BurningBen
10.02.2009, 22:22
Hi,
ich habe hier zum ersten mal was mit Interrupts produziert.
ich hab den Code auch schon im AVR-Studio simuliert, da funktioniert soweit alles.
Bei Interrupts ist ja die Geschwindigkeit sehr wichtig, und deshalb wollte ich fragen, ob mir jemand sagen kann, wielange meine interrupt routine wohl etwa braucht. Oder ob es eine möglichkeit gibt, die Zeit auch zu simulieren.
Ablaufen soll das Programm auf nem ATtiny2313 mit 16MHz
#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint8_t phase;
ISR(INT0_vect)
{
if (PIND & (1<<PIND3)) {
phase++;
} else {
phase--;
}
}
int main (void) {
DDRD = 0x00; //Alle D's als eingänge
DDRB = (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3);
phase = 1;
MCUCR |= (1<<ISC01) | (0<<ISC00); //INT0 löst bei fallender Flanke aus.
//für steigende Flanke: 11 statt 10
GIMSK |= (1<<INT0); //Enable INT0
sei();
while (1) {
switch (phase) {
case 0: phase = 4; PORTB = (1<<PB3); break;
case 1: PORTB = (1<<PB0); break;
case 2: PORTB = (1<<PB1); break;
case 3: PORTB = (1<<PB2); break;
case 4: PORTB = (1<<PB3); break;
case 5: phase = 1; PORTB = (1<<PB0); break;
}
}
return 0;
}
Herzlichen Dank,
Benjamin
PS: Falls noch ein Fehler im Code ist, bitte sagen.
ich habe hier zum ersten mal was mit Interrupts produziert.
ich hab den Code auch schon im AVR-Studio simuliert, da funktioniert soweit alles.
Bei Interrupts ist ja die Geschwindigkeit sehr wichtig, und deshalb wollte ich fragen, ob mir jemand sagen kann, wielange meine interrupt routine wohl etwa braucht. Oder ob es eine möglichkeit gibt, die Zeit auch zu simulieren.
Ablaufen soll das Programm auf nem ATtiny2313 mit 16MHz
#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint8_t phase;
ISR(INT0_vect)
{
if (PIND & (1<<PIND3)) {
phase++;
} else {
phase--;
}
}
int main (void) {
DDRD = 0x00; //Alle D's als eingänge
DDRB = (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3);
phase = 1;
MCUCR |= (1<<ISC01) | (0<<ISC00); //INT0 löst bei fallender Flanke aus.
//für steigende Flanke: 11 statt 10
GIMSK |= (1<<INT0); //Enable INT0
sei();
while (1) {
switch (phase) {
case 0: phase = 4; PORTB = (1<<PB3); break;
case 1: PORTB = (1<<PB0); break;
case 2: PORTB = (1<<PB1); break;
case 3: PORTB = (1<<PB2); break;
case 4: PORTB = (1<<PB3); break;
case 5: phase = 1; PORTB = (1<<PB0); break;
}
}
return 0;
}
Herzlichen Dank,
Benjamin
PS: Falls noch ein Fehler im Code ist, bitte sagen.