Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Прерывания ATMEGA88


Прерывания ATMEGA88

Сообщений 1 страница 5 из 5

1

Здравствуйте, есть проект, работает по прерываниям PCINT, проблема в том, что по отдельности каждое из прерываний работает, если закомментировать другие действия, но если попытаться раскомментировать, то работает одно из них,остальные не действуют, как будто прерываний не происходит:

Код:
$regfile = "m88def.dat"
$crystal = 8000000



ddrb = &B01111111
portb = &B01111111
Config Pind.0 = Input
Config Pind.4 = Input
Config Pind.7 = Input
Config Pinb.7 = Input


'Enable Pcint0
PCICR.PCIE0=1
Pcmsk0 = &B10000000
On Pcint0 isr2 nosave
'Enable Pcint2
PCICR.PCIE2=1
Pcmsk2 = &B10010001
On Pcint2 isr2 nosave
Enable Interrupts


do

loop
end


'isr0:
   if  Pinb.7  = 1 then portb = &B00101000 else  portb = &B01111111
'   PCIFR.PCIF0=1
'return


isr2:  ' действия при прерывании
   if  Pind.4 = 0 then portb = &B00010000 else  portb = &B01111111
   if  Pind.7  = 0 then portb = &B01111100 else  portb = &B01111111
   if  Pind.0  = 1 then portb = &B00001010 else  portb = &B01111111
   if  Pinb.7  = 1 then portb = &B00101000 else  portb = &B01111111


'   PCIFR.PCIF2=1
return 

По поиску в других темах ,решения не нашел

0

2

nosave подразумевает что регистры будут сохранены в прерывании, но этого нет в коде.

0

3

В общем поковырял примеры, нашел ,вроде работает, но портянка кода большая и ассемблерные вставки, может кому понадобится

Код:
$regfile = "m88def.dat"
$crystal = 8000000
$baud = 9600

Const Const_used_pinb = &B_1000_0000
Const Const_used_pinc = &B_0011_1000
Const Const_used_pind = &B_1001_0001
Dim mask_pcint_0 As Byte
Dim mask_pcint_1 As Byte
Dim mask_pcint_2 As Byte
Dim status_pcint_0 As Byte
Dim status_pcint_1 As Byte
Dim status_pcint_2 As Byte       ' Ïåðåìåííàÿ äëÿ õðàíåíèÿ íàæàòîé êíîïêè
!ldi R16 , Const_used_pinb       ' ïîëó÷àåì ìàñêó, èíâåðòèðîâàíèåì èñïîëüçóåìûõ ïèíîâ
!com R16
!sts {mask_pcint_0} , R16

!ldi R16 , Const_used_pinc       ' ïîëó÷àåì ìàñêó, èíâåðòèðîâàíèåì èñïîëüçóåìûõ ïèíîâ
!com R16
!sts {mask_pcint_1} , R16

!ldi R16 , Const_used_pind       ' ïîëó÷àåì ìàñêó, èíâåðòèðîâàíèåì èñïîëüçóåìûõ ïèíîâ
!com R16
!sts {mask_pcint_2} , R16

Ddrb = mask_pcint_0       ' Êîíôèãóðèðóåì èñïîëüçóåìûå âûâîäû ÌÊ íà âõîä
Ddrc = mask_pcint_1       ' Êîíôèãóðèðóåì èñïîëüçóåìûå âûâîäû ÌÊ íà âõîä
Ddrd = mask_pcint_2       ' Êîíôèãóðèðóåì èñïîëüçóåìûå âûâîäû ÌÊ íà âõîä

Pcmsk0 = Const_used_pinb
Pcmsk1 = Const_used_pinc
Pcmsk2 = Const_used_pind       '  äàííîì ñëó÷àå âûñòàâëåíî ðàçðåøèòü ïðåðûâàíèÿ: PCINT16; PCINT18 - PCINT23

On Pcint0 isr0 nosave
On Pcint1 isr1 nosave
On Pcint2 isr2 nosave
Enable Pcint0
Enable Pcint1
Enable Pcint2


Enable Interrupts


do
   print bin(status_pcint_0);" ";status_pcint_0;
   print " ";bin(status_pcint_1);" ";status_pcint_1;
   print " ";bin(status_pcint_2);" ";status_pcint_2
   waitms 100
loop
end


isr0:
   !Push R30       ' Ñîõðàíÿåì èñïîëüçóåìûå â ïðåðûâàíèè ðåãèñòðû
   !In R30 , Sreg       ' Ò.ê., èñïîëüçóþòñÿ ëîãè÷åñêèå îïåðàöèè, îáÿçàòåëüíî ñîõðàíÿåì SREG
   !Push R30       ' Ñîõðàíÿåì SREG
   !push R31       ' Ñîõðàíÿåì èñïîëüçóåìûå â ïðåðûâàíèè ðåãèñòðû

   !in R30 , Pinb       ' ×èòàåì ïîðò

   !lds R31 , {mask_pcint_0}       ' Ñ÷èòûâàåì ìàñêó äëÿ îáðåçàíèÿ íåíóæíûõ áèò
   !OR R30 , R31       ' Îáðåçàåì ïî ìàñêå èñïîëüçóåìûõ âûâîäîâ ÌÊ

   !andi R30 , Const_used_pinb
'    !com R30       ' Ïîáèòíàÿ èíâåðñèÿ, ìîæåò êîãäà è ïðèãîäèòñÿ

   !sts {status_pcint_0} , R30       ' Çàáèðàåì â ïåðåìåííóþ íàæàòóþ êíîïêó

   !Pop R31       ' Âîññòàíàâëèâàåì ðàíåå ñîõðàí¸ííûå ðåãèñòðû
   !Pop R30       ' Âîññòàíàâëèâàåì ðàíåå ñîõðàí¸ííûé SREG
   !Out Sreg , R30       ' Âîññòàíàâëèâàåì ðàíåå ñîõðàí¸ííûé SREG
   !pop R30       ' Âîññòàíàâëèâàåì ðàíåå ñîõðàí¸ííûå ðåãèñòðû

   !reti

isr1:
   !Push R30       ' Ñîõðàíÿåì èñïîëüçóåìûå â ïðåðûâàíèè ðåãèñòðû
   !In R30 , Sreg       ' Ò.ê., èñïîëüçóþòñÿ ëîãè÷åñêèå îïåðàöèè, îáÿçàòåëüíî ñîõðàíÿåì SREG
   !Push R30       ' Ñîõðàíÿåì SREG
   !push R31       ' Ñîõðàíÿåì èñïîëüçóåìûå â ïðåðûâàíèè ðåãèñòðû

   !in R30 , Pinc       ' ×èòàåì ïîðò

   !lds R31 , {mask_pcint_1}       ' Ñ÷èòûâàåì ìàñêó äëÿ îáðåçàíèÿ íåíóæíûõ áèò
   !OR R30 , R31       ' Îáðåçàåì ïî ìàñêå èñïîëüçóåìûõ âûâîäîâ ÌÊ

   !andi R30 , Const_used_pinc
'    !com R30       ' Ïîáèòíàÿ èíâåðñèÿ, ìîæåò êîãäà è ïðèãîäèòñÿ

   !sts {status_pcint_1} , R30       ' Çàáèðàåì â ïåðåìåííóþ íàæàòóþ êíîïêó

   !Pop R31       ' Âîññòàíàâëèâàåì ðàíåå ñîõðàí¸ííûå ðåãèñòðû
   !Pop R30       ' Âîññòàíàâëèâàåì ðàíåå ñîõðàí¸ííûé SREG
   !Out Sreg , R30       ' Âîññòàíàâëèâàåì ðàíåå ñîõðàí¸ííûé SREG
   !pop R30       ' Âîññòàíàâëèâàåì ðàíåå ñîõðàí¸ííûå ðåãèñòðû

   !reti


return

isr2:

   !Push R30       ' Ñîõðàíÿåì èñïîëüçóåìûå â ïðåðûâàíèè ðåãèñòðû
   !In R30 , Sreg       ' Ò.ê., èñïîëüçóþòñÿ ëîãè÷åñêèå îïåðàöèè, îáÿçàòåëüíî ñîõðàíÿåì SREG
   !Push R30       ' Ñîõðàíÿåì SREG
   !push R31       ' Ñîõðàíÿåì èñïîëüçóåìûå â ïðåðûâàíèè ðåãèñòðû

   !in R30 , Pind       ' ×èòàåì ïîðò

   !lds R31 , {mask_pcint_2}       ' Ñ÷èòûâàåì ìàñêó äëÿ îáðåçàíèÿ íåíóæíûõ áèò
   !OR R30 , R31       ' Îáðåçàåì ïî ìàñêå èñïîëüçóåìûõ âûâîäîâ ÌÊ

   !andi R30 , Const_used_pind
'    !com R30       ' Ïîáèòíàÿ èíâåðñèÿ, ìîæåò êîãäà è ïðèãîäèòñÿ

   !sts {status_pcint_2} , R30       ' Çàáèðàåì â ïåðåìåííóþ íàæàòóþ êíîïêó

   !Pop R31       ' Âîññòàíàâëèâàåì ðàíåå ñîõðàí¸ííûå ðåãèñòðû
   !Pop R30       ' Âîññòàíàâëèâàåì ðàíåå ñîõðàí¸ííûé SREG
   !Out Sreg , R30       ' Âîññòàíàâëèâàåì ðàíåå ñîõðàí¸ííûé SREG
   !pop R30       ' Âîññòàíàâëèâàåì ðàíåå ñîõðàí¸ííûå ðåãèñòðû

   !reti

return

Отредактировано stas732 (2020-01-14 17:30:33)

0

4

Как искали ? ;)
Так вот тут Прерывания INT0, INT1, PCINTx Atmega8_88_328 Александр все разложил... ;)

0

5

Да, на основе этого и пришлось реализовать, предполагал,что будет проще, штатными средствами

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Прерывания ATMEGA88