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
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 ) prehladny, bez zbytocnych skokov niekde kde to uz netreba a tym aj maximalne rychly. Program som netestoval, to necham na velacteneho citatela. ***