www.mikrocontroller.net

Forum: Compiler & IDEs Atmega168 springt in keine ISR


Autor: Janeman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>

//      ------------------------    Ausgänge   Benennen    ---------------------      //

#define RFT1                     PD0
#define RFT2                     PD1
#define PR1                      PD2
#define PR2                      PD3
#define A0                       PD4
#define A1                       PD5
#define d0                       PD6
#define d1                       PD7


//      ----------------------    Variablen definieren    -----------------------      //

     volatile unsigned int ST;


//      ----------------------    Timer Interrupt Routine    -------------------      //


   ISR (TIMER0_COMPA_vect)
     {
     PORTD = 0b00000000;
     }


//      ----------------------    Hauptschleife    -------------------      //



int main (void) {


   //      --    Ports initialisieren    --      //


     DDRB  = 0b00000000;                //Alle Pins an B als Eingang
     DDRD  = 0b11111111;                //Alle Pins an B als Ausgang

     PORTD = 0b11111111;                //alle LEDs sind aus


   //      --    Timer 0 konfigurieren    --      //


     TCCR0A |= (1<<CS00)|(1<<CS02);    //Prescaler einstellen: CPU-Takt/1024 = 18kHz

     TCCR0A |= (1<<WGM01);                 //Mode einstellen: Timer ist im Compare-Match-Mode

     OCR0A   = 0xB4;                            //Compare-Wert Einstellen: 0xB4 = 180  
                                                           // 180*55,5us = alle 9,99ms  ein Interrupt

     TIMSK0 |= (1<<OCIE0A);                //Compare Interrupt A aktivieren

     sei();                                             //Globale Interrupts aktivieren


   //      ----------------------    Endlosschleife    -----------------------      //


   while(1) 
    {
    // PORTD = 0b00000000;    //Nur zum Überprüfen ob der Befehl in der ISR funktioniert
   }
   return 0;
}


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

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was die IDE zu deinem Code sagt, ist egal.

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Janeman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wow, seid ihr schnell...

Das der SyntaxChecker unbegründet anschlägt dachte ich mir. Hier mal die 
HEX:
:100000000C9434000C9451000C9451000C94510049
:100010000C9451000C9451000C9451000C9451001C
:100020000C9451000C9451000C9451000C9451000C
:100030000C9451000C9451000C9453000C945100FA
:100040000C9451000C9451000C9451000C945100EC
:100050000C9451000C9451000C9451000C945100DC
:100060000C9451000C94510011241FBECFEFD4E02A
:10007000DEBFCDBF11E0A0E0B1E0EEEFF0E002C0E6
:1000800005900D92A030B107D9F711E0A0E0B1E0E2
:1000900001C01D92A230B107E1F70E945E000C94EE
:1000A0007E000C9400001F920F920FB60F92112445
:1000B0001BB80F900FBE0F901F901895CFEFD4E094
:1000C000DEBFCDBF14B88FEF8AB98BB984B5856018
:1000D00084BD84B5826084BD84EB87BD80916E0051
:1000E000826080936E00789480910001909101016C
:0E00F000892B11F05898F8CF589AF6CFFFCF11
: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

Autor: Janeman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Janeman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, danke, geht!!!!

Autor: Peter F. (piet)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.