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

Program by sa Ti po chvili zrutil, lebo volas funkciu z funkcie a stale dookola bez navratu z funkcie, takze po konecnom case pretecie zasobnik z navratovych adries a bude to :slight_smile:

void sinu1()
{
	 // ...
	while (1)

toto while je vyslovene vrazende. Uz nikdy nebudes moct obsluzit casovu slucku.

	/*ZMENA SIGNALU PO STISKNUTI TLACITKA:*/		
		if(PORTD==0x7B)		//je zmacknute tlacitko?

toto urcite netestuje stav tlacitka. Stav vstupu hladaj v registri PIND

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

zase nejaka divna nekonecna slucka

Tak ja to skusim (ospravedlnujem sa) znova na zaklade mojho prispevku
z z 06 leden 2013, 16:02.

// projekt pre demonstrovanie pouzitia citaca ako casovej zakladne vsektych dejov v mcu
// ATmega8, CLK 8MHz, prekladac GCC, AVRstudio 4.18, -Os

#include <avr/io.h>
#include <stdint.h>

// Definice makier s parametrami
#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 // spravnost hodnoty predvolby teraz neskumam, treba si ju vypocitat podla Tvojich potrieb
#define PREDVOLBA_CZ_TROJUHOLNIK 5 // spravnost hodnoty predvolby teraz neskumam, treba si ju vypocitat podla Tvojich potrieb

#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; // zmestili by sa do jedneho bajtu, ale spracovanie v dvoch bajtoch usetri strojovy cas.

// predpokladajme, ze vstup na tlacitko je osetreny nasledovne:
// medzi pinom a Ucc je R = 10kohm 
// a medzi pinom a GND je kondenzator 100n-1uF
// tym povazujem zakmity tlacitka za vyriesene


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); // predvolbu delicky treba tiez tak ako PREDVOLBA_CZ... upravit podla aktualnych potrieb
   RES(TLACITKO_SMER_PORT,TLACITKO_BIT); 
   SMER_PORT_PRE_DA = 0xff; // port pre DA treba nastavit ako vystupny

   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); // reset bitu priznaku pretecenia dame hned 
                                   // za testovaciu podmienku a nie niekde do
                                   // prdaka, kde si uz po pol roku prehliadania
                                   // zdrojovych textov nespomenieme ze co tym
                                   // nastavenim jednotky v bite casovaca chcel 
                                   // autor vobec povedat. 

// kvoli testovaniu stavu tlacitka nebudeme nikde skakat, 
// lebo sice skok na funkciu je efektny a prehladny, 
// ale trochu nam zabera zo strojoveho casu 
// co pri potrebe generovat 50kHz trojuholnika je uz citit.
// zaroven je to uloha na par riadkov, 
// takze nam moc nezneprehladni kod
         // =========== zaciatok testovania tlacitka ===========
         if (TST(TLACITKO_PORT,TLACITKO_BIT)) stav_tlacitka_new = TRUE;
         else stav_tlacitka_new = FALSE;
         // stav generovania signalu sa zmeni len pri nabeznej hrane stlacenia tlacitka
         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;
            }
            // vynulujeme pomocne pocitadlo, aby priebeh zacinal vzdy od zaciatku
            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;
} 

Program je (myslim si :slight_smile: ) prehladny, bez zbytocnych skokov niekde kde to uz netreba a tym aj maximalne rychly. Program som netestoval, to necham na velacteneho citatela. :slight_smile:***