Da ist auch ein Wait 1 in der isr...
So würde ich es wohl probieren: (ungetestet, da nur Laptop hier und keine Hardware)
Code:
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Programmname: UART-Schnittstelle.bas
'Letzte Änderung: 03.03.2013
'Funktion: Empfang von gesamt 18Byte,
' ausgabe als echo über seriell und lcd zur kontrolle
'Mikrocontroller: Mega8
'
'Input:
'Output:
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Den Atmega mit den passenden Daten füttern.
'-------------------------------------------------------------------------------
$regfile = "m8def.dat" 'eingesetzter Mikrocontroller
$crystal = 8000000 'eingestellte Taktfrequenz (8MHz)
$hwstack = 40 'Standardwert
$swstack = 40 'Standardwert
$framesize = 20 'Standardwert
$baud = 9600
'-------------------------------------------------------------------------------
'Ports/Pins/Configs
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Timer/OCR/PWM/ISR usw. setzen
'-------------------------------------------------------------------------------
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Config Serialin = Buffered , Size = 18
Enable Interrupts
'-------------------------------------------------------------------------------
'Variablen
'-------------------------------------------------------------------------------
Dim Temp_byte As Byte
Dim Datenblock(16) As Byte
Dim Indexposition As Byte
Const Startzeichen = 123
Const Endzeichen = 125
Const Datenblock_laenge = 16
Dim Datenblock_komplett As Bit
Dim Lcd_position As Byte
Dim Datenblock_string As String * 16
Dim Datenblock_byte(16) As Byte At Datenblock_string Overlay
'-------------------------------------------------------------------------------
'Hauptprogramm
'-------------------------------------------------------------------------------
Cls
Waitms 100
Do
If Ischarwaiting() = 1 Then
Gosub Empfangen
End If
If Datenblock_komplett = 1 Then
Reset Datenblock_komplett
Gosub Anzeige
End If
Loop
End
Anzeige:
Cls
Waitms 100
For Indexposition = 1 To 3 Step 1
Lcd_position = Indexposition
Locate 1 , Lcd_position
Lcd Chr(datenblock(indexposition))
Next
For Indexposition = 3 To Datenblock_laenge Step 1
Lcd_position = Indexposition - 8
Locate 2 , Lcd_position
Lcd Chr(datenblock(indexposition))
Next
'Echo zurücksenden zur Kontrolle
Print Datenblock_string
Return
Empfangen:
Temp_byte = Inkey()
If Temp_byte > 12 Then 'unter 13 sind nur Sonderzeichen
If Temp_byte = Startzeichen Then
Indexposition = 0
Elseif Temp_byte = Endzeichen Then
Gosub Auswerten
Else
Incr Indexposition
Datenblock(indexposition) = Temp_byte
End If
If Indexposition = Datenblock_laenge Then
Gosub Auswerten
End If
End If
Return
Auswerten:
Dim Dummy As Byte
Datenblock_string = String(datenblock_laenge , 0)
Dummy = Memcopy(datenblock(1) , Datenblock_byte(1) , Indexposition)
Datenblock(1) = String(datenblock_laenge , 22) 'Wozu?
Indexposition = 0
Set Datenblock_komplett
Return
Lesezeichen