ATTINY2313A. Не работают внешние прерывания по входам PCINT(0-7) при включённом UART.
- Войдите на сайт для отправки комментариев
Чт, 18/03/2021 - 02:16
Пишу программу для ATTINY2313, заливаю в ATTINY2313A, возникла непонятная проблема: при включённом UART (RXD=PD0, TXD=PD1), не работают внешние прерывания по входам PCINT(0-7) (PB0-PB7), чтобы внешние прерывания начинали работать, необходимо выключать UART, записывая в регистр UCSRB значение 0x00, то есть полностью выключать UART. Возникает вопрос: почему так происходит, если эти 2 функции не имеют общих регистров, векторов прерывания и выводов контроллера???
Исходный текст приведите. Только то, что касается UART и PCINT.
подпишусь
Читайте даташит. 2313 и 2313А отличаются реализацией PCINT. В 2313 один вектор прерывание, В 2313А несколько векторов прерывания.
Дополнение. Может быть я не правильно вас понял. Вы знаете про отличия, и спрашиваете - почему не работает, если ничто вроде мешать не должно. Тогда не знаю. Надо копаться, как там происходит инициализация и т.д.
Ну так ТС ведь не использует фишки А, а всё что касается PCINT0-7, с виду, одинаково что с А, что без.
......... Читайте даташит. 2313 и 2313А отличаются реализацией PCINT. В 2313 один вектор прерывание, В 2313А несколько векторов прерывания......
Дело в том, что я использую одинаковые для обоих контроллеров модули (выводы PCINT(0-7)), и здесь для обоих контроллеров должна быть полная совместимость, по крайней мере так заявляет производитель.
Кстати, забыл указать, что программу отлаживаю в симулятор Proteus 7, в железе, программа работает как-то неадекватно, но это я дальше буду искать ошибки.
По поводу текста программы, он написан на ассемблере и не знаю есть ли смысл его приводить.
DEL
У вас в протеусе есть модель ATTINY2313A? У меня в Proteus8 только ATTINY2313.
Да, в протеусе ATTINY2313, в железе будет ATTINY2313A. Файл прошивки написан для ATTINY2313,
include "TN2313DEF.INC - подключённый файл описания контроллера. Но вопрос то это не отменяет, почему внешние прерывания и UART так конфликтуют между собой. В железо код заливал, там ситуация хуже (возможно есть ещё ошибки в коде), пока я бы хотел ограничиться основным вопросом (UART и внешние прерывания). Сразу скажу значения остальных регистров тоже менял (UCSRA, UCSRC, UBRRH, UBRRL, UDR), на внешние прерывания влияет только регистр UCSRB!!! Ну судя по всему, потому-что он включает и отключает UART!!!
Поверил на Proteus8 и ATTINY2313, В тестовой программе Включенный и постоянно работающий на передачу USART не мешает срабатыванию PCINT0.
Заметил одну особенность. По даташиту после сброса UCSRC = 0b00000110, а в Протеусе после сброса UCSRC = 0b00100110, т.е. с включенными контролем четности.
Вот сам проект:
https://forum.cxem.net/applications/core/interface/file/attachment.php?id=748221
что в 7-ом, что в 8-ом протеусе работает одинаково.
Если закомментировать строчку
out UCSRB, temp1
перед которой стоит строчка
ldi temp1, 0x00
в одном из файлов (или в обоих файлах) init.inc или vychbutton.inc начинается глюк.
Кстати, забыл указать, что программу отлаживаю в симулятор Proteus 7
"Отлаживаю" - это "запускаю" или "пользуюсь Отладчиком"?
Если закомментировать указанные вами строки и использовать отладчик, то в отладчике видно, что программа постоянно вызывает прерывание "USART0 Data Register Empty".
Учитесь пользоваться отладчиком, пригодится.
Благодарю, выключил все прерывания по UART, вроде помогло. Только я что-то не совсем понял, данное прерывание, оно что постоянно генерируется???