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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.