ATMega8 Timer1 ISR

Gast #1597601
Lesenswert?

Ich versuche gerade eine ISR für einen ATMega8 zu schreiben.

Clock bei 8MHz, CTC für Timer 1A.

1
void signal (TIMER1_COMPA_vect)
2
{
3
/*  static  uint16_t  ITime = 0;
4

5
  ITime ++;
6

7
  if (ITime > 500)
8
  {
9
    PORTD &= ~(1<<PD4);
10
  } else PORTD |= (1<<PD4);
11

12
  if (ITime >= 1000) ITime =0;
13
*/
14
   PORTD |= (1<<PD4);
15

16
  return;
17
}
18

19
int main (void)
20
{
21
  PORTC  =  255;
22
  DDRC  =  0;
23

24
  PORTD  =  255 & ~(1<<PD4);
25
  DDRD  =  (1<<PD4);
26

27

28
  TCCR1B  =  (1<<WGM12) | (1<<CS11);  
29
  TIMSK  =  (1<<OCIE1A);
30
  OCR1A  =  10;
31

32
        sei();
33

34
        while (1) {}
35
}

Leider wird der Pin nicht einmal eingeschaltet.
(kein Sprung in die ISR)

WGM für den CTCModus von T1A
CS11 Prescaler auf 8
OCIE1A Interrupt einschalten

OCR1A vergelichsregister.

Finde meinen FEhler nicht, kann mir einer einen Schubs in die richtige 
Richtung geben ?
Persönliche Seite #1597632
Lesenswert?

Was erwartest du für ein Ergebnis und was beobachtest du?

Ich erwarte, dass die die CTC-Routine etwa alle 10 Mikrosekunden 
angesprungen wird und PD4 von PORTD auf HIGH gesetzt wird. Den 
HIGH-Pegel müsste man mit einem Multmeter einfach nachweisen können.

OK ich habe im AVR Simulator gecheatet :)
1
// Clock bei 8MHz, CTC für Timer 1A.
2

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

6
ISR(TIMER1_COMPA_vect)
7
{
8
  PORTD |= (1<<PD4); 
9
}
10

11
int main(void)
12
{
13
  PORTC =  255;
14
  DDRC  =  0;
15

16
  PORTD =  ~(1<<PD4);
17
  DDRD  =  (1<<PD4);
18

19
  TCCR1B =  (1<<WGM12) | (1<<CS11);  
20
  TIMSK  =  (1<<OCIE1A);
21
  OCR1A  =  10;
22

23
  sei();
24

25
  while(1) 
26
  {
27
  }
28
}

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