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
:
Verschoben durch User
1 | #ifndef F_CPU
|
2 | #define F_CPU 8000000L
|
3 | #endif
|
4 | |
5 | #include <avr/io.h> |
6 | #include <avr/interrupt.h> |
7 | #include <util/delay.h> |
8 | |
9 | void long_delay(uint16_t ms) { |
10 | for(; ms>0; ms--) _delay_ms(1); |
11 | }
|
12 | |
13 | |
14 | int main() |
15 | {
|
16 | cli(); |
17 | |
18 | PORTA = 0x00; |
19 | MCUCR = 0b00000011; |
20 | GICR = 0b11000000; |
21 | |
22 | sei(); |
23 | while(1) |
24 | {
|
25 | POrTA = 0x00; |
26 | }
|
27 | |
28 | }
|
29 | |
30 | ISR(INT0_vect) |
31 | {
|
32 | PORTA = 0xFF; |
33 | long_delay(2000); |
34 | }
|
sry.... DDRA = 0xFF; das kört noch am anfang vom main irgendwo rein ;) sonst bringts gar nix wenn PORTA auf 1 geschalten wird ;)
Hallo Chris, Danke für die Antwort. Den Quelltext habe ich geändert. Erstens, weil ich keinen Port A habe und zweitens, weil die delay_ms in meiner delay.h gar nicht implementiert ist. 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. ===========================================
1 | #ifndef F_CPU
|
2 | #define F_CPU 8000000L
|
3 | #endif
|
4 | |
5 | #include <avr/io.h> |
6 | #include <avr/interrupt.h> |
7 | #include <avr/delay.h> |
8 | |
9 | void long_delay(uint16_t ms) { |
10 | uint16_t i; |
11 | uint16_t b; |
12 | i = 0; |
13 | b = 0; |
14 | for(i; i < 65000; i++) { |
15 | _delay_loop_1(10); |
16 | b++; |
17 | }
|
18 | }
|
19 | |
20 | int main() |
21 | {
|
22 | cli(); |
23 | |
24 | DDRB = 0xFF; |
25 | PORTB = 0x00; |
26 | MCUCR = 0b00000011; |
27 | GICR = 0b11000000; |
28 | |
29 | sei(); |
30 | while(1) |
31 | {
|
32 | PORTB = 0x00; |
33 | }
|
34 | |
35 | }
|
36 | |
37 | ISR(INT0_vect) |
38 | {
|
39 | PORTB = 0xFF; |
40 | long_delay(20000); |
41 | }
|
=========================================== Jetzt die Warnmeldungen
1 | Build started 24.11.2008 at 20:37:10 |
2 | avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -O0 -Wp,-M,-MP,-MT,interrupts.o,-MF,dep/interrupts.o.d -c ../interrupts.c |
3 | ../interrupts.c: In function `long_delay': |
4 | ../interrupts.c:16: warning: statement with no effect |
5 | ../interrupts.c: At top level: |
6 | ../interrupts.c:42: warning: return type defaults to `int' |
7 | ../interrupts.c: In function `ISR': |
8 | ../interrupts.c:45: warning: control reaches end of non-void function |
9 | avr-gcc -mmcu=atmega8 interrupts.o -o interrupts.elf |
10 | avr-objcopy -O ihex -R .eeprom interrupts.elf interrupts.hex |
11 | avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex interrupts.elf interrupts.eep |
12 | Build succeeded with 3 Warnings... |
Vielen Dank für das Lesen meines Problems und vielen Dank im Vorraus für eine Antwort. Florian.
@Autor: Florian Inside (florianinside) >ich keinen Port A habe und zweitens, weil die delay_ms in meiner delay.h >gar nicht implementiert ist. Aber sicher, nur das es _delay_ms() heisst, mit führendem Unterstrich! >Das Resultat ist, dass PortB durchgehend low ist. Sei doch einfach mal nicht oberschlau und übernimm das Beispiel ohne unnötige Änderungen. MFG Falk
Abgesehen davon: Wenn die delay.h bei Dir tatsächlich noch im Unterordner "avr" steht, dann ist es allerhöchste Zeit, dass Du Dir mal eine aktuelle Compiler- und lib-Version installierst! Darauf deutet auch die "return type defaults to 'int'" bei der ISR hin, da Deine lib offensichtlich ISR noch nicht kennt.
@johannes: deine Idee führe ich gerne aus! Wie mache ich das für mein AVR Studio? WinAVR und AVR Studio 4 deinstallieren, neu downloaden, installieren? Florian.
Florian Inside wrote: > @johannes: > > deine Idee führe ich gerne aus! > Wie mache ich das für mein AVR Studio? > > WinAVR und AVR Studio 4 deinstallieren, neu downloaden, installieren? AVRStudio 4, aber einen Uralt-WINAVR drauf? Naja, dann... Also der WINAVR muss definitiv erst runter, den kann man nicht updaten. AVRStudio müsste eigentlich automatisch updaten, wenn der Installer sieht, dass bereits eine ältere Version in Deinem System haust.
A. K. wrote:
> Lass das Studio in Frieden und deinstallere/reinstalliere nur WinAVR.
Naja, je nachdem, welche konkrete Version vom AVRStudio das ist, macht
auch da ein Update Sinn. Es gab da afair mal eine Problematik, dass ab
einer bestimmten WINAVR-Version auch eine bestimmte aktuellere
AVRStudio-Version benötigt wird.
Kannst recht haben. Allerdings sollte bei Studio ein einfacher Update ohne Deinstallation ausreichen. Vor WinAVR.
A. K. wrote: > Kannst recht haben. Allerdings sollte bei Studio ein einfacher Update > ohne Deinstallation ausreichen. Vor WinAVR. Richtig.
woher kreige ich diese delay.h, von der ganz oben die rede ist?
Hallo Florian Den Code den du suchst, findest du auch in der Codesammlung: http://www.electronicsplanet.ch/mikrocontroller/source-code/ATmega8/ATmega8-External-Interrupt-0-falling.htm Gruss Hanspeter
Hanspetie schrieb: > woher kreige ich diese delay.h, von der ganz oben die rede ist? In der heutigen Zeit hast du das einfach, wenn du AVR-Studio installierst. Es hat wenig Sinn, derartige Threads aus 2008 auzugraben. Die Dinge haben sich weiterentwickelt seit dieser Zeit.
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.