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
Werbung
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
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 05: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?
Lesezeichen