Свежие обсуждения
Микроконтроллеры

Помогите настроить АЦП в Atmega

1 3 4

Вот поэтому я пишу не

TCCR0=0x02;

а

TCCR0 = _BV(CS01) | _BV(CS00);	

Кстати, у меги 8 и меги 16 эти биты совпадают...

 

Можно у тебя еще спросить вопросик один
Делаю в той же проге нарастающий код на PORTC:
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (PIND.0==0){
PORTC++;}
else {
PORTC=PORTC+10;};
}
Так оно у меня в протеусе когда код до 64 доходит сбрасывает, или после сразу 192 показывает. С чем может быть связано? Глюк протеуса?

 

Мега8? У неё порт C неполный, у него нет PC7. Наверное поэтому.

Когда ты пишешь PORTC=PORTC+10, то реально сначала считываются ножки порта, к считанному значению прибавляется 10, и полученное число выводится в порт. Почитай про операции "чтение-модификация-запись". Бывают ситуации, когда нога настроена на вывод, в неё выводится 1, а считывается всё равно 0. (Не уверен, что это в АВР-ках, но где-то точно было). Поэтому лучше иметь какую-нибудь вспомогательную переменную, производить вычисления с ней, и уже потом выводить её значение в порт. Это позволит избежать многих неочевидных и трудноуловимых ошибок.

Типа:

static unsigned char port_c_data = 0;
if (PIND.0==0){
    port_c_data++;}
else {
   port_c_data = port_c_data+10;};
}
PORTC=port_c_data;

 

Не атмега16
Так дело в том что если написать отдельную прогу столько с этой функцией все работает те 0-1...255-0...
А если к той с вольтметром дописываю то не идет

 

Как только код>64 сразу на ноль сбивается.
Это ни как не завязано с TOSC1 TOSC2(РС6 и РС7)?

 

Я для кого писал-то всё это выше? Может быть связано и с TOSC, и с чем угодно. Сделай вспомогательную переменную.

 

shemmer, схемку, может, выложите ? А также fuse-биты напишете? А то интересные вещи между делом выясняются. JTag-бит меняли? Если нет - у Вас на порту C вообще половину линий трогать нельзя! Тут же не телепаты сидят

 

chav1961: но и не полениться усреднить показания - АЦП практически никогда два одинаковых показания Вам не даст. Обычно 16..32 выборок достаточно, чтобы цифры не скакали.
Для усреднения очень удобно применять метод сколзящего среднего:
Не надо накапливать выборки в массиве.
Работает подобно интегрирующей RC цепочке.

#define N 16

result=(result*(N-1)+adc_data)/N;

 

Добавил архив с исходником и скриншотом в Proteuse.-посмотрите пожалуйста

109749.rar

 

Ну во-первых, при отжатых кнопках входы висят в воздухе. Что с них читается? Да что угодно. Либо подтянуть их резисторами к земле, либо (лучше) - включить кнопки на землю, и подтянуть к +5в (можно при помощи встроенного pull-up).

Во-вторых, кнопки "дребезжат". То есть, при нажатии их состояние многократно изменяется перед тем как устаканиться. Не знаю, эмулирует ли это протеус, но может быть дело в этом. Поищи в конфе по слову "дребезг".

Дальше. При отпускании кнопки "+" возникает прерывание INT0, при отпускании "-" - INT1, так? В INT0 мы работаем с port_cA_data, в INT1 - с port_cB_data. Нажали 10 раз "+", port_cA_data стало 10, вывелось в порт. Нажали 1 раз "-" - port_cB_data стало 255 (было 0), вывелось в порт. Наверное, это не то, что надо?

Что касается собственно порта С, то просто попробуй вывести в него при старте программы 0xFF, и посмотри, что выйдет.