ChristophB
04.08.2010, 12:37
Hallo ich verzweifel hier gerade ein bisschen.
Ich versuche den Timer0 des ATMEGA32 zu verwenden. allerdings habe ich so das Gefühl, dass nur einmal die ISR ausgelöst wird und danach nichts mehr passiert.
ich währe euch sehr dankbar wenn ihr mir bei dem Problem helfen könntet.
#include <avr/io.h>
#include <avr/interrupt.h>
uint16_t t = 0;
uint8_t c = 0x00;
void servo_init()
{
//Die Steuersignale der Servos liegen an Port D an!
//Port D als Ausgang definieren
DDRD = 0xff;
PORTD = 0x00;
//Timer initialisieren
TCCR0 = (1<<CS00);
TCNT0 = 96;
TIMSK|=(1<<TOIE0);
//Intrerrupts einschalten
sei();
PORTD = 0x01;
}
//ISR beim überlauf des Timers T0
ISR(TIMER0_OVF_vect){
TCNT0 = 96;
PORTD = 0x03;
t++;
if(t>999){
PORTD = c;
t = 0;
c++;
}
sei();
}
int main( void ) //Funktion die automatisch ausgeführt wird
{
//PORTD
DDRD = 0xff;
//PORTD = 0b11111111;
//PortC
DDRC = 0x00;
PORTC = 0b11111111; // Pull ups -> High && reie 3 aktiviert
//PORTA
DDRA = 0b11100000;
PORTA = 0b01011111;
servo_init();
sei();
while( 1 ) { // Endlosschleife ' verhindert unkontrollierten zustand
}
return 0; // Wird von int main() verlangt
}
Das Problem ist, das die Variable t in der ISR nicht hochgezählt wird und somit auch die Variable nicht am PORTD ausgegeben wird und auch nicht incrementiert wird. Das PORTD = 0x03; welches in der ISR steht wird allerdings ausgeführt.
Ich versuche den Timer0 des ATMEGA32 zu verwenden. allerdings habe ich so das Gefühl, dass nur einmal die ISR ausgelöst wird und danach nichts mehr passiert.
ich währe euch sehr dankbar wenn ihr mir bei dem Problem helfen könntet.
#include <avr/io.h>
#include <avr/interrupt.h>
uint16_t t = 0;
uint8_t c = 0x00;
void servo_init()
{
//Die Steuersignale der Servos liegen an Port D an!
//Port D als Ausgang definieren
DDRD = 0xff;
PORTD = 0x00;
//Timer initialisieren
TCCR0 = (1<<CS00);
TCNT0 = 96;
TIMSK|=(1<<TOIE0);
//Intrerrupts einschalten
sei();
PORTD = 0x01;
}
//ISR beim überlauf des Timers T0
ISR(TIMER0_OVF_vect){
TCNT0 = 96;
PORTD = 0x03;
t++;
if(t>999){
PORTD = c;
t = 0;
c++;
}
sei();
}
int main( void ) //Funktion die automatisch ausgeführt wird
{
//PORTD
DDRD = 0xff;
//PORTD = 0b11111111;
//PortC
DDRC = 0x00;
PORTC = 0b11111111; // Pull ups -> High && reie 3 aktiviert
//PORTA
DDRA = 0b11100000;
PORTA = 0b01011111;
servo_init();
sei();
while( 1 ) { // Endlosschleife ' verhindert unkontrollierten zustand
}
return 0; // Wird von int main() verlangt
}
Das Problem ist, das die Variable t in der ISR nicht hochgezählt wird und somit auch die Variable nicht am PORTD ausgegeben wird und auch nicht incrementiert wird. Das PORTD = 0x03; welches in der ISR steht wird allerdings ausgeführt.