1234567890
Da fehlt einiges. Der Code mit dem vermeintlichen Fehler sollte zum Nachvollziehen compilierbar sein. Pruef_quelle kann ich auch nicht weiter finden.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
1234567890
Geändert von i_make_it (05.02.2015 um 06:29 Uhr)
Hallo demmy,
Du schreibst “ich verwende alle 4 Timer„.
Ist schon eine weile her als ich ein lauffähiges Projekt mit Mega644 aufgebaut habe, bis ich den Controller durch einen Mega 128 ersetzt habe(100% Code). Ergebnis Projekt instabil. Ursache war Timer0.
Mit $regfile = "m1284pdef.dat" gibt es nur Timer,Timer1,Timer2 und Timer3 aber für die eingebundenen Lib für IR wird Timer0 benötigt. Somit diese Zuweisung. Const Timsk = Timsk0. Alles wieder OK.
Kann sein das dieser Fehler in Bascom schon behoben wurde.
Ist zwar nicht direkt die Hilfe für Bytevergleich aber wenn in einem größeren Code eine Timer- Interruptsausführung gestartet wird, die im Ablauf nicht passt, kann es schon mal chaotisch werden.
Somit sollte es nur ein Hinweis sein.
Weis auch nicht warum du nicht [Crc] nutzt. Siehe Bascomhilfe.
Nicht vergessen im UART werden immer die Steuerzeichen Chr(10) und Chr(13) angehängt. Diese Zeichen siehst du natürlich nicht am Terminal, wenn er nur Strings anzeigt. In Hexmodus schon.
Mit freundlichen Grüßen
fredred
Wäre dann const timsk0 = timsk nicht angebracht, oder habe ich da grad nen Denkfehler?
Oder gar timsk0 alias timsk ?
Wenn das Herz involviert ist, steht die Logik außen vor! \/
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 Weg zu einigen meiner Konstruktionen
1234567890
Geändert von i_make_it (05.02.2015 um 06: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 20:11 Uhr)
Lesezeichen