Forum: Mikrocontroller und Digitale Elektronik Drehgeber mit Mega8 - zu wenige Timer?!


von Christian W. (orikson)


Lesenswert?

Hey,

ich habe eine Temperaturüberwachung mit einem Mega8 gebaut. Am Mega8 
hängt ein LCD (20x4), 4 Temperatursensoren (KTY-222, PC0/ADC0 - 
PC3/ADC3), ein Transistor für nen Lüfter (PWM, PB3/OC2), eine DUO-LED in 
rot/blau als Hintergrundbeleuchtung (PWM, blau = PB1/OC1A, rot = PB2 = 
PB2/OC1B) und ein STEC11B03 Drehgeber (PD2/INT0 - PD3/INT1).

Vorerst will ich nur einen Wert am LCD ausgeben, welchen ich mit dem 
Drehgeber verändern kann. Habe jetz aber schon mehrere Vorschläge 
probiert (auch http://www.mikrocontroller.net/articles/Drehgeber), es 
aber immernoch nicht hinbekommen. Hier erst mal mein Code, die Teile zur 
Temperaturmessung, Lüftersteuerung etc. hab ich mal rausgenommen: 
http://nopaste.info/26ecdb16a1.html

Ich denke, das Problem liegt irgendwo zwischen Zeile 30 - 32. Sobald ich 
TIMSK nicht als Kommentar schreibt läuft gar nichts mehr, keine LCD 
Ausgabe etc.

Bei OCR0 meckert er, was ja klar ist, weil es das beim Mega8 nicht gibt. 
Aber womit soll ich das ersetzten?

Wär über nen Tipp sehr dankbar, da ich grad echt nicht weiter komm und 
ich auch in den Datenblättern von Mega8 und Mega16 nicht über das 
richtige gestolpert bin...

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

Christian Wächter schrieb:

> Temperaturmessung, Lüftersteuerung etc. hab ich mal rausgenommen:
> http://nopaste.info/26ecdb16a1.html

Und du denkst ernsthaft, in einem Programmiererforum darf man keinen 
Source Code posten? Ich war mal so frei.

>
> Ich denke, das Problem liegt irgendwo zwischen Zeile 30 - 32. Sobald ich
> TIMSK nicht als Kommentar schreibt läuft gar nichts mehr,

logisch. Du gibts den Overflow Interrupt frei, hast aber einen Handler 
für den Compare Interrupt. Und kaboom. Aufruf einer ISR, die nicht 
existiert wird mit einem Prozessor-Reset bestraft.

weiter hab ich dann nicht mehr geschaut.

von Helfender (Gast)


Lesenswert?

Hallo,

> Ich denke, das Problem liegt irgendwo zwischen Zeile 30 - 32.

Halb richtig; es scheint eine Diskrepanz zwischen dem freigegebenen 
Timer0-Interrupt (Zeile 34) und der ISR (Z.37) zu sein. Sie passen nicht 
zusammen (Overflow-Int freigegeben, die ISR ist für den Compare- 
Interrupt). Das geht nicht gut ...
Lösung: den ISR-Vektor auf Overflow-Interrupt umstellen. (Im Tutorial 
ist es richtig.)

> Bei OCR0 meckert er, was ja klar ist, weil es das beim Mega8 nicht gibt.

Logisch, Timer0 hat keine Compare-Einheit ...

> Aber womit soll ich das ersetzten?

Wenn man die Funktionsweise der Geber-Abfrage verstanden hat, sollte das 
Konfigurieren von Timer0 auch ohne Compare-Register kein Problem 
darstellen; im Tutorial stehen genug Kommentare. (Tip: im Tutorial wird 
der Timer alle 1ms die ISR aufrufen. So muss dein Timer0 incl. Prescaler 
konfiguriert werden.) Die leichte Abweichung zu 1ms bei korrekter 
Einstellung kann vernachlässigt werden (ich komme auf 1,024 ms).

von Helfender (Gast)


Lesenswert?

> Im Tutorial ist es richtig.

Sorry, falsch geschaut; dort ist für dich der falsche Interrupt. Du 
musst natürlich den Timer0-Overflow-Interrupt verwenden.

von Christian W. (orikson)


Lesenswert?

Also gut, habe es jetzt nochmal überarbeitet und zum laufen bekommen. 
Folgendes hab ich geändert:

1) ISR( TIMER0_COMP_vect ) musste man zu ISR( TIMER0_OVF_vect ) ändern
2) Die internen Pull-Up Widerstände aktivieren (habe keine externen 
vorgesehen. Leichtsinnsfehler...
3) TCCR0 =  (1<<CS01) | (1<<CS00); Ich verstehe zwar nicht ganz warum, 
aber es geht. Damit habe ich einen Prescaler von 64. Bei 4 MHz komm ich 
damit auf eine Verzögerung von 0,004 ms, oder hab ich da nen 
Rechenfehler?

Na ja, jetz läuft es wunderbar (STEC11B03 is n 2 Schritt Decoder ;-P ), 
also danke für die Denkhilfe.

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.