PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : problem mit Timer und SIG_OVERFLOW0



alecs
27.03.2006, 17:10
Hallo,

ich möchte aller 3 sekunden eine aufgabe (Beschleunigen) ausführen, doch es funktioniert nicht :(

der Code sind folgendermaßen aus (gekürzt):



#define Task_1 0

volatile unsigned int Timer1_ms;
volatile unsigned char TaskFlags;

int main(void)
{
init(); // init ports && ext Interrupts

ioinit(); // init COM
fdevopen(uart_putchar, NULL, 0);

timer1_init(); // init Timer1
TIMSK |= (1<<TOIE0); // timer0

twi_init();

sei(); // Interrupts aktivieren

...

if ( TaskFlags & ( 1 << Task_1) )
{
TaskFlags &= ~(1<< Task_1);
....
}
else
{
...
}
}

void timer1_init(void)
{
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);

TCCR1B = (0<<CS12) | (0<<CS11) | (1<<CS10);

TIMSK &= ~0x3c;

OCR1A = 0;
OCR1B = 0;
}

SIGNAL (SIG_OVERFLOW0)
{
Timer1_ms++;
if(Timer1_ms % 3 == 0) // % 3 == mod 3 for 3 seconds
{
TaskFlags |= ( 1<< Task_1 );
}
}







Woran kann das liegen ?

danke

Arexx-Henk
27.03.2006, 21:23
timer1_init(); // init Timer1
TIMSK |= (1<<TOIE0); // timer0


geht es um Timer1 (eins)?

wieso denn 'TOIE0' da ist ja timer0 (nul)

mit
TIMSK &= ~0x3c;
werden ja alle timer1 interrupt ausgeschaltet

gruss

Henk

alecs
27.03.2006, 21:52
Hallo Henk,

ich benutze Timer1 für die PWM und Timer0 wollte ich für den Task.

ok ich versuch das mal in der "void timer1_init(void)" nur auf Timer1 zustellen , aber dennoch dürfte es kaum was ändern oder ? Denn nach dem ich die init aufgerufen hab schlte ich die Interrupts für Timer0 mit " TIMSK |= (1<<TOIE0); "ein, oder seh ich das verkehrt ?


gruss

Alex

SprinterSB
28.03.2006, 08:04
*Grummel*
Was funktioniert denn nicht???

Fehler beim Compilieren, stürzt ab, falsche Interruptrate, geht nur manchmal, nur das geht nicht, ...

alecs
29.03.2006, 08:39
Hallo,

also es kommt kein Fehler beim Compilieren, es wird einfach nur nicht dieser Teil ausgefüht :




if ( TaskFlags & ( 1 << Task_1) )
{
TaskFlags &= ~(1<< Task_1);
....
}


Und im Moment weiß ich noch nicht warum!!! HAbt Ihr eine Idee???

Danke

SprinterSB
29.03.2006, 09:16
Da sollte mindestens eine Schleife drum, sonst landest du nach verlassen von main in exit (Endlosschleife).

alecs
29.03.2006, 09:24
Hallo,

das ganze befindet sich in einer Schleife, ich hab nur aus Gründen der Lesbarkeit den Sourcecode gekürzt. ...

SprinterSB
29.03.2006, 10:09
Bist du absolut sicher, daß dein Fehler nicht in den ... steckt?

So ist's nur rumgerate...

Bist du sicher, daß deine ISR weniger als 256 Takte braucht? Immerhin dividierst du da 16-Bit-Werte!! (was eigentlich unnötig ist).
Die Initialisierung von Timer0 steht auch irgendwo in den Pünktchen.

*Würmer-aus-der-Nase-zieh-und-Glaskugel-auspack*

alecs
29.03.2006, 10:39
ok ok ... mein Fehler, ich hab einen Schreibfehler bei der Initialisierung von Timer0 gehabt und daher ging es nicht. Nun läuft alles.

Danke noch mal an Alle.

Alecs