Hallo liebe Bascom User,
ich programmiere schon eine Weile mit Bascom. Aber jetzt brauche ich mal Eure Hilfe weil ich mir das einfach nicht erklären kann.
Zur Ausrüstung: Bascom Vollversion 2077. AVRISP MK2.
Ich programmiere gerade an einer Stempeluhr die die Buchungen im Sram speichert. Daher der große Atmega 1284P. Die CPU ist aber nicht das Problem.
An Port A ist eine 12er Tastatur angeschlossen, und zwar A0=Reihe1, A1=Reihe2...A5=Spalte1, A6=Spalte2...usw.
Alle Tastaturleitungen gehen über 470 Ohm an den AVR.
Hier wird der PCINT von Port A genutzt um einen Tastendruck zu erkennen. Da PCINT aber bei jedem Tastendruck zwei mal IRQ auslöst wollte ich einen einfach "herausfiltern"
Nach meiner Kenntnis kann ich ein Unterprogramm und eine ISR jederzeit mit einem Return verlassen.
Bei dieser Variante macht der Controller einen Reset. Und zwar immer wenn MA 1 ist, also er in das vorzeitige Return reingeht.
Eine Erklärung hierfür habe ich noch nicht gefunden.
Aber jetzt kommts. Das hier geht:
Kann mir einer erklären warum das so ist??
Gruß Jogi
ich programmiere schon eine Weile mit Bascom. Aber jetzt brauche ich mal Eure Hilfe weil ich mir das einfach nicht erklären kann.
Zur Ausrüstung: Bascom Vollversion 2077. AVRISP MK2.
Ich programmiere gerade an einer Stempeluhr die die Buchungen im Sram speichert. Daher der große Atmega 1284P. Die CPU ist aber nicht das Problem.
An Port A ist eine 12er Tastatur angeschlossen, und zwar A0=Reihe1, A1=Reihe2...A5=Spalte1, A6=Spalte2...usw.
Alle Tastaturleitungen gehen über 470 Ohm an den AVR.
Hier wird der PCINT von Port A genutzt um einen Tastendruck zu erkennen. Da PCINT aber bei jedem Tastendruck zwei mal IRQ auslöst wollte ich einen einfach "herausfiltern"
Nach meiner Kenntnis kann ich ein Unterprogramm und eine ISR jederzeit mit einem Return verlassen.
Bei dieser Variante macht der Controller einen Reset. Und zwar immer wenn MA 1 ist, also er in das vorzeitige Return reingeht.
Code:
$regfile = "m1284pdef.dat"
$crystal = 14745600
$hwstack = 128
$swstack = 128
$framesize = 128
$baud = 9600
Dim Ma As Byte
Dim Z As Byte
Ddra = &B11110000
Porta = &B00001111
Print " ready..."
Enable Pcint0
Pcmsk0 = &B00001111
On Pcint0 Taste
Enable Interrupts
Ma = 1
Open "com1:" For Binary As #1
Do
Incr Z
Print #1 , "Zähler:" ; Z
Print #1 , "Loop"
Print #1 , "Ma: " ; Ma
Wait 3
Loop
Taste:
Print #1 , "Jetzt in ISR"
If Ma = 1 Then
Ma = 2
Pcifr.0 = 1
Return
End If
Print #1 , "Jetzt ganz in ISR"
Pcifr.0 = 1
Ma = 1
Return
Eine Erklärung hierfür habe ich noch nicht gefunden.
Aber jetzt kommts. Das hier geht:
Code:
$regfile = "m1284pdef.dat"
$crystal = 14745600
$hwstack = 128
$swstack = 128
$framesize = 128
$baud = 9600
Dim Ma As Byte
Dim Z As Byte
Ddra = &B11110000
Porta = &B00001111
Print " ready..."
Enable Pcint0
Pcmsk0 = &B00001111
On Pcint0 Taste
Enable Interrupts
Ma = 1
Open "com1:" For Binary As #1
Do
Incr Z
Print #1 , "Zähler:" ; Z
Print #1 , "Loop"
Print #1 , "Ma: " ; Ma
Wait 3
Loop
Taste:
Print #1 , "Jetzt in ISR"
Select Case Ma
Case 1:
Print #1 , "Jetzt ganz in ISR"
Ma = 2
Case 2:
Ma = 1
End Select
Pcifr.0 = 1
Return
Kann mir einer erklären warum das so ist??
Gruß Jogi