Sida 1 av 1

Blinka LED på STK500

Postat: 19 november 2007, 10:12:15
av BultaIBo
Försöker få Timer0 att fungera med hjälp av Procyon AVRLib. Har testat med följande enkla kod som går att kompilera, men inget händer när jag kör koden på mitt STK500:

Kod: Markera allt

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

#include "global.h"
#include "timerx8.h"

void Timer0Int(void);

unsigned char loop = 0;

//----------------------------
void main(void)
{
                DDRB = 0xff;
	PORTB = 0xFF;

	timerInit();
	timer0SetPrescaler(TIMERRTC_CLK_DIV1024);
	timerAttach(TIMER0OVERFLOW_INT, Timer0Int);
	sei();      
    
	while(1)
	{

	} 
}

//----------------------------
void Timer0Int(void)
{
	loop++;
	if(loop==255)
	{
		PORTB ^=1; 
		loop=0;
	}
}
//----------------------------
Använder jag följande kod som är utan interrupt, så blinkar LED:en:

Kod: Markera allt

void main(void)
{
	DDRB = 0xff;
	PORTB = 0xFF;

	timerInit();
	         
	while(1)
	{
		timerPause(50);
		PORTB ^=1; 
	} 
}
Vad har jag missat? Verkar som om interruptet inte anropas, eller anropas det för sällan? Jag kör STK500 på 3,8 MHz och en ATMEGA644.

Postat: 19 november 2007, 10:36:23
av Spinky Spendrup
Du kan ju börja med ett enkelt test. Släck dioderna innan timerstarten och gör endast en tändning (PORTB=0xAA kanske) i interruptet för att se om det öht slår.

Vad har du för optimering?

Postat: 19 november 2007, 10:53:20
av BultaIBo
Tack för svaret!

Hittat två fel...
1) Jag hade lite för lång tid mellan blinkningarna, så jag tog bort loopen i interupptet.

2) Bytte till Timer2 och då fungerade det. Varför fungerar inte timmer0?

Följnade kod fungerar, dvs min LED blinkar med hjälp av ett Timer interrupt:

Kod: Markera allt

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

#include "global.h"
#include "timerx8.h"

void Timer2Int(void);

//----------------------------
void main(void)
{
	DDRB = 0xff;
	PORTB = 0xFF;

	timerInit();
	timer2SetPrescaler(TIMERRTC_CLK_DIV1024);
	timerAttach(TIMER2OVERFLOW_INT, Timer2Int);

	while(1)
	{
	
	} 
}


void Timer2Int(void)
{	
	PORTB ^=1; 	
}

//----------------------------

Jag kör på optimering: -O0

Postat: 19 november 2007, 10:59:20
av Spinky Spendrup
Jag har inte 644:ans datablad, men är det inte olika upplösning på timer0 och timer2? Edit: nej det är samma.

Helt hundra på att du satt klockkällan från prescalern och inte från något externt?

Vad jobbigt det är att synka med databladet när man inte ser registernamnen... Typ TCCR2B |= 1<< CS22.