Hallo Gemeinde,
ich stehe etwas ratlos da.
Problem:
Mega2560 (Arduino R3)
verwendet: vier serielle Hardwareschnittstellen.
Alle gepuffert mit jeweils 200 Byte
Bisher lief eigentlich alles ganz gut.
Nun habe ich mir eingebildet ich mache die Ablaufsteuerung 'etwa besser' und setze dazu einen Timer ein.
Läuft auch, jedoch treten seltsame Umstände auf.
drei der vier Seriellen werden mehr oder weniger regelmässig aufgerufen und der Pufferstand ausgewertet.
Ist er hoch genug werden die Daten ausgelesen.
Bei einem Kanal gibt es aber das Problem das ich innerhalb, und nach, einer gewissen Zeit antworten muss.
Bei diesem Kanal kommen ständig irgendwelche Zeichen (Rauschen), irgendwann mal die Kennung und dann die Nutzdaten.
Die Lösung ist so angedacht.
Timer0 erzeugt einen Takt der schnell genug ist um den Puffer immer leer zu halten,
Mit diesem Takt wird der Puffer ausgelesen und auf das erste Kennungszeichen geschaut ob dieses empfangen wurde.
Ist es das passende Zeichen dann wird ein Merker gesetzt und das Lesen weiterer Zeichen durch den INT verhindert.
Dieser Merker wird im Hauptprogramm abgefragt und dann zum Unterprogramm für die Telegrammauswertung und Antwortangabe gesprungen.
Ist dieses beendet wird der Merker gelöscht und somit greift die IR-Rutine wieder auf den Puffer zu.
Bis zum Aufruf des UP zur Auswertung speichert der Puffer dann die ankommenden Daten.
Funktioniert eigentlich ganz gut aber!
Jetzt treten in der Auswertung der anderen Puffer unerwartete Probleme auf, es kommt zum Lesen falscher Daten (Die/eine Wordvariable hat dann den Wert 65535, also lauter einsen).
Auch scheint sich das Programm aufzuhängen.
Ich habe versucht den Timer 2 zu verwenden, läuft auch, aber auch das selbe Problem.
------------------------------
$regfile = "m2560def.dat"
$crystal = 16000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portg.5 , Db5 = Porte.3 , Db6 = Porth.3 , Db7 = Porth.4 , E = Porth.6 , Rs = Porth.5
Config Serialin = Buffered , Size = 200
Config Serialout = Buffered , Size = 200
Config Serialin1 = Buffered , Size = 200
Config Serialout1 = Buffered , Size = 200
Config Serialin2 = Buffered , Size = 200
Config Serialout2 = Buffered , Size = 200
Config Serialin3 = Buffered , Size = 200
Config Serialout3 = Buffered , Size = 200
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com2 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com3 = 1200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'Open all UARTS
'Open "COM1:" For Binary As #1
Open "COM2:" For Binary As #2
Open "COM3:" For Binary As #3
Open "COM4:" For Binary As #4
...
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer2 = Timer , Prescale = 64
On Timer2 Int_t0
Enable Timer2 ' wie TIMER0
Enable Interrupts
Start Adc
' ------------------------------------------------------------
' ------------ Interrupt_Routine ----------------
' -------------------------------------------------------------
'Aufgabe:
' a: Schauen ob das erste Zeichen der Kennung empfangen wurde
' b: Erzeugen der Zykluszeit für Ereignisauslösung und Überwachungen Taktung ca 1 sec
' c: Taktung für LC-Ausgabe Taktung 2..3 sec
' 16000000 / 64 (Vorteiler) 250000 Hz vor dem Timer0
' dieser teilt durch 255 (Überlauf löst Int aus) somit ergibt sich: 980.4 Hz
' 980 /244 = 4.01 Hz
' 4.01 / 4 = 1 Hz = 1 sec.
Int_t0:
If W_in = 0 Then ' schauen ob zulässig
Zeichen = Inkey(#3)
If Zeichen = "W" Then
W_in = 1 ' Merker setzen
End If
End If
Incr Int_zaehler_byte1
If Int_zaehler_byte1 = 244 Then
Incr Int_zaehler_byte2
Int_zaehler_byte1 = 0
End If
If Int_zaehler_byte2 = 4 Then
Takt1_da = 1
Int_zaehler_byte2 = 0
End If
Return
------------------------------------------------------------
Habe ich da einen grundsätzlichen Fehler drin oder läuft irgend ein Stack über?
Oder was könnte es sonst sein?
Kurt
vill sowas?
'$hwstack = 100
'$swstack = 40
'$framesize = 100
ich stehe etwas ratlos da.
Problem:
Mega2560 (Arduino R3)
verwendet: vier serielle Hardwareschnittstellen.
Alle gepuffert mit jeweils 200 Byte
Bisher lief eigentlich alles ganz gut.
Nun habe ich mir eingebildet ich mache die Ablaufsteuerung 'etwa besser' und setze dazu einen Timer ein.
Läuft auch, jedoch treten seltsame Umstände auf.
drei der vier Seriellen werden mehr oder weniger regelmässig aufgerufen und der Pufferstand ausgewertet.
Ist er hoch genug werden die Daten ausgelesen.
Bei einem Kanal gibt es aber das Problem das ich innerhalb, und nach, einer gewissen Zeit antworten muss.
Bei diesem Kanal kommen ständig irgendwelche Zeichen (Rauschen), irgendwann mal die Kennung und dann die Nutzdaten.
Die Lösung ist so angedacht.
Timer0 erzeugt einen Takt der schnell genug ist um den Puffer immer leer zu halten,
Mit diesem Takt wird der Puffer ausgelesen und auf das erste Kennungszeichen geschaut ob dieses empfangen wurde.
Ist es das passende Zeichen dann wird ein Merker gesetzt und das Lesen weiterer Zeichen durch den INT verhindert.
Dieser Merker wird im Hauptprogramm abgefragt und dann zum Unterprogramm für die Telegrammauswertung und Antwortangabe gesprungen.
Ist dieses beendet wird der Merker gelöscht und somit greift die IR-Rutine wieder auf den Puffer zu.
Bis zum Aufruf des UP zur Auswertung speichert der Puffer dann die ankommenden Daten.
Funktioniert eigentlich ganz gut aber!
Jetzt treten in der Auswertung der anderen Puffer unerwartete Probleme auf, es kommt zum Lesen falscher Daten (Die/eine Wordvariable hat dann den Wert 65535, also lauter einsen).
Auch scheint sich das Programm aufzuhängen.
Ich habe versucht den Timer 2 zu verwenden, läuft auch, aber auch das selbe Problem.
------------------------------
$regfile = "m2560def.dat"
$crystal = 16000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portg.5 , Db5 = Porte.3 , Db6 = Porth.3 , Db7 = Porth.4 , E = Porth.6 , Rs = Porth.5
Config Serialin = Buffered , Size = 200
Config Serialout = Buffered , Size = 200
Config Serialin1 = Buffered , Size = 200
Config Serialout1 = Buffered , Size = 200
Config Serialin2 = Buffered , Size = 200
Config Serialout2 = Buffered , Size = 200
Config Serialin3 = Buffered , Size = 200
Config Serialout3 = Buffered , Size = 200
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com2 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com3 = 1200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'Open all UARTS
'Open "COM1:" For Binary As #1
Open "COM2:" For Binary As #2
Open "COM3:" For Binary As #3
Open "COM4:" For Binary As #4
...
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer2 = Timer , Prescale = 64
On Timer2 Int_t0
Enable Timer2 ' wie TIMER0
Enable Interrupts
Start Adc
' ------------------------------------------------------------
' ------------ Interrupt_Routine ----------------
' -------------------------------------------------------------
'Aufgabe:
' a: Schauen ob das erste Zeichen der Kennung empfangen wurde
' b: Erzeugen der Zykluszeit für Ereignisauslösung und Überwachungen Taktung ca 1 sec
' c: Taktung für LC-Ausgabe Taktung 2..3 sec
' 16000000 / 64 (Vorteiler) 250000 Hz vor dem Timer0
' dieser teilt durch 255 (Überlauf löst Int aus) somit ergibt sich: 980.4 Hz
' 980 /244 = 4.01 Hz
' 4.01 / 4 = 1 Hz = 1 sec.
Int_t0:
If W_in = 0 Then ' schauen ob zulässig
Zeichen = Inkey(#3)
If Zeichen = "W" Then
W_in = 1 ' Merker setzen
End If
End If
Incr Int_zaehler_byte1
If Int_zaehler_byte1 = 244 Then
Incr Int_zaehler_byte2
Int_zaehler_byte1 = 0
End If
If Int_zaehler_byte2 = 4 Then
Takt1_da = 1
Int_zaehler_byte2 = 0
End If
Return
------------------------------------------------------------
Habe ich da einen grundsätzlichen Fehler drin oder läuft irgend ein Stack über?
Oder was könnte es sonst sein?
Kurt
vill sowas?
'$hwstack = 100
'$swstack = 40
'$framesize = 100