Forum: Mikrocontroller und Digitale Elektronik Tiny2313-Timer im WinAVR


von Martin (Gast)


Lesenswert?

Hi Leute!

Wollte mir mal zum Verständnis einen Timer in WinAVR debuggen. Wenn ich 
folgenden Code mit dem AVR 2313 anschauen möchte, läuft zwar der 
Debugger, nur die Timer Routine (ISR) wird nicht angesprungen. Weiß 
jemand was ich falsch gemacht hab?? 1000 Dank im Voraus!!!!


#ifndef F_CPU
#define F_CPU 3686400
#endif

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>


int sekunde=0;

ISR (TIMER1_COMP1_vect)
{
sekunde++;
}

static void initTimer(void) {
    TCCR1B = 1<<WGM12 | 1<<CS10;          // divide by 1
                                          // clear on compare
    OCR1A = 10 ; // Output Compare Register
    TCNT1 = 0;                            // Timmer startet mit 0


    TIMSK = 1<<OCIE1A;                    // beim Vergleichswertes 
Compare Match

}


void main(void){
int sekunde=0;
DDRB=0xff;
initTimer();

for(;;){
PORTB=sekunde;

}
}

von gast (Gast)


Lesenswert?


von Stefan E. (sternst)


Lesenswert?

Darüber hinaus:

1) volatile

2) Ein Interrupt alle 10 Takte ist völlig illusorisch.

von Martin (Gast)


Lesenswert?

Danke für eure Antworten!

Zu 1) - OK, hab den Code angepaßt.
ZU 2) - ok, hab ich auch angepaßt


Trotzdem läuft's im Debugger nicht. Ich möchte eigentlich nur mal einen 
Timer zum laufen bringen, der auf das ISR-Event reagiert....

Mein Code steigt im Debugger nach einmaligem Durchlauf einfach aus...

Hat jemand ein Codebeispiel für einen Tiny2313, bei dem auf ein 
Timer-Interrupt reagiert wird? Das Problem ist, daß im GCC-Tutorial 
nicht auf die A + B Register beim Tiny2313 eingegangen wird.

Danke schonmal!!!!!


------------Code-----------

#ifndef F_CPU
#define F_CPU 3686400
#endif

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>


volatile uint16_t sekunde=0;

ISR (TIMER1_COMP1_vect)
{
sekunde++;
}

static void initTimer(void) {
    TCCR1B = 1<<WGM12 | 1<<CS10;          // divide by 1
                                          // clear on compare
    OCR1A = 10 ; // Output Compare Register
    TCNT1 = 0;                            // Timmer startet mit 0


    TIMSK = 1<<OCIE1A;                    // beim Vergleichswertes 
Compare Match

}


void main(void){
int sekunde=0;
DDRB=0xff;
initTimer();
sei();

for(;;){
PORTB=sekunde;

}
}

von Stefan E. (sternst)


Lesenswert?

Schlag mal den richtigen Namen für die ISR nach.

von Martin T. (thunder1902)


Lesenswert?

ES FUNKTIONIERT!!!!

Oh mann - hab in der .h Datei vom anderen 2313-iC nachgeschaut!!

Danke Stefan für den Tip!!

Jetzt muß ich nur noch rauskriegen, warum PortB nicht hochzählt. Hab's 
auch schon mit 'nem 8-Bit Int probiert - geht aber nicht.....

Hast du da evtl. auch noch ein Tip für mich?? :-)

Danke nochmal!!!!!

von Karl H. (kbuchegg)


Lesenswert?

Martin Preisler schrieb:

> Hast du da evtl. auch noch ein Tip für mich?? :-)

Schau dir mal an, wieviele Variablen namens 'Sekunde' du im Programm 
hast.

von Martin T. (thunder1902)


Lesenswert?

Ich lang' mir gleich an's Hirn!! Oh mann!!

Das ist ja fast peinlich!!

Ich danke euch!!! ;-)

Viele Grüße

Martin

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