Forum: Compiler & IDEs Anfänger Interrupt Frage


von Gast (Gast)


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

von Gast (Gast)


Lesenswert?

Arbeite übrigens mit dem Mega8515 und STK500

von Fabian B. (fabs)


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

von Stefan B. (stefan) Benutzerseite


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

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.