www.mikrocontroller.net

Forum: Compiler & IDEs Timer / Interrupt Problem


Autor: Swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bin am ende meiner Kräfte. :-(

folgender Programmcode will nicht laufen:

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

#define F_CPU 14745600

unsigned int cnt = 0;

int main (void){

  DDRD= 0x78;  // LED-Ports PD3-PD6 als Ausgang
  PORTD |= 0x78;

  TCCR1A=0x00; // Timer 1 auf Normalbetrieb
  TCCR1B=5; // Clksoure = Quarz / 1024
  TCNT1H=0 ;// Timer auf 0 setzen
  TCNT1L=0 ;
  TIMSK=(1<<TOIE1); //Timer1 Overflow Interrupt Enable
  //TIFR=(1<<TOV1);
  sei();
  while(1){    // Main Loop

  }
  return 1;
}

ISR(TIMER1_OVF_vect){     // Zeile 34
  cnt++;
  if(cnt>10)cnt=0;
  if(cnt==5)PORTD &= ~0x08;  // setze Pin 4 am PortD
  if(cnt==9)PORTD |= 0x08;
}

Der Interrupt wird ausgelöst aber leider ein RESET durchgeführt.
Die Zeit zwischen den Resets stimmt 
allerdings.(1024*65536*10)/14745600HZ = ~5sec)

Beim Kompilieren bekomme ich außerdem folgende Warnungen:

mcu.c:34: warning: return type defaults to `int'
mcu.c:34: warning: function declaration isn't a prototype
mcu.c: In function `ISR':
mcu.c:34: warning: type of "TIMER1_OVF_vect" defaults to "int"
mcu.c:39: warning: control reaches end of non-void function

ist das normal? Ich kann leider mit diesen Warnungen (in diesem 
Zusammenhang) nichts anfangen.

Muß ich außerhalb des SourceCodes irgendetwas beachten? (FUSE-Bits, 
LOCK-Bits oder irgendetwas anderes)

ich habe mich hier im Forum umgesehen und der Sourcecode scheint richtig 
zu sein.

Ich benutze den ATMEGA8535.

MfG

Swen

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir scheint, Du verwendest eine alte Version der AVR-libc, die "ISR" 
noch nicht kennt. Mach mal ein Update auf die aktuelle Version, dann 
sollte es klappen...

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

Bewertung
0 lesenswert
nicht lesenswert
Swen wrote:

> ist das normal? Ich kann leider mit diesen Warnungen (in diesem
> Zusammenhang) nichts anfangen.

Natürlich nicht, sonst wären es keine Warnungen.

Du hast effektiv gar keinen Interruptvektor, daher startet die
Applikation mit jedem Interrupt neu (der default vector macht
einen Sprung nach Adresse 0).

> Muß ich außerhalb des SourceCodes irgendetwas beachten?

Eine aktuelle avr-libc-Version (>= 1.4.0, aktuell ist 1.4.5)
benutzen.

Wenn du das aus irgendwelchen Gründen nicht kannst oder willst,
musst du noch <avr/signal.h> zusätzlich aufnehmen (das ist
mittlerweile komplett nach <avr/interrupt.h> migriert worden)
und deine ISR deklarieren als:
SIGNAL(SIG_OVERFLOW1){ ... }

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls Du grad keine Update-Möglichkeit hast, versuchs mal mit
#include<avr/signal.h>

//...Code...

SIGNAL(SIG_OVERFLOW1)
{
    //Interrupt-Subroutine
}
Wenns damit auch nicht klappt, dann ist noch was anderes im Argen.

Autor: Swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich benutze die aktuelle WinAVR Version mit dem darin enthaltenem 
AVR-libc und c-Compiler.

Mit "Signal" sind schon einmal die Warnungen weg. Aber ein Blinken 
bekomme ich immernoch nicht. (Eine LED ist am Ausgang angeschlossen)

Wie bekomme ich den die aktuelle AVR-libc-Version herraus?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der aktuellen WINAVR-Package ist auch eine aktuelle libc-Version 
drin. Deine scheint deutlich mehr als 1 Jahr alt zu sein, da gabs ISR 
noch nicht.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Aber ein Blinken bekomme ich immernoch nicht
Ich hoffe Du bist nicht zu ungeduldig und wartest auch wirklich die 25 
Sekunden, bis sich was ändert...

Warum verwendest Du eigentlich eine (16-Bit-)Integer-Variable für einen 
Zahlenwert, der nie größer als 10 werden kann? Da reicht auch ein 
unsigned char bzw. ein uint8_t aus der stdint.h. Das nur am Rande... 
Einen Grund, warum nichts passiert, sehe ich jetzt auf den ersten Blick 
nicht.

Autor: Swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WinAVR Version ist 2006-04-21.

AVR-libc Version 1.4.4 soll darin enthalten sein.

Ich bin außerdem erst seit ca 3 Monaten dabei. Um den fehler trotzdem 
ausschließen zu können hab ich gerade WinAVR nochmal drüber installiert.

Autor: Swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast recht hab mich verrechnet.

Beim schreiben dieses Postings hab ich nochmal alles nachgerechnet und 
statt ca 5sec nun 45 sec raus. was bedeutet das sich ca alle 22,5 sec 
was ändert.

Da "Signal" funktioniert werde ich damit weiter arbeiten (müssen).

Nicht ganz das wahre aber es tut.

Vielen dank euch allen

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Da "Signal" funktioniert werde ich damit weiter arbeiten (müssen).

Keine gute Idee.
Wenn du wirklich die neuesten Versionen hast,
dann solltest du auf ISR wechseln.

Ein häufiger Fehler, ist ein ganz simpler Tippfehler
beim Namen des Interrupt Vektors. Also alles doppelt
und dreifach kontrollieren.

Einfach kannst du dirs zb so machen:
In der linken Hälfte vom AVR Studio ist die
Projektanzeige. Dort machst du im Baum die 'external
dependencies auf'. Dort muesste es eine Datei
iom8535.h geben (heist immer so: io und dann das
Kürzel für den Prozessor). Das öffnest du mal und
suchst nach OVERFLOW
Jetzt suchst du den richtigen Overflow raus. Da sind
für jeden Interrupt Vektor immer 2 Zeilen: zuerst
der neue ISR Name und dann der alte SIGNAL Name.
Nimm dir den ISR Namen mittels Strg-C in den Copy Buffer,
geh zu deiner Source und setze den ISR Namen mittels Strg-V
an der richtigen Stelle ein. So gehst du sicher, dass
du keinen Tippfehler hast.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz:
Der Name oben in seinem Code stimmt schon, habs nachgesehen. Sein 
Problem liegt anscheinend tatsächlich bei der lib.

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

Bewertung
0 lesenswert
nicht lesenswert
johnny.m wrote:

> Der Name oben in seinem Code stimmt schon, habs nachgesehen. Sein
> Problem liegt anscheinend tatsächlich bei der lib.

Wenn er die aktuelle WinAVR-Version hat, muss sich dann aber noch
irgendwo eine hornalte Bibliotheksversion (oder Teile davon)
herumdrücken auf der Festplatte...

Autor: Swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg Wunsch

jo daran lag es. Ist leider nicht mein eigener Rechner, kann also nicht 
beliebig dran rum schrauben.
Ich weiß leider auch nicht genau was sonst noch alles drauf ist.

Im Makefile ist es dann ganz einfach:

# List any extra directories to look for include files here.
#     Each directory must be seperated by a space.
EXTRAINCDIRS = xxx

Einfach xxx mit dem richtigen Pfad zur gewünschten AVR-libc ersetzen.



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.