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:
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?Code:If byte1 = byte2 Then '..... Tue was else ' Fehler und die Werte der beiden Bytes ausgeben end if
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?
Ok,
du meinst jetzt mittels enable bzw. disable Interrupts?
Was glaubst / hoffst du was das bewirkt wenn ich fragen darf?
Gruß
evtl. ==
mfg
Achim
Da fehlt der Quelltext, wo man den Fehler nachvollziehen kann.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
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?
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.
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! \/
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
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
Lesezeichen