Forum: Compiler & IDEs Interrupt - Beispielcode für ATMega 8 erbeten


von Florian I. (florianinside)


Lesenswert?

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
von Johannes M. (johnny-m)


Lesenswert?


von chris (Gast)


Lesenswert?

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
}

von chris (Gast)


Lesenswert?

sry.... DDRA = 0xFF; das kört noch am anfang vom main irgendwo rein ;)

sonst bringts gar nix wenn PORTA auf 1 geschalten wird ;)

von Falk B. (falk)


Lesenswert?

Siehe Interrupt

von Florian I. (florianinside)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@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

von Johannes M. (johnny-m)


Lesenswert?

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.

von Florian I. (florianinside)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Lass das Studio in Frieden und deinstallere/reinstalliere nur WinAVR.

von Johannes M. (johnny-m)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Kannst recht haben. Allerdings sollte bei Studio ein einfacher Update 
ohne Deinstallation ausreichen. Vor WinAVR.

von Johannes M. (johnny-m)


Lesenswert?

A. K. wrote:
> Kannst recht haben. Allerdings sollte bei Studio ein einfacher Update
> ohne Deinstallation ausreichen. Vor WinAVR.
Richtig.

von Hanspetie (Gast)


Lesenswert?

woher kreige ich diese delay.h, von der ganz oben die rede ist?

von Hanspetie (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.