Also ich gebe ja zu dass ich anscheinend doof bin, aber vielleicht hat ja doch einer die Nerven und versucht mir das zu erklären. Ich habe einen Mega16, das STK500 und Codevision; Nun habe ich den Timer 0 eingestellt: Prescaler 64, Reload =0xC6 = 198 Im Interrupt wird nur ein Port getoggelt, also sollte ich an dem Port eine Frequenz von ca. 1 kHz messen. Mein Oszi (Tektronix TDS1012) sagt aber dass da nur 740 Hz anliegen. Kann mir einer erklären warum ? Es kann doch nicht sooo schwer sein, beim AVR eine Frequenz von 1 kHz zu erzeugen. Greetings Karlheinz
Du springst 1000 mal in der Sekunde in den Interrupt und toggelst einen Port. Aber um ein 1KHz-Signal zu generieren mußt du 2000 mal in der Sekunde in den Interrupt springen, um den Port zu toggeln. Wie jetzt die 740 Hz zustande kommen, keine Ahnung. Stimmt die Quarzfrequenz? Michael
Irgnedwas stimmt hier doch überhaupt nicht. Wenn man die 740 mal zurückrechnet (Vorteiler 64 und reload 0xC6) komme ich auf eine Taktfrequenz von 5,5MHz??
3,694304 MHz / 64 = 57723,5. 57723 / (256 - 198) = 995.2... Also von daher stimmt's schon. Jedoch weit entfernt von 740. Michael
Da find ich jetzt zwar nix über die FUSES, aber es gibt ja Datenblätter. Also SUT und CKSEL und COPT scheinen ok zu sein, CKOPT = 1 CKSEL = 111 SUT = 11 Vielleicht liegts ja irgendwie am STK, ich werde wohl den Chip mal programmieren und extern aufbauen, nur mit Takt und Versorgung Mal schauen was da so passiert
Mal ins blaue geschossen: Der Sprung zur Interuptservicerutine und das ev. sichern der Register brauchen doch auch Zeit bevor Du den Timer wieder lädts. Ist jetzt nur mal ein schuss aus der Hüfte von einem Anfänger. Reiner
Kann es sein daß du im Hauptprogramm keine Endlosschleife hast und der Controller 740 mal in der Sekunde das Programm neu startet? Michael
Zum einen solltest du den Timer gleich als erstes neu laden. Zum anderen kann ich mir noch einen anderen Fehler vorstellen: Im Hauptprogramm toggelst du einen Pin am PORTC, im Timer-Interrupt toggelst du einen anderen Pin, auch am PORTC. Das toggeln eines Pins kann bei einem AVR nie atomar sein, man braucht dazu also immer mehr als nur eine Anweisung, bei der immer erst der gesamte Port in ein Register gelesen, das eine Bit getoggelt und dann wieder geschrieben wird. Das Problem ist nun, dass ein Timer-Interrupt just nach dem Einlesen des Ports im Hauptprogramm stattfindet, deinen PORTC.1 toggelt und nachdem die INT-Routine abgearbeitet wurde, überschreibt das Hauptprogramm deinen grad getoggelten PORTC.1 wieder mit dem alten Wert. Das ganze nennt sich Race-Condition, Stichwort Synchronisation und kann auftreten, wenn mehrere evtl. pseudoparallel ablaufende Codeabschnitte eine Ressource nicht atomar ändern. Bei einem Portpin ist aber immer der ganze PORT eine Ressource, und nicht die einzelnen Pins. Die Lösung wäre in dem Fall die Interrupts im Hauptrogramm vor dem Toggeln auszuschalten und danach wieder einzuschalten.
Hi, @Cristof Krüger: "Das toggeln eines Pins kann bei einem AVR nie atomar sein, man braucht dazu also immer mehr als nur eine Anweisung, bei der immer erst der gesamte Port in ein Register gelesen, das eine Bit getoggelt und dann wieder geschrieben wird." Es ist so nicht ganz richtig bei den neuen ATiny u. Mega44 geht das mit nur einem Befehl. Leider benutzt er ein Mega16 somit braucht er mehr Instruction sowie wie du es gesagt hast. Mfg Dirk
BUMBAAAAAAFFFFFFFFF Genau das war´s, Christof. Wenn ich das Toggeln aus dem Hauptprogramm rausnehme, dann stimmt die Frequenz bis auf eine Nachkommastelle genau 1000 Dank Greetings Karlheinz
@Karlheinz: Super, freut mich, dass mein ganzes Geschreibsel nicht umsonst war =) @Dirk: Interessant. Wusste gar nicht, dass ATMEL den Befehlssatz nu erweitert. Das macht die AVRs ja noch interessanter!
Hi... Naja, das ist eigentlich keine Befehlssatz-Erweiterung. Eher eine Funktionalitätserweiterung der Port-Hardware. Das Schreiben von Einsen ins PINx-Register (also das Eingangsregister) toggelt den Port. Nettes Feature, aber ich glaube kaum, dass das die Compiler momentan schon nutzen... ...HanneS...
Achso... wenn es nur das ist, dann dient es evtl. zur verkürzung eines typischen Hello-World-Blink-LED-Programms. Mir fällt sonst auf Anhieb nicht ein, was sonst davon großartig profitieren würde. Togglen von Pins kommt zwar oft bei Clocksignalen vor, aber da weiss man ja immer, wann man das auf 0 oder auf 1 setzt.
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.