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

To je uplne v poriadku. Pytaj sa dokedy nebudes rozumiet.
V mojom programe je vela komentov preto, aby mu bolo rozumiet (aspon sa snazim :slight_smile: ), 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. :slight_smile:


#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 :slight_smile:

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. :slight_smile:

P.S.3: Vsimni si, ze kod testovania tlacitka je dlhsi ako cely kod na generovanie trojuholnika a sinusu dokopy :slight_smile:**