Interrupt - Beispielcode für ATMega 8 erbeten

#1057092
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
Gast #1057099
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
}
#1057281
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.
#1057317
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
#1057335
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.
#1057380
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.
#1057383
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.

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