Forum: Mikrocontroller und Digitale Elektronik BASCOM - Timer stimmt nicht


von *__* (Gast)


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:
1
Config Timer1 = Timer , Prescale = 64
2
On Timer1 Zeit
3
Timer1 = 65411
4
5
Enable Timer1
6
Enable Interrupts
7
8
[...]
9
10
Zeit:
11
   Timer1 = 65411
12
13
   If Mseconds < 999 Then
14
      Mseconds = Mseconds + 1
15
   Else
16
      Mseconds = 0
17
      If Seconds < 59 Then
18
         Seconds = Seconds + 1
19
      Else
20
         Seconds = 0
21
         If Minutes < 59 Then
22
            Minutes = Minutes + 1
23
         Else
24
            Minutes = 0
25
         End If
26
      End If
27
   End If
28
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

von Serieller (Gast)


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?

von *__* (Gast)


Lesenswert?

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

von *__* (Gast)


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?

von idee (Gast)


Lesenswert?

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

von Fox Mulder (Gast)


Lesenswert?

*__* schrieb:
> Hat da
> jemand eine Lösung?

Gescheit programmieren.

von Helmut (Gast)


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.

von *__* (Gast)


Lesenswert?

Also mein Timer0 ist so konfiguriert:
1
config timer0 = timer, prescale = 8
2
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

von *__* (Gast)


Lesenswert?

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

von spess53 (Gast)


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

von *__* (Gast)


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

von MWS (Gast)


Lesenswert?

*__* schrieb:
> 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 ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.