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







Zitieren

Lesezeichen