Forum: Mikrocontroller und Digitale Elektronik ATMega8 Timer1 ISR


von neuling (Gast)


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 ?

von Michael W. (retikulum)


Lesenswert?

Ich werfe ein fröhliches volatile in die Runde.

Michael

von neuling (Gast)


Lesenswert?

Sorry, aber Register sind doch Volatile...

von Stefan B. (stefan) Benutzerseite


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
}

von neuling (Gast)


Lesenswert?

Der Interrupt war falsch deklariert.

von neuling (Gast)


Lesenswert?

Ja, wollte den Pin schalten zum Nachweis das die Routine angesprungen 
wird.

Jetzt klappt alles...

Vielen Dank !

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.