Generátor: Generovaní sinusového a trojúhelníkového průběhu

No ja to zkusil udelat nasledovne, ale nevim, zda je spravne nastaven registr OCR0A. V komentech jsou i vypocty, tak na to prosim nekdo mrknete. Dekuji.

[code]#define F_CPU 20000000UL //zakladni frekvence
#include <avr/io.h> //input/output

unsigned char sinu [32] = {127,138,149,160,171,182,193,205, //127-205
205,193,182,171,160,149,138,127, //205-127
127,116,105,94,83,72,61,49, //127-49
49,61,72,83,94,105,116,127}; //49-127
unsigned char troj [20] = {0,12,24,36,48, //0-48
60,71,82,93,103, //60-103
114,125,136,147,154, //114-154
124,93,62,31,0,}; //124-0
unsigned char i=0, y=0;

void sinu1()
{
TCCR0A = 0;
TCCR0B = 0;
/* 20000000/(1*256)=78125;78125/256=305;41670/305=137 /
OCR0A = 0x89; //137
/
T0:Fast PWM;/1 */
TCCR0A |= (1<<0)|(1<<1);
TCCR0B |= (1<<3)|(1<<0);

while (1)
{
if((TIFR & 0x01)==1)		//TCNT0==OCR0A?
	{
		i1();
	}
/*ZMENA SIGNALU PO STISKNUTI TLACITKA:*/		
	if(PORTD==0x7B)		//je zmacknute tlacitko?
	{
		PORTB = 0;		//signal 0
		PORTD = 0x7F;		//zadne tlacitko neni sepnuto
		troj1();
	}
}

}

void i1()
{
TIFR=TIFR | 0x01; //nuluje registr TIFR (zapsanim 1)
PORTB = sinu*; //hodnota z tabulky
i++;
if (i==31)
{
i=0;
}
}

void troj1()
{
TCCR0A = 0;
TCCR0B = 0;
/* 20000000/(1*256)=78125;78125/256=305;50000/305=164 /
OCR0A = 0xA4; //164
/
T0:Fast PWM;/1 */
TCCR0A |= (1<<0)|(1<<1);
TCCR0B |= (1<<3)|(1<<0);

while (1)
{
if((TIFR & 0x01)==1)		//TCNT0==OCR0A?
	{
		i2();
	}
/*ZMENA SIGNALU PO STISKNUTI TLACITKA:*/		
	if(PORTD==0x7B)		//je zmacknute tlacitko?
	{
		PORTB = 127;		//signal 0
		PORTD = 0x7F;		//zadne tlacitko neni sepnuto
		sinu1();
	}
}

}

void i2()
{
TIFR=TIFR | 0x01; //nuluje registr TIFR (zapsanim 1)
PORTB = troj[y]; //hodnota z tabulky
y++;
if (y==24)
{
y=0;
}
}

int main(void)
{
DDRB = 0xFF; //vystup pro signal
DDRD = 0x7B; //vstup pro tlacitko (PD2)
PORTD = 0x7F; //zadne tlacitko neni sepnuto
sinu1();
}[/code]

Jde mi predevsim o zkontrolovani chyb + jestli mate nekdo moznost to otestovat, byl bych velice rad… Ale uplne nejvic mi jde o vypocet OCR0A, ktery ovlivnuje to, jak rychle jsou posilany hodnoty z tabulek na PORTB. Bylo mi receno ze prave toto ovlivnuje vystupni frekvenci, ktera ma byt u SINUS = 41670 Hz a u TROJUHEL = 50000 Hz.

Predem dekuji za odpovedi a preji hezky zbytek dne.*