Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
sad-angel
Встал на лапы
Сообщения: 122 Зарегистрирован: Пт июл 11, 2008 21:49:40
Откуда: Украина
Сообщение
sad-angel » Вс дек 05, 2010 18:47:06
На вход 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
Сообщение
stas00n » Вс дек 05, 2010 19:34:37
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
Сообщение
stas00n » Вс дек 05, 2010 19:38:34
Кстати по этому поводу компилятор должен по идее выдать варнинг. Вы на них смотрите?
stas00n
Вымогатель припоя
Сообщения: 557 Зарегистрирован: Пн мар 23, 2009 04:03:45
Сообщение
stas00n » Вс дек 05, 2010 19:45:36
Но дело не в этом. посмотрите на ваш обработчик. Для наглядности исключу все лишнее:
Код: Выделить всё
//обработчик прерывания АЦП
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
Откуда: Украина
Сообщение
sad-angel » Вс дек 05, 2010 20:57:31
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
Откуда: Новочеркасск
Контактная информация:
Сообщение
ARV » Пн дек 06, 2010 08:24:50
пожалуй, еще лучше было бы так:
Код: Выделить всё
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
Откуда: Украина
Сообщение
sad-angel » Пн дек 06, 2010 12:13:25
ARV писал(а): пожалуй, еще лучше было бы так:
Код: Выделить всё
ISR(ADC_vect){
if(ADMUX & _BV(MUX0))
PORTD = ADCH;
else
PORTB = ADCH;
ADMUX ^= _BV(MUX0);
ADCSRA |= _BV(ADSC);
}
Спасибо!