ATtiny26L, его замечательный АЦП, входной уровень и пропадающее прерывание
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Регина Дубовицкая 22 октября 2004 г. 08:34

Выполняю измерения напряжения на датчике несколько раз в минуту с помощью контроллера ATtiny26L.
Измеряемое напряжение подаётся на вход ADC7 относительно GND.
Между циклами контроллер сбрасывают извне импульсом на входе RESET.
Код приведён далее.

Теперь о сути проблемы.
Всё работает верно, т.е. процедура _MEASUREMENT отрабатывает от начала до конца и выдаёт адекватный результат измерения, -

но только пока уровень сигнала на входе ADC7 не превысит 0.5 от опорного напряжения АЦПэ.
Когда это случится, измерение #2 (см. код) не хочет завершаться, т.е. цикл АЦП виснет, не завершаясь прерыванием!
При этом цикл #1 всегда благополучно отрабатывается.

Если второй цикл не пройдёт хотя бы один раз, то он больше никогда не пройдёт (до отключения-вновь-включения питания),

какое бы напряжение на вход ADC7 ни подавали. Напоминаю: сброс между циклами и первый цикл всегда проходит.

Если команды sleep заменить на цикл ожидания по флагу ADIF из управляющего регистра ADCSR, картина та же, т.е. при сбое

этот флаг во втором цикле измерения не устанавливается.

Между первым и вторым циклом никаких прочих событий (прерываний) нет.

Использую чипы ATTINY26L-16SI 0416, уже три штуки опробовал - результат одинаковый.

Питание стационарное, блокировка хорошая.

Тактирование внутреннее 1MHz от встроенного осциллятора.

НИКОГДА такого не видел! Вот первый раз увидел и делюсь своей "радостью".
Тихо едет крыша.
Help me. Please. Хорошим советом.
Спасибо за внимание.


Код:

.DEF tmp=r16
.ORG ADCCaddr ; ADC conversion complete Interrupt Vector Address
rjmp _ADC_DONE

; Прерывание по завершению преобразования ADC
_ADC_DONE:
ret

; сюда выходим при измерении
_MEASUREMENT:
ldi tmp,0x22 ; sleep == idle
out MCUCR,tmp

ldi tmp,0x3F ; Вход = GND, Vref=Vcc
out ADMUX,tmp
ldi tmp,0x89 ; ADC on
out ADCSR,tmp
sbi ADCSR,ADSC ; #1 (первый цикл - ) измерение впустую (68uS)
sei ; ожидалка
sleep ; <---- этот цикл всегда проходит успешно.

ldi tmp,0xA7 ; выбираем вход с ADC7, Vref = Uint = 2.56V
out ADMUX,tmp

sbi ADCSR,ADSC ; #2 Старт ADC. (52uS)
sei ; ожидалка
sleep ; <---- вот здесь мы остаёмся при загадочном сбое.

in tmp,ADCL ; <---- вот сюда выходим, когда сбоя нет.
in tmp,ADCH
sts UVALUE,tmp

ldi tmp,0x3F
out ADMUX,tmp
ldi tmp,0 ; отключамс
out ADCSR,tmp
ret

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru