- Labornetzteil AliExpress    Werbung      
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 35

Thema: Bytevergleich fehlerhaft

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    Home
    Beiträge
    213
    Hi,
    ja so ist es.

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    348
    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?

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.720
    Guten Morgen demmy,
    Zitat Zitat von demmy Beitrag anzeigen
    Kann es sowas geben?
    Gibt es wie du siehst, darf aber nicht sein.

    Wie kann das 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.

    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

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    57
    Beiträge
    2.814
    1234567890
    Geändert von i_make_it (05.02.2015 um 05:34 Uhr)

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    Home
    Beiträge
    213
    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

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    348
    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)

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    54
    Beiträge
    765
    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! \/

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    Home
    Beiträge
    213
    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

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    348
    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)

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    31.05.2009
    Beiträge
    270
    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

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. ISR Fehlerhaft
    Von Zille im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 20.01.2014, 18:11
  2. Sinus-Funktion Fehlerhaft?!
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 15.07.2009, 17:24
  3. Schaltung fehlerhaft
    Von Atmelbeginne im Forum PIC Controller
    Antworten: 3
    Letzter Beitrag: 12.09.2008, 16:56
  4. Uartausgabe Fehlerhaft
    Von Picht im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 19.02.2007, 16:45
  5. Drehgeber auswertung - Fehlerhaft?
    Von gamecounter im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 22.03.2006, 10:19

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

    Werbung      fchao-Sinus-Wechselrichter AliExpress