CTC-Timer/Interrupt zu langsam!?

OP #2520602
Lesenswert?
• ▲
▼
Hallo,

ich habe folgenden Code:
1
int main(void)
2
{
3
  TCCR0A = (1 << WGM01); //CTC-Mode
4
  TCCR0B |= (1 << CS00) | (1 << CS02); //Prescaler 1024
5
  OCR0A = 78-1; //0 bis 77 --> 78 Tiks=knapp 10ms --> 9,984ms
6
  TIMSK |= (1 << OCIE0A); //Interrupt an
7
  sei(); //Globale Interrupts an
8
  while(1) {
9
  }
10
}
11
ISR(TIMER0_COMPA_vect)
12
{
13
  if (status==1) {
14
    LEDan();
15
    status=0;
16
  }
17
  else {
18
    LEDaus();
19
    status=1;
20
  }
Allerdings sehe ich es immer noch blinken.
Ein zusätzlicher Counter um das mal mit einer Sekunde vergleichen zu 
können zeigte auch, dass es bei weitem zu langsam ist.
Die Register habe ich nun schon mehrmals im Datenblatt durchgeschaut. 
Das müsste eigentlich passen...
Ich finde den Fehler einfach nicht.
1Sekunde/8MHz=0,000000125s/Takt
0,000000125s/Takt * 1024 Prescaler=0,000128s/Countererhöhung
0,000128s/Countererhöhung * 78 Schritte bis Overflow 
(CTC)=0,009984s/Overflow
--> theoretisch ca. alle 10ms (0,01s) ein Aufruf der Interruptroutine

Praktisch läuft das ganze wesentlich langsamer ab
#2520646
Lesenswert?
• ▲
▼
Michael N. schrieb:
> 8x kommt schon in etwa hin (müsste es nochmal umbasteln um es ca. sagen
> zu können)

Warum?
Ich denke du hast eine LED im System?


1
#define F_CPU 8000000UL
2

3
#include <avr/io.h>
4
#include <util/delay.h>
5

6
int main()
7
{
8
  Led_port auf Ausgang;
9

10
  while( 1 ) {
11
    Led_ein();
12
    _delay_ms( 1000 );
13
    Led_aus();
14
    _delay_ms( 1000 );
15
  }
16
}

wenn die 8 Mhz stimmen, dann leuchtet deine LEd 1 Sekunde lang und ist 1 
Sekunde lang dunkel. Wenn die 8Mhz nicht stimmen und zb 1Mhz sind, dann 
leuchtet die Led 8 Sekunden und ist 8 Sekunden dunkel.
Schon weißt du es.

> Aber wenn ich in AVR Studio auf "Read" (unter "Fuses") gehe, dann sagt
> er mir Int. RC Osc. 8MHz

und was sagt sie bei CKDIV8
OP #2520815
Lesenswert?
• ▲
▼
Karl Heinz Buchegger schrieb:
> Ich denke du hast eine LED im System?

Müsste es halt nochmal umprogrammieren. Eigentlich ist das nämlich auch 
nicht nur eine LED, sondern mehrere die per Schieberegister angesteuert 
werden müssen.

Bin leider gerade nichtmehr an dem PC von dem aus ich 
programmiere...Kann aktuell nichtmehr nachschauen.

Das testen mit dem _delay_ms könnte ich auch nochmal machen. Damit hatte 
ich nämlich eigentlich erst im ersten Entwicklungsstadium meiner 
Schaltung getestet ob die Zeit stimmt. Da hat es aber noch gepasst 
(waren 8MHz).

Karl Heinz Buchegger schrieb:
> und was sagt sie bei CKDIV8

Wie gesagt bin ich gerade nichtmehr an dem PC.
Allerdings hatte ich vorhin schon nach dem Begriff Ausschau gehalten: 
Unter den Fuses war es nicht mit drin!? Wo find ich das dann? (AVR 
Studio)
#2520839
Lesenswert?
• ▲
▼
Michael N. schrieb:
> Unter den Fuses war es nicht mit drin!?

Doch, der Tiny45 hat diese CKDIV8-Fuse auch.

> Wo find ich das dann? (AVR Studio)

Im Low-Byte der Fuses, Bit 7.

Aber Du brauchst Diese Fuse nicht, denn Du kannst den 
System-Taktvorteiler CLKPR auch per Software einstellen. Dazu einfach in 
der Init den Schreibschutz von CLKPR aufheben (Bit 7, CLKPCE setzen) und 
dann zweimal hintereinander den Index des gewünschten Vorteilers in 
CLKPR scheiben, bei 1 zu 1 also 0.

Dreimal darfst Du raten, wo diese Info zu finden ist.

...

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.