Sida 1 av 1

Vad har jag glömt? (AVR, C, Timer1)

Postat: 10 mars 2007, 19:24:27
av PaNiC
Jag ska ha interrupt på timer1 output compare. Men med nedanstående kod snurrar inte timern. Vad har jag glömt?

Kod: Markera allt

void setup(void)
	{
	DDRA = 0xff;
	DDRB = 0xff;
	DDRC = 0xff;
	DDRD = 0b00011000;
	PORTA = 0x00;
	PORTB = 0x00;
	PORTC = 0x00;
	TCCR1B = 1<<CS11 | 1<<CS10 | 1<<CTC1;
	OCR1B = 31250;
	TIMSK = 1<<OCIE1B;
	sei();
	}

int main(void)
	{
	setup();
	for(;;)
		{
		PORTB = TCNT1L;
		}
	}

Postat: 10 mars 2007, 19:38:45
av thepirateboy
Vilken uC? Funkar det i simulatorn?

Postat: 10 mars 2007, 19:43:55
av PaNiC
90s8515.

Har inte kunnat prova simulatorn då den inte fungerar. Något kaiko med VC++ Runtimen. Ska installera om windows ikväll.

Postat: 10 mars 2007, 21:45:53
av thepirateboy
Du kan prova att uppgradera till AVR Studio 4.13 b528, då bör simulatorn funka.

http://www.atmel.com/dyn/products/tools ... ol_id=2725

Postat: 10 mars 2007, 22:11:29
av cykze
Du verkar ha aktiverat interrupt för "Output Compare Match" utan att ha någon interrupt-funktion som fångar upp interrupten.

Postat: 10 mars 2007, 23:30:07
av PaNiC
cykze, jag har en funktion som tar det. Inte tagit med den här bara.
Men nu är det testat med simulator också, och timern går inte.

Postat: 11 mars 2007, 08:53:29
av oJsan
Det fungerar alltså inte i simulatorn?! Kan det inte bara vara så att det tar vääldigt lång tid att simulera alla cykler?
Och vad händer i funktionen som tar avbrottet? Hur kan du veta att den funktionen inte körs? (Skicka ALL kod)
Verkar "PORTB = TCNT1L; " bara stå still så är det ju ett tecken på att timern inte går...
En viktig fråga: Fungerar någon annan programvara i din nuvarande uppkoppling?

Postat: 11 mars 2007, 10:09:13
av PaNiC
Hittade felet nu. Compare match uppstår av någon anledning på OCR1A fast det inte ska och TCCR1B, CTC1 nollar således TCNT1-registren innan de har hunnit räkna upp.

Postat: 11 mars 2007, 18:32:52
av AntiZ
I Mega88 är Prescalern för Timer1 och Timer0 ihoplänkade (kan ha olika värde dock) men när man vill reseta prescalern för Timer0, så ryker Timer1's prescaler också. Inte något sådant skumt.