Forum: Mikrocontroller und Digitale Elektronik Timerprogrammierung


von Michael P. (smalldevice)


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

von ... .. (docean) Benutzerseite


Lesenswert?

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...

LCD Ausgabe ist schnarchlanngsam...

von Johannes M. (johnny-m)


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...

von Johannes M. (johnny-m)


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.

von Michael P. (smalldevice)


Lesenswert?

Hallo,

Danke für die Tips. Es lag an der Einstellung des Fusebits für die 
Taktfrequenz.
Programm ist jetzt fertig und ich werde mich nun dem Platinendesign 
widmen.
Freue mich schon auf mein neues "Kontrollzentrum" für meinen 
Röhrenverstärker.

Nochmal DANKE!!!

Gruß smalldevice

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.