Hallo Liebe Basic Gemeinde,
ich möchte gern mit einem Attiny841 Signal vom LIN Bus lesen.
Dazu habe ich mir eine State Maschine gebastelt, welche nach dem Erkennen des Break-Signals die UART aktiviert. Dieses Funktioniert soweit.
Das Problem was ich habe ist, dass ich das Sync Byte nicht richtig lese.
Im Bild (in der Farbe blau) die Daten, welche zum RxD des Controllers gehen. Die rote Kurve ist die LED, welche ich zum debuggen nutz.
Alles anzeigen
Man sieht, an dem kurzen Impuls in der roten Linie, dass er viel zu früh ein Byte in der UART erkennt. Im Code ist es zwischen Zeile 76...79.
Kann mir da einer auf die Sprünge helfen.
VG
ich möchte gern mit einem Attiny841 Signal vom LIN Bus lesen.
Dazu habe ich mir eine State Maschine gebastelt, welche nach dem Erkennen des Break-Signals die UART aktiviert. Dieses Funktioniert soweit.
Das Problem was ich habe ist, dass ich das Sync Byte nicht richtig lese.
Im Bild (in der Farbe blau) die Daten, welche zum RxD des Controllers gehen. Die rote Kurve ist die LED, welche ich zum debuggen nutz.
Quellcode
- Config Com1 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
- Config Com2 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
- Config Serialin0 = Buffered , Size = 10
- Config Serialin1 = Buffered , Size = 10
- Open "com1:" For Binary As #1
- Open "com2:" For Binary As #2
- $include "State.inc"
- $include "Ports_def.inc"
- $include "Timer.inc"
- Waitms 500
- Call Setstate(waiting_for_break) ' Festlegen des Anfangs-Zustands
- Enable Timer0
- Enable Interrupts 'enable global ints
- '*******************************************************************************
- Dim Temp As Byte
- Dim Empfangsbuffer(10) As Byte
- Dim Cnt As Byte
- Do
- Select Case Getstate()
- ' -----------------------------------------------------
- Case Waiting_for_break
- ' -----------------------------------------------------
- If Isstatechanged() = True Then ' Code wird 1x ausgeführt nach Zustandswechsel
- Gosub Disable_uart0_rxd ' UART ausschalten
- Timer0 = False 'Reset Counter
- Print#2 , "WAIT_FOR_BREAK"
- End If
- If Rxd0 = False Then
- Start Timer0 'Starte Zeitmessung vom Breakpulse
- Led = True
- Else
- If Timer0 < Breaktime Then
- Timer0 = 0 'Pulse zu klein
- End If
- If Timer0 > Timeout Then
- Timer0 = 0 'Pulse zu lang
- End If
- If Timer0 >= Breaktime And Timer0 <= Timeout Then 'Pule = Break
- Timer0 = 0
- Gosub Enable_uart0_rxd 'UART einschalten
- Clear Serialin0 'clear Buffer
- Setstate(sync) 'Pule = Break
- End If
- Led = False
- End If
- ' -----------------------------------------------------
- Case Sync
- ' -----------------------------------------------------
- If Isstatechanged() = True Then ' Code wird 1x ausgeführt nach Zustandswechsel
- Clear Serialin0
- Led = True
- End If
- Temp = Ischarwaiting(#0) 'was there a char?
- Led = Temp
- If Temp = 1 Then
- Temp = Inkey(#0)
- If Temp = 55 Then
- Setstate(address)
- Print#2 , "go to Address"
- Else
- Setstate(waiting_for_break)
- Print#2 , "Error " ; Temp
- End If
- End If
- .
- .
- .
Man sieht, an dem kurzen Impuls in der roten Linie, dass er viel zu früh ein Byte in der UART erkennt. Im Code ist es zwischen Zeile 76...79.
Kann mir da einer auf die Sprünge helfen.
VG
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Bassist ()