Страница 1 из 1

Помогите разобраться с компаратором в Attiny 13a

Добавлено: Пн июл 15, 2019 07:11:07
sharmax
Коллеги, добрый день! В микроконтроллерах я еще пока как слепой котенок, но очень надеюсь на вашу помощь.
Пятый день уже не могу понять, как работает аналоговый компаратор в Attiny 13A... По порядку:
1. Собираем на макетной плате схему - см. вложение.
2. В мастер-построителе программ Code vision AVR конфигурирую порт 2 как выходной с нулевым исходным состоянием, все остальные порты - на вход, но у pb0 и pb1 подтяжку не включаю, у остальных (неиспользуемых) - включаю. Также на вкладке "компаратор" включаю этот компаратор, соответствующей галочкой подключаю ИОН к выводу 5. Неясными остаются назначения галочек "Negative input multiplexer" и "Disable digital input buffers" (1 и 2) - их не трогаю. Галочку "Analog comparator interrupt" также оставляю выключенной, посколько пока еще не до прерываний.
3. Дополняю заготовку программы соответствующим циклом if - else, который отслеживает состояние бита ACO и соответствующим образом изменяет состояние порта 2, к которому подключен контрольный светодиод.


#include <tiny13a.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=Out Func1=In Func0=In
// State5=P State4=P State3=P State2=0 State1=T State0=T
PORTB=0x38;
DDRB=0x04;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Analog Comparator initialization
// Analog Comparator: On
// The Analog Comparator's positive input is
// connected to the Bandgap Voltage Reference
ACSR=0x40;
ADCSRB=0x00;
// Digital input buffer on AIN0: Off
// Digital input buffer on AIN1: Off
DIDR0=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

while (1)
{if (ACO==1) {PORTB.2=1;}
else {PORTB.2=0};
};
}
4. Дальше как обычно - прошиваю МК и устанавливаю его в макетную плату, подаю напряжение. И ничего не происходит - при любом положении движка подстроечного резистора светодиод гореть не желает. На 5 выводе МК напряжение 0,5В, неизменно (хотя, как я понимаю, должно быть 1,2В - мы же подключили к нему ИОН), на 6 выводе напряжение, как и положено, изменяется в зависимости от угла поворота движка.
Также проводил опыт - отключал ИОН от 5 вывода и подавал на него 3В с резистивного делителя - компаратор по прежнему работать не хочет.
Что я делаю не так? Заранее спасибо за ответы.

Re: Помогите разобраться с компаратором в Attiny 13a

Добавлено: Пн июл 15, 2019 09:00:43
Dimon456
Либо так

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

if ((ACSR & (1<<(ACO))) == 0)
или так

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

if ((ACSR & (1<<(ACO))) != 0)

Re: Помогите разобраться с компаратором в Attiny 13a

Добавлено: Пн июл 15, 2019 09:09:08
Ivanoff-iv
в твоем случае надо писать не
if (ACO==1)....
а
if (ACSR.ACO==1)....
т.к. АСО это просто константа ==5 указывает на то что параметр АСО в тини 13 занимает 5й бит регистра (ACSR)

Добавлено after 3 minutes 8 seconds:
меня опередили...
я написал по КвАВРовски, такая запись считается нестандартной но, ТСу, думаю так будет более понятно, потому и не стал стирать свой пост.
Dimon456 привел более универсальный код (он не ограничивается областью регистров доступных для битовых операций и работает не только в КвАВР)

Re: Помогите разобраться с компаратором в Attiny 13a

Добавлено: Пн июл 15, 2019 09:29:24
akl
sharmax писал(а):На 5 выводе МК напряжение 0,5В, неизменно (хотя, как я понимаю, должно быть 1,2В - мы же подключили к нему ИОН)
Уточню. На 5 лапу (+AIN0) включенная встроенная опора не выводится.

Re: Помогите разобраться с компаратором в Attiny 13a

Добавлено: Пн июл 15, 2019 17:36:57
sharmax
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3666315#p3666315"]в твоем случае надо писать не
if (ACO==1)....
а
if (ACSR.ACO==1)....[/uquote]
Огромное спасибо! Помогло.
Ну а смысл галочек "Negative input multiplexer" и "Disable digital input buffers" (1 и 2) в чем состоит, сможете рассказать?

Re: Помогите разобраться с компаратором в Attiny 13a

Добавлено: Пн июл 15, 2019 18:50:24
Ivanoff-iv
на входах компаратора есть переключатели... с одним входом ты разобрался он переключается на встроенный источник (нога при этом освобождается и может быть задействована для других целей), второй вход тоже может быт переключен со своей ноги, он переключается на вход АЦП, а какая это будет нога, зависит от настроек АЦП...
—————
дисейбл диджитал буфер — отключает ногу от стандартного применения (порт, пин, ддр) делая невозможным "ногодрыг" на ней, а также исключает случайное переключение и немного снижает энергопотребление...