Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
12f629 таймер и прерывания
sa137 Дата: Вс, 07.08.2011, 22:12  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 33
Репутация: 0   ±
Замечания:   ±
На сайте с 04.07.2011

Статус: Offline

объясните странное (с мой взгляд) поведение такого кода

##################
'pin1 +V power
'..
'pin7 GPIO0 output LED
'pin8 GND

@ DEVICE WDT_OFF, MCLR_OFF, INTRC_OSC_NOCLKOUT, INTRC_OSC, BOD_OFF

' Define clock options
DEFINE OSC 4
Define OSCCAL_1K 1 ' Set OSCCAL for 1K device

' setup trig & pin
CMCON =%00000111 ' DISABLE COMPARATOR
TRISIO =%00000000 ' all pin output
OPTION_REG = %10000111 ' делитель 1/256, подтяжка резисторов выключена
INTCON =%00100000 ' прерывание по переполнению tmr0

' define variables
i var byte

'alias
LED var GPIO.0
OUT var GPIO.1

On Interrupt GoTo display

i=0

main:
goto main

disable
display:
toggle out

if i>=16 then
toggle LED
i=0
else
i=i+1
endif
resume
enable

#################

на GPIO.1 имею меандр ~ 19kHz, как по мне должно быть около 15Гц !



светодиод бледно горит.
Прикрепления: 0954836.png (245.4 Kb)
ЯНДЕКС Дата: 07.08.2011
DAlexV Дата: Вс, 07.08.2011, 23:51  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (sa137)
объясните странное (с мой взгляд) поведение такого кода
Абсолютно ни чего странного. Завис в прерывании. Если уж разрешаем прерывание, то и не забываем сбрасывать его флаг(T0IF в данном случае). Иначе после выхода из прерывания(без сброса флага) будет происходить повторный вход в обработчик. Тема уже не раз поднималась.
http://www.picbasic.ru/forum/9-19-1
http://www.picbasic.ru/forum/9-360-4043-16-1267778550

И далее по форуму .......


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
sa137 Дата: Пн, 08.08.2011, 22:38  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 33
Репутация: 0   ±
Замечания:   ±
На сайте с 04.07.2011

Статус: Offline

Quote (DAlexV)
Завис в прерывании. Если уж разрешаем прерывание, то и не забываем сбрасывать его флаг


правильно ли я понимаю, что тогда нужно написать так :

disable
display:
INTCON = %10000000 'Запрет прерываний битами
toggle out

if i>=16 then
toggle LED
i=0
else
i=i+1
endif
T0IF = 0 'Сбросим флаг прерывания
INTCON = %10010000 'Разрешение внешнего прерывания и сброс флага
resume
enable

или можно синие строки не писать?

Добавлено (08.08.2011, 22.38.57)
---------------------------------------------
понял свою ошибку .
заработало так:

disable
display:
toggle out

if i>=16 then
toggle LED
i=0
else
i=i+1
endif
INTCON.2 = %00000100 ' Ñáðîñèì ôëàã ïðåðûâàíèÿ T0IF
resume
enable

DAlexV Дата: Сб, 13.08.2011, 00:42  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Можно конечно и таким образом поступить, но правильнее сбрасывать битами(особенно если планируется использовать другие прерывания) дабы не зацепить случайно другие флаги и биты состояний

Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
  • Страница 1 из 1
  • 1
Поиск: