Interrupt kommt zu schnell

Gast #633569
Lesenswert?
• ▲
▼
Hallo,

Ich habe gerade erst angefangen mit Mikrocontroller-Programmierung. Ich 
möchte über den Timer0 eine LED zum blinken bringen, dazu habe ich 
folgendes Programm geschrieben.
1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <avr/interrupt.h>
4

5
volatile char i=0;
6

7

8
ISR(TIMER0_COMP_vect)
9
{
10
  i++;
11
  PORTB ^= (1<<PB7);
12
}
13

14
int main(void)
15
{
16
  DDRB = 0xff;  //PortB als Ausgang
17
  DDRD = 0x00;  //PortD als Eingang
18
  TCCR0 = 0x0D;  //CTC-Modus Prescaler 1024
19
  OCR0 = 0x7F;  //Zählerwert eingestellt
20
  TIMSK = 0x01;  //Interrupt ermöglichen
21
  sei();
22
  
23
  
24
  PORTB = 0xff;  //LED´s aus
25
  
26
  while(1)
27
  {
28
    if(i>4)
29
    {
30
      i=0;
31
      PORTB ^= (1<<PB3);
32
    }
33
  }
34
}
Das ganze läuft mit einem ATmega8515 und einem 4MHz Quarz auf einem 
STK500. Leider läuft blinken die Lampen aber zu schnell, die 4.LED 
ungefähr 12mal in 10 Sekunden.

Irgendwie komm ich nicht so wirklich auf die Lösung warum der sowas mit 
mir macht :(

Ich benutzte WinAVR-20070525.

Ich hoffe Ihr könnt mir helfen.

Gruß,
Icey
#633577
Lesenswert?
• ▲
▼
Mal rechnen: Alle 128*1024 Takte ein Interrupt, danach Software-Teiler 
10: 128*1024*10 = ca. 1,3Mio. Passt doch prima, wenn man mal annimmt, 
dass du vergessen hast, den Mega vom internen 1MHz Takt auf den Quarz 
umzustellen.

Bloss: Wenn er dann mal mit 4MHz läuft: Langsamer wird dadurch nicht 
blinken. Eher im Gegenteil. Wie ist denn deine Rechnung?
Gast #633584
Lesenswert?
• ▲
▼
Moin,

Mist ich bin doof kopfaufdentischknall

Ich hab mich mit den Einheiten verwurstetelt, ich hab statt ns mit ms 
gerechnet, da kann ja nur das falsche rauskommen.

Danke für die schnelle Hilfe :)

Gruß,
Icey
Gast #633687
Lesenswert?
• ▲
▼
Nö. Da muß man ja doch wieder ins Datenblatt schauen und die Bits 
auseinanderklamüsern, um zu rauszubekommen, ob der Wert denn nun stimmt 
oder nicht.  Abgesehen davon ist Code, der sich selbst kommentiert, 
immer besser als unverständlicher Code, den man erst mit einem Kommentar 
erklären muß.

Am besten:

TCCR0 = _BV(WGM01) | _BV(CS02) | _BV(CS00);

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