Forum: Compiler & IDEs Timer Atmega16L


von Silvio W. (thedon)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

> 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?

von Johannes M. (johnny-m)


Lesenswert?

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...

von Silvio W. (thedon)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

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...

von Silvio W. (thedon)


Lesenswert?

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??

von Johannes M. (johnny-m)


Lesenswert?

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?

von Silvio W. (thedon)


Lesenswert?

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!

von Johannes M. (johnny-m)


Lesenswert?

Silvio W. wrote:
> Ja, mache ich!! Habe auch eure Ausführungen verstanden, das mit dem
> Quarz war mehr eine Feststellung, keine Frage!
Ah so...

von Silvio W. (thedon)


Lesenswert?

Könntest du mir evtl noch mit meinem Timer-Inkrementier-Problem 
weiterhelfen??

von Johannes M. (johnny-m)


Lesenswert?

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...

von Silvio W. (thedon)


Lesenswert?

Danke!!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

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...;-)

von Sebastian (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

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?

von Sebastian (Gast)


Lesenswert?

OK jetzt ist alles klar, war ein kleines Verständnisproblem

Danke

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.