To je uplne v poriadku. Pytaj sa dokedy nebudes rozumiet.
V mojom programe je vela komentov preto, aby mu bolo rozumiet (aspon sa snazim ), ale ako mi tu uz niekto v dobrom radil, menej je viac. Tak to skusim este raz a ak nebudes niecomu KONKRETNEMU v programe rozumiet, pytaj sa kludne bod po bode.
#include <avr/io.h>
#include <stdint.h>
// Definice makier s parametrami, toto jednoducho akceptuj a aj v dalsich svojich programoch pouzivaj obdobne substitucie.
// vedie to k prehladnejsiemu a zrozumitelnejsiemu kodu.
// to ocenis, najma ak sa budes niekoho pytat o radu. Cim neprehladnejsi zdroja, tym menej ochotnych sa nim zaoberat :-)
#define SET(BAJT,BIT) ((BAJT) |= (1<<(BIT)))
#define TST(BAJT,BIT) ((BAJT) & (1<<(BIT)))
#define TRUE 0x00
#define FALSE 0xff
#define SINUS TRUE
#define TROJUHOLNIK FALSE
#define PREDVOLBA_CZ_SINUS 7
#define TLACITKO_BIT 5 // nech je tlacitko na piatom bite
#define TLACITKO_PORT PIND // nech je tlacitko na porte D
#define TLACITKO_SMER_PORT DDRD // nech je tlacitko na porte D
#define MAX_VZORKY_TROJUHOLNIK 20
#define MAX_VZORKY_SINUS 32
#define PORT_PRE_DA PORTB
#define SMER_PORT_PRE_DA DDRB
uint8_t generuj_signal = SINUS;
uint8_t stav_tlacitka_new, stav_tlacitka_old, i;
unsigned char sinu [MAX_VZORKY_SINUS] = {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 [MAX_VZORKY_TROJUHOLNIK] = {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
int main(void)
{
// ========= zaciatok inicializacie ===========
OCR2 = PREDVOLBA_CZ_SINUS;
SET(TCCR2,WGM21);
SET(TCCR2,CS22);
RES(TLACITKO_SMER_PORT,TLACITKO_BIT);
SMER_PORT_PRE_DA = 0xff;
if (TST(TLACITKO_PORT,TLACITKO_BIT)) stav_tlacitka_new = TRUE;
else stav_tlacitka_new = FALSE;
stav_tlacitka_old = stav_tlacitka_new;
// ========= koniec inicializacie ===========
while(1) {
if (TST(TIFR,OCF2)) {
SET(TIFR,OCF2);
// =========== zaciatok testovania tlacitka ===========
if (TST(TLACITKO_PORT,TLACITKO_BIT)) stav_tlacitka_new = TRUE;
else stav_tlacitka_new = FALSE;
if (stav_tlacitka_new == FALSE) && (stav_tlacitka_old == TRUE)) {
if (generuj_signal == SINUS) {
generuj_signal = TROJUHOLNIK;
// trojuholnik moze mat inu periodu ako sinus
OCR2 = PREDVOLBA_CZ_TROJUHOLNIK;
}
else {
generuj_signal = SINUS;
// sinus moze mat inu periodu ako trojuholnik
OCR2 = PREDVOLBA_CZ_SINUS;
}
i = 0;
}
stav_tlacitka_old = else stav_tlacitka_new;
// =========== koniec testovania tlacitka ===========
// ========= zaciatok generovania vzorky ===========
// volba spravnej funkcie na zaklade stavu "tlacitka"
if (generuj_signal == SINUS) {
PORT_PRE_DA = sinu*;
i++;
if (i >= MAX_VZORKY_SINUS) i = 0;
}
else {
PORT_PRE_DA = troj*;
i++;
if (i >= MAX_VZORKY_TROJUHOLNIK) i = 0;
}
// ========= koniec generovania vzorky ===========
}
}
return;
}
Periodu menis roznym nastavenim hodnoty v OCR2. Bud tam vlozis
hodnotu PREDVOLBA_CZ_SINUS alebo hodnotu PREDVOLBA_CZ_TROJUHOLNIK. Na substitucie cisel textom si zvykni, je to velmi uzitocne. Nema to nijaky vplyv na vysledny kod, iba a vylucne na lepsiu citatelnost kodu.
Drzim palce, pytaj sa dalej
P.S. Moj kod je kratsi ako Tvoj, tak sa skus cez neho preluskat a skus ho vyskusat. Po skuske mozno budes mat dalsie otazky, mozno na simulatore v AVR studiu zistis, ako kod pracuje.
P.S.2: Pokial som si dobre vsimol, Tvoj kod postupne vola sinu() a z neho troj() a potom sinu() a znovu troj() a znovu sinu() a znovu troj()… Az kym sa nezaplni zasobnik a program neskolabuje. Vsetko zavisi od poctu stlacenia tlacitka a od velkosti volnej pamate. Skratka tak ako som si stacil vsimnut, program je odsudeny na to ist do kytiek a preto som tie while(1) nazval nezmyselnymi.
P.S.3: Vsimni si, ze kod testovania tlacitka je dlhsi ako cely kod na generovanie trojuholnika a sinusu dokopy **