Hartnäckige Sache.
Kannst du bitte deine Source komplett, so wie sie ist, reinstellen ?
Druckbare Version
Hartnäckige Sache.
Kannst du bitte deine Source komplett, so wie sie ist, reinstellen ?
Code:$regfile = "m16def.dat"
$crystal = 19999998 'Quarz: 3.6864 MHz
$baud = 19200
Dim I As Byte
Config Lcdpin = Pin , Db4 = Porta.6 , Db5 = Porta.5 , Db6 = Porta.4 , Db7 = Porta.3 , E = Porta.7 , Rs = Porta.2 ' Natürlich so wie es wirklich angeschlossen ist (4-Bit-Modus)
Dim A As Byte
Config Lcd = 20 * 4 'Baudrate der UART: 9600 Baud
Config Pind.1 = Input
Config Pind.0 = Output
Config Pinb.3 = Output
Config Pind.5 = Output
Config Pind.2 = Input
Dim Crc_l As Byte
Dim Crc_h As Byte
Dim New As Byte
Dim Tmp As Byte
Dim Bcclo As Byte
Dim Bcchi As Byte
Dim X As Byte
Dim Crce As Word
Dim Crcs As Word
Dim Packets(10) As Byte
Dim Packete(8) As Byte
Declare Sub Sendewr
Declare Sub Empfangewr
Declare Sub Clc
Declare Sub Lcdout
Declare Sub Status
Declare Sub Auswahltyp
Dim Wrtyp As String * 10
Declare Sub Auswahlanzahl
Dim Anzahl As Integer
Dim Line1 As String * 20
Dim Line2 As String * 20
Dim Line3 As String * 20
Dim Line4 As String * 20
'PowerLED
Portd.5 = 1
Portb.3 = 1
'Init Packets
Packets(1) = 002
Packets(2) = 050
Packets(3) = 000
Packets(4) = 032
Packets(5) = 032
Packets(6) = 032
Packets(7) = 032
Packets(8) = 032
Packets(9) = 037
Packets(10) = 135
'Config Serialin = Buffered , Size = 8
Do
'Gosub Auswahltyp
'Taster 1
'If Pind.2 = 1 Then
' Line2 = " reset"
' Print "reset"
' Gosub Lcdout
'End If
'Taster 2
If Pind.4 = 1 Then
Gosub Sendewr
Gosub Empfangewr
'Gosub Status
End If
Loop
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'SUBs
Sub Sendewr
Line2 = " sende Anfrage"
Printbin Packets(1) ; 10
Gosub Lcdout
'Gosub Clc
Return
End Sub Sendewr
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sub Empfangewr
Line2 = " warte auf Daten"
'Gosub Lcdout
Inputbin Packete(1) , 8
Printbin Packete(1) ; 8
Crce = Crc16(packete(1) , 6)
Crc_l = Low(crce)
Crc_h = High(crce)
Cls
Locate 1 , 1
Lcd "Empfangenes Paket:"
Locate 2 , 1
Lcd "1:" ; Str(packete(1))
Locate 2 , 5
Lcd "2:" ; Str(packete(2))
Locate 2 , 9
Lcd "3:" ; Str(packete(3))
Locate 2 , 13
Lcd "4:" ; Str(packete(4))
Locate 2 , 17
Lcd "5:" ; Str(packete(5))
Locate 3 , 1
Lcd "6:" ; Str(packete(6))
Locate 3 , 5
Lcd "7:" ; Str(packete(7))
Locate 3 , 9
Lcd "8:" ; Str(packete(8))
Locate 4 , 1
Lcd "CRC_l:" ; Crc_l
Locate 4 , 12
Lcd "CRC_H:" ; Crc_h
'Gosub Status
Return
End Sub Empfangewr
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'Checksumme berechnen
Sub Clc
Bcclo = &HFF
Bcchi = &HFF
Return
End Sub Clc
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'LCD Ausgabe
Sub Lcdout
Cls
Locate 1 , 1 '1. Zeile
Lcd Line1
Locate 2 , 1 '2. Zeile
Lcd Line2
Locate 3 , 1 '3. Zeile
Lcd Line3
Locate 4 , 1 '4. Zeile
Lcd Line4
Return
End Sub Lcdout
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'Status Auswertung
Sub Status
If X = 6 Then
Line3 = "ok"
Print "kein fehler"
Else
Line3 = "Fehler"
Print "fehler"
End If
Gosub Lcdout
Return
End Sub Status
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
End
also anscheinend empfängt er alle bytes, aber er ordnet sie falsch.
byte 6,7,8 stellt er immer vorran.
wenn ich ein zweites paket sende überschreibt er byte 7, 8 garnicht
beim dritten paket überschreibt er alle bis auf byte 8
VERZWEIFLUNG!!!
Ich schau' mir dein Programm grad an, bleib locker.
Wenn du grad in der Panik-Phase bist, die immer irgendwann eintritt, dreh' ein paar Runden ums Haus oder füttere die Katze, kraulen ist noch besser. In dem Zustand sieht man den Wald vor Bäumen nicht mehr.
(glaub' mir, ich mach das schon länger)
Guter tipp danke, das problem ist nur dass es sich hierbei um ein projekt für die arbeit ist und ich am 15.nov abgabetermin habe.
Aaaallsooo:
Im Programm ist KEIN direkter Fehler, es geht ums Timing
Vom Sendwr bis zum Inputbin brauchst du offenbar mal zu lange, da geht was verloren.
du MUSST config serialin = buffered angeben, der Sender schickt nach Empfang sicher sofort los, anders kriegst du die Hälfte nicht mit.
soweit, sogut.
aaaaber:
Der Sender schickt (ziemlich sicher) nicht nur ein Paket, sondern mehrere.
Es könnte sein, daß er deinen "Bestätigungs-printbin" gleich nach dem Empfangen als Aufforderung versteht, oder es hat andere Gründe.
Deswegen klappt's ja auch einmal, aber dann nichtmehr.
Da du ja das Empfangspaket eh' auf dem LCD zeigst, kannst du diesen "Retour-print" ja mal weglassen, vielleicht reicht das schon.
Sonst muß man sich den Sender näher anschauen.
Nochmal: DU MUSST den serialin-Buffer nehmen (size = 8 muss reichen, wenn der Sender auch wirklich nur ein Paket schickt)
Wenn sich der Sender nicht disziplinieren läßt, müssen wir deinen input auf asynchron umstellen. Wenn der einfach drauflosplappert, wird sowas immer wieder passieren.
Hast du Info, WANNN WER WEM was zu schicken hat ?
Und such keinen Fehler, da is keiner (s.o)
Aufgabenstellung:
also ich hab in diesem fall 12 geräte mit 12 adressen (2-13)
mein mc soll anfangs sequeziell den status der geräte abfragen und den status am lcd und über usart ausgeben.
immer wenn ich eine anfrage an eine gerät sende bekomme ich gleich darauf antwort.
ich glaub nicht, dass was verloren geht, da ich das packet bei der anfrage ja komplett empfange, halt nur in einer falschen reihenfolge.Zitat:
Vom Sendwr bis zum Inputbin brauchst du offenbar mal zu lange, da geht was verloren.
du MUSST config serialin = buffered angeben, der Sender schickt nach Empfang sicher sofort los, anders kriegst du die Hälfte nicht mit.
soweit, sogut.
das hab ich schon versucht, nur dann empfängt er anscheinend garnichtsmehr.
bei weiteren anfragen, bleibt immer das 8byte gleich wie beim ersten und ändert sich nicht.
nein, er schickt sicher nur ein antwort-paket mit 8bytes + 2bytes crcZitat:
Der Sender schickt (ziemlich sicher) nicht nur ein Paket, sondern mehrere.
welchen bestätigungs-printbin?Zitat:
Es könnte sein, daß er deinen "Bestätigungs-printbin" gleich nach dem Empfangen als Aufforderung versteht, oder es hat andere Gründe.
ich sende gerät empfängt und gibt darauf antwort
das hab ich nur gemacht, dass ich die packete am pc mitbeobachten kannZitat:
Da du ja das Empfangspaket eh' auf dem LCD zeigst, kannst du diesen "Retour-print" ja mal weglassen, vielleicht reicht das schon.
Der Inputbin ist einfach und übersichtlich: Er schreibt ab der angegebenen Addresse ( Packete ( 1 ) ) die nächsten 8 Byte, die er erwischt, strikt aufsteigend rein. Da gibt's keine Querschläger.
Das hab ich überprüft, das steht so in der Hex-file.
Wenn also der Sender tatsächlich nur ein paket mit 8 Byte schickt, dann stehen die auch genau so drin, wie sie weggeschickt wurden.
( Ich ignoriere mal die Möglichkeit, daß der Sender was verdreht )
Solange du dich drauf fixierst, daß so ein Buffer schon mal durcheinander kommen kann, hast du schlechte Karten
bis jetzt, hab ich das ganze ja nur mit einem prog das ich geschrieben hab getestet, vielleicht bringt auch das etwas durcheinander. werd mich mal auf den weg machen und es mal schnell in reality testen.
bis jetzt, hab ich das ganze ja nur mit einem prog das ich geschrieben hab getestet, vielleicht bringt auch das etwas durcheinander. werd mich mal auf den weg machen und es mal schnell in reality testen.