www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timerprogrammierung


Autor: Michael Pippert (smalldevice)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Pippert (smalldevice)
Datum:

Bewertung
0 lesenswert
nicht 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

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.