BASCOM-AVR: Nefungujúci prerušenia z INT0 u Atmega644P

Zdravim Vas, zacinam sa ucit programovat AVR v jazyku Bascom avsak mam problem s jednym programom. Chcel som si na nom vyskusat prerusenie ale nefunguje to tak ako som si predstavoval :slight_smile:. V skratke ma ist o to ze pomocou jedneho tlacitka si prepinam dva programy pre ovladanie LED co mi ako tak funguje. Dalsie tlacitko som pouzil pre funkciu prerusenia a to mi uz nechodi a malo by to fungovat tak ze po prichode vzostupnej hrany na INT0 program skoci na podprogram P a rozsvieti niektore LED na porte B. Vedel by mi niekto pomoct kde robim chybu? Viem ze je tam kopec veci ktore by sa dali spravit jednoduhsie ale ucim sa :slight_smile: Dakujem Vam a prikladam program

[code]'Knižnica pre výber MCU
'Nastavenie frekvencie na 8MHz
$regfile = “m644def.dat”
$crystal = 8000000

'Deklarácia portu B ako výstupu
'Deklarácia portu A ako vstupu
'Nastavenie prerušenia INT0 tak aby reagoval na vzostupnú hranu
Config Portb = Output
Config Porta = Input
Config Int0 = Falling

'Pri aktivácii prerušenia sa presuń na program PR
'Povolenie prerušenia INT0
'Povolenie Všetkých prerušení
On Int0 P
Enable Int0
Enable Interrupts

'Deklarácia premennej A ako byte
Dim A As Byte

'Nastavenie premennej A na hodnotu H00
'Nastavenie portu B na hodnotu HFF
'Nastavenie portu A na hodnotu HFF, tzn aktivácia pull-up rezistorov
A = &H00
Portb = &HFF
Porta = &HFF

'Pomenovanie PA0 na TL1
Tl1 Alias Pina.1

'Spustenie Hlavného programu P0, ktorý beží v nekonečnej slučke
P0:
Do

'Po stlačení TL1 sa presuň na program P2
If Tl1 = 0 Then
Gosub P1
End If

'Pri hodnote premennej A = 2, tzn po vykonaní programu P1, a stlačení TL1 sa presuň na program P2
'Počkaj 250ms, kvôli odstráneniu prekmitov na TL1
If Tl1 = 0 And A = 2 Then
Gosub P2
End If

Waitms 250

Loop

'Program 1: Do premennej A zapíš hodnotu 2 a následne pošli na port B hodnotu H00, počkaj 2s a pošli na port B hodnotu HFF a znova čakaj 2s a následne sa vráť do programu P0
P1:
A = 2

Portb = &H00
Wait 2
Portb = &HFF
Wait 2

Return

'Program 2: Do premennej A zapíš hodnotu 1 a následne posielaj na jednotlivé piny portu B logické úrovňe podľa zadania(vytvorenie svetelného hada), pričom po každom
'odoslaní hodnoty počkaj 1s. Nakoniec sa vráť do programu P0
P2:
A = 1

Portb = &B00000001
Wait 1
Portb = &B00000010
Wait 1
Portb = &B00000100
Wait 1
Portb = &B00001000
Wait 1
Portb = &B00010000
Wait 1
Portb = &B00100000
Wait 1
Portb = &B01000000
Wait 1
Portb = &B10000000
Wait 1
Portb = &B01000000
Wait 1
Portb = &B00100000
Wait 1
Portb = &B00010000
Wait 1
Portb = &B00001000
Wait 1
Portb = &B00000100
Wait 1
Portb = &B00000010
Wait 1
Portb = &B00000001
Wait 1
Portb = &HFF

Return

'Program prerušenia
P:
Portb = &H55
Waitms 500

Return

End[/code]

:arrow_right: administrator: přejmenováno z "Prerušenie Atmega644P - Bascom"

moc tomu jazyku nerozumím, ale tady to : Config Int0 = Falling … znamená, že přerušení je aktivní na sestupnou hranu… Dále musí poradit zkušenější…

Ještě jsem si všiml, ty nemusíš nastavit pin na int0 jako vstup ? Ono to tak má být sice výchozí funkce, ale pokud nemáš připojený externí pull-up odpor tak to stejnak fungovat nebude…

Napiš jak máš to tlačítko zapojené…

Možná najdeš inspiraci pro řešení tvého problému zde.

Problem som uz vyriesil a bol len v tom ze som si nevsimol ze na PA0 nieje INT0 ale PCINT0. INT0 je na PD2 takze po tejto zmene vsetko chodi ako ma. Dakujem Vam ale aj tak za cas a ochotu. Prajem pekny zvysok dna a temu mozete zmazat, nakolko asi nikomu nic neprida :slight_smile: