- 12V Akku mit 280 Ah bauen         
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 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

  2. #2
    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)

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    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! \/

  4. #4
    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

  5. #5
    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)

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    Home
    Beiträge
    213
    Hallo demmy,

    die Speicherreservierung für lokale Variablen ist ja gewaltig.

    Kleine Beschreibung von meinem Freund Peter.
    $hwstack bestimmt die Größe des reservierten Speichers in Byte für Sprungmarken. Vor jedem Sprung innerhalb des Programms wird die aktuelle Position (2 Byte) im Hardwarestack gespeichert. Je mehr Sprünge im Programm vorhanden sind, desto größer sollte der Wert gewählt werden.
    $swstack bestimmt die Größe des reservierten Speichers in Byte zur Adressierung von zu übergebenden und lokalen Variablen. Jede Variable die einer Sub oder Funktion übergeben oder als Local deklariert wird benötigt 2 Byte des Softwarestacks.
    $framesize bestimmt die Größe des reservierten Speichers in Byte für lokale Variablen. Alle zu einem Zeitpunkt benötigten lokalen Variablen werden in diesem Bereich gespeichert. Bei Verwendung vieler lokaler Variablen in Subs oder Funktionen sollte dieser Wert entsprechend groß gewählt werden.

    Variablen
    Eine Variable wird mit dem Befehl Dim oder Local festgelegt. Die Festlegung einer Variable wird auch als Deklaration bezeichnet. Wird eine Variable mit Dim deklariert, so gilt diese ab dem Punkt ihrer Deklaration programmweit (auch in allen Subs und Funktionen). Innerhalb einer Sub oder Funktion kann eine Variable auch als Local deklariert werden. Dies hat zur Folge, dass diese Variable nur in der einen Durchführung der Sub oder Funktion gültig ist und wieder gelöscht wird, sobald die Sub oder Funktion verlassen wird.Der Wert einer Variable kann wärend der Programmausführung geändert werden. Dies ermöglicht es zum Beispiel das Ergebnis einer Rechnung zu speichern.
    Jede Variable benötigt - abhängig von ihrem Typ - eine bestimmte Menge an Speicherplatz im RAM. Bascom-AVR unterstützt die folgenden Datentypen:

    • Bit: besteht aus nur einem Bit und kann den Wert 0 oder 1 speichern
    • Byte: besteht aus 8 Bit und kann Ganzzahlen von 0 bis 255 speichern
    • Word: besteht aus 16 Bit und kann Ganzzahlen von 0 bis 65535 speichern
    • Integer: besteht aus 16 Bit und kann Ganzzahlen von -32768 bis +327687 speichern
    • Long: besteht aus 32 Bit und kann Ganzzahlen von -2147483648 bis 2147483647 speichern
    • Single: besteht aus 32 Bit und kann Fließkommazahlen von 1,5 x 10^–45 bis 3,4 x 10^38 speichern
    • Double: besteht aus 64 Bit und kann Fließkommazahlen von 5,0 x 10^–324 bis 1,7 x 10^308 speichern
    • String: kann text mit einer Länge von 1 bis 254 Zeichern speichern, jedes Zeichen benötigt ein Byte und zusätzlich wird ein Byte mehr benötigt als der String lang ist

    Sollte deine Angabe stimmen, komme ich ins grübeln, da so etwas noch nicht erlebt.
    Rechne mal selber. Double hat 8 Byte(ist das Max). Somit müssten 255 Variablen in dieser Größe im Code stehen(ist Grenzwert). Wie du aber erkennen kannst, mit Verschwendung der Strings, kommt man locker auf diese Größe.
    Nur mal so:
    Text = „Hallo“ somit 5 Byte + 1(sicher ist +2) = 6 Byte nötig, schreibst du es aber so,
    Dim Text AsString*100
    werden 94 Byte „verballert“. Warum?

    War ja auch mal meine Anfrage poste auch mal die Dim’s deiner Variablen usw.
    Bekamst auch schon den Hinweis, wenn Array oder Overlay nicht sauber eingestellt, kommt es zu Überschreibung der Byte. Fehlerfindung sehr schwierig, da dynamisch. Ist wie mit Windows „mal Gates mal nicht“

    Bitte beachte, ist keine Belehrung, nur ein Hinweis.

    Mit freundlichen Grüßen
    fredred .
    Geändert von fredred (06.11.2014 um 14:37 Uhr)

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    348
    Hi nochmals vielen Dank für die super Erklärungen!

    Also das mit dem extrem hohen Frame hat mich auch sehr verwundert. Ich habe auch meinen Denkfehler dabei gefunden. Wenn man die Lib "stackchek" von Bascom verwendet bekommt man nicht den belegten Frame angezeigt, sondern den Speicher der noch frei ist!!!!!
    Ich habe inzwischen die Stack-Werte wieder auf ein normales Level heruntergeschraubt.

    Und ich habe endlich die Zeit gefunden und mein Programm nochmal vernünftig auf das wesentliche mit allen Deklarationen zu reduzieren.

    Code:
    $regfile = "M1284pdef.dat"
    ' In den Fusebits wurde der externe Oszillator für 18,432MHz ausgewählt
    $crystal = 18432000
    
    $hwstack = 100                                              ' Standard 42 
    $swstack = 100                                              ' Standard 40 
    $framesize = 200                                            ' Standard 40 
    Const _my_framesize = 200
    
    $lib "stackcheck.lib"
    
    $hwcheck                                                    ' hw stack check ein
    $framecheck                                                 ' frame check ein
    $softcheck                                                  ' sw stack check ein
    
    ' Baudrate für den ersten seriellen Port 
    $baud = 9600
    ' Baudrate für den zweitern seriellen Port 
    $baud1 = 9600
    
    
    ' Analog Comparator ausschalten   ACSR.ACD = 1
    Stop Ac
    ' Watchdog ausschalten
    Stop Watchdog
    
    
    ' Echo aus
    Echo Off
    ' Interrupts global zulassen
    Enable Interrupts
    
    
    
    ' KONFIGURATION
    
    ' Com1 auf 8 Bit Modus konfigurieren
    Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    ' Com2 auf 8 Bit Modus konfigurieren
    Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    
    ' Öffnen der ersten Com-Schnittstelle
    Open "COM1:" For Binary As #1
    ' Öffnen der zweiten Com-Schnittstelle
    Open "COM2:" For Binary As #2
    
    ' Empfangspuffer UART
    Config Serialin = Buffered , Size = 100
    ' Sendepuffer UART
    Config Serialout = Buffered , Size = 100
    ' Empfangspuffer UART1
    Config Serialin1 = Buffered , Size = 100
    ' Sendepuffer UART1
    Config Serialout1 = Buffered , Size = 100
    
    
    Const Adc_multi = 0.0025                                    ' = 2,56V / 1024bit
    Config Adc = Single , Prescaler = Auto , Reference = Internal_2.56       ' Es wird die interne Referenzspannung von 2,56V ausgewählt
    Start Adc
    
    
    
    ' TIMER KONFIGURIEREN
    
    'Const Timsk = Timsk0
    Config Timer0 = Timer , Prescale = 1024                     ' Timer konfigurieren
    On Timer0 Timerroutine0                                     ' Timerinterrupt Subroutine zuweisen
    Enable Timer0                                               ' Timer aktivieren
    Stop Timer0                                                 ' Timer stoppen
    
    
    Config Timer1 = Timer , Prescale = 1024                     ' Timer konfigurieren
    On Timer1 Timerroutine1                                     ' Timerinterrupt Subroutine zuweisen
    Enable Timer1                                               ' Timer aktivieren
    Stop Timer1                                                 ' Timer stoppen
    
    
    Config Timer2 = Timer , Prescale = 1024                     ' Timer konfigurieren
    On Timer2 Timerroutine2                                     ' Timerinterrupt Subroutine zuweisen
    Enable Timer2                                               ' Timer aktivieren
    Stop Timer2                                                 ' Timer stoppen
    
    
    Config Timer3 = Timer , Prescale = 1024                     ' Timer konfigurieren
    On Timer3 Timerroutine3                                     ' Timerinterrupt Subroutine zuweisen
    Enable Timer3                                               ' Timer aktivieren
    Stop Timer3                                                 ' Timer stoppen
    
    
    
    ' SUB'S DEKLARIEREN
    
    Declare Sub Zykluszeitmessung
    Declare Sub R_bus_kommunikation
    Declare Sub Timerueberlauf0
    Declare Sub Timerueberlauf1
    Declare Sub Timerueberlauf2
    Declare Sub Timerueberlauf3
    Declare Sub Stackbelegungmessung
    
    
    
    ' VARIABLENDEKLARATION
    
    ' Schleifenzähler
    Dim I As Byte
    Dim I1 As Byte
    Dim I2 As Byte
    
    
    Dim Kartenadresse As Byte
    Dim Pruef_kartenadresse As Byte
    
    Dim Anzahl_karten As Integer
    Anzahl_karten = 2
    
    Dim Aktuelle_karte As Integer
    Aktuelle_karte = 1
    
    ' Teilnehmer/Karten Speicherbereiche
    Dim R_bus_empfangsarray(5) As Byte
    Dim R_bus_sendearray(5) As Byte
    
    Dim R_bus_empfangene_zieladresse As Byte
    Dim R_bus_empfangene_quelladresse As Byte
    
    Dim R_bus_status As Byte
    Dim R_bus_schritt As Byte
    R_bus_schritt = 1
    Dim R_bus_fehlertyp As Integer
    Dim R_bus_diagnosemodus As Bit
    Dim R_bus_gesperrt As Bit
    Dim R_bus_kein_teilnehmer As Bit
    Dim R_bus_fehler As Bit
    Dim R_bus_karten_fehler As Bit
    Dim R_bus_konfig_fehler As Bit
    Dim R_bus_konfig_fehler_position As Integer
    
    Dim Err_falscher_teilnehmer As Bit
    Dim Err_fehlende_antwort As Bit
    Dim Err_falsche_protokolllaenge As Bit
    Dim Err_falscher_telegrammkopf As Bit
    Dim Err_falsche_checksumme As Bit
    
    ' Timer Reloadwerte festlegen (für 16Bit Timer1 u. 3 mit Prescaler 1024 bei 18,432MHz)
    Dim Reload_1s As Word
    Reload_1s = 47536
    Dim Reload_500ms As Word
    Reload_500ms = 56536
    Dim Reload_250ms As Word
    Reload_250ms = 61036
    Dim Reload_150ms As Word
    Reload_150ms = 62836
    
    ' Zykluszeit Messung
    'Const Zeitmessung_divident = 18000                          ' 18432000 MHz / 1024 Prescaler
    'Dim Zeitmessung_zeit As Single
    Dim Zeitmessung_timer_ueberlauf As Bit
    Dim Zeitmessung_reloadwert As Word
    Dim Zeitmessung_ticks_start As Integer
    Dim Zeitmessung_ticks_ende As Integer
    Dim Zeitmessung_letzter_ueberlauf As Bit
    Dim Zeitmessung_vergangene_ticks As Integer
    Dim Zeitmessung_aktiv As Bit
    
    
    ' Timerflags
    Dim Timerflag0 As Bit
    Dim Timerstatus0 As Bit
    Dim Timerflag1 As Bit
    Dim Timerstatus1 As Bit
    Dim Timerflag2 As Bit
    Dim Timerstatus2 As Bit
    Dim Timerflag3 As Bit
    Dim Timerstatus3 As Bit
    
    ' Stackbelegung Messung
    Dim Hwstack_belegung As Word
    Dim Swstack_belegung As Word
    Dim Frame_belegung As Word
    
    
    ' Zu beginn S-Bus / R-Bus Eingangs- / Ausgangspuffer leeren
    Clear Serialin
    Clear Serialout
    Clear Serialin1
    Clear Serialout1
    
    
    
    ' HAUPTSCHLEIFE
    
    Do
    
    
    ' R-BUS KOMMUNIKATION
    Call R_bus_kommunikation
    
    
    ' ZYKLUSZEIT MESSEN
    Call Zykluszeitmessung
    
    
    'STACKBELEGUNG MESSEN
    Call Stackbelegungmessung
    
    
    ' TIMER0
    If Timerflag0 = 1 Then
       Timerflag0 = 0
      ' Call Timerueberlauf0
    End If
    
    ' TIMER1
    If Timerflag1 = 1 Then
       Timerflag1 = 0
      ' Call Timerueberlauf1
    End If
    
    ' TIMER2
    If Timerflag2 = 1 Then
       Timerflag2 = 0
      ' Call Timerueberlauf2
    End If
    
    ' TIMER3
    If Timerflag3 = 1 Then
       Timerflag3 = 0
      ' Call Timerueberlauf3
    End If
    
    Loop
    
    ' R-BUS KOMMUNIKATION
    
    Sub R_bus_kommunikation
    
    ' RINGABFRAGE DER TEILNEHMER
    
       Select Case R_bus_schritt
    
          Case 1:                                               ' KARTE ANSPRECHEN
    
             ' Eingangs- / Ausgangspuffer löschen
             Clear Serialin1
             Clear Serialout1
    
             ' Timer zurücksetzen bzw. auf neuen Startwert einstellen (1s)
             Timer1 = Reload_1s
             Timerflag1 = 0
             Timerstatus1 = 1
             ' Watchdogtimer starten
             Start Timer1
    
             ' Sendedaten und Kartenadresse zuordnen
             Select Case Aktuelle_karte
    
               Case 1 :
                  Kartenadresse = 255
                  R_bus_sendearray(3) = 10
                  R_bus_sendearray(4) = 20
               Case 2 :
                  Kartenadresse = 254
                  R_bus_sendearray(3) = 11
                  R_bus_sendearray(4) = 21
    
             End Select
    
             R_bus_sendearray(1) = Kartenadresse
             R_bus_sendearray(2) = 0
             R_bus_sendearray(5) = Crc8(r_bus_sendearray(1) , 4)
    
             Pruef_kartenadresse = Kartenadresse
             R_bus_empfangene_zieladresse = 0
             R_bus_empfangene_quelladresse = 0
    
             Waitus 500
    
             ' Telegramm an Teilnehmer senden
             Printbin #2 , R_bus_sendearray(1) , 5 ;
    
             ' In Schritt 2 schalten
             R_bus_schritt = 2
    
          Case 2:                                               ' AUF RÜCKMELDUNG DER KARTE WARTEN
    
              ' Daten im Empfangspuffer
              If _rs_bufcountr1 > 0 Then
    
                  Err_fehlende_antwort = 0
    
                  ' Telegramm vollständig empfangen
                  If _rs_bufcountr1 >= 5 Then
    
                        Err_falsche_protokolllaenge = 0
    
                        ' Telegramm einlesen
                        Inputbin #2 , R_bus_empfangsarray(1) , 5
    
                        R_bus_empfangene_zieladresse = R_bus_empfangsarray(1)
                        R_bus_empfangene_quelladresse = R_bus_empfangsarray(2)
    
                        ' Zieladresse einlesen und mit eigener Adresse vergleichen
                        If R_bus_empfangene_zieladresse = 0 Then
    
                              Err_falscher_telegrammkopf = 0
    
                              ' HIER PASSIERT DER FEHLER!!!!!!!!!!!!!!
                              ' Quelladresse mit erwarteter vergleichen
                              If R_bus_empfangene_quelladresse = Pruef_kartenadresse Then
    
                                     Err_falscher_teilnehmer = 0
    
                                     ' Empfangene Checksumme mit errechneter vergleichen
                                     If R_bus_empfangsarray(5) = Crc8(r_bus_empfangsarray(1) , 4) Then
    
                                           Err_falsche_checksumme = 0
    
    
                                           ' Aktuellen Teilnehmer um eins erhöhen
                                           Incr Aktuelle_karte
    
                                           ' Alle Teilnehmer durchgelaufen, wieder von vorne beginnen
                                           If Aktuelle_karte > Anzahl_karten Then
                                              Aktuelle_karte = 1
                                           End If
    
                                           ' WatchdogTimer zurücksetzen bzw. auf neuen Startwert einstellen (1s)
                                           Timer1 = Reload_1s
                                           Timerflag1 = 0
    
                                           ' Zurück zu Schritt 1
                                           R_bus_schritt = 1
    
                                     Else
    
                                           ' R-bus-fehler
                                           ' Timer1 stoppen
                                           Stop Timer1
                                           Timerflag1 = 0
                                           Timerstatus1 = 0
                                           ' Zur Fehlerüberprüfung springen
                                           R_bus_schritt = 3
                                           Err_falsche_checksumme = 1
    
                                     End If
    
                              Else
    
                                     ' R-bus-fehler
                                     ' Timer1 stoppen
                                     Stop Timer1
                                     Timerflag1 = 0
                                     Timerstatus1 = 0
                                     ' Zur Fehlerüberprüfung springen
                                     R_bus_schritt = 3
                                     Err_falscher_teilnehmer = 1
    
                              End If
    
                        Else
    
                            Err_falscher_telegrammkopf = 1
    
                        End If
    
                  Else
    
                        Err_falsche_protokolllaenge = 1
    
                  End If
    
              Else
    
                  Err_fehlende_antwort = 1
    
              End If
    
    
          Case 3:                                               ' WATCHDOG / FEHLERÜBERPRÜFUNG WARTEZEIT
    
    
       End Select
    
    End Sub
    
    ' ZYKLUSZEITMESSUNG
    
    Sub Zykluszeitmessung
    
       If Zeitmessung_aktiv = 1 Then
    
          ' Timer Ticks ende
          Zeitmessung_ticks_ende = Timer3
    
          ' Letzten abgeschlossenen Messzyklus auswerten
    
          ' gab es seit dem beginn der Zeitmessung einen Timerüberlauf
          Zeitmessung_letzter_ueberlauf = Zeitmessung_timer_ueberlauf
    
          If Zeitmessung_letzter_ueberlauf = 0 Then
             Zeitmessung_vergangene_ticks = Zeitmessung_ticks_ende - Zeitmessung_ticks_start
          Else
             ' Start bis Überlauf
             Zeitmessung_ticks_start = 65536 - Zeitmessung_ticks_start
             ' Überlauf bis Ende
             Zeitmessung_ticks_ende = Zeitmessung_ticks_ende - Zeitmessung_reloadwert
             ' Summe der Ticks
             Zeitmessung_vergangene_ticks = Zeitmessung_ticks_start + Zeitmessung_ticks_ende
          End If
    
          ' Zeit berechnen
          'Zeitmessung_zeit = Zeitmessung_timerticks / Zeitmessung_divident
    
       End If
    
       ' Neue Zeitmessung beginnen
    
       ' Timer Ticks start
       Zeitmessung_ticks_start = Timer3
       Zeitmessung_timer_ueberlauf = 0
       Zeitmessung_aktiv = 1
    
    End Sub
    
    ' STACKBELEGUNG MESSUNG
    Sub Stackbelegungmessung
    
       Hwstack_belegung = _hwstackstart - _hw_lowest
    
       Swstack_belegung = _hwstack_low - _sw_lowest
    
       If _fw_highest > 0 Then
          Frame_belegung = _frame_high - _fw_highest
          ' Korrektur bei der Berechnung des belegten Platzes
          Frame_belegung = _my_framesize - Frame_belegung       ' ohne Korrektur wird verbleibender Platz angezeigt...
       End If
    
    End Sub
    
    Timerroutine0:
    
       Timerflag0 = 1
    
    Return
    
    Timerroutine1:
    
       Timerflag1 = 1
    
    Return
    
    Timerroutine2:
    
       Timerflag2 = 1
    
    Return
    
    Timerroutine3:
    
       Timerflag3 = 1
    
    Return
    
    ' UART1 schließen
    Close #1
    ' UART2 schließen
    Close #2
    
    End
    Ich hoffe Ihr könnt da jetzt besser was rauslesen?

    Und bezüglich Overlays, das verwende ich aktuell nicht in meinem Code.

    Viele Grüße
    Geändert von demmy (07.11.2014 um 10:40 Uhr)

  8. #8
    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

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    348
    Hi zusammen,

    also die Werte habe ich mir die ganze Zeit schon über eine UART im Fehlerfall ausgeben lassen! Deshalb weiß ich ja das die Werte im Fehlerfall identisch sind.

    Und ich kann euch versichern, das wir die Hardware ausschließen können. Ja, die Frequenz ist recht hoch, aber der µC läuft mit 5V. Ich habe auch schon mit einem Oszi die Spannung mitgeloggt. Die liegt absolut konstant bei 5,03V. Zudem ist die Brown-Out Detection aktiviert.

    Also es muss etwas sein, wenn beide UART'S gleichzeitig senden und empfangen!

    Solange nur die eine Schnittstelle aktiv ist, also die, welche zyklisch die Karten abruft, passiert der Fehler nicht.

    Erst wenn ich die zweite Schnittstelle dazu nehme, und dort auch aktiv zyklisch sende und empfange, dann tritt der Fehler auf!!!
    Aber komischerweise tritt der Fehler immer nur bei der anderen auf.

    Ich versuch das jetzt nochmal mit der zweiten IF abfrage auf Not IF ohne das ELSE was fredred vorgeschlagen hat.

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    Home
    Beiträge
    213
    Hallo demmy,

    Der Hinweis von Willy ist OK aber wenn es nur Probleme mit Crs sind, können wir dies ausschließen.
    Mit Bascom(keile Sache) sollte doch schon einiges beachtet werden. Nur weil im Name BAS erscheint, hat dies nichts mit dem alten Dos- Basic gemein. Der BASCOM- Compiler ist schon sehr nah an Hardware für Controller dran.
    Nach Meinen bescheidenen Erfahrungen, sind es häufig nur Fehler der Variablen Einstellungen. Noch schlimmer ist, wenn eine IF- oder Caseabfrage ins Leere läuft.
    Nun habe ich mich die Zeit genommen deinen Code nachzuvollziehen. Ist nicht so einfach da sehr viele Schleifen verschachtelt sind.
    Frage: hast du in deiner Bascom Umgebung [Line number und Draw Indention Lines] aktiviert. Somit ist ein Abgleich besser möglich.
    Infoaustausch sollt dann besser mit PN erfolgen. Endergebnis dann im Forum.
    Wir wollen Forum ja nicht „vermüllen“.
    Vorab Hinweis: (Incr Aktuelle_karte) in Zeile 244 kann ich nachvollziehen, müsste dies nicht erst vor End If stehen.
    Leider habe ich zur Zeit nicht die Möglichkeit dein Programm hardwaremäßig zu testen.

    Mit freundlichen Grüßen
    fredred

    PS. den letzten Kommentar gelesen.
    Somit nehme ich an eine Abfrage/Entscheidung verursacht Fehler.
    Ist ja nach wie vor immer das gleiche Problem, man kann sehr viel im Programmablauf abfragen, aber hängt das „Ding“ in einer Schleife fest, kommt keine Fehlermeldung(macht ja alles so wie Programmiert) Somit alles im Terminal anzeigen lassen und an den kritischen Punkten ein Stop einfügen.
    Schaust du mal im Bascom Code für 2 UART abfragen, wirst du erkennen, nur wenn der erste den Status „ich bin fertig“ meldet wird UART zwei freigegeben.

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
  •  

Labornetzteil AliExpress