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

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб янв 28, 2012 21:09:29

Сообщение 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В с резистивного делителя - компаратор по прежнему работать не хочет.
Что я делаю не так? Заранее спасибо за ответы.
Вложения
post-2266-0-05465000-1562851614_thumb.jpg
(8.42 КБ) 494 скачивания
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Либо так

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

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

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

if ((ACSR & (1<<(ACO))) != 0)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

в твоем случае надо писать не
if (ACO==1)....
а
if (ACSR.ACO==1)....
т.к. АСО это просто константа ==5 указывает на то что параметр АСО в тини 13 занимает 5й бит регистра (ACSR)

Добавлено after 3 minutes 8 seconds:
меня опередили...
я написал по КвАВРовски, такая запись считается нестандартной но, ТСу, думаю так будет более понятно, потому и не стал стирать свой пост.
Dimon456 привел более универсальный код (он не ограничивается областью регистров доступных для битовых операций и работает не только в КвАВР)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

sharmax писал(а):На 5 выводе МК напряжение 0,5В, неизменно (хотя, как я понимаю, должно быть 1,2В - мы же подключили к нему ИОН)
Уточню. На 5 лапу (+AIN0) включенная встроенная опора не выводится.
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 78
Зарегистрирован: Сб янв 28, 2012 21:09:29

Сообщение 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) в чем состоит, сможете рассказать?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

на входах компаратора есть переключатели... с одним входом ты разобрался он переключается на встроенный источник (нога при этом освобождается и может быть задействована для других целей), второй вход тоже может быт переключен со своей ноги, он переключается на вход АЦП, а какая это будет нога, зависит от настроек АЦП...
—————
дисейбл диджитал буфер — отключает ногу от стандартного применения (порт, пин, ддр) делая невозможным "ногодрыг" на ней, а также исключает случайное переключение и немного снижает энергопотребление...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Ответить

Вернуться в «AVR»