ATTINY2313A. Не работают внешние прерывания по входам PCINT(0-7) при включённом UART.

Alex_Ferrum
Offline
Зарегистрирован: 04.05.2015

Пишу программу для ATTINY2313, заливаю в ATTINY2313A, возникла непонятная проблема: при включённом UART (RXD=PD0, TXD=PD1), не работают внешние прерывания по входам PCINT(0-7) (PB0-PB7), чтобы внешние прерывания начинали работать, необходимо выключать UART, записывая в регистр UCSRB значение 0x00, то есть полностью выключать UART. Возникает вопрос: почему так происходит, если эти 2 функции не имеют общих регистров, векторов прерывания и выводов контроллера???

Green
Offline
Зарегистрирован: 01.10.2015

Исходный текст приведите. Только то, что касается UART и PCINT.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

подпишусь

Bruzzer
Offline
Зарегистрирован: 17.03.2020

Alex_Ferrum пишет:
Пишу программу для ATTINY2313, заливаю в ATTINY2313A,

Читайте даташит. 2313 и 2313А отличаются реализацией PCINT. В 2313 один вектор прерывание, В 2313А несколько векторов прерывания.

Дополнение. Может быть я не правильно вас понял. Вы знаете про отличия, и спрашиваете - почему не работает, если ничто вроде мешать не должно. Тогда не знаю. Надо копаться, как там происходит инициализация и т.д.

Green
Offline
Зарегистрирован: 01.10.2015

Bruzzer пишет:
Читайте даташит. 2313 и 2313А отличаются реализацией PCINT. В 2313 один вектор прерывание, В 2313А несколько векторов прерывания.

Ну так ТС ведь не использует фишки А, а всё что касается PCINT0-7, с виду, одинаково что с А, что без.

Alex_Ferrum
Offline
Зарегистрирован: 04.05.2015

Bruzzer пишет:

......... Читайте даташит. 2313 и 2313А отличаются реализацией PCINT. В 2313 один вектор прерывание, В 2313А несколько векторов прерывания......


Дело в том, что я использую одинаковые для обоих контроллеров модули (выводы PCINT(0-7)), и здесь для обоих контроллеров должна быть полная совместимость, по крайней мере так заявляет производитель.
Кстати, забыл указать, что программу отлаживаю в симулятор Proteus 7, в железе, программа работает как-то неадекватно, но это я дальше буду искать ошибки.
По поводу текста программы, он написан на ассемблере и не знаю есть ли смысл его приводить.

Bruzzer
Offline
Зарегистрирован: 17.03.2020

DEL

Bruzzer
Offline
Зарегистрирован: 17.03.2020

У вас в протеусе есть модель ATTINY2313A? У меня в Proteus8 только ATTINY2313.

Alex_Ferrum
Offline
Зарегистрирован: 04.05.2015

Да, в протеусе ATTINY2313, в железе будет ATTINY2313A. Файл прошивки написан для ATTINY2313,
include "TN2313DEF.INC - подключённый файл описания контроллера. Но вопрос то это не отменяет, почему внешние прерывания и UART так конфликтуют между собой. В железо код заливал, там ситуация хуже (возможно есть ещё ошибки в коде), пока я бы хотел ограничиться основным вопросом (UART и внешние прерывания). Сразу скажу значения остальных регистров тоже менял (UCSRA, UCSRC, UBRRH, UBRRL, UDR), на внешние прерывания влияет только регистр UCSRB!!! Ну судя по всему, потому-что он включает и отключает UART!!!

Bruzzer
Offline
Зарегистрирован: 17.03.2020

Поверил на Proteus8 и ATTINY2313, В тестовой программе Включенный и постоянно работающий на передачу USART не мешает срабатыванию PCINT0.

Заметил одну особенность. По даташиту после сброса UCSRC = 0b00000110, а в Протеусе после сброса UCSRC = 0b00100110, т.е. с включенными контролем четности.

 

Alex_Ferrum
Offline
Зарегистрирован: 04.05.2015

Вот сам проект:

https://forum.cxem.net/applications/core/interface/file/attachment.php?id=748221

что в 7-ом, что в 8-ом протеусе работает одинаково.

Если закомментировать строчку

out UCSRB, temp1

перед которой стоит строчка

ldi temp1, 0x00

в одном из файлов (или в обоих файлах) init.inc или vychbutton.inc начинается глюк.

Bruzzer
Offline
Зарегистрирован: 17.03.2020

Alex_Ferrum пишет:

Кстати, забыл указать, что программу отлаживаю в симулятор Proteus 7

"Отлаживаю" - это "запускаю" или "пользуюсь Отладчиком"?

Если закомментировать указанные вами строки и использовать отладчик, то в отладчике видно, что программа постоянно вызывает прерывание "USART0 Data Register Empty".

Учитесь пользоваться отладчиком, пригодится.

Alex_Ferrum
Offline
Зарегистрирован: 04.05.2015

Благодарю, выключил все прерывания по UART, вроде помогло. Только я что-то не совсем понял, данное прерывание, оно что постоянно генерируется???