PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer Problem



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.

TobiKa
04.08.2010, 12:53
Wenn t>999 ist, wird PORTD = c gesetzt. Dann wird aber beim nächsten Interrupt PORTD wieder gleich 0x03 gesetzt.
Das passiert wahrscheinlich so schnell das du das PORTD = c garnicht siehst.

Jaecko
04.08.2010, 12:54
Ein sei(); gehört NICHT in eine ISR. Da sorgt der Compiler selbst dafür, dass nichts passiert. Da bringt man den Controller eher durcheinander, da der Interrupt dann z.b. schon angesprungen werden kann, während er noch läuft => Problem.

Zwar kein Fehler aber unnötigt: Du initialisiert einiges doppelt; Z.b. sei() reicht 1x in der Main, ebenso DDRD.

ChristophB
04.08.2010, 13:04
Danke für die schnelle hilfe. das port d bei jedem aufruf der ISR auf 0x03 gesetzt wird habe ich irgendwie total verpennt.