PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt - Beispielcode für ATMega 8 ebeten



Florianinside
24.11.2008, 08:08
Hallo Forum.
Ich programmiere meinen neuen ATMega 8 erfolgreich mit AVR Studio 4.x.
Doch bei den Interrupts gebe entweder ich oder der Compiler auf.

Liebes Forum, ich würde mich sehr freuen über einen kleinen Beispielcode, der folgende Bedingungen erfüllt:

- mit ISR arbeiten (und nicht mit den SIGNAL-Methoden)
- per INT0 oder INT1 die Änderung eines PINS überwachen
- in C geschieben sein

Ich würde mich sehr freuen, wenn ich das Beispiel in ein C-Projekt einfügen kann um erstmalig zu sehen, dass die Interrupts ansprechbar sind.

Mit freundlichem Gruß und vielen Dank im vorraus,
Florian

Ceos
24.11.2008, 08:14
poste doch mal deinen code, dann versteht man deine fehler besser und kann dir besser helfen

ausser dass du

#include<avr/interrupt.h>
vergessen

oder bei den vektornamen der interrupts dich vielleicht in GROSS und kleinschreibung vertan hast

gibts eigentlich keine anderen fehlerquellen

Florianinside
24.11.2008, 11:09
Hallo Ceo,
Danke für die Antwort. Den Quelltext habe ich natürlich zu liefern. Hier ist er.
Das Resultat ist, dass PortB durchgehend low ist. Sprich: Die LEDS leuchten dauernd. Int0 (Pin 4) und Int1 (Pin5) sind von mir gebrückt. Eine Verbindung zu 5V oder Masse bringt keine Änderung auf Port B. Die LEDS leuchten dauernd.

Weißt du zufällig, was ich ändern kann?

Anbei der Quelltext, die Warnmeldungen des Compilers sind angefügt.

===========================================

#ifndef F_CPU
#define F_CPU 8000000L
#endif

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

void long_delay(uint16_t ms) {
uint16_t i;
uint16_t b;
i = 0;
b = 0;
for(i; i < 65000; i++) {
_delay_loop_1(10);
b++;
}
}

int main()
{
cli();

DDRB = 0xFF;
PORTB = 0x00;
MCUCR = 0b00000011;
GICR = 0b11000000;

sei();
while(1)
{
PORTB = 0x00;
}

}

ISR(INT0_vect)
{
PORTB = 0xFF;
long_delay(20000);
}

===========================================

Jetzt die Warnmeldungen
Build started 24.11.2008 at 20:37:10
avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -O0 -Wp,-M,-MP,-MT,interrupts.o,-MF,dep/interrupts.o.d -c ../interrupts.c
../interrupts.c: In function `long_delay':
../interrupts.c:16: warning: statement with no effect
../interrupts.c: At top level:
../interrupts.c:42: warning: return type defaults to `int'
../interrupts.c: In function `ISR':
../interrupts.c:45: warning: control reaches end of non-void function
avr-gcc -mmcu=atmega8 interrupts.o -o interrupts.elf
avr-objcopy -O ihex -R .eeprom interrupts.elf interrupts.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex interrupts.elf interrupts.eep
Build succeeded with 3 Warnings...

Vielen Dank für das Lesen meines Problems und vielen Dank im Vorraus für eine Antwort.
Florian.

Ceos
24.11.2008, 11:52
../interrupts.c:16: warning: statement with no effect

das inkrementierender variable b , bzw. die variable b in dem kontext hat keine wirkung , nimm sie einfach raus

../interrupts.c:42: warning: return type defaults to `int'
../interrupts.c: In function `ISR':
../interrupts.c:45: warning: control reaches end of non-void function

das bedeutet, dass er deine ISR als eine
int ISR(...) Methode auffasst, du hast also irgendwas vergessen oder falsch gemacht

allgemein würde ich DRINGEND dazu raten ISRs und methoden allgemein VOR der main zu schreiben, das hier ist kein c++ und du hast auch keine prozedurprototypen deklariert, vermutlich rührt daher der fehler

prozedurales C mit nachgestellten methoden erfordert immer eine dekalration von prozedurprototypen und da ich ehrlich gesagt nicht unbedingt weis wie die interrupts nach den präprozessor aussehen würd ich sie immer über der main schreiben

PS ein alter hut ich weis, aber sie zu dass deine codes NIE warnungen produzieren jede warnung kann zu undefiniertem verhalten führen und die fehlersuche wird dann sehr mühseelig

PS mein nick heisst Ceos auch wenn er irrtumlich aus dem Wort Ceo entstammt ... altlast aus jüngeren jahren aber der hat sich so eingebrannt :p

McJenso
24.11.2008, 12:04
Hallo,

ohne die 0bxxxxxxxx jetzt genau auseinander zu pflücken. Wo ist die ISR für INT1. Wenn du den aktivierst und die ISR fehlt, resetet sich der Controller.

Man ist immer versucht die ISR so kurz wie möglich zu halten und länger dauernde Dinge durch den Interrupt in der Hauptschleife zu veranlassen. Als Übung ist die long_delay Geschichte in der ISR ja okay, ansonsten tödlich.


Gruß

Jens

zerush
24.11.2008, 12:07
Hi,

welche Compiler Version benutzt du?

Ich habe es gerade mit WinAVR-20071221 compiliert und ich bekomme nur diese Warnung:

../interrupts.c: In function `long_delay':
../interrupts.c:16: warning: statement with no effect

Die kommt daher, dass in der for-Schleife nur i; und nicht i = 0; steht.


../interrupts.c:16: warning: statement with no effect

das inkrementierender variable b , bzw. die variable b in dem kontext hat keine wirkung , nimm sie einfach raus

Das stimmt so nicht, ich stimme zwar zu, dass b keine Wrikung hier hat, aber diese Zeile produziert keine Warnung... (Die Nummerierung stimmt nicht mit dem geposteten Code überein...)

Ich bekomme allerdings bei Optimierung O0 den Hinweis, dass die delay-Funktionen nur richtig funktionieren ab O1 ! (und dass man util/delay.h benutzen soll).

Irgendwie erkennt er bei dir ISR nicht richtig an. Er denkt dies wäre eine Funktion mit dem Namen ISR....

EDIT: Vielleicht hast du eine falsche/alte interrupt.h, und darin gibt es kein ISR(...)

Florianinside
24.11.2008, 12:32
Hallo Forum.
Es scheint an meiner Compilerversion zu liegen.
Wie kann ich denn meine AVR Studio und WinAVR-Software auf den neuesten Stand bringen?
Gibt es einen eleganteren Weg außer alles zu de- und wieder zu installieren?

zerush
24.11.2008, 12:54
Du brauchst eigentlich nur WinAVR neu zu installieren. Das alte besser vorher deinstallieren, damit auch sicher der neue genutzt wird.

http://winavr.sourceforge.net/download.html