PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
BultaIBo
Inlägg: 32 Blev medlem: 21 mars 2006, 18:08:03
Ort: Hammarö
Inlägg
av BultaIBo » 19 november 2007, 10:12:15
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 » 19 november 2007, 10:36:23
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?
BultaIBo
Inlägg: 32 Blev medlem: 21 mars 2006, 18:08:03
Ort: Hammarö
Inlägg
av BultaIBo » 19 november 2007, 10:53:20
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 » 19 november 2007, 10:59:20
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.