PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Timer und Atmega168



applican
26.07.2007, 00:24
Guten Abend zusammen

Ich programmiere nun schon den ganzen Abend am Timer, doch aus unerklärlichen Gründen funktioniert das ganze nicht. Was ich machen will: Eine LED in (vorerst beliebigen Takt) blinken zu lassen.

Folgende ausgangslage: Atmega168, interne Frequenz (8 Mhz, ausser ich hätte die Fusebits falsch gesetzt, ich glaube aber nicht).
LED an PD2.
Zuerst habe ich versucht, es nach dem Wiki von Roboternetz (und auch noch anderen Tutorials) zu programmiere, da bekam ich aber immer die Meldung vom Compiler, er kenne TCCR nicht.

Also habe ich das Datenblatt zur Hand genommen und gesucht. Da habe ich andere Registernamen gefunden, mit denen funktioniert zwar das Compilieren, aber die LED bleibt auf AN.


#include <avr/interrupt.h>
#include <avr/io.h>
#define F_CPU 8000000

volatile unsigned int counter0;

ISR(SIG_OVERFLOW1) //ISR
{
counter0++; //counter erhöhen
}

void init_interrupts(void) //interrupt initialisieren
{
TCCR1B |= (1<<CS00); //prescaler auf 64
TCCR1B |= (1<<CS01); //prescaler

sei();
TIMSK1 |= (1<<TOIE1); //interrupts starten
}

inline void sleepms(uint16_t msec)
{
uint16_t i;
for(i=0; i<msec; i++)
{
sleep(100);
}
}

inline void sleep (uint8_t t)
{
counter0 = 0;
while (counter0 < t);
}



int main(void)
{
while(1)
{
DDRD |= (1<<PD2);
PORTD |= (1<<PD2); //LED einschalten

sleepms(1000);

PORTD &= ~(1<<PD2); //LED ausschalten

sleepms(1000);

return 0;
}
}



Hier noch der Code. Ich nehme an, dass der Interrupt nicht (richtig) startet.

Ach ja, ich arbeite mit avr-gcc (falls es noch andere avr-c-compiler gibt, wüsste ich jetzt gar nicht) und avrdude unter Linux.

Im voraus Danke, falls mir jemand helfen kann...

Gruss Dave

linux_80
26.07.2007, 01:06
Hallo,

2. versuch ;-)

die Function init_interrupts wird nicht aufgerufen, also läuft der Timer nicht !

PS:
Und auch mal das Fusebits CKDIV8 anschauen, das ist standardmäsig aktiviert, mit diesem wird der Takt nochmal durch 8 geteilt.

applican
26.07.2007, 01:14
Zuerst mal danke für die sowohl schnelle wie auch späte Antwort...

Den Clock-Teiler habe ich deaktiviert, das hat auch funktioniert...

Wegen der Warteschleife: Ich habe es mal kurz durchgelesen und werde es nun ausprobieren, aber irgendwo habe ich mal gelesen, man solle das nicht so machen (weiss nicht mehr wieso). Aber im Momment werde ich es wohl doch dabei belassen, so sollte es immerhin funktionieren... ;-)

gruss Dave

applican
26.07.2007, 02:25
Guten Morgen nochmals...

So... mitlerweile funktioniert es.

#include <avr/io.h>
//#include <inttypes.h>
#define F_CPU 8000000 // 8 MHz
#include <util/delay.h>

void sleepms(unsigned int ms)
/* delay for a minimum of <ms> */
{
// we use a calibrated macro. This is more
// accurate and not so much compiler dependent
// as self made code.
while(ms)
{
_delay_ms(0.96);
ms--;
}
}

int main(void)
{
while(1)
{
DDRD |= (1<<PD2);


PORTD |= (1<<PD2); //LED einschalten

sleepms(1500);

PORTD &= ~(1<<PD2); //LED ausschalten

sleepms(500);

}
return 0;
}

Und nicht, dass ich noch Urheberrechtsprobleme bekomme: der Code ist grösstenteils vom tuxgraphics.org

gruss dave