www.mikrocontroller.net

Forum: Compiler & IDEs Anfänger Interrupt Frage


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich bin Anfänger im GCC programmieren. Ich möchte das beim betätigen 
eines Tasters an Port D das Programm in eine ISR springt und mir den 
Wert x mit 10 multipliziert. Hab schon was versucht es scheinen aber 
noch einige Fehler drin zu sein.
Hoffe ihr könnt mir weiterhelfen. Wäre gut wenn ich auch eine kurze 
Erklärung dabei habe.


// Test 1

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

volatile float x =0.01;

ISR(INT0_vect)

{

x=x*10;

}

int main (void)

{

DDRD=0x00;      //D Eingang
DDRC=0xff;      //C Ausgang
PORTC = 0xff;

MCUCR |=(1<<ISC01) | (1<<ISC00);
GICR |=(1<<INT0);
sei();

  while(1)

  {

  PORTC |= (1<<1);
  PORTC &=~(1<<3);
  PORTC &=~(1<<5);
  PORTC |= (1<<7);

  _delay_ms(x);

  PORTC |= (1<<1);
  PORTC &=~(1<<3);
  PORTC |= (1<<5);
  PORTC &=~(1<<7);

  _delay_ms(x);

  PORTC &=~(1<<1);
  PORTC |= (1<<3);
  PORTC |= (1<<5);
  PORTC &=~(1<<7);

  _delay_ms(x);

  PORTC &=~(1<<1);
  PORTC |= (1<<3);
  PORTC &=~(1<<5);
  PORTC |= (1<<7);

  _delay_ms(x);


  }


}

Vielen Dank schonmal!

Schöne Grüße

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arbeite übrigens mit dem Mega8515 und STK500

Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist denn das Problem?

Ein Problem wirst du mit Tastenprellen haben (lies mal den Artikel hier 
auf der Seite).
Ein zweites entsteht durch _delay_ms(x). Delay_ms ruft man nicht mit 
variablem Argument auf!!! Dann wird der Code irrsinnig aufgeblasen.

Gruß
Fabian

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vor dem sei noch das INT0 Interruptflag löschen, sonst landet das 
Programm u.u. sofort im Interrupt: GIFR |= (1<<INTF0);

_delay_ms und _delay_us mit Variablen, d.h. zur Compilezeit nicht 
bekannten Werten, ist ein No-No

(1<<ISC01) | (1<<ISC00); sind die Parameter dafür, dass der INT0 
angesprungen wird, wenn der Pin LOW LEVEL hat. Willst du einen 
Reaktionstester bauen bzw. wie schnell bist du mit dem Loslassen der 
Taste?

Bei einem Atmega mit 8 MHz kommen geschätzt ein paar hunderttausend 
Interrupts pro Sekunde Tastendruck. Es hängt davon ab, wieviele verloren 
gehen, wenn der INT0 die längliche Gleitkommarechnung macht. Jedenfalls 
erreicht x sehr schnell sehr grosse Werte. Es wird so aussehen, als ob 
das Hauptprogramm eingefroren ist

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.