Wenn Du Bytematch nutzt, dann musst Du die Register sichern. Ich nutze immer die ischarwaiting() Methode.
Ungetestet:
Code:
$regfile = "M8def.dat" '.dat-file ATmega8'
$crystal = 8000000 'Taktfrequenz 8MHz'
$hwstack = 350 'Größe Hardwarestack'
$swstack = 350 'Größe Softwarestack'
$framesize = 200 'Größe Frame'
''$lib "i2c_twi.lbx" ' Für Hardware TWI
$baud = 19200 'Baudrate UART
'Declare Sub Serial0charmatch()
'Declare Sub Verarbeiten()
'Declare Sub Setzen()
''Config Scl = Portc.5 'SCL-Pin
''Config Sda = Portc.4 'SDA-Pin
''Config Twi = 400000 'Clockspeed für SCL
''Twcr = &B00000100 'TWI einschalten
''Const Pcf_write = &H39 'Adresse jeelabs LuxPlug
''Const Pcf_read = &H40
''I2cinit 'SCL und SDA initialisieren
Config Serialin = Buffered , Size = 4 'kann man bei Speichmangel immer noch runtersetzen ' , Bytematch = 37 '37=%
Const Ledtakt = 2000
Dim Durchlauf As Long
Enable Interrupts
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portd.5 , Db7 = Portb.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Kontrollled Alias Portb.0
Led1 Alias Portd.7
Led2 Alias Portd.6
Config Kontrollled = Output 'Kontroll-LED
Config Led1 = Output '1. schaltbare LED
Config Led2 = Output '2. schaltbare LED
Dim B As Byte
Dim I As Byte 'Splitting der Hauptschleife
Dim Incoming_data As String * 4 'UART Buffer
Dim Port As String * 2 'Portnummer (String)
Dim Wert As String * 2 'Wert -> Port (String)
Dim B_port As Byte 'Portnummer (Wert)
Dim B_wert As Byte 'Wert -> Port (Wert)
'Dim Flag12 As Bit 'Zustand Pin 12
'Dim Flag13 As Bit 'Zustand Pin 13
B_port = 50
B_wert = 49
Cls
Cursor On Blink
Lcd "USB-IO_plus"
Waitms 150
Locate 2 , 1
Lcd "."
Waitms 150
Locate 2 , 2
Lcd "."
Waitms 150
Locate 2 , 3
Lcd "."
Waitms 150
Locate 2 , 4
Lcd "initialisiert"
Do
Gosub Taktled
If Ischarwaiting() = 1 Then
Gosub Empfangen
End If
Gosub Setzen
'Print "Port " ; B_port ; " Wert " ; B_wert 'Ausgabe zu Debuggingzwecken
Loop
End
Taktled:
If durchlauf = Ledtakt Then
Durchlauf = 0
Toggle Kontrollled
endif
Incr Durchlauf
Return 'end program
Empfangen:
B = Inkey()
If B = 37 Then
Gosub Verarbeiten
Else
If Len(incoming_data) < 4 Then
Incoming_data = Incoming_data + Chr(b)
Else
Incoming_data = ""
' Print "...Fehler..."
End If
End If
Return
'Sub Serial0charmatch()
' Input Incoming_data Noecho ' Daten aus Buffer auslesen
' Verarbeiten
' Clear Serialin ' Buffer leeren
'End Sub
Verarbeiten:
Port = Left(incoming_data , 2) 'Byte 1 und 2 extrahieren
Wert = Mid(incoming_data , 3 , 2) 'Byte 3 und 4 extrahieren
B_port = Val(port) 'String zu Wert konvertieren
B_wert = Val(wert)
Return
Setzen:
Select Case B_port 'zu setzenden Pin auswählen
Case 50 : If B_wert = 49 Then
Set Led2
Gosub Print_on
Elseif B_wert = 50 Then
Reset Led2
Gosub Print_off
End If
Case 51 : If B_wert = 49 Then
Set Led1
Gosub Print_on
Elseif B_wert = 50 Then
Reset Led1
Gosub Print_off
End If
Case Else : !nop 'wozu?
End Select
Return
Print_on:
Print "Pin set high"
B_port = 0
B_wert = 0
Return
Print_off:
Print "Pin set low"
B_port = 0
B_wert = 0
Return
Lesezeichen