Timerproblem

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Timerproblem

      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
    • Michael schrieb:

      Kurt schrieb:

      läuft irgend ein Stack über?
      das ist naheliegend, da du keinenStack definiert hast.Die intern von Bascom vergebenen Werte sind ausreichend für ein kleines Blinkprogramm, aber schon bei nur einer seriellen wird es knapp mit lustigen Fehlern.

      Kurt schrieb:

      vill sowas?

      '$hwstack = 100
      '$swstack = 40
      '$framesize = 100
      ja, das wäre gut.
      Hallo Michael, läuft.

      Danke für die gute Information!!

      Kurt