ATMega8L - не работает ADC (АЦП)

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 6
Зарегистрирован: Сб фев 06, 2010 17:55:03

Сообщение Mythi »

Здравствуйте, Уважаемые Кошаки- форумчане!

Адын) "С чего все начиналось."

Есть схема(приложение Адын) и программа на С(см. далее) компилированная в 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 даже не мигает. Такое ощущение что МК висит...

В чем может быть проблема? Заранее спасибо. :beer:
Вложения
.jpg
Приложение АДЫН
(33.81 КБ) 311 скачиваний
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 534
Зарегистрирован: Пн янв 16, 2006 08:00:17
Откуда: Иркутск

Сообщение Mamonth »

В обработчике прерывания напишите вместо
PORTD = 0b00000010

вот так:
PORTD |= (1<<PD1); если нужно поставить 1
PORTD &= ~(1<<PD1); если нужно поставить 0

для всех переключений светодиодов!!!

У вас глушит из прерывания все ваши потуги из майна...

Если не поняли в чем дело - читать про битовые операции в Си...
Today fine night...
Реклама
Родился
Сообщения: 6
Зарегистрирован: Сб фев 06, 2010 17:55:03

Сообщение Mythi »

Спасибо сейчас попробую и отпишусь... :))
Родился
Сообщения: 6
Зарегистрирован: Сб фев 06, 2010 17:55:03

Сообщение Mythi »

Вот получилось так. Пока без оптимизации но ето не главное

пытался воткнуть текст сюда но ветвление If отображается неверно
по этому смотрите в прфайлах.

четвертый(PD3) диод мигает, 3(PD2) диод постоянно горит. на нажатие кнопок не реагирует. проверял цешкой:
AREF = 5.05В
на входе ADC напряжение прыгает в зависимости от нажатия кнопок от 0 до 4,98В

понять не могу в чем дело. ?
Вложения
(2).txt
(1.9 КБ) 205 скачиваний
Последний раз редактировалось Mythi Сб фев 06, 2010 19:55:16, всего редактировалось 2 раза.
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18859
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Mamonth писал(а):Если не поняли в чем дело - читать про битовые операции в Си...
можно вот тут почитать :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18859
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

это вы здесь что понаписали?

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

PORTD &= ~(1<<PD2> (205)) PORTD |= (1<<PD0> (153)) PORTD |= (1<<PD1); // LED1 
вместо (1<<PD3) очень рекомендую использовать макрос, типичный для WinAVR _BV(PD3), который делает то же самое.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Родился
Сообщения: 6
Зарегистрирован: Сб фев 06, 2010 17:55:03

Сообщение Mythi »

Смотрите выше. Проблемы с оформлением Листинга.

Про битовые операции я понял у меня стаж программирования большой правда на Delphi и под DirectX но по книге Шпака понял и С для МК.
Вымогатель припоя
Аватара пользователя
Сообщения: 534
Зарегистрирован: Пн янв 16, 2006 08:00:17
Откуда: Иркутск

Сообщение Mamonth »

ну вообще странно... немного смущает написанные if но да ладно. В остальном Ваша программа вроде нормальная. Насчет кнопок - схема-отсутствует... Кнопок в первом посте не видно...

Еще момент, я так понимаю Вы пытаетесь задать какие-пороги и что-то вкл-выкл.... Но четких порогов быть не может, потому аккуратненько с if поработайте...
Today fine night...
Родился
Сообщения: 6
Зарегистрирован: Сб фев 06, 2010 17:55:03

Сообщение Mythi »

Ой! Извените.
Забыл сказать что кнопки на схеме это конденсаторы С6 - С10. Просто в Eagle не смог найти нужные по размерам кнопки (я с ним не работаю). А разводил плату потом в LAYOUT.

Mamonth. Пороги пока я написал "от балды", но когда он заработает ( а он заработает это точно, чтоб мне Билл Гейтс приснился) я конечно же ветвление иф перепишу.

А кнопки сделаны (еще не все, это только проба) для UI.
Родился
Сообщения: 6
Зарегистрирован: Сб фев 06, 2010 17:55:03

Сообщение Mythi »

Ура Заработало...

А было следующее (только сильно не пинайте): ДШ нада внимательно изучать- не к тому выводу подключил вход АЦП. 28 пин это порт PORTC.5 а не PORTC.0.

Все Всем большое спасибо и :beer: с меня...
Вымогатель припоя
Аватара пользователя
Сообщения: 534
Зарегистрирован: Пн янв 16, 2006 08:00:17
Откуда: Иркутск

Сообщение Mamonth »

Пжл...
Today fine night...
Закрыто

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