Forum: Compiler & IDEs Atmega168 springt in keine ISR


von Janeman (Gast)


Lesenswert?

Hallo zusammen,

ich bin ganz neu im Umgang mit MikroComputern und schaffe es einfach 
nicht, in eine ISR zu springen. Ich befürchte, das es damit zusammen 
hängt, dass ich mit Eclipse und dem AVR-Plugin arbeite (unter MacOSX). 
Vielleicht zunächst einmal der Code für Atmega168
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdint.h>
4
5
//      ------------------------    Ausgänge   Benennen    ---------------------      //
6
7
#define RFT1                     PD0
8
#define RFT2                     PD1
9
#define PR1                      PD2
10
#define PR2                      PD3
11
#define A0                       PD4
12
#define A1                       PD5
13
#define d0                       PD6
14
#define d1                       PD7
15
16
17
//      ----------------------    Variablen definieren    -----------------------      //
18
19
     volatile unsigned int ST;
20
21
22
//      ----------------------    Timer Interrupt Routine    -------------------      //
23
24
25
   ISR (TIMER0_COMPA_vect)
26
     {
27
     PORTD = 0b00000000;
28
     }
29
30
31
//      ----------------------    Hauptschleife    -------------------      //
32
33
34
35
int main (void) {
36
37
38
   //      --    Ports initialisieren    --      //
39
40
41
     DDRB  = 0b00000000;                //Alle Pins an B als Eingang
42
     DDRD  = 0b11111111;                //Alle Pins an B als Ausgang
43
44
     PORTD = 0b11111111;                //alle LEDs sind aus
45
46
47
   //      --    Timer 0 konfigurieren    --      //
48
49
50
     TCCR0A |= (1<<CS00)|(1<<CS02);    //Prescaler einstellen: CPU-Takt/1024 = 18kHz
51
52
     TCCR0A |= (1<<WGM01);                 //Mode einstellen: Timer ist im Compare-Match-Mode
53
54
     OCR0A   = 0xB4;                            //Compare-Wert Einstellen: 0xB4 = 180  
55
                                                           // 180*55,5us = alle 9,99ms  ein Interrupt
56
57
     TIMSK0 |= (1<<OCIE0A);                //Compare Interrupt A aktivieren
58
59
     sei();                                             //Globale Interrupts aktivieren
60
61
62
   //      ----------------------    Endlosschleife    -----------------------      //
63
64
65
   while(1) 
66
    {
67
    // PORTD = 0b00000000;    //Nur zum Überprüfen ob der Befehl in der ISR funktioniert
68
   }
69
   return 0;
70
}


Ich habe schon ausgiebig hier im Forum recherchiert und dort wurde 
erwähnt, dass solche Probleme bei dem Plugin auftreten können und nicht 
am Code liegen müssen. Dabei wurde darauf verwiesen, dass in den Linker 
Einstellungen der MikroComp definiert werden muss. Aber er ist bei mir 
eingetragen.
Unter Project Properties -> C/C++ Build -> Settings -> Tool Settings -> 
AVR-C-Linker steht:

Command: avr-gcc
Options:    -Wl,-Map,Turntable.map -mmcu=atmega168

Was mich auch so ein wenig stuzig macht, ist, dass Eclipse die ISR 
vollständig "Gelb-Ankreidet" und über Syntaxfehler berichtet. Aber ich 
gehe mal davon aus, dass er einfach von der Syntaxprüfung nicht mit ISR 
umgehen kann. Schreibe ich z.B. ein void davor, meckert die nicht mehr 
rum.

Habt ihr vielleicht sonst noch eine Idee? Ich hoffe Ihr könnt mir 
helfen, mich plagt das schon einige Tage und ich habe noch keine Lösung 
finden können. Vielen Dank im Vorraus.

Gruß Jan

von Tobi (Gast)


Lesenswert?

Hi!

Also wenn der Compiler ISR nicht kennt, ist was faul. Wenn du "void" 
davorschreibst ist das eine normale Funktion. Ergo gibt es dafür keinen 
Interruptvektor, der angesprungen werden kann. Allerdings sehe ich auch 
nicht, warum ISR nicht erkannt werden soll.

von Karl H. (kbuchegg)


Lesenswert?

Was die IDE zu deinem Code sagt, ist egal.

Viel wichtiger: Was macht der reale Prozessor? Nur das ist wichtig.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ich sehe an dem Code nichts auffälliges.  Poste doch mal das Hexfile,
was du erzeugst.

Dass dein Eclipse-Plugin mit dem ISR() nichts anfangen kann und es
daher als eine Funktionsdefinition ohne davorstehenden Typ ansieht,
ist sicher nicht verwunderlich.  Es müsste wohl jemand dem Plugin
beibringen, dass ISR() halt keine echte Funktion ist.

von Stefan E. (sternst)


Lesenswert?

Es gibt keinen Interrupt, weil der Timer gar nicht läuft. Datenblatt 
rauskramen, und nochmal genau nachschauen, welche Bits in welchen 
Registern liegen.

von Oliver (Gast)


Lesenswert?

>Ich habe schon ausgiebig hier im Forum recherchiert und dort wurde
>erwähnt, dass solche Probleme bei dem Plugin auftreten können und nicht
>am Code liegen müssen.

Tja, da hast du wohl was falsch verstande. Solche Probleme liegen IMMER 
am Code.

In deinem Fall vermutlich daran, das CS00 und CS02 nicht in TCCR0A, 
sondern in TCCR0B liegen. So läuft dein Timer gar nicht erst los.

Die Syntax-Meckerei des Eclipse-Editors and dem ISR-Makro allerdings 
liegt an Eclipse, und sollte nach dem ersten build weg sein.

Oliver

von Janeman (Gast)


Lesenswert?

Wow, seid ihr schnell...

Das der SyntaxChecker unbegründet anschlägt dachte ich mir. Hier mal die 
HEX:
1
:100000000C9434000C9451000C9451000C94510049
2
:100010000C9451000C9451000C9451000C9451001C
3
:100020000C9451000C9451000C9451000C9451000C
4
:100030000C9451000C9451000C9453000C945100FA
5
:100040000C9451000C9451000C9451000C945100EC
6
:100050000C9451000C9451000C9451000C945100DC
7
:100060000C9451000C94510011241FBECFEFD4E02A
8
:10007000DEBFCDBF11E0A0E0B1E0EEEFF0E002C0E6
9
:1000800005900D92A030B107D9F711E0A0E0B1E0E2
10
:1000900001C01D92A230B107E1F70E945E000C94EE
11
:1000A0007E000C9400001F920F920FB60F92112445
12
:1000B0001BB80F900FBE0F901F901895CFEFD4E094
13
:1000C000DEBFCDBF14B88FEF8AB98BB984B5856018
14
:1000D00084BD84B5826084BD84EB87BD80916E0051
15
:1000E000826080936E00789480910001909101016C
16
:0E00F000892B11F05898F8CF589AF6CFFFCF11
17
:00000001FF

Ist das so wie gewollt, oder soll ich die Datei komplett reinstellen?

Mal so vielleicht nebenbei. Wie wertet ihr so eine HEX-Datei aus? Gibt 
es ein Programm, welches diese dann wieder in Assembler-Code oder 
ähnliches übersetzt?

Danke für die Hilfe

von Janeman (Gast)


Lesenswert?

Oh, Schande über mein Haupt.... Das tut mir leid. Das war Dumm von mir! 
Werde es gleich mal ausprobieren.

Ihr habt recht, die Einstellungen für den Prescaler liegen im 
B-Register.

Vielen Dank für Eure Hilfe. Hoffentlich kann ich Sie irgendwann mal 
erwiedern, aber das wird wohl noch dauern ;-)

Grüße Jan

von Oliver (Gast)


Lesenswert?

>Es müsste wohl jemand dem Plugin
>beibringen, dass ISR() halt keine echte Funktion ist.

Das Problem ist eher, daß die avr-include-files aus irgend einem Grund 
nicht sofort vom Editor ausgewertet oder gefunden werden. Die werden 
auch als fehlend angemeckert. Nach dem ersten build kennt der Editor 
dann alles.

Oliver

von Janeman (Gast)


Lesenswert?

Super, danke, geht!!!!

von Peter F. (piet)


Lesenswert?

Oliver schrieb:
>>Ich habe schon ausgiebig hier im Forum recherchiert und dort wurde
>>erwähnt, dass solche Probleme bei dem Plugin auftreten können und nicht
>>am Code liegen müssen.
>
> Tja, da hast du wohl was falsch verstande. Solche Probleme liegen IMMER
> am Code.

Oder an den Compiler Optionen ;-)
Vor einer weile habe ich ein kleines dev board in betrieb genommen mit 
einem Mega32, alles funktionierte wunderbar aber kein Interrupt wollte 
funktionieren.

Nach einer ganzen weile, und knapp ner Stunde suchen, habe ich dann den 
Fehler gefunden.
Ich habe zwar einen Mega32 gebrannt aber compiliert war das .hex file 
für einen Mega16.
Die beiden µC sind sich wohl so ähnlich das der Code zwar lief aber die 
Vektoren sind verschieden.
So konnte auch kein Interrupt anspringen...

Grüße,
Peter

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.