Timer / Interrupt Problem

Gast #457706
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
Moderator Persönliche Seite #457718
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){ ... }
Gast #457720
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.
Gast #457733
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?
Gast #457738
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.
Gast #457765
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
#457797
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.
Gast #460579
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren