-         

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 35

Thema: Bytevergleich fehlerhaft

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    340

    Bytevergleich fehlerhaft

    Anzeige

    Hi zusammen,

    ich habe ein kleines Problem, welches mich noch zur Verzweiflung bringt. Und zwar was kann bei einem Atmega1284p dazu führen, das ein normaler Bytevergleich gelegentlich sporadisch fehlerhaft ist?

    der Bytevergleich sieht ganz simpel so aus:

    Code:
    If byte1 = byte2 Then
    '..... Tue was
    else
    ' Fehler und die Werte der beiden Bytes ausgeben
    end if
    die beiden Bytes werden zyklisch über die beiden UART-Schnittstellen beschrieben. Jedes mal wenn der Vergleich angeblich ungleich ist und ich mir die beiden angeblich ungleichen Bytes ausgeben lasse, steht aber in beiden Bytes der gleiche Wert drin. Wie kann das sein, das beide Werte identisch sind und er trotzdem in den "Else-Teil" springt?

    Das Überprüfen findet in einer eigenen Sub statt, welche zyklisch aus der Hauptschleife angesprungen wird und aus diesem Grund habe ich schon den "$hwstack, $swstack und die $framesize hochgesetzt. Kann es etwas damit zu tun haben?

    Ich habe in dem Programm auch alle 4 Timer sowie beide UARTS des Atmega im Einsatz. Ich meine zu glauben, das das Problem verstärkt auftritt, wenn beide UARTS aktiv sind und gleichzeitig Daten ausgetauscht werden. Für die UARTS verwende ich unter anderem auch die Eingang und Ausgangspuffer.

    Hat jemand eine Idee oder so ein Phänomen schon mal gehabt?

    Ich hoffe jemand hat einen Denkanstoss?

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    Zitat Zitat von demmy Beitrag anzeigen
    ... Ich habe in dem Programm auch alle 4 Timer sowie beide UARTS des Atmega im Einsatz ...
    Verbiete doch mal während des Vergleichs die Interrupts, erlaube sie NACH dem Vergleich wieder und schau Dir dann das Ganze nochmal an . . .
    Ciao sagt der JoeamBerg

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    340
    Ok,
    du meinst jetzt mittels enable bzw. disable Interrupts?

    Was glaubst / hoffst du was das bewirkt wenn ich fragen darf?

    Gruß

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2011
    Ort
    Dresden
    Beiträge
    170
    evtl. ==

    mfg
    Achim

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    Da fehlt der Quelltext, wo man den Fehler nachvollziehen kann.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo,

    Wir hatten hier letzthin das Problem, dass Bascom keine komplexeren Ausdrücke in einem IF verkraftet:

    If ((A AND B) XOR C) Then .....
    hat nicht funktioniert, das muss man mit einer Hilfsvariablen machen:
    X = ((A AND B) XOR C)
    If X Then ...

    funktioniert dann.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    340
    mhh das trifft leider alles nicht zu, es ist ein direkter Bytevergleich wie oben beschrieben.

    Der Quelltext ist ein paar hundert Zeilen lang, ich glaube nicht das ihr euch das alles antun wollt, der meiste Teil hat eigentlich auch gar nichts mit dem Problem zu tun und läuft autark, ohne das er in diese eine Sub in irgend einer Form eingreift.
    Das ganze Programm ist im Grunde so strukturiert das in der Hauptschleife zyklisch einzelne Subs nacheinander aufgerufen werden. Interrupts werden auch keine verwendet außer die Timer. Und bei den Timern wird nur ein Flag gesetzt, welches bei gesetztem Zustand in der Hauptschleife eine Sub anspringen lässt.
    Auch die Variablen sind alle Global und die die in dieser Sub verwendet werden, werden eigentlich auch nur dort gebraucht. Sonst nirgends im Programm.

    Ich schaue mal ob ich ein paar interessante Auszüge aus dem Quelltet einstellen kann.

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    Evtl. mal den Stack erhöhen. Was passiert, wenn Du zwischen den Bytes eine Dummy-Variable deklarierst?

    Dim Byte1 as byte
    dim dummy(10) as byte
    dim Byte2 as Byte
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    SA
    Alter
    64
    Beiträge
    211
    Hallo,

    ich nehme an die Timereinstellung „spinnen“ beim Mega 128, besser im Header dies einfügen.

    Const Timsk = Timsk0

    Da kein Code sowie Interrupt- Einstellungen bekannt sind, ist es schwer zu helfen.

    Gruß
    fredred

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    340
    Hi,
    was bewirkt denn dieser Befehl?

    Const Timsk = Timsk0

    Die Stacks habe ich auch schon ganz schön hochgeschraubt!!!


    Also folgender Code beinhaltet das Problem:

    Code:
    $regfile = "M1284pdef.dat"
    ' In den Fusebits wurde der externe Oszillator für 18,432MHz ausgewählt
    $crystal = 18432000
    
    $hwstack = 355                                             ' Standard 42 für den "Hardware Stack"
    $swstack = 355                                             ' Standard 40 für den "Software Stack" 
    $framesize = 655                                          ' Standard 40 für den "Frame" 
    
    ' 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 zweiten Com-Schnittstelle
    Open "COM2:" For Binary As #1
    
    ' Empfangspuffer UART
    Config Serialin = Buffered , Size = 50
    ' Sendepuffer UART
    Config Serialout = Buffered , Size = 50
    ' Empfangspuffer UART1
    Config Serialin1 = Buffered , Size = 50
    ' Sendepuffer UART1
    Config Serialout1 = Buffered , Size = 50
    
    Declare Sub Kommunikation   
    
    Do 
    
    ....
    
    Call Kommunikation
    ....
    
    Loop
    
    Sub Kommunikation
    
              ' Daten im Empfangspuffer
              If _rs_bufcountr1 > 0 Then
    
                  fehlende_daten = 0
    
                  ' Daten vollständig empfangen
                  If _rs_bufcountr1 >= 5 Then
    
                        falsche_laenge = 0
    
                        ' Daten einlesen
                        Inputbin #1 , empfangsarray(1) , 5
    
                        ziel = empfangsarray(1)
                        quelle = empfangsarray(2)
    
                       
                        If ziel = 0 Then
    
                              falscher_kopf = 0
    
                              ' HIER PASSIERT DER FEHLER!!!!!!!!!!!!!!!!!!!
                              If quelle = Pruef_quelle Then
    
                                     falscher_tn = 0
    
                                     ' Empfangene Checksumme mit errechneter vergleichen
                                     If empfangsarray(5) = Crc8(empfangsarray(1) , 4) Then
    
                                           Err_falsche_checksumme = 0
    
                                           ' Hier tut er dann irgendwas!!!
    
                                     Else
                                          
                                           Err_falsche_checksumme = 1
    
                                     End If
    
                              Else
                                   
                                    
                                     Err_falscher_tn = 1
                                     ' Zur Fehlerüberprüfung springen
    
                              End If
    
                        Else
    
                            falscher_kopf = 1
    
                        End If
    
                  Else
    
                        falsche_laenge = 1
    
                  End If
    
              Else
    
                  fehlende_daten = 1
    
              End If
    
    End Sub

Seite 1 von 4 123 ... LetzteLetzte

Ähnliche Themen

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

Berechtigungen

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