Hallo, ich habe ein kleines Problem. Wollte meinen Atmeag16L ausprobieren und habe folgenden Code geschrieben: #include <avr/io.h> #include <avr/interrupt.h> void timer0(void); int main (void) { DDRD |= (1<<PD6); timer0(); while(1) { } return 0; } void timer0(void) { TCCR0|= (1<<CS00); TCNT0 = 0xfe; TIMSK |= (1<<TOIE0); sei(); } ISR(TIMER0_OVF_vect) { PORTD ^= (1<<PD6); TCNT0 = 0xfe; } Will mir im Endeffekt nur einen Rechteckfunktion ausgeben lassen. Der Atmega besitzt eine Frequenz von 1MHz, doch am Pin selbst liegt nur eine Frequenz von ca. 9kHz an, habe Fuse Bits etc nicht verändert. Woran könnte das liegen, dass keine höhere Frequenz entsteht?
> TCNT0 = 0xfe;
Ich glaube kaum, dass dein µC es schafft in einem einzigen
Taktzyklus die komplette ISR abzuarbeiten.
-> Der nächste Interrupt kommt schon, während die aktuelle
ISR noch abgearbeitet wird und muss warten bis die ISR
fertig durchgelaufen ist.
Effektiv misst du also wie lange deine ISR dauert. Und da ist
dann halt nicht mehr drinn.
Optimizer der Compilers ist eingeschaltet?
Silvio W. wrote:
> Woran könnte das liegen, dass keine höhere Frequenz entsteht?
Das liegt daran, dass der µC in einem Takt auch nur einen (Assembler-)
Befehl ausführen kann. Allein der Interrupt Handler braucht vermutlich
mehr als 25 Takte (vom Auftreten des Interrupt-Ereignisses bis zum
Rücksprung ins Hauptprogramm). Man könnte sagen: herzlichen Glückwunsch,
Du hast eine Methode gefunden, die Länge eines Interrupt Handlers zu
messen...
Der Optimizer ist nicht eingeschaltet. Aber trotzdem muss es doch möglich sein, eine Freuquenz zu erreichen, die höher ist als 9kHz, ums sie nutzen zu können. Wenn ich das ganze im AVR-Studio simuliere, zeigt mir das Programm schon Mist beim Timer0 an, der zählt diverse Zustände und der minimale step beträgt 2. Der Timer zählt also nicht um 1 nach iben, sondern um2 oder zeigt nen komplett anderen Wert an.
Silvio W. wrote: > Der Optimizer ist nicht eingeschaltet. Da kann der Optimizer gar nichts dran drehen! > Aber trotzdem muss es doch möglich sein, eine Freuquenz zu erreichen, > die höher ist als 9kHz, ums sie nutzen zu können. Ja, aber nicht in Software! Sowas macht man mit einer Compare-Einheit...
Hatte auch schon einen externen Quarz mit 12kHz dran gehangen, kam aber auch dort nicht auf meine gewünschte Frequenz. Wieso inkrementiert mein AVR Studio beim Schrittbetrieb den Timer immer um 2 und nicht, wie er eigtl sollte, um 1??
Silvio W. wrote: > Hatte auch schon einen externen Quarz mit 12kHz dran gehangen, kam aber > auch dort nicht auf meine gewünschte Frequenz. Sag mal, liest Du das, was wir hier schreiben überhaupt?
Johannes M. wrote:
>Sag mal, liest Du das, was wir hier schreiben überhaupt?
Ja, mache ich!! Habe auch eure Ausführungen verstanden, das mit dem
Quarz war mehr eine Feststellung, keine Frage!
Silvio W. wrote: > Ja, mache ich!! Habe auch eure Ausführungen verstanden, das mit dem > Quarz war mehr eine Feststellung, keine Frage! Ah so...
Ein Simulator-Schritt ist ein Assembler-Befehl. Wenn der Assembler-Befehl einen Takt benötigt, dann ist der Timer im nächsten Schritt um eins erhöht, wenn es ein zwei-Zyklen-Befehl ist, dann sind es eben zwei Inkremente...
Johannes M. wrote: > Silvio W. wrote: >> Der Optimizer ist nicht eingeschaltet. > Da kann der Optimizer gar nichts dran drehen! Ich hab jetzt nicht nachgesehen, ob sich der push/pop Aufwand in der ISR mit oder ohne Optimizer verändert. Wenn dem so ist, dann könnte der Optimizer die 'Grenzfrequenz' leicht nach oben treiben, weil die ISR insgesammt schneller wird. Daher die Nachfrage meinerseits.
Karl heinz Buchegger wrote: > Ich hab jetzt nicht nachgesehen, ob sich der push/pop Aufwand > in der ISR mit oder ohne Optimizer verändert. Wenn dem so ist, > dann könnte der Optimizer die 'Grenzfrequenz' leicht nach oben > treiben, weil die ISR insgesammt schneller wird. Daher die > Nachfrage meinerseits. Aber eine ISR inklusive Portpin toggeln in weniger als einem Takt bekommt selbst der beste Optimizer nicht hin...;-)
Hallo zusammen, muss mich mal mit einmischen - da ich mit Silvio in einem Raum sitze ;-). Simuliert (AVR-Studio) und hardwareseitig gemessen: Wenn man den 8-Bit Timer0 ganz normal als Interruptquelle nutzt, ohne Vorladen des TCNT0 und Taktfrequenz = CPU Frequenz, dann sollte beim Überlauf die ISR aller 255µs ausgeführt werden (1MHz interner Oszillator), tatsächlich wird sie aller 510µs ausgeführt. Der Controller befindet sich in der restlichen Zeit in einer while-Endlosschleife. Die Simulation mit AVRStudio zeigt, dass der Wert des TCNT0-Registers mit jedem Einzelschritt um den Betrag von 2 erhöht wird. (Controller führt dabei eine Endlosschleife aus!). An was kann das liegen? Viele Grüße Sebastian
Sebastian wrote: > Die Simulation mit AVRStudio zeigt, dass der Wert des TCNT0-Registers > mit jedem Einzelschritt um den Betrag von 2 erhöht wird. (Controller > führt dabei eine Endlosschleife aus!). > > An was kann das liegen? Daran, dass der Sprung- bzw. Branch-Befehl, aus dem die Schleife besteht, zwei Taktzyklen benötigt...
Sebastian wrote: > Simuliert (AVR-Studio) und hardwareseitig gemessen: > Wenn man den 8-Bit Timer0 ganz normal als Interruptquelle nutzt, ohne > Vorladen des TCNT0 und Taktfrequenz = CPU Frequenz, dann sollte beim > Überlauf die ISR aller 255µs ausgeführt werden (1MHz interner > Oszillator), tatsächlich wird sie aller 510µs ausgeführt. Wie genau sieht das Programm (besser: die ISR) aus? Toggelt sie einen Pin, so wie im Ursprungsposting? Welche Zeit genau hast du gemessen? Von ansteigender Flanke bis zur nächsten ansteigenden Flanke? Oder die Zeit von der steigenden bis zur fallenden Flanke? Falls die ISR den Pin toggelt: Bedenke, dass du immer 2 ISR Aufrufe brauchst, von einer steigenden Flanke zur nächsten. Deine theoretischen 255µs verdoppeln sich in diesem Fall sofort zu 510µs. > Die Simulation mit AVRStudio zeigt, dass der Wert des TCNT0-Registers > mit jedem Einzelschritt um den Betrag von 2 erhöht wird. (Controller > führt dabei eine Endlosschleife aus!). Und woraus schliesst du, dass ein Einzelschritt in einer leeren Endlosschleife, nur genau 1 Takt dauern darf?
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.