Hallo an alle,
ich habe vor auf einem ATMega8 den HW UART sowie einen Software UART mit jeweils 9600 baud zu betreiben. Der ATMega läuft mit 16Mhz.
Ich versuche gerade eine Routine zu schreiben welche mir einen Buffer für den Software UART zur Verfügung stellt, also im Moment noch Gehversuche.
Ich habe aber folgendes Problem. Meine INT0 Routine wird immer, aber wirklich immer, zweimal aufgerufen.
Ich finde den Fehler einfach nicht. Könnt ihr mal einen Blick drauf werfen? Bin auch offen für Verbesserungsvorschläge was meine Bufferroutine angeht.
Danke
Code:
$regfile = "m8Adef.dat" 'Die Anweisung bestimmt Controllertyp, hier AVR Mega 32
$framesize = 128 'Stackanweisungen, die eigentlich nur bei größeren Programmen
$swstack = 128 'wirklich nötig werden
$hwstack = 128
$crystal = 16000000
'HW UART
Config Com1 = 9600 , Parity = None , Stopbits = 1 , Databits = 8
'Software UART
Open "comb.0:9600,8,n,1" For Output As #2
Open "comd.2:9600,8,n,1" For Input As #3
'Interrupt für Software UART konfigurieren
Config Portd.2 = Input
Set Portd.2
On Int0 Irrint0
Config Int0 = Falling
Enable Int0
'Interrupts aktivieren
Enable Interrupts
Dim Suartpos As Byte
Suartpos = 1
Dim Suartsize As Byte
Suartsize = 50
Dim Sbuffer(50) As Byte
Dim Sbufferlastpos As Byte
Sbufferlastpos = 1
Dim Inchar As Byte
Do
'Hat sich der Software UART Buffer verändert?
If Sbufferlastpos <> Suartpos Then
Print Sbufferlastpos
Incr Sbufferlastpos
If Sbufferlastpos > 50 Then Sbufferlastpos = 1
Print Sbuffer(sbufferlastpos)
End If
Loop
'Interruptroutine für Software UART
Irrint0:
Disable Int0
Inchar = Inkey(#3)
Incr Suartpos
If Suartpos > 50 Then Suartpos = 1
Sbuffer(suartpos) = Inchar
Enable Int0
Return
Lesezeichen