mikrocontroller.net

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


Autor: Florian Inside (florianinside)
Datum:

Bewertung
0 lesenswert
nicht 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 Moderator
Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#ifndef F_CPU
#define F_CPU  8000000L
#endif

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

void long_delay(uint16_t ms) {
    for(; ms>0; ms--) _delay_ms(1);
}


int main()
{
  cli();
  
  PORTA = 0x00;
  MCUCR = 0b00000011;
  GICR = 0b11000000;

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

ISR(INT0_vect)
{
  PORTA = 0xFF;    
  long_delay(2000);
}

Autor: chris (Gast)
Datum:

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

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Interrupt

Autor: Florian Inside (florianinside)
Datum:

Bewertung
0 lesenswert
nicht 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.
===========================================
#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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Florian Inside (florianinside)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass das Studio in Frieden und deinstallere/reinstalliere nur WinAVR.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Hanspetie (Gast)
Datum:

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

Autor: Hanspetie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Florian

Den Code den du suchst, findest du auch in der Codesammlung:

http://www.electronicsplanet.ch/mikrocontroller/so...

Gruss
Hanspeter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.