Forum: Mikrocontroller und Digitale Elektronik Interruptvektoren und AVR Studio 5


von Hans-Joachim B. (beckhj)


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

von Peter II (Gast)


Lesenswert?

bekommt du eine warnung bei compilieren?

stimmt denn der Name?  TIMER0_COMPB_vect muss in der header datei 
stehen, wenn nicht stimmt er nicht.

von Thomas E. (thomase)


Lesenswert?

Hans-joachim Beck schrieb:
> Hier mein Code (die relevanten Ausschnitte):
Das übliche Problem mit unvollständigem Code.
Und wo ist die "interrupt.h"?
sei() soll irgendwo anders stehen...

mfg.

von Hans-Joachim B. (beckhj)


Lesenswert?

Hallo!

Nein, keine Fehlermeldung vom Compiler.

Der Code ist nicht vollständig - aber dieser Code produziert das 
Problem.

Im main() gibt es nur einen Aufruf an Timer_0_init() und ein sei(). 
Danach verabschiede ich mich in eine Endlosschleife.

von zy (Gast)


Lesenswert?

Bitte poste den ganzen code!

von Thomas E. (thomase)


Lesenswert?

Hans-joachim Beck schrieb:
> Der Code ist nicht vollständig - aber dieser Code produziert das
> Problem.
Der Code produziert das Problem, weil er nicht vollständig ist:
#include <avr/interrupt.h> fehlt.

#include <inttypes.h> hat mit Interrupts nicht das geringste zu tun.

mfg.

von Hans-Joachim B. (beckhj)


Lesenswert?

Hallo!

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.

Danke!!!!!

von Peter II (Gast)


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.

hast du denn eingeschaltet das du auch warnungen bekommst? -Wall

von Johann L. (gjlayde) Benutzerseite


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]

von Hans-Joachim B. (beckhj)


Lesenswert?

Ja, sind alle eingeschaltet - aber jetzt geht alles.

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.