Anfänger Interrupt Frage

Gast #841576
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
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
Persönliche Seite
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.