www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Habe Timer Problem


Autor: Yannic W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe ein Problem mit folgendem code:
$regfile = "m16def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 20
$framesize = 40
$baud = 9600


Config Portb.3 = Input

Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Porta.4 , Rs = Porta.5
Config Lcd = 24 * 2
Initlcd
Cursor Off

Dim Minuten As Byte
Dim Sekunden As Byte
Dim Zeit1 As Byte
Dim Zeit2 As Byte


Config Timer1 = Timer , Prescale = 256
Const Timervorgabe = 3036
On Timer1 Timer_irq
Enable Interrupts


Minuten = 0
Sekunden = 0
Zeit1 = 0
Zeit2 = 0


Do
Locate 1 , 1
Lcd Sekunden

If Pinb.3 = 1 Then
   Enable Timer1
End If

Loop


Timer_irq:
  Timer1 = Timervorgabe
  Incr Sekunden
  If Sekunden = 60 Then
    Incr Minuten
    Sekunden = 0
  End If
Return 

Sobald ich den Taster betätige springt Sekunden sofort auf 1 anstelle 
erst eine Sekunde zu warten. Danach läuft es so wie es soll im 
Sekundentakt. Hat jemand eine Lösung für das Problem ?

mfg Yannic W.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim Enable Timer1 ist deine Timervorgabe noch nicht geladen, d.h. 
Timer1 hat eine Timervorgabe von 0, d.h. der erste Interrupt kommt 
sofort nach dem Enable und dann erst wird kontinuierlich beim Auftreten 
des Interrupts die Timervorgabe neu gesetzt.

Autor: Yannic W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sprich es müsste gehen, wenn ich in die If für den Tasten Taster über 
Enable Timer1 ; Timervorgabe = 3036 setze oder ?

mfg Yannic W.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö.

Timervorgabe ist schon korrekt gesetzt (Const Timervorgabe = 3036), aber 
das ist nur eine Arbeitskonstante. Für den Timer1 bringt das noch 
nichts. Es muss eine Zuweisung an Timer1 dazukommen (so wie in der ISR).

Und damit es einen Effekt hat, muss die Reihenfolge andersrum sein 
(setzen/Zuweisung vorm enable).

If Pinb.3 = 1 Then
   Timer1 = Timervorgabe
   Enable Timer1
End If

Autor: Yannic W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank :)

Autor: Yannic W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut irgendwie war es das wohl doch noch nicht so ganz.

Neuer Code:
$regfile = "m16def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 20
$framesize = 40
$baud = 9600

Config Portb.3 = Input

Dim Minuten As Byte
Dim Sekunden As Byte

Sekunden = 0

Config Timer1 = Timer , Prescale = 256
Const Timervorgabe = 3036
Timer1 = Timervorgabe
On Timer1 Timer_irq
Enable Interrupts

Do 
If Pinb.3 = 1 Then
   Gosub Automodus
End If
Loop

Automodus: 
Enable Timer1

Do 
If Sekunden = 5 Then 
Machwas
End if 
Loop


Timer_irq:
  Incr Sekunden
  If Sekunden = 60 Then
    Incr Minuten
    Sekunden = 0
  End If
Return


Es passiert wieder das gleiche wie vorher.

Autor: Yannic W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner mehr eine Idee ?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

' Einmalige Initialisierungen: 
' BASCOM Interna
$regfile = "m16def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 20
$framesize = 40
$baud = 9600

' Einmalige Initialisierungen: 
' Variablen
Dim Minuten As Byte
Dim Sekunden As Byte
Sekunden = 0

' Einmalige Initialisierungen: 
' Hardware
Config Portb.3 = Input
Config Timer1 = Timer , Prescale = 256
Const Timervorgabe = 3036
Timer1 = Timervorgabe ' #1
On Timer1 Timer_irq
' #2
Enable Interrupts

' Hauptschleife
Do 
  If Pinb.3 = 1 Then
    Goto Automodus    ' <=== DO LOOP mit GOTO verlassen
  End If
Loop

Automodus: 
  ' #3
  Enable Timer1

Do 
  If Sekunden = 5 Then 
    Machwas
  End If 
Loop
End            ' <=== Ende Hauptprogramm

' Subroutine Timer1 ISR
Timer_irq:
  Incr Sekunden
  If Sekunden = 60 Then
    Incr Minuten
    Sekunden = 0
  End If
Return


Eventuell den Code von #1 an Stelle #2 oder Stelle #3 schreiben. Ich 
weiss nicht, ob BASCOM bei On Timer1 Timer_irq zuvor gesetzte Timer1 
Werte in Ruhe lässt bzw. hat das im vorherigen Beispiel an der Stelle 
funktioniert?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADD: Und den Timer1 in der Interrupt-Routine neu laden nicht vergessen! 
So wie im ersten Beispiel.

Autor: Yannic W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An stelle 3 hatte ich ihn bereits stehen. Brachte aber auch leider 
garnichts.

Hast du ggf. nen Avr da, an dem du den code mal antesten kannst. So 
könnte man wenigstens sicher sein, das es klappt.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kennt Bascom eigentlich den CTC-Mode?
Da braucht man dann nichts nachladen...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Yannic W.
> An Stelle 3 hatte ich ihn bereits stehen. Brachte aber auch leider
> garnichts.

Hast du das gelesen: Und den Timer1 in der Interrupt-Routine neu laden 
nicht vergessen! So wie im ersten Beispiel.

> Hast du ggf. nen Avr da, an dem du den code mal antesten kannst. So
> könnte man wenigstens sicher sein, das es klappt.

Nur einen Atmega32 oder einen Attiny2313 in anderen Schaltungen, die ich 
aber auseinander pflücken müsste. Jetzt ist es mir ehrlich zu spät, mit 
dem Hardwarefummeln anzufangen. Wenn nix geht, kümmere ich mich morgen 
abend darum. Und ich kann nur mit einer Bascom AVR Demoversion 
aufwarten. Ich hoffe das reicht.

@  STK500-Besitzer
> Kennt Bascom eigentlich den CTC-Mode?
> Da braucht man dann nichts nachladen...

Auf den ersten Blick sehe ich im Manual nichts bei CONFIG ... und ON 
INTERRUPT ... zum Clear Timer on Compare Modus. 
http://avrhelp.mcselec.com/index.html

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Yannic W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So den code hab ich gerade nochmal veruscht.

Klappte aber leider wieder nicht:
$regfile = "m16def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 20
$framesize = 40
$baud = 9600

Config Portb.3 = Input

Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Porta.4 , Rs = Porta.5
Config Lcd = 24 * 2
Initlcd
Cursor Off


Dim Minuten As Byte
Dim Sekunden As Byte
Sekunden = 0

Config Portb.3 = Input

Config Timer1 = Timer , Prescale = 256
Const Timervorgabe = 3036
On Timer1 Timer_irq
Timer1 = Timervorgabe
Enable Interrupts


Do
  If Pinb.3 = 1 Then
    Goto Automodus
  End If
Loop

Automodus:
Enable Timer1

Do
Locate 2 , 1
Lcd Sekunden
  If Sekunden = 5 Then
    Locate 1 , 1
    Lcd "5 sek"
  End If
Loop
End

Timer_irq:
  Timer1 = Timervorgabe
  Incr Sekunden
  If Sekunden = 60 Then
    Incr Minuten
    Sekunden = 0
  End If
Return


Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ich habe es mit einem schnell zusammengestrickten Atmega32-Aufbau und 
Bascom AVR Demo ausprobiert. Ich habe aber kein LCD angeschlossen und 
keinen Taster.

Geprüft habe ich an einem freien Pin (PORTD.6), den ich auf Output 
gestellt habe und im ersten Versuch im Sekundentakt zwischen 1 und 0 
toggele. Den jeweiligen Zustand messe ich mit einem Spannungsmesser. 
Klappt alles, schöner Wechsel zwischen 5V und 0V im Sekundentakt.

Im zweiten Versuch lasse ich den Pin auf 0 und schalte ihn nur in der 
Sekunde 5 auf 1. Klappt auch. In Sekunde 0 bis 4 0V, dann eine Sekunde 
lang 5V und dann wieder lange 0V.

Lass mal die erste DO LOOP komplett weg, um zu sehen, ob es Probleme mit 
dem Taster gibt und du nie zum Label Automodus und zum Restprogramm 
kommst.

Autor: Yannic W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm, würde das denn Sinn erlgeben ? Ich meine ja nur in die Schleife 
Automodus muss er ja automatisch kommen, da er ja sonst bei echter 
sekunde 4 auf dem display nichts ausgeben würde.

Kann es aber totzdem nochmal ohne die do loop versuchen.

Autor: Yannic W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sodale, ich habe es jetzt geschafft, das Problem weitgehend einzugrenzen 
:)

Folgener Code läuft:
$regfile = "m16def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 20
$framesize = 40
$baud = 9600

Config Portb.3 = Input

Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Porta.4 , Rs = Porta.5
Config Lcd = 24 * 2
Initlcd
Cursor Off


Dim Minuten As Byte
Dim Sekunden As Byte
Sekunden = 0


Config Timer1 = Timer , Prescale = 256
Const Timervorgabe = 3036
On Timer1 Timer_irq
Timer1 = Timervorgabe
Enable Interrupts

Do
Gosub Automodus
Loop

Automodus:

Enable Timer1

Do
Locate 2 , 1
Lcd Sekunden
  If Sekunden = 5 Then
    Locate 1 , 1
    Lcd "5 sek"
  End If
Loop

End

Timer_irq:
  Timer1 = Timervorgabe
  Incr Sekunden
  If Sekunden = 60 Then
    Incr Minuten
    Sekunden = 0
  End If
Return

Jetzt stellt sich nur die Frage, wieso geht es mit Taster nicht ?

Autor: Yannic W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
push

Keiner mehr eine Idee ? Wie schon gesagt liegt es am Taster. Nur wie 
kann ich es nun funktionierend mit Taster hinbekommen ?

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.