Страница 1 из 1

проблема с прерываниями на tiny2313

Добавлено: Вт фев 19, 2008 21:19:54
Jenya_2
проблема с прерываниями на tiny2313
Господа, подскажите!
написал программу на тини 2313, которая принимает в порт(в5) времяимпульсный сигнал. По результату декодирования зажигает светодиоды, мигает ими...
мигание реализовал через прерывания от таймера 0...
так вот, если во время входа в прерывание, замкнуть вход порта(в5) на 0 или 1, то прерывания прекращают прерываться, вроде как флаг сбрасывается!
но в программе я ничего не сбрасываю...если даю в порт следующую команду(посылку импульсов), она снова декодируется,и все нормально до момента подачи шума в порт.
ставил nop-ы между командами cbi,sbi, да и в случайных местах- что-то меняется...(прерывания глючат через раз ) или виснет основная прог.(декодер импульсов) ,но правильно все равно не работает,в эмуляторе- avr studio, все работает нормально!
Помогите, может кто сталкивался с подобным????

файл, с кодом прилагается....


передатчик включается только на время передачи команды, остальное время он выключен
(то есть в приемнике слышен шум!). А приемник должен отображать последнюю команду,
пока сброс не нажать.. И пищалка при этом прерывисто пищать! а шум ее останавливает.
Даже хватает просто коснуться портом + или -, и все,таймер как будто останавливается, (не мигает)
(это без радиоканала уже, на проводах связь). После подачи следующей команды, все нормально, до
следующего "шума "

мигание это, т.е. пищание , я сделал по прерыванию (переполнению) таймера 0, оно,
(только одно прерывание)
разрешается в начале программы и больше не запрещается. Вложенных прерываний- нет!
стек? по идее не должен переполняться,хотя как это точно проверить?
в обработчике как и в основной программе, есть много
команд условного перехода,проверка состояния портов, может оно мешает прерыванию?


заранее спасибо!

Добавлено: Вт фев 19, 2008 22:11:53
Reboot_s
Ответ очень прост!
В программе три четверти можно выкинуть, это все мусор.
Во первых:

rjmp Reset ;вектора прерываний
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt
rjmp Timer1_compa ;*** совпадение таймера 1
rjmp Timer1_OVF ;*** переполнение таймера 1
rjmp Timer0_OVF ;*** переполнение таймера 0
*****************************************
rjmp USART0_RX
rjmp USART0_UDRE
rjmp USART0_TX
rjmp ANALOG_COMP
rjmp PCINT
rjmp Timer1_compB
rjmp Timer1_compA
rjmp Timer0_compB
rjmp USI_START
rjmp USI_OVERFLOW
rjmp EE_READY
rjmp WDT_OVERFLOW
nop
nop
nop
nop
nop

Здесь только одна рабочая строка:
rjmp Reset
Все остальные строки пропускаются.

Прерывание задается с момощью векторов перываний по опредленному адресу, к примеру по переполнению таймера 0 будет:
.org $006
rjmp Timer0_OVF ;*** переполнение таймера 0

Во вторых:
Повыкидывай команды nop! Они применяются очень редко, в случае когда какая-то апаратная функция МК требует пару временных циклов для срабатывания.

В третьих:
Четко определи, как ты хочешь, что МК реагировал на входной импульс. Как на изменение состояние порта или как на внешнее перерывание.

Почисти программу и попробуй снова. Если возникнут новые вопросы - пиши.

Добавлено: Вт фев 19, 2008 22:47:46
Reboot_s
Запись
rjmp Timer1_OVF
тоже правильна, но все остальные нужно поотключать, они не используются.

Добавлено: Ср фев 20, 2008 10:35:31
Jenya_2
здравствуйте!
хочу сказать, что nop-ы я сначала вообще не ставил, поставил когда ничего не помогало... и добился более менее стабильной работы...какая зависимость???? если "nop" ничего не делает,кроме задержки в 1 такт????
согласен, много неиспользуемых строк, но они и не мешают...?
прерывания должны срабатывать независимо от того, какая команда выполняется, нужная или не нужная... или я не прав?

заранее спасибо...

Добавлено: Ср фев 20, 2008 11:49:11
Reboot_s
Правы, перывание от того и прерыванием зовется, что прерывает выполнение любой команды.
Но неиспользуемые прерывание во избежание глюков должны быть исключены.
Если вы обращаетесь за помощью, то выявляйте уважение к тем к кому обращаетесь. Почему кто-то должен разбиратся в вашй проге, все там исправлять, а вы даже не хотите хотя бы визуально уменьшить ее.
Ведь есть разница читать текст программы на одну страницу и на две?

И поверьте мне, или возьмите любую прошивку от действующего устройства - nop используются или для созданий подпрограм микрозадержек или для успешного срабатывания апаратной части, что редко требуется. На стабильность они не влияют никаким образом, ваша проблема в ошибках алгоритма.