Forum: Compiler & IDEs Timer / Interrupt Problem


von Swen (Gast)


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

von johnny.m (Gast)


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...

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


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:
1
SIGNAL(SIG_OVERFLOW1){ ... }

von johnny.m (Gast)


Lesenswert?

Falls Du grad keine Update-Möglichkeit hast, versuchs mal mit
1
#include<avr/signal.h>
2
3
//...Code...
4
5
SIGNAL(SIG_OVERFLOW1)
6
{
7
    //Interrupt-Subroutine
8
}
Wenns damit auch nicht klappt, dann ist noch was anderes im Argen.

von Swen (Gast)


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?

von johnny.m (Gast)


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.

von johnny.m (Gast)


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.

von Swen (Gast)


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.

von Swen (Gast)


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

von Karl heinz B. (kbucheg)


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.

von johnny.m (Gast)


Lesenswert?

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

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


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...

von Swen (Gast)


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.



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.