mikrocontroller.net

Forum: Compiler & IDEs Timer Atmega16L


Autor: Silvio W. (thedon)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Silvio W. (thedon)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Silvio W. (thedon)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Silvio W. (thedon)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Silvio W. (thedon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könntest du mir evtl noch mit meinem Timer-Inkrementier-Problem 
weiterhelfen??

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Silvio W. (thedon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...;-)

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK jetzt ist alles klar, war ein kleines Verständnisproblem

Danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.