Запуск АЦП в Attiny13

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 11
Зарегистрирован: Чт авг 04, 2011 23:21:25
Откуда: Уфа

Сообщение TeraWATT »

Дорогие товарищи!Помогите пожалуйста разобраться с запуском АЦП в tiny13. Делал в соответствии с http://radiokot.ru/forum/viewtopic.php?f=57&t=85771, поглядывая в datasheet и корректируя код под CVavr, но ничего так и не запустилось.
Код:

Код: Выделить всё

#include <io.h>
#include <tiny13.h>
#include <delay.h>

// Declare your global variables here

unsigned int adc_data;
// Bandgap Voltage Reference: On
//#define ADC_VREF_TYPE ((1<<REFS0) | (0<<ADLAR))

 
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
if ((ADCH>>1) != (adc_data>>1)) // отбрасываю младший разряд и проверяю, есть ли изменения. Устранение "дребезга"
   {
      adc_data = ADCH;
     
   }

}
void Send_SPI(char data) //куча функций для вывода на один индикатор
{int i=0;
 PORTB.2=0; //ss
 for (i=0;i<9;i++)
{    delay_us(100);
 PORTB.1=1;//SCK
 if((data&(1<<i))==(1<<i))
  {
    PORTB.0=1; //MOSI
    delay_us(100);
  } 
  else
  {
  PORTB.0=0; //MOSI
  delay_us(100);
  }             
  delay_us(100);
  PORTB.1=0; //SCK
};
delay_us(100);
 PORTB.2=1;
}
//
void SPI_int(int num)
{
//char data;

 if(num==0)
  { Send_SPI(0b00111111);}
  if(num==1)  
  { Send_SPI(0b00000110);}
  if(num==2)           
  { Send_SPI(0b10011011);}
  if(num==3)           
  { Send_SPI(0b10001111);}
  if(num==4)           
  { Send_SPI(0b10100110);}
  if(num==5)           
  { Send_SPI(0b10101101);}
  if(num==6)           
  { Send_SPI(0b10111101);}
  if(num==7)           
  { Send_SPI(0b00000111);}
  if(num==8)           
  { Send_SPI(0b11111111);}
  if(num==9)           
  { Send_SPI(0b10101111);}   
 // Send_SPI(data);      
  if(num==-1)           
  { Send_SPI(0b00000000);} 
  }
 



// Read the AD conversion result
// with noise canceling
//unsigned int read_adc(unsigned char adc_input)
//{
//ADMUX=adc_input | ADC_VREF_TYPE;
//// Delay needed for the stabilization of the ADC input voltage
//delay_us(10);
//#asm
//    in   r30,mcucr
//    cbr  r30,__sm_mask
//    sbr  r30,__se_bit | __sm_adc_noise_red
//    out  mcucr,r30
//    sleep
//    cbr  r30,__se_bit
//    out  mcucr,r30
//#endasm
//return adc_data;
//}

void  send_int(int inp)
{
int i=0;
char N[4];
N[0]=inp/1000; 
N[1]=(inp-N[0]*1000)/100;
N[2]=(inp/10-N[0]*100-N[1]);
N[3]=(inp-N[0]*1000-N[1]*100-N[2]*10);

 for(i=0;i<4;i++)
 {    SPI_int(N[i]);
      delay_ms(500);
      SPI_int(-1);
      Send_SPI(0b10000000);
      delay_ms(500);
      SPI_int(-1);
 }  
         
  SPI_int(-1);
   delay_ms(3000);
     
}

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=In Bit3=In Bit2=Out Bit1=Out Bit0=Out 
DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit5=T Bit4=T Bit3=T Bit2=0 Bit1=0 Bit0=0 
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);


//// ADC initialization
//// ADC Clock frequency: 62,500 kHz
//// ADC Bandgap Voltage Reference: On
//// ADC Auto Trigger Source: ADC Stopped
//// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
//DIDR0|=(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
//ADMUX=ADC_VREF_TYPE;
//// ADMUX=0b01100001;
//ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
//ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
//
#asm("cli")
//========Разрешения прерываний АЦП микроконтроллера======
   ADCSRA = ADCSRA|(1<<ADEN)|(1<<ADATE); //разрешение на работу АЦП, автозапуск.
   ADCSRA = ADCSRA|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0); //установка предделителя 
   ADCSRB = ADCSRB|(1<<ACME); //Установил режим работы непрерывного преобразования.
   ADMUX = ADMUX|(0<<MUX1)|(1<<MUX0);//указал, какой у меня вход задействован в качестве АЦП.
   ADMUX = ADMUX&(~(1<<REFS0));// установка источника опорного напряжения = VCC
   ADMUX = ADMUX|(1<<ADLAR); // Результат преобразования сдвинут вправо. Результат можно читать из ADCH при этом в ADCL будут храниться в 7 и 8 бите младшие разряды рпеобразования, ими в нашем случае можно пренебречь.
   DIDR0 =  DIDR0|(1<<ADC2D); // отключение цифрового буфера от канала ADC2.
   ADCSRB = (ADCSRB&0b11111000)|(0<<ADTS2)|(0<<ADTS1)|(0<<ADTS0); //Установка источника сигнала для выполнения преобразования...000 - непрерывное преобразование.
   ADCSRA = ADCSRA|(1<<ADIE); //Разрешение прерывания
   ADCSRA = ADCSRA|(1<<ADSC);//Запуск первого преобразования
   //=======КОНЕЦ Разрешения прерываний АЦП микроконтроллера=

// Globally enable interrupts
#asm("sei")

while (1)
      {  
      
      send_int(adc_data);

      }
}
В Proteus всегда выводятся нули, в железе 0-2--
Реклама
Опытный кот
Сообщения: 806
Зарегистрирован: Ср май 06, 2015 06:41:27
Откуда: Благовещенск

Сообщение Андрей СШ »

TeraWATT писал(а): ADCSRB = ADCSRB|(1<<ACME); //Установил режим работы непрерывного преобразования.
Неправда. Бит АСМЕ переключает мультиплексор между АЦП и компаратором. И в данном случае вообще ни на что не влияет.
TeraWATT писал(а):В Proteus всегда выводятся нули, в железе 0-2--
Схему надо посмотреть. Скорее всего выдаётся то, что подано на АЦП, т.е. около нуля.

АЦП замультиплексен на PB2. Сигнал Чип-селект, судя по коду, там же.
Реклама
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

при использовании прерываний надо добавить библиотеку прерываний interrupt.h в инклуд, и глобально разрешить прерывания sei что присутствует в тексте программы
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

В CodeVision такая библиотека не нужна.
Mishany писал(а):глобально разрешить прерывания sei что присутствует в тексте программы
^
|
Написать написанное.
Вложения
TeraWATT_kot.rar
(12.81 КБ) 135 скачиваний
Docendo discimus
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 11
Зарегистрирован: Чт авг 04, 2011 23:21:25
Откуда: Уфа

Сообщение TeraWATT »

Нашел причину: не происходит преобразования результата АЦП из двоичной формы в десятичную, поэтому приведенная в моем первом сообщении индусская система вывода результата не работает. Всем спасибо!
Реклама
Ответить

Вернуться в «AVR»