Timerprogrammierung

OP #1118246
Lesenswert?

Hallo Gemeinde,

Ich bin jetzt ca. 6 Wochen in die Programmierung der µC mit Bascom 
eingestiegen. Mein Projekt (Steuerung eines Röhrenvorverstärkers mit 
Fernbedienung (RC5), Lautstärke und Ballanceregelung über Digitalpoti 
DS1802, Bedienung am Gerät mit 9 Tastern und LCD-Anzeige)
funktioniert tadallos.
Zum Schluss wollte ich noch einen Betriebsstundenzähler verwirklichen. 
Allerdings komme ich nicht auf den gewünschten Takt von einer Sekunde. 
Ich habe folgendes angewendet:
Die Zählschritte des Timers erfolgen mit: Quarzfrequenz / Prescale = 4 
MHz / 64 = 62500 Hz - also alle 0.016 ms. Die Dauer, die der Timer 
insgesamt benötigt bis die 65536 Schritte voll gezählt sind beträgt: 
0.016 ms x 65536 = 1.048576 Sekunden. Für 1 Sekunde: 1/0,016 mS = 62500 
--> Startwert für Timer = 65536-62500 = 3036

leider dauern meine Sekunden (Timerüberlauf) ca. 4 sekunden

Ich habe auch am STK eine 4MHz Quarz eingesetzt und den entsprechenden 
Jumper gesetzt leider mit gleichem Ergebnis.

Was mache ich falsch?

Programmauszug:
$regfile = "m16def.dat"
$crystal = 4000000
Config Timer1 = Timer , Prescale = 64
On Timer1 Timerroutine
Enable Timer1
Timer1 = 3036
Start Timer1

dim i as byte

Do

Loop


Timerroutine:
Timer1 = 3036
  incr i
  lcd i
Return

End


Gruß smalldevice
#1118276
Lesenswert?

Erstens gibt es für solche Sachen den CTC-Modus des Timers, der das 
unsinnige Nachladen im Interrupt Handler mit dem ganzen Overhead 
überflüssig und den Timer genauer macht. Zweitens hast Du vermutlich die 
Fusebits nicht korrekt gesetzt, so dass der ATMega16 mit dem internen 
Oszillator bei 1 MHz läuft (das ist der Auslieferungszustand). Wenn 
etwas anderes als die Default-Taktquelle verwendet werden soll, dann 
nützen keine Jumper etwas, dann müssen die Fuses entsprechend 
programmiert werden. Auch BASCOM kann Dich davor nicht bewahren, es weiß 
schließlich nicht, was Du alles an den µC anschließen willst...
#1118278
Lesenswert?

... ... wrote:
> Macht "lcd i" eine Ausgabe auf dem Display?
>
> Wenn ja raus damit und ab in die Main damit (deine do loop).
>
> In einer Interruptroutine grundsätzlich kurz halten...
Naja, wenn die einmal in der Sekunde aufgerufen werden soll, dann ist es 
noch kein Problem. Aber grundsätzlich hast Du völlig Recht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren