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

Zdravim… No s tou kalkulackou si me dostal :smiley: :smiley: :smiley: Asi sem se preklep :wink: A kdyz chci aby perioda SINU byla 20us pri aproximaci 32 vzorku a perioda TROJ byla 23,998us pri aproximaci 20 vzorku, jak mam tedy spocitat hodnotu do OCR0A + preddelicku??? Toto je jedina vec, na kterou stale nemohu prijit…

To Martin: Promin, ale z toho tveho programu si nevemu vubec nic… Je tam tolik zadefinovanych veci a komentu, ze se v tom vubec nemuzu vyznat… Trochu sem ten program prekopal:

[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(PIND==0x04)		//je zmacknute tlacitko?
	{
		PORTB = 0;		//signal 0
		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(PIND==0x04)		//je zmacknute tlacitko?
	{
		PORTB = 127;		//signal 0
		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 = 0x00; //vstup pro tlacitko
PORTD = 0x00; //pull-up OFF
sinu1();
}[/code]

Hlavne teda ZDE:

/*ZMENA SIGNALU PO STISKNUTI TLACITKA:*/ if(PIND==0x04) //je zmacknute tlacitko? { PORTB = 0; //signal 0 troj1(); }

A co se tyce tech podle tebe nesmyslnych smicek jako je:

while (1) { if((TIFR & 0x01)==1) //TCNT0==OCR0A? { i1(); } /*ZMENA SIGNALU PO STISKNUTI TLACITKA:*/ if(PIND==0x04) //je zmacknute tlacitko? { PORTB = 0; //signal 0 troj1(); } }

Tak program se tu nesekne donekonecna, ale jen do te doby, nez se bud odvola na void i1() nebo na void troj1()

Takze budu velice rad, kdyz mi nekdo vysvetli, jak nastavit PERIODU SINU a TROJ prubehu. Dekuji.*