ATMega8L - не работает ADC (АЦП)
Добавлено: Сб фев 06, 2010 18:21:02
Здравствуйте, Уважаемые Кошаки- форумчане!
Адын) "С чего все начиналось."
Есть схема(приложение Адын) и программа на С(см. далее) компилированная в WINAVR, и запехнутая в МК с помощью PONYPROG.
#define F_CPU 1000000UL // 1 MHz
#include <avr>
#include <avr> //Для доступа к функции sei()
#include <avr> //Для доступа к макросу INTERRUPT
#include <avr> // что бы выжидать время
ISR (ADC_vect) //Обработчик прерывания от АЦП
{
unsigned int ADCdata; //Буферная переменная для. хранения
ADCdata = ADCH; //результата преобразования
if (ADCdata > (205)) PORTD = 0b00000001; // LED0
else if (ADCdata > (153)) PORTD = 0b00000010; // LED1
else PORTD = 0b00000100; // LED2
ADCSR = ADCSR | 0x40; //Устанавливаем разряд ADSC в регистре ADCSR,
//чтобы начать новое преобразование
}
int main (void)
{
DDRD = 0xff; //Все D - выходы
ADMUX = 0b01100000; //01 - ARef вход- C0;
ADCSR = 0b10001011; /* 0b11001110 - активизируем АЦП с коэффициентом деления 8,
разрешаем прерывание от АЦП */
_delay_ms(150); // Поспим немного: Пусть AЦП разжует и проглотит инфу
ADCSR = ADCSR | 0x40; // GO Go Go
sei(); //Общее разрешение прерываний
while(1) //Бесконечный цикл в ожидании прерывания от АЦП
{
PORTD = 0b00001000; // установить "1" на всех линиях порта D
_delay_ms(250); // Ждем 0.25 сек.
_delay_ms(250); // Ждем 0.25 сек.
_delay_ms(250); // Ждем 0.25 сек.
_delay_ms(250); // Ждем 0.25 сек.
PORTD = 0b00000000; // установить "0" на всех линиях порта D
_delay_ms(250); // Ждем 0.25 сек.
_delay_ms(250); // Ждем 0.25 сек.
_delay_ms(250); // Ждем 0.25 сек.
_delay_ms(250); // Ждем 0.25 сек.
}
}
ДВА) Собственно Проблема.
Горит только 3 светодиод. 4 даже не мигает. Такое ощущение что МК висит...
В чем может быть проблема? Заранее спасибо.
Адын) "С чего все начиналось."
Есть схема(приложение Адын) и программа на С(см. далее) компилированная в WINAVR, и запехнутая в МК с помощью PONYPROG.
#define F_CPU 1000000UL // 1 MHz
#include <avr>
#include <avr> //Для доступа к функции sei()
#include <avr> //Для доступа к макросу INTERRUPT
#include <avr> // что бы выжидать время
ISR (ADC_vect) //Обработчик прерывания от АЦП
{
unsigned int ADCdata; //Буферная переменная для. хранения
ADCdata = ADCH; //результата преобразования
if (ADCdata > (205)) PORTD = 0b00000001; // LED0
else if (ADCdata > (153)) PORTD = 0b00000010; // LED1
else PORTD = 0b00000100; // LED2
ADCSR = ADCSR | 0x40; //Устанавливаем разряд ADSC в регистре ADCSR,
//чтобы начать новое преобразование
}
int main (void)
{
DDRD = 0xff; //Все D - выходы
ADMUX = 0b01100000; //01 - ARef вход- C0;
ADCSR = 0b10001011; /* 0b11001110 - активизируем АЦП с коэффициентом деления 8,
разрешаем прерывание от АЦП */
_delay_ms(150); // Поспим немного: Пусть AЦП разжует и проглотит инфу
ADCSR = ADCSR | 0x40; // GO Go Go
sei(); //Общее разрешение прерываний
while(1) //Бесконечный цикл в ожидании прерывания от АЦП
{
PORTD = 0b00001000; // установить "1" на всех линиях порта D
_delay_ms(250); // Ждем 0.25 сек.
_delay_ms(250); // Ждем 0.25 сек.
_delay_ms(250); // Ждем 0.25 сек.
_delay_ms(250); // Ждем 0.25 сек.
PORTD = 0b00000000; // установить "0" на всех линиях порта D
_delay_ms(250); // Ждем 0.25 сек.
_delay_ms(250); // Ждем 0.25 сек.
_delay_ms(250); // Ждем 0.25 сек.
_delay_ms(250); // Ждем 0.25 сек.
}
}
ДВА) Собственно Проблема.
Горит только 3 светодиод. 4 даже не мигает. Такое ощущение что МК висит...
В чем может быть проблема? Заранее спасибо.