CTC-Timer/Interrupt zu langsam!?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren