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
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