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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.