www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik BASCOM - Timer stimmt nicht


Autor: *__* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bastle gerade an einem Küchentimer in BASCOM. Dieser stimmt aber nicht 
ganz. Ich nutze einen externen Quarz mit 22pf Kerkos. Fuses: Low 0xFC 
High 0xDF
Folgender Code nutze ich:
Config Timer1 = Timer , Prescale = 64
On Timer1 Zeit
Timer1 = 65411

Enable Timer1
Enable Interrupts

[...]

Zeit:
   Timer1 = 65411

   If Mseconds < 999 Then
      Mseconds = Mseconds + 1
   Else
      Mseconds = 0
      If Seconds < 59 Then
         Seconds = Seconds + 1
      Else
         Seconds = 0
         If Minutes < 59 Then
            Minutes = Minutes + 1
         Else
            Minutes = 0
         End If
      End If
   End If
Return
Timer0 kümmert sich noch ums Charlieplexing und in der Mainloop werden 
nur ein paar Taster abgefragt.

Bei 3min geht der Timer so um die 2-4 sek. nach

Autor: Serieller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Config Timer1 = Timer , Prescale = 64
> On Timer1 Zeit
> Timer1 = 65411
> Zeit:
>   Timer1 = 65411

1) Hat dein AVR keinen CTC Modus?

2) Wie genau ist dein Taktgeber?

Autor: *__* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nutze eine Attiny2313. Wie oben geschrieben nutze ich einen externen 
Quarz mit 8Mhz sowie die 22pf Kerkos gegen GND.

Autor: *__* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab gerade herausgefunden, dass wenn ich Timer0 (fürs Charlieplexing) 
deaktivier, dass dann ich dann kein Unterschied von 2-4 herrscht. 
Anscheinend müssen sich die beiden Timer in die Quere kommen. Hat da 
jemand eine Lösung?

Autor: idee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schreib doch mal in welcher Zeitbasis (jede ms, alle 500µs...) die Timer 
Interrupts erfolgen.

Autor: Fox Mulder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
*__* schrieb:
> Hat da
> jemand eine Lösung?

Gescheit programmieren.

Autor: Helmut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum prüfst du auf kleiner als? Z.B. kleiner als 59 Sekunden.

Du setzt ja bereits ab der tatsächlich 59 ten Sekunde den Sekundenzähler 
auf Null. Das dürfte erst nach der 59. Sekunde der Fall sein.

Zähle mal die Timerwerte jeweils hoch also +1 und prüfe dann auf 
zeitlichen Überlauf usw.

Autor: *__* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also mein Timer0 ist so konfiguriert:
config timer0 = timer, prescale = 8
on timer0 charlieplexing

mein interrupt soll jede ms geschehen

programmiert hab ich nach diesem beispiel: 
http://mosfetkiller.de/?s=werkzeugkoffer#zeitbasis

aber ich kann mir vorstellen, dass das problem das <59, <999 ist. werde 
das gleich mal ausprobieren

Autor: *__* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Obwohl ich die <59,<999 angepasst habe, habe ich trotzdem bei 1 Minute 
beim AVR eine Laufzeit von 1 Minute und 2 Sekunden.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Du setzt ja bereits ab der tatsächlich 59 ten Sekunde den Sekundenzähler
>auf Null. Das dürfte erst nach der 59. Sekunde der Fall sein.

Nein. Wenn <59 dann Increment.

@*__* (Gast)

Bist du 100%-ig sicher, das dein AVR mit dem Quarz läuft?

MfG Spess

Autor: *__* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin mir 100% sicher. Ist ja aktuell auf einem Breadboard aufgebaut 
und wenn ich den Quarz rausnehme, dann geht gar nichts mehr :D

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
__ schrieb im Beitrag #2097743:
> möchte dieses kleine Projekt noch in BASCOM fertig bekommen und dann auf
> C umsteigen.

Da dacht' ich mir doch letzthin: welches Glück, die C-Gemeinde erhält 
einen Jünger dazu. lol

Da darfst Dich aber noch ganz schön anstrengen :D

Noch nicht daran gedacht, daß der Zähler während des Eintritts in die 
ISR weiter läuft ? Benötigt so ca. 50-60 Takte, bis der Zähler presettet 
wird, und das bei einem Prescaler von 64.

Ist also grenzwertig. Wenn dann noch vorher die Timer0-ISR ausgelöst hat 
und in Bearbeitung ist während Timer1 überläuft, so wird Timer1 eben 
erst nach Timer0 aufgerufen und später auf den Preset gesetzt.

Timer1 hat also länger Zeit bis er überläuft, und deswegen stimmt die 
Zeit nicht. Der Unfug mit der 1000stel Sekunde Auflösung für 'nen 
Eierwecker tut sein Übriges dazu.

Kannst Du vermeiden, indem Du den CTC Mode für Timer1 nimmst, Config 
Timer1 ..., Clear Timer = 1, Comparewert auf 124, wenn's weiter 1/1000 
sein sollen. Und nicht die Ovfl-, sondern die Output-Compare-ISR 
verwenden.

Dann klappt das auch mit dem Ei ;-)

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.