Blinka LED på STK500

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
BultaIBo
Inlägg: 32
Blev medlem: 21 mars 2006, 18:08:03
Ort: Hammarö

Blinka LED på STK500

Inlägg 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.
Spinky Spendrup
Inlägg: 75
Blev medlem: 4 december 2003, 19:14:27
Ort: Byn

Inlägg 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?
Användarvisningsbild
BultaIBo
Inlägg: 32
Blev medlem: 21 mars 2006, 18:08:03
Ort: Hammarö

Inlägg 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
Spinky Spendrup
Inlägg: 75
Blev medlem: 4 december 2003, 19:14:27
Ort: Byn

Inlägg 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.
Skriv svar