www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fehlersuche Bascom Interrupts


Autor: int (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein kurzes Programm, was aber nicht richtig funktioniert. Ich 
kann den Fehler nicht finden.

Stoppuhr wird jede Millisekunde aufgerufen. Alle 40ms wird der "action" 
Flag gesetzt. Falls dieser gesetzt ist, wird in der Main-Loop eine 
Ausgabe generiert. Nach 4 "action"-Blöcken wird eine weitere Aktion 
gestartet ("runnr").

Es scheint Probleme mit dem Stack zu geben, die Ausgabe zeigt schon mal 
Werte > 1000, was eigentlich nicht möglich ist. Oder es kommen wirre 
Zeichen, oder das ganze hängt sich auf und der µC startet neu.

Hilfe!
$regfile = "m644pdef.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 700
$framesize = 100
$baud = 38400
$baud1 = 9600
'$sim

Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , _
   Db7 = Portb.2 , E = Portb.1 , Rs = Portb.0
Config Lcd = 16 * 2 , Chipset = Dogm162v5


' ************* Stoppuhr - TEIL ********************
Config Timer0 = Timer , Prescale = 64
Timer0 = 6

On Timer0 Stoppuhr
Enable Timer0
Start Timer0

Dim Millisekunden As Integer
Dim Sekunden As Integer
Dim Minuten As Integer

Dim Lminuten As Integer
Dim Lsekunden As Integer
Dim Lmillisekunden As Integer


Open "COM2:" For Binary As #2


Config Timer1 = Timer , Capture Edge = Falling , Prescale = 1
Start Timer1


Dim Runcounter As Byte
Runcounter = 0
Dim Runnr As Byte
Runnr = 1
Dim Action As Byte
Action = 0

Wait 5

Enable Interrupts


Cls


Do
   If Action = 1 Then
      Runnr = Runnr + 1


      Print #2 , Millisekunden
      Action = 0

      If Runnr = 4 Then
         'sonstige aktion
         Runnr = 0
      End If

   End If

Loop

End


'stoppuhr
Stoppuhr:
   Timer0 = 6

   Millisekunden = Millisekunden + 1
   Lmillisekunden = Lmillisekunden + 1

   If Runcounter = 40 And Action = 0 Then
      Action = 1
      Runcounter = 0
   End If

   If Millisekunden = 1000 Then
         Incr Sekunden
         Incr Lsekunden
         Millisekunden = 0
         Lmillisekunden = 0
   End If

   If Sekunden = 60 Then
      Incr Minuten
      Incr Lminuten
      Sekunden = 0
      Lsekunden = 0
   End If

   Runcounter = Runcounter + 1

Return

Autor: screwdriver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Zuerst mal ein Lob dafür, dass du gleich deinen Code gepostet hast. Ist 
ja eher eine Seltenheit.

Dein Quellcode sollte im Prinzip in Ordnung sein. Aufgefallen ist mir 
folgendes Interrupt-Problem:

Während Bascom intern damit beschäftigt ist die Variable "Millisekunden" 
per USART auszugeben, bzw. deren Ausgabe vorzubereiten, kann der 
Timer0-Interrupt zuschlagen und kann in der ISR selbst die Variable 
"Millisekunden" ändern. Dies erzeugt sogenannte Seiteneffekte.

Versuch mal während der Print-Ausgabe die Interrupts zu sperren.

Disable Interrupts
Print #2 , Millisekunden
Enable Interrupts

screwdriver

Autor: int (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für den Tipp! Werde ich gleich heute abend ausprobieren.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.