Tisztelt listások !
Mint kezdő C-s, nem sikerült megtalálnom az alábbi prg. hibáját és emiatt kérek segítséget tőletek. Nem működik.
Az alábbi CodeVision-al fordított programom, Avr Studio alatt, debug módban tesztelve, nem írja be a OCR1A és OCR1B regisztereket.
A ICR1 regisztert beírja.
Köszönök minden segítséget: tursaba
#include <mega128.h>
#include <io.h>
// Színusz tábla (konstans)
flash int sinewave[]=
{0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,
0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,
0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,
0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,
0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,
0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c
};
unsigned char i,sreg;
// Timer 1, B regiszterre komparálás, interrupt szervíz rutin
interrupt [TIM1_COMPB] void timer1_compb_isr(void)
{
sreg=SREG; //Mentés
OCR1BL=sinewave;
i++; //következő elem
SREG=sreg; //Mentés vissza
}
void Kimenet(void)
{
DDRB=0x40; //D5 = output ( PWM LED tesztje )
DDRC=0xFF;
PORTB=0x40;
PORTB=0x00;
PORTB=0x40;
PORTB=0x00; //LED test vége
}
void Tim_1_ini(void)
{
// Timer/Counter 1 inicializálás
// WGM13, WGM12, WGM11, WGM10
// 0 0 0 0 = 8BIT, DUAL SLOPE
// 1 1 1 1 = OCR1A, FAST PWM
// 1 0 0 1 = OCR1A, PF PWM
// COM1B1, COM1B0
// 1 0 = __/""\__
TCCR1A=0x30; //COM1A1, COM1A0,COM1B1, COM1B0, COM1C1, COM1C0, WGM11, WGM10
// 1 0 0 1 PF PWM !!
TCCR1B=0x15; //ICNC1, ICES1, ------ WGM13, WGM12, CS12, CS11, CS10
// 1 0 1 0 1
TCCR1C=0x40; //FOC1A,FOC1B, FOC1C, --- --- --- --- ---
// nem kellenek
OCR1A=0x00C5; // TOP limit ?? , nem írja be !!
OCR1B=0x00D5; //komparálási hely, nem írja be!!
ICR1=0x00F8; //csak tesztre, ez műxik
// Interrupt(PWM 1) initialization
TIMSK=0x08; // MASZK, PWM 1
//TIFR=0x08 az IT itt keletkezik
}
void main(void)
{
Kimenet(); //csak teszt + led
Tim_1_ini();
// Global interrupts enable
#asm("sei")
while (1) //hurok, az IT-re várás
{
};
}
CodeVision-Winavr
Köszönöm kapu48.
Azon már túl vagyok, sőt asm-ben próbáltam és az eredmény u.a.
A sw. részlegesen működött.
Az anomális viselkedés okát az oldotta meg, hogy az Eposz JTAG-et hozzá
kellett frissíteni az AVRstudio verziójához.
A beírást még mindig nem látom (valószínű JTAG sajátosság), de a sw. úgy működik,ahogy kell és a változtatások látszanak a működésében.
Minden O.K.
Mégegyszer köszönet.
tursaba
Azon már túl vagyok, sőt asm-ben próbáltam és az eredmény u.a.
A sw. részlegesen működött.
Az anomális viselkedés okát az oldotta meg, hogy az Eposz JTAG-et hozzá
kellett frissíteni az AVRstudio verziójához.
A beírást még mindig nem látom (valószínű JTAG sajátosság), de a sw. úgy működik,ahogy kell és a változtatások látszanak a működésében.
Minden O.K.
Mégegyszer köszönet.
tursaba