PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler bei Datenübertragung/Auswertung



extremesports
26.11.2011, 23:16
Hallo,

ich bin verzweifelt... Hab eben mal wieder mein Projekt hervorgeholt (an dem ich seit Juli nicht mehr gearbeitet hab) und jetzt funktioniert nichts mehr.
Vielleicht bin ich einfach zu blind den Fehler zu finden.
Das ganze soll ermöglichen über einen USB-to-UART Converter Pins schalten zu können...
Hier mal der 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 , Bytematch = 37 '37=%
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

Config Portb.0 = Output 'Kontroll-LED
Config Portd.7 = Output '1. schaltbare LED
Config Portd.6 = Output '2. schaltbare LED

Dim I As Byte 'Splitting der Hauptschleife
Dim Incoming_data As String * 5 '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


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
Toggle Portb.0 'Blinkende LED zur Kontrolle des Programmdurchlaufes
For I = 0 To 200
Waitms 1
Next I

Setzen
Loop

End 'end program


Sub Serial0charmatch()
Input Incoming_data Noecho ' Daten aus Buffer auslesen
'Print Incoming_data 'Ausgabe zu Debuggingzwecken
Verarbeiten
Clear Serialin ' Buffer leeren
End Sub

Sub Verarbeiten()
Port = Left(incoming_data , 2) 'Byte 2 und 3 extrahieren
Wert = Mid(incoming_data , 3 , 2) 'Byte 4 und 5 extrahieren
B_port = Val(port) 'String zu Wert konvertieren
B_wert = Val(wert)
Print "Port " ; B_port ; "Wert " ; B_wert 'Ausgabe zu Debuggingzwecken
End Sub

Sub Setzen()
Select Case B_port 'zu setzenden Pin auswählen
Case 50 : If B_wert = 49 Then
Portd.6 = 1
Gosub Print_on
Elseif B_wert = 50 Then
Portd.6 = 0
Gosub Print_off
End If
Case 50 : If B_wert = 49 Then
Portd.7 = 1
Gosub Print_on
Elseif B_wert = 50 Then
Portd.7 = 0
Gosub Print_off
End If
Case Else : !nop
End Select
End Sub

Print_on:
Print "Pin set high"
Return

Print_off:
Print "Pin set low"
Return

Momentan funktioniert so gut wie gar nichts... nur die Kontroll LED blinkt und die erste Ausgabe auf dem LCD erscheint...

extremesports
27.11.2011, 00:31
So, ich hab jetzt noch mal einige Änderungen vorgenommen:


$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 , Bytematch = 37 '37=%
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

Config Portb.0 = Output 'Kontroll-LED
Config Portd.7 = Output '1. schaltbare LED
Config Portd.6 = Output '2. schaltbare LED

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
Toggle Portb.0 'Blinkende LED zur Kontrolle des Programmdurchlaufes
For I = 0 To 200
Waitms 1
Next I

Setzen
'Print "Port " ; B_port ; " Wert " ; B_wert 'Ausgabe zu Debuggingzwecken
Loop

End 'end program


Sub Serial0charmatch()
Input Incoming_data Noecho ' Daten aus Buffer auslesen
Verarbeiten
Clear Serialin ' Buffer leeren
End Sub

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)
End Sub

Sub Setzen()
Select Case B_port 'zu setzenden Pin auswählen
Case 50 : If B_wert = 49 Then
Portd.6 = 1
Gosub Print_on
Elseif B_wert = 50 Then
Portd.6 = 0
Gosub Print_off
End If
Case 51 : If B_wert = 49 Then
Portd.7 = 1
Gosub Print_on
Elseif B_wert = 50 Then
Portd.7 = 0
Gosub Print_off
End If
Case Else : !nop
End Select
End Sub

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

Mir scheint es so, als ob mein Programm nicht auf das ASCII Zeichen % also Dezimal 37 reagiert, obwohl ich das so festgelegt habe. Und das komische an der Sache ist, dass es auch schon mal funktioniert hat!
Und trotz meinem Noecho kommt immer mal wieder das, was ich sende zurück. Habs heut mehrmals kompiliert und auf den µC gebrannt. Ein mal kam nichts zurück, sonst kam immer das gesendete zurück, obwohl ich diesbezüglich gar nichts am Code geändert hab. Ich bin echt langsam ratlos.
Wär toll, wenn sich hier mal jemand die Zeit nehmen könnte und kurz über meinen Code schauen und mir nen Tipp geben wo ich was ändern muss...

peterfido
27.11.2011, 09:22
Wenn Du Bytematch nutzt, dann musst Du die Register sichern. Ich nutze immer die ischarwaiting() Methode.

Ungetestet:


$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

extremesports
27.11.2011, 19:17
Vielen Dank für deine Antwort.
Ich werd das mal versuchen umzusetzen. Wird aber erst Ende der Woche hin hauen, da ich bin mitte der Woche noch voll und ganz mit Klausuren ausgelastet bin.
Ich poste dann mal meine Ergebnisse...

Bis dahin... ;)