Interruptvektoren und AVR Studio 5

OP #2679904
Lesenswert?

Hallo!

Ich starte nun neu mit dem AVR STudio 5 und laufe da auf ganz dummes 
(einfaches??) Problem.

Meine Interrupte kommen nicht.

Ich will mit dem Timer 0 meines Atmega88PA einen zyklischen Interrupt 
auslösen.

Hier mein Code (die relevanten Ausschnitte):
1
/* Includes */
2
#include <avr/io.h>
3
#include <inttypes.h>
4
#include "timer.h"
5

6
volatile unsigned int timetick;
7

8
void Timer_0_init(void)
9
{
10
  // Timer 0 konfigurieren
11
  TCCR0B = ((1<<CS02) | (1<<CS00) | (1<<WGM02)); // Use system Clock (CS02) Prescaler 1024, CTC Modu
12
  // ((8000000/256)/100) = 156,25
13
  TCNT0=0;
14
  OCR0B=156;
15
  TIFR0= (1 << OCF0B);
16
  // Compare Interrupt erlauben
17
  TIMSK0 |= (1<<OCIE0B);
18
}
19

20

21
ISR ( TIMER0_COMPB_vect )
22
{
23
  TIFR0 |= (1<< OCF0B);
24
  
25
  timetick++;
26
}

Aber da passiert nichts. Ich habe da mal in die LSS_Datei rein geschaut:
1
00000000 <__vectors>:
2
   0:  19 c0         rjmp  .+50       ; 0x34 <__ctors_end>
3
   2:  28 c0         rjmp  .+80       ; 0x54 <__bad_interrupt>
4
   4:  27 c0         rjmp  .+78       ; 0x54 <__bad_interrupt>
5
   6:  26 c0         rjmp  .+76       ; 0x54 <__bad_interrupt>
6
   8:  25 c0         rjmp  .+74       ; 0x54 <__bad_interrupt>
7
   a:  24 c0         rjmp  .+72       ; 0x54 <__bad_interrupt>
8
   c:  23 c0         rjmp  .+70       ; 0x54 <__bad_interrupt>
9
   e:  22 c0         rjmp  .+68       ; 0x54 <__bad_interrupt>
10
  10:  21 c0         rjmp  .+66       ; 0x54 <__bad_interrupt>
11
  12:  20 c0         rjmp  .+64       ; 0x54 <__bad_interrupt>
12
  14:  1f c0         rjmp  .+62       ; 0x54 <__bad_interrupt>
13
  16:  1e c0         rjmp  .+60       ; 0x54 <__bad_interrupt>
14
  18:  1d c0         rjmp  .+58       ; 0x54 <__bad_interrupt>
15
  1a:  1c c0         rjmp  .+56       ; 0x54 <__bad_interrupt>
16
  1c:  1b c0         rjmp  .+54       ; 0x54 <__bad_interrupt>
17
  1e:  1a c0         rjmp  .+52       ; 0x54 <__bad_interrupt>
18
  20:  19 c0         rjmp  .+50       ; 0x54 <__bad_interrupt>
19
  22:  18 c0         rjmp  .+48       ; 0x54 <__bad_interrupt>
20
  24:  17 c0         rjmp  .+46       ; 0x54 <__bad_interrupt>
21
  26:  16 c0         rjmp  .+44       ; 0x54 <__bad_interrupt>
22
  28:  15 c0         rjmp  .+42       ; 0x54 <__bad_interrupt>
23
  2a:  14 c0         rjmp  .+40       ; 0x54 <__bad_interrupt>
24
  2c:  13 c0         rjmp  .+38       ; 0x54 <__bad_interrupt>
25
  2e:  12 c0         rjmp  .+36       ; 0x54 <__bad_interrupt>
26
  30:  11 c0         rjmp  .+34       ; 0x54 <__bad_interrupt>
27
  32:  10 c0         rjmp  .+32       ; 0x54 <__bad_interrupt>
So wie es aussieht, wird der Intreruptvektor nicht richtig versorgt, 
aber der Interrupt kommt, denn im Debugger springt das Programm nach dem 
sei() im Hauptprogramm immer wieder auf den Programmanfang zurück.

Bin ich da blind und sehe mein Problem nicht???

Grüße
Hans-Joachim
Persönliche Seite #2680659
Lesenswert?

Hans-joachim Beck schrieb:

> OK, also es ist so - ein <avr/interrupt.h> behebt das Problem.

> Mich wundert nur, warum das der Cmopiler nicht erkennt,
> denn er sollte eigentlich TIMER0_COMPB_vect nicht auflösen können.

Und wass soll er da für einen Fehler bringen? TIMER0_COMPB_vect wird 
definiert in avr/io.h und der Compiler kann nicht wissen, daß ISR als 
Makro aus einem nicht-includeten Header angedacht ist...

Wenn du
 
1
#include <avr/io.h>
2

3
ISR (TIMER0_COMPB_vect)
4
{
5
}

durch den Päprozessor schichst, bleibt folgendes davon über:
 
1
ISR (__vector_15)
2
{
3
}

Dies definiert also eine int- Funktion mit einem int-Parameter:
 
1
int ISR (int __vector_15)
2
{
3
}

was dir auch die Compilerwarnungen flüstern:
 
1
warning: return type defaults to 'int' [-Wreturn-type]
2
In function 'ISR':
3
warning: type of '__vector_15' defaults to 'int' [-Wmissing-parameter-type]
4
warning: unused parameter '__vector_15' [-Wunused-parameter]
5
warning: control reaches end of non-void function [-Wreturn-type]

Um sowas zu vermeiden, compiliere zB mit -Werror=strict-prototypes 
-Werror=return-type -Werror=missing-parameter-type und du bekommst nicht 
einen Fehler, sondern gleich vier
1
error: return type defaults to 'int' [-Werror=return-type]
2
error: function declaration isn't a prototype [-Werror=strict-prototypes]
3
In function 'ISR':
4
error: type of '__vector_15' defaults to 'int' [-Werror=missing-parameter-type]
5
warning: unused parameter '__vector_15' [-Wunused-parameter]
6
error: control reaches end of non-void function [-Werror=return-type]

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