Hartnäckige Sache.
Kannst du bitte deine Source komplett, so wie sie ist, reinstellen ?
Hartnäckige Sache.
Kannst du bitte deine Source komplett, so wie sie ist, reinstellen ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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.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 crcDer Sender schickt (ziemlich sicher) nicht nur ein Paket, sondern mehrere.
welchen bestätigungs-printbin?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 kannDa 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
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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.
Lesezeichen