Обсуждаем контроллеры компании Atmel.
Ответить

Не работает компаратор ATMega 88

Пн апр 15, 2024 10:11:17

Происходит какая-то фигня, не пойму в чём глобальная проблема.
Хочу использовать компаратор. В микроконтроллере ATMega 88. Включаю его програмно (код настроек генерится мастером среды разработки CodeVision AVR V3.40) на сравнение внешних напряжений. У него как и положено два входа, подключенных к ножкам контроллера AIN0, AIN1. И выход, который можно опрашивать програмно - системная 1 битная ACO. И вот всех книгах, интернетах и даташитах пишут, что АСО выставляется в ноль или единицу по результатам сравнения напряжений на входах (через пару тактов). Так и делаю - электрически подаю разные напряжения на входы. Контролирую входы осциллографом на всякий пожарный - всё есть. Один вход 2,5 вольта, второй либо 2, либо 3 вольта. Или один вход - лог. 1, другой - лог. 0. И меню их местами.
Но на выходе компаратора (значение АСО) всё время нулевое. Что только не делал. Выводил в порт напрямую, присваивал переменной и проч. Результат тот же. Проверял с разными вариантами программы и способах подачи входных напряжений 5 микросхем АТ88 (даже в разных корпусах) и одну АТ48. Естественно, проверяю работу портов - если без компаратора, всё отлично работает. Сначала на макетке, потом в фирменной отладочной плате.
Одинаково!

Такое чувство, что там что-то залочено. Но все описания говорят, что никаких хитрых локов - включил, и работает. А вот нифига!

Даже не знаю, где копать... :facepalm:

PS. В электронике силён, так что электрически делаю всё правильно.

Re: Не работает компаратор ATMega 88

Пн апр 15, 2024 10:21:22

а вот мы в ясновидении не сильны. поэтому не знаем, куда копать, чтобы узнать, что ты там написал в своей программе.

Re: Не работает компаратор ATMega 88

Пн апр 15, 2024 11:47:30

Смотрим в каком режиме работают линии портов ввода/вывода соответствующие выбранным входам компаратора (DIDR1).
(или те, куда мультиплексор для AIN1 указывает)
8)

Re: Не работает компаратор ATMega 88

Пн апр 15, 2024 20:51:47

Спасибо, ребята!
Я его победил!
Компилятор не видит значение бита ACO из регистра ACSR, несмотря на то, что его понимает и не ругается. Поэтому проверка бита АСО не срабатывает.
Вот такой "дубовый" код работает:

i = ACSR & 0b00100000; // маскируем управляющий регистр компаратора, оставляем только бит АСО
if (i)
{
PORTB.7 = 1;
}
else
{
PORTB.7 = 0;

Закрываем тему.
Ответить