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
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...
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){ ... } |
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.
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?
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.
> 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.
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.
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
> 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.
@Karl Heinz: Der Name oben in seinem Code stimmt schon, habs nachgesehen. Sein Problem liegt anscheinend tatsächlich bei der lib.
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...
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.