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...
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.
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).
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.