PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Timer0 und ATMega128



Edi
29.10.2006, 15:41
Hallo,
ich habe versucht, auf meinem STK500 ein Lauflicht zu implementieren, bei dem die Verzögerungen mittels Timer0 erzeugt werden, mein Programmcode sieht wie folgt aus:



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

#define SIG_CNT_LIMIT 10
unsigned short i=0; /* count interrupt events */
volatile int zaehler=1;
int up=1;

void init_timer0(void);


ISR(TIMER0_COMP_vect)
{
i++;
/* Did the counter exceed the limit? */
if (i>=SIG_CNT_LIMIT )
{
i=0;
//PORTB = ~zaehler;

if(up == 1)
zaehler = zaehler * 2; //Zaehlerwert auf naechste LED erhoehen
else
zaehler = zaehler / 2; //Zaehlerwert auf naechste LED erniedrigen

if(zaehler == 128) //um von der letzten LED rückwaerts zu laufen, up = 0
up = 0;
else if (zaehler == 1) //um von der ersten LED wieder nach oben zu laufen
up = 1;
}
}


void init_timer0()
{
/* clear timer if timer value matches compare value. */
/* CTC Mode in Register TCCR0*/
TCCR0=(1<<WGM01)|(0<<WGM00);

/* set clock divider to "1024" at position CS00..02 */
TCCR0=(1<<CS02)|(1<<CS01)|(1<<CS00);

/* set timer compare value to 0xFF (=255, 3.68MHz/1024/255)*/
OCR0=0xFF; /* highbyte of compare register */

/* enable compare1a interrupt in the interrupt mask register */
TIMSK=(1<<OCIE0);

/* reset current timer value */
TCNT0=0; /*Timer counter 0*/
}


/* This is the main function. */
int main(void)
{
init_timer0();
DDRB = 0xFF; // all pins are output
DDRA = 0x00;
PORTB=0xFF;
sei();

for(;;)
{
PORTB = ~zaehler; //Ausgabe des aktuellen Zaehlerwertes
}
}


Bekomme beim erstellen zwar keinen Error, aber ich sehe auch kein Lauflicht, kann mir jemand sagen, woran es liegen kann?[/code]

linux_80
29.10.2006, 16:38
Hallo,

bei init_timer0 setzt Du erst die WGM0x Bits, in der 2. Zeile werden sie aber schon wieder gelöscht, also kein CTC mehr !

Edi
29.10.2006, 16:43
Hi,
habe die beiden Zeilen jetzt durch folgende ersetzt:

TCCR0=(1<<WGM01)|(0<<WGM00)|(1<<CS02)|(1<<CS01)|(1<<CS00);

Es tut sich aber trotzdem nichts!

linux_80
29.10.2006, 18:10
Was geht denn jetzt genau nicht, brennt keine, eine oder alle LEDs ?
Ich hab das jetzt mal selber probiert, erst im Simulator, dann mit einem M32, da ich kein M128 hab, musste nur auf PortC umbauen, aber es läuft, das Licht, bei ca. 3.2MHz alle 0,8s die nächste LED.

Jetzt bräuchten wir noch ein paar Infos, wie hast Du compiliert usw., da ich das STK500 auch nicht kenne, darf da jemand anders weitermachen. ;-)

Edi
29.10.2006, 18:16
Hi,
es fängt einfach keine LED zu leuchten an, wenn ich das Lauflicht mit for-Schleifen mache geht es, aber mit Timer nicht!

ich kompiliere immer mit dem Make All vom Programmers Notepad, Makefile ist das selbe wie beim anderen Lauflicht, nur Name des .c Files geändert.