Hi,
ja so ist es.
Werbung
Hi,
ja so ist es.
Guten Morgen zusammen,
leider haben alle Versuche bisher nichts gebracht.
Auch die Zeile für den Timer war leider vergebens.
Ich habe aber inzwischen noch was herausgefunden.
Zunächst noch:
Pruef_quelle ist ein im Programm fest hintelegter wert: dieser wird nur einmal als konstante deklariert.
In folgender Zeile übergebe ich das was über die UART eingelesen wurde an eine Variable.
quelle = empfangsarray(2)
ich habe jetzt wenn der Fehler passiert mit die Werte (pruef_quelle, quelle und empfangsarray(2)) ausgeben lassen.
Diese sind unterschiedlich!
Auch die Konstante pruef_quelle hat plötzlich einen Wert der überhaupt nicht stimmt.
Schaue ich mir das array empfangsarray(1) - empfangsaeeay(5) an, wie bisher, dann sehen die Werte alle korrekt aus.
Es muss also was schief laufen beim übernehmen des Bytes aus dem Bytearray in eine Variable.
Kann es sowas geben?
Wie kann das sein?
Guten Morgen demmy,
Gibt es wie du siehst, darf aber nicht sein.
Ich wollte schon öfter raten, wo denn der Bug versteckt ist. Konnte mich aber aufgrund der vielen unbekannten Infos für keine der vielen Möglichkeiten entscheiden.Wie kann das sein?
Du solltest den kompletten Code posten und um es uns noch etwas einfacher zu machen, Teile daraus solange auskommentieren, solange der Fehler noch auftaucht. Vielleicht findest du den Fehler dadurch auch sogar selber
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
1234567890
Geändert von i_make_it (05.02.2015 um 05:34 Uhr)
Hi demmy,
so da du Interrupt- Timerfehler ausschließen kannst, hätte ich noch Fragen.
Im Codeschnipsel in #10, kann ich nicht erkennen wie groß Array ist. Wichtig für Checksummenbildung mit Crc Auswertung, ist die max Bytelänge und das Abschlusssteuerzeichen zu kennen.
Hast du 50 Byte für Werte muss Sitze zwei Byte größer sein, denn da wird die Checksumme angehängt.
Sehr elegant ist Serial mit Charmatch zuprüfen. Läuft ja im „Hintergrund“, Sub solle aber nach meinen Erfahrungen immer am Ende des Programms stehen.
Declare für Com1 sollte folglich Sub Serial 0charmatch() sein
Kleiner Auszug meiner BAS(Funkbrücke mit RFM12b)
‚++++++++++++++++++++++
'!!!!! muss aktiv sein wenn COM2 Hardware benutzt werden soll !!!!!
Declare Sub Serial1charmatch() 'Sub bekannt machen
Dim Pu As Byte 'Pu prüft den Puffer
'------hier werden die COM-Schnittstellen eingestellt-------
'COM1 ist die V24 für PC / COM2 (TTL) für Empfängervebindung
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
'!!!!! darf nur aktiv sein wenn COM2 Hardware belegt ist !!!!!
'Sonst hält Programm an bis Bytematch 13 ist.
Config Serialin1 = Buffered , Size = 160 , Bytematch = 13 ' 13 gleich Zeilenumbruch
'COM zum einlesen öffnen
Open "COM1:" For Binary As #1 'für Terminal
Open "COM2:" For Binary As #2 'für Empfänger
'diese Sub startet wenn im Puffer COM2 Daten anliegen und
'wird mit Empfang von Chr(13) beendet.
'Pu prüft den Puffer der COM2 wird in diesem Projekt nicht genutzt da
'Empfänger auch eigene Messungen printet wird wohl immer etwas drin sein.
Sub Serial1charmatch()
Pu = Ischarwaiting(2) 'könnte gelöscht werden
Pushall
Input #2 , Kanal Noecho ‚ Kanal alle Byte
Popall
End Sub
Wie schon von peterfide beschrieben solltest du Dummy-Variable deklarierst. Einfach die Bytewerte
ein „Speicherplatz“ mit Länge zuweisen. Mit Overlay sehr übersichtlich und spart noch Resursen.
kleiner Auszug.
Const Max_len = 160
Dim Empfangspuffer(max_len) As Byte
' ab Empfangspuffer(6) die Nutzdaten
Dim Strom As Single At Empfangspuffer(6) Overlay
Dim Spannung1 As Single At Empfangspuffer(3) Overlay
Dim Spannung2 As Single At Empfangspuffer(70) Overlay
Dim Temperatur As Single At Empfangspuffer(102) Overlay
Dim Helligkeit As Single At Empfangspuffer(134) Overlay
‚Crc_ in ist Vergleichsvaiable.
Dim Crc_in As Word At Empfangspuffer(15) Overlay ' CRC muss bei Max_len - 2
Dim Crc As Word
Die As müssen natürlich nicht [Single] sein. Habe ich nur wegen der Auswertungen benötigt.
‘Beispiel prüfen.
Do
Incr Z 'Z um 1 erhöhen
If Z = Max_len Then ' erwarte Anzahl an Bytes empfangen
' CRC berechnen
Z = Max_len - 8
Crc = Crc16(empfangspuffer(6) , Z)
' CRC prüfen
If Crc <> Crc_in Then
Print "Fehler"
End If
If Crc = Crc_in Then
Print "mach weiter"
End If
‘…….
Loop
So wie ich es sehe, hast du schon sehr gute Kenntnisse. Somit, dies nur als Anregung betrachten und selber an dein Projekt anpassen.
{i_make_it} hat es noch besser erklärten können wie ich. Ein MCU ist kein "Hochleistungsrechner",
Freue mich aber wie hartnägig du bist. Wirst bestimmt bald zum Ziel kommen.
Mit freundlichen Grüßen
fredred
Hi,
vielen Dank schon mal für eure Hilfe!
Also das Array "empfangsarray(5)" ist 5 Byte groß.
empfangsarray(1) = Zieladresse
empfangsarray(2) = Quelladresse
empfangsarray(3) = Nutzdaten1
empfangsarray(4) = Nutzdaten2
empfangsarray(5) = CRC8
In der Zeile: empfangsarray(5) = Crc8(empfangsarray(1) , 4) berechne ich eigentlich die Checksumme des empfangenen Telegramms mit der empfangenen Checksumme
und Prüfe das Telegramm auf Plausibilität.
Darf ich das mit den Dummy-Variablen so verstehen das zwischen den Speicherbereichen der Variablen immer ein Leerplatzt bleibt?
Wenn es in irgendeiner Form zu einer Überschneidung der Variablen kommen sollte, müsste ich das nicht erkennen wenn ich mir in Bascom nach dem Compilieren mit "strg w" den Report anzeigen lasse? Dort kann ich doch die Speicherbereiche der Einzelnen Variablen sehen!?
Geändert von demmy (03.11.2014 um 19:11 Uhr)
Frei nach Radio Eriwan: Im Prinzip schon. Du kannst aber bei einer falschen Wertzuweisung, wenn Du z.B. mit den Overlays durcheinander kommst, unter Umständen ungewollt dahinterliegende Variablen überschreiben. Wenn sich eine Konstante ändert, dann passt da was nicht. Raten macht mir da nicht soo Spaß. Compilierfähiger Code, wo der Fehler noch auftritt ist immer hilfreich.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Hi demmy,
Ja Ja perterfido hat schon wieder mal Recht. Es ist wie Topfschlagen wenn nur ein paar Codezeilen bekannt sind.
Hatte als Hinweis auch nur ein paar Codezeilen meines Projekts geschickt, da der komplette Code 879 Zeilen hat.
Erstell doch einfach mal zwei kleine Code. Ein mit Sendebyte und ein mit Empfangsbyte. Natürlich mit Stacks- und Dimzuweisungen.
Somit können wir alles praktisch testen und bestimmt helfen.
Da ich nach wie vor der Meinung bin, Crs wertet auch die Steuerzeichen (Hex 0A uns 0C) aus, könne dies dein Problem sein. So war auch der Vorschlag gemeint, Array als Dummy-Variable, als Paket zu Senden und dieses auch so auszuwerten.
Vielleicht reicht es auch schon du übermittelst Sende- Empfangsbyte in Hexformat.
PS. Bin nicht gut in der deutschen Sprache und Rechtschreibung. Aber ein Hexskript lese ich wie ein Bilderbuch.
Kleiner Spaß(Anregung von peterfido)
Anfrage an Radio Eriwan: „kann man eine Frau aus einer Entfernung von 1 Meter schwängern“
Antwort von Ratio Eriwan: Im Prinzip schon. „wenn Penis 1,10 Meter lang ist und in der Mitte nicht durchhängt“
Gruß
fredred
Also,
ich habe aktuell ein paar Neuigkeiten.
Ich habe mir jetzt nochmal den $swstack, $hwstack und $Frame vorgenommen und die Werte nochmals erhöht. Jetzt habe ich den Eindruck das das Problem drastisch besser geworden ist. Aber leider noch nicht 100%ig weg.
Gibt es die Möglichkeit zur Laufzeit des Programmes auszulesen, in wie weit die Speicherbereiche belegt oder ausgelastet sind? Also irgendwie einen Stackpointer oder sowas? Ich würde mir gerne ausgeben lassen wie voll die Dinger laufen?
Was wiederum irgendwie gegen die Stacks spricht ist, der Versuch den ich noch gemacht habe alle Sub's rauszunehmen und den gesamten Code direkt in der Hauptschleife laufen zu lassen. Also komplett ohne den Aufruf von Subs, ist das fehlverhalten sprunghaft angestiegen!?
UPDATE:
ich habe die Bibliothek "stackcheck" und deren funktionen entdeckt.
mit der Hilfe der Lib habe ich ein $hwstack von 8 ein $swstack von 9 und ein $Frame von 2045 ermittelt und ausgelesen. Sind das plausibele Werte?
Geändert von demmy (05.11.2014 um 21:20 Uhr)
Hallo demmy,
Vielleicht liegt es ja an der Hardware.
Die Frequenz liegt ja recht weit am Limit.
Mit welcher Spannung arbeitet der Mega?
Zeig uns doch mal deine Schaltung.
mfG
Willi
Lesezeichen