ATmega8:не удается переключать каналы АЦП

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
sad-angel
Встал на лапы
Сообщения: 122
Зарегистрирован: Пт июл 11, 2008 21:49:40
Откуда: Украина

ATmega8:не удается переключать каналы АЦП

Сообщение sad-angel »

На вход ADC0 и ADC1 микроконтроллера ATmega8 подаються измерительные сигналы. Их нужно обработать и вывести на дисплей. Написал простейшую программу, но она не работает - не происходит переключение каналов АЦП. Программа написана в WinAVR:

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


#include <avr/io.h>
#include <avr/interrupt.h>

void ADC_Init(void)
 {
  ADCSRA=((1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1));
  ADMUX=((1<<REFS1)|( 1<<REFS0)|(1<<ADLAR)); //ИОН-2.56в, 8 результат,0-й канал 
 }

//обработчик прерывания АЦП
ISR(ADC_vect)
{
 static unsigned char mode=0;

if(mode==0)
{
 PORTB=ADCH;
 mode=1;
 ADMUX|=1<<MUX0; //Enable ADC1;
}

if(mode==1)
{
 PORTD=ADCH;
 mode=0;
 ADMUX&=~(1<<MUX0);// Enable_ADC0;
}

 ADCSR |= (1<<ADSC); //Start ADC
}

int main(void)
{
 ADC_Init();
 ADCSR |= (1<<ADSC); //Start ADC

 DDRD=0xFF;
 DDRB=0xFF;
 sei();
 while(1)
 {
  asm("nop");
 }
}


Реклама
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Re: ATmega8:не удается переключать каналы АЦП

Сообщение stas00n »

sad-angel писал(а):

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


if(mode==0)
{
 PORTB=ADCH;
 mode=1;
 ADMUX|=1<<MUX0; //Enable ADC1; Тут по-моему забыли скобки - надо (1<<MUX0)
}

if(mode==1)
{
 PORTD=ADCH;
 mode=0;
 ADMUX&=~(1<<MUX0);// Enable_ADC0; 
}

 
Реклама
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Re: ATmega8:не удается переключать каналы АЦП

Сообщение stas00n »

Кстати по этому поводу компилятор должен по идее выдать варнинг. Вы на них смотрите?
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Re: ATmega8:не удается переключать каналы АЦП

Сообщение stas00n »

Но дело не в этом. посмотрите на ваш обработчик. Для наглядности исключу все лишнее:

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


//обработчик прерывания АЦП
ISR(ADC_vect)
{
 static unsigned char mode=0;
if(mode==0)
{
 mode=1;
}
if(mode==1)
{
 mode=0;
}
}
Доступно?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
sad-angel
Встал на лапы
Сообщения: 122
Зарегистрирован: Пт июл 11, 2008 21:49:40
Откуда: Украина

Re: ATmega8:не удается переключать каналы АЦП

Сообщение sad-angel »

stas00n писал(а):Но дело не в этом. посмотрите на ваш обработчик. Для наглядности исключу все лишнее:

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


//обработчик прерывания АЦП
ISR(ADC_vect)
{
 static unsigned char mode=0;
if(mode==0)
{
 mode=1;
}
if(mode==1)
{
 mode=0;
}
}
Доступно?
Спасибо, я все понял! Исправил код:

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

ISR(ADC_vect)
{
static unsigned char mode=0;

if(mode==0)
{
PORTB=ADCH;
mode=1;
ADMUX|=1<<MUX0; //Enable ADC1;
}
else {
if(mode==1)
{
PORTD=ADCH;
mode=0;
ADMUX&=~(1<<MUX0);// Enable_ADC0;
}
}
ADCSR |= (1<<ADSC); //Start ADC
}
но потом сделал лучше:

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

ISR(ADC_vect)
{
static unsigned char mode=0;
switch(mode)
{ 
case 0:
{
PORTB=ADCH;
mode=1;
ADMUX|=1<<MUX0; //Enable ADC1;
ADCSR |= (1<<ADSC); //Start ADC
} break;

case 1:
{
PORTD=ADCH;
mode=0;
ADMUX&=~(1<<MUX0);// Enable_ADC0;
ADCSR |= (1<<ADSC); //Start ADC
} break; 
}
}
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: ATmega8:не удается переключать каналы АЦП

Сообщение ARV »

пожалуй, еще лучше было бы так:

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

ISR(ADC_vect){
   if(ADMUX & _BV(MUX0))
      PORTD = ADCH;
   else
      PORTB = ADCH;
   ADMUX ^= _BV(MUX0);
   ADCSRA |= _BV(ADSC);
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
sad-angel
Встал на лапы
Сообщения: 122
Зарегистрирован: Пт июл 11, 2008 21:49:40
Откуда: Украина

Re: ATmega8:не удается переключать каналы АЦП

Сообщение sad-angel »

ARV писал(а):пожалуй, еще лучше было бы так:

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

ISR(ADC_vect){
   if(ADMUX & _BV(MUX0))
      PORTD = ADCH;
   else
      PORTB = ADCH;
   ADMUX ^= _BV(MUX0);
   ADCSRA |= _BV(ADSC);
}
Спасибо!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»