ATmega8 2 АЦП

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

ATmega8 2 АЦП

Сообщение shurikss123 »

Ребят помогите запустить на 8-ке АЦП 2-х каналов.

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

int main(void)
{
   USART_Init();

   ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS0);

   ADMUX=(1<<REFS1)|(1<<REFS0)|(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3);

   sei();
   PORTB = 0xff;

   while (1)
   {
      //tower_left
      USART_Transmit(device);
      USART_Transmit(ch);
      USART_Transmit(0x1);


      ADCSRA |= (1 << ADSC)|(1<<ADFR);    //Начинаем преобразование
      ADMUX = (1<<REFS1)|(1<<REFS0)|(0<<MUX0)|(0<<MUX1);
      while ((ADCSRA&_BV(ADIF))==0x00); //Ждем флага окончания преобразования

      USART_Transmit(ADCH);

      USART_Transmit(ADCL);
      _delay_ms(1000);

   };
}


Первый замер шлет нормально последующие, либо ноль либо 1024. и вот понять не могу что не так
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

Re: ATmega8 2 АЦП

Сообщение U235 »

Обычно сначала переключают канал, а потом запускают измерение.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Re: ATmega8 2 АЦП

Сообщение shurikss123 »

U235 писал(а):Обычно сначала переключают канал, а потом запускают измерение.


я уже по всякому пробывал первый замер делат а потом тупо повторяет
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: ATmega8 2 АЦП

Сообщение ILYAUL »

И ещё обычно , раз не работают с прерываниями , ручками сбрасывают флаг ADIF Сбрасывается он записью 1
Аватара пользователя
s_black
Мучитель микросхем
Сообщения: 411
Зарегистрирован: Вс авг 10, 2008 19:35:49
Откуда: Евпатория
Контактная информация:

Re: ATmega8 2 АЦП

Сообщение s_black »

shurikss123 писал(а):Ребят помогите запустить на 8-ке АЦП 2-х каналов.

Вот пример и для трёх каналов. СмотрИте исходник.
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Re: ATmega8 2 АЦП

Сообщение shurikss123 »

ILYAUL писал(а):И ещё обычно , раз не работают с прерываниями , ручками сбрасывают флаг ADIF Сбрасывается он записью 1


не то, в протеусе ругается на заблокированный бит?
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Re: ATmega8 2 АЦП

Сообщение shurikss123 »

s_black писал(а):
shurikss123 писал(а):Ребят помогите запустить на 8-ке АЦП 2-х каналов.

Вот пример и для трёх каналов. СмотрИте исходник.


в твоем случае 48 мега, в моем 8 мега, есть разница.
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
siamds
Встал на лапы
Сообщения: 99
Зарегистрирован: Вт мар 20, 2012 20:50:22
Откуда: Краснодар

Re: ATmega8 2 АЦП

Сообщение siamds »

По Вашей просьбе написал код для двух каналов ADC для ATMega8. Чтобы не возиться с написанием кода программы, программа создана при помощи генератора кодов CV_AVR. Программа промоделирована в Proteus’e. Программа снабжена подробными комментариями. Файлы программы и рисунки генератора кодов во вложении.
Вложения
ADC_Mega8.rar
Двухканальный ADC
(158.87 КБ) 954 скачивания
На каждого Моцарта есть свой Сальери.
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Re: ATmega8 2 АЦП

Сообщение shurikss123 »

siamds писал(а):По Вашей просьбе написал код для двух каналов ADC для ATMega8. Чтобы не возиться с написанием кода программы, программа создана при помощи генератора кодов CV_AVR. Программа промоделирована в Proteus’e. Программа снабжена подробными комментариями. Файлы программы и рисунки генератора кодов во вложении.

вечерком посмотрю
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Re: ATmega8 2 АЦП

Сообщение shurikss123 »

ниче не пойму не работает хоть убей
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

Re: ATmega8 2 АЦП

Сообщение U235 »

Попробуйте так

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

int main(void)
{
   USART_Init();

   ADCSRA=(1<<ADPS1)|(1<<ADPS0);
   ADMUX=(1<<REFS1)|(1<<REFS0)|(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3);

   sei();
   PORTB = 0xff;

   while (1)
   {
      //tower_left
      USART_Transmit(device);
      USART_Transmit(ch);
      USART_Transmit(0x1);


      ADCSRA |= (1 << ADSC);    //Начинаем преобразование
      while ((ADCSRA&_BV(ADIF))==0x00); //Ждем флага окончания преобразования
      ADMUX = (1<<REFS1)|(1<<REFS0)|(0<<MUX0)|(0<<MUX1);

      ADCSRA |= (1 << ADIF);

      USART_Transmit(ADCL);
      USART_Transmit(ADCH);

      _delay_ms(1000);

   };
}
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Аватара пользователя
siamds
Встал на лапы
Сообщения: 99
Зарегистрирован: Вт мар 20, 2012 20:50:22
Откуда: Краснодар

Re: ATmega8 2 АЦП

Сообщение siamds »

shurikss123 писал(а):ниче не пойму не работает хоть убей

Давайте разбираться почему не работает. Каким компилятором Вы пользуетесь, и какой симулятор установлен на Вашем компьютере? Программу скачали 11 наших коллег – обратиться к ним работает ли программа у них?
На каждого Моцарта есть свой Сальери.
Аватара пользователя
C@at
Вымогатель припоя
Сообщения: 652
Зарегистрирован: Вс ноя 13, 2011 16:42:05
Откуда: Украина

Re: ATmega8 2 АЦП

Сообщение C@at »

siamds пробовал в протеусе ваш проект ADC_Mega8.rar , у меня все работает :beer:
Аватара пользователя
siamds
Встал на лапы
Сообщения: 99
Зарегистрирован: Вт мар 20, 2012 20:50:22
Откуда: Краснодар

Re: ATmega8 2 АЦП

Сообщение siamds »

Уважаемый C@at!
Спасибо за сообщение. Благодаря Вам будет легче искать “глюки” в программе shurikss123.
На каждого Моцарта есть свой Сальери.
Аватара пользователя
C@at
Вымогатель припоя
Сообщения: 652
Зарегистрирован: Вс ноя 13, 2011 16:42:05
Откуда: Украина

Re: ATmega8 2 АЦП

Сообщение C@at »

Вот если найдется тут такой человек, который подскажет ему, что для поиска "глюка" нужно выложить полностью секретный проект, тогда это действительно поможет.....
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: ATmega8 2 АЦП

Сообщение Jack_A »

C@at писал(а):Вот если найдется тут такой человек, который подскажет ему, что для поиска "глюка" нужно выложить полностью секретный проект, тогда это действительно поможет.....


Да ни в жисть, сопрут ! Копирайт, панимеш :))
Аватара пользователя
C@at
Вымогатель припоя
Сообщения: 652
Зарегистрирован: Вс ноя 13, 2011 16:42:05
Откуда: Украина

Re: ATmega8 2 АЦП

Сообщение C@at »

Jack_A как вы узнали :shock: что все сопрут?
Уже все стырено в личное пользование :))) ...... и спрятано здесь.
Спасибо siamds за труд, весьма простой наглядный пример + коментарии!
Аватара пользователя
Angmar
Родился
Сообщения: 9
Зарегистрирован: Ср авг 01, 2012 15:06:31

Re: ATmega8 2 АЦП

Сообщение Angmar »

Для ICCAVR есть готовое решение. Несложно портировать в WinAVR, CodeVisionAVR etc.
Привожу сразу с функциями УАРТА, так как применяется отсылка строк из Флеша и РАМа. Проверял на ATMega8 и 32 (никакой разницы).

Главная функция в проекте для чтения АЦП и отправки по УАРТУ -
ADC_transmitValue(). Остаётся в функции main вписать её в нужном вместе. Ну и инициализауию АЦП и УАРТа - ADC_init() и uart0_init()
PS - В функции ADC_transmitValue() надо поставить необх. кол-во каналов.
Спойлер

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


//Controller:  ATmega32 (16MHz Crystal). Compiler:  ICCAVR

#include <iom32v.h>
#include <macros.h>

#define ADC_ENABLE         ADCSRA |= (1<<ADEN)
#define ADC_DISABLE         ADCSRA &= 0x7F
#define ADC_START_CONVERSION    ADCSRA |= (1<<ADSC)
#define TX_NEWLINE  {transmitByte(0x0d); transmitByte(0x0a);}

void ADC_init(void);
int ADC_read(void);
float ADC_calculateTemp(int);
unsigned char* updateTempDisplay(float);
unsigned char* temporary(void);
void ADC_transmitValue(void);

unsigned char receiveByte(void);
void transmitByte(unsigned char);
void transmitString_F(const unsigned char*);
void transmitString(unsigned char*);
unsigned char valueDisplay[]=":  .   volt";

float Vref = 5.00; // Напряжение на Vref АЦП

// Initialize the ADC ******************************************************
void ADC_init(void)
{
 ADCSRA = 0x00; //disable adc
 ADMUX = 0x40; //select adc input 0
 ADCSRA = 0x86;
}
 
// Do a Analog to Digital Conversion **********************************************
int ADC_read(void)
{
    char i;
    int ADC_temp, ADCH_temp;
    int ADC_var = 0;
     
    ADC_ENABLE;
     
    ADC_START_CONVERSION;    //первый раз вычитываем всякий мусор из АЦП
   
    while(!(ADCSRA & 0x10));     //Ждём, флага окончания преобразования. ADIF flag active
    ADCSRA|=(1<<ADIF);
         
    for(i=0;i<8;i++)             //Считывание 8 раз для усреднения и повышения точности (потом поделим на 8)
    {
    ADC_START_CONVERSION;
        while(!(ADCSRA & 0x10));    // wait for conversion done, ADIF flag active
        ADCSRA|=(1<<ADIF);
     
        ADC_temp = ADCL;            // read out ADCL register
        ADCH_temp = ADCH;         // read out ADCH register         
    ADC_temp +=(ADCH_temp << 8);
        ADC_var += ADC_temp;      // accumulate result (8 samples) for later averaging
    }
 
    ADC_var = ADC_var >> 3;     //усредняем выборку из 8 преобразований
   
    ADC_DISABLE;
   
    return ADC_var;
}

//To calculate Voltage *************************************************
 float ADC_calculateValue(int inputValue)
 {
    float actualValue;
    actualValue=(inputValue * Vref/1024.0);   //calculates the voltage present
    return actualValue;
 }
   
//To update the valueDisplay string based on the latest voltage read ************************
  unsigned char* updateDisplay(float actualValue)
 {   
     
  int temp;
  unsigned char c;
  temp=(int)(actualValue*100.0);   //to include decimal point for display
   
  if((actualValue*100.0 - temp) >= 0.5) temp=temp+1;
   
  valueDisplay[5] = ((unsigned char)(temp%10)) | 0x30;
  temp=temp/10;
     valueDisplay[4] = ((unsigned char)(temp%10)) | 0x30;
  temp=temp/10;
  valueDisplay[2] = ((unsigned char)(temp%10)) | 0x30;
  temp=temp/10;
   
  return valueDisplay;
       
}
 
//to transmit the voltage values at 8 ADC channels *******************************
void ADC_transmitValue(void)
{
  int value;
  float value1;
  unsigned char i;
   
 
  for(i=0; i<8; i++) // вместо 8 устанавливаем необходимое кол-во или выбранные номера каналов АЦП !!!
  {
    ADMUX &= 0xe0;
    ADMUX |= i;   //ВЫБИРАЕМ КАНАЛ
    value = ADC_read();
    value1 = ADC_calculateValue(value);
     
//following three functions are part of the UART routines, sending the
//voltage values to serial port. UART must be initialized before
//calling them
 
    transmitString_F("   Channel ");   
    transmitByte(i | 0x30);
    transmitString(updateDisplay(value1));
    TX_NEWLINE;
  }
}
   

//******** FUNCTIONS FOR SERIAL COMMUNICATION USING UART *******
//Function to initialize UART **************************
//UART0 initialize 
// desired baud rate: 19200
// actual: baud rate:19231 (0.2%)(at 16MHz crystal)
// char size: 8 bit
// parity: Disabled
 
void uart0_init(void)
{
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x00;
 UCSRC = BIT(URSEL) | 0x06;
 UBRRL = 0x33; //set baud rate lo
 UBRRH = 0x00; //set baud rate hi
 UCSRB = 0x98;
}
 
//Function to receive a single byte **********************
unsigned char receiveByte( void )
{
  unsigned char data, status;
   
  while(!(UCSRA & (1<<RXC)));   // Wait for incomming data
   
  status = UCSRA;
  data = UDR;
 
  return(data);
}

//Function to transmit a single byte *************************
void transmitByte( unsigned char data )
{
  while ( !(UCSRA & (1<<UDRE)) )
    ;           //Wait for empty transmit buffer
  UDR = data;         //Start transmition
}
 
//Function to transmit a string stored in Flash *****************
void transmitString_F(const unsigned char* string)
{
    while (*string)
  transmitByte(*string++);
}
 
//Function to transmit a string from RAM
//***************************************************
void transmitString(unsigned char* string)
{
    while (*string)
  transmitByte(*string++);
}


Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Re: ATmega8 2 АЦП

Сообщение shurikss123 »

siamds писал(а):
shurikss123 писал(а):ниче не пойму не работает хоть убей

Давайте разбираться почему не работает. Каким компилятором Вы пользуетесь, и какой симулятор установлен на Вашем компьютере? Программу скачали 11 наших коллег – обратиться к ним работает ли программа у них?


gcc-avr 1:4.5.3-3
avr-libs 1:1.7.1-2
proteus не важно, я в железе пробывал, на двух atmega8, кстате на atmega168 завелось без проблем по даташиту.
вот исходник
https://code.google.com/p/sfag/source/b ... po=tank-tx
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: ATmega8 2 АЦП

Сообщение ILYAUL »

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

ADCSRA |= 0x40;
- Ошибка
Ответить

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