Keil uVision3

Dali se u C programiranju mo¾e koristiti (delay_ms();) funkcija? Programiranje 8051 (DS89C450)?

H.

--
Buiæ
Reply to
inz
Loading thread data ...

U C programiranju se moze koristiti funkcija delay_ms ako i samo ako: funkciju sam napises ili library koji dobijes uz C sadrzi tu funkciju Inace kod funkcija kao sto je ta potrebno je biti oprezan jer moguce je da koristi timere i/ili interupte, vidi sto pise u uputama

Boris

Reply to
Boris Vuletic

Ja sam si napisao ovakvu funkciju , ali me nesto zajebava...kad npr. se desi jedan interupt i u rutini koja obradi taj interupt program ode u ovu funkciju za pauzu , ako se desi neki drugi interupt, program ceka prvo da se izvrti ova funkcija za pauzu, pa tek onda ode obradit onaj drugi interup. ....ne kuzim zasto sta nebi trebao program iza svake operacije provjeriti dali ima za skocit na neki inter. i tek onda nastavit

Evo moje rutine za pauzu //******************************************************************* //FUNKCIJA KOJA RADI PAUZU void pauza (int us) { /*pauza je namjestena na sekundu, pa se je po zelji moze mnoziti*/ int ii; for (ii=0;ii

Reply to
inz

Dok se izvr¹ava interrupt rutina, ako se dogodi neki drugi interrupt, on èeka dok zavr¹i ovaj prvi (bar bi trebao, ako arhitektura nije bugovita). Zato se ne valja zadr¾avati u interruptima vi¹e od par instrukcija (Gledano asemblerski, u interruptu odraðujem max. 10-15 instrukcija. Sve iznad toga znaèi da mi je kod lo¹e napisan. To primjenjujem i za C kod). Niti sluèajno vrtiti petlje unutar funkcija koje odraðuju interrupte.

Isto tako, ako postoji vi¹e interrupta, potrebno je pametno poslo¾iti njihove prioritete.

Reply to
Mario Malenica

Kako bi ti onda napisao ovo...

Do¹ao si u interupt rutinu i negdje mora¹ æekati da se stanje na pinu koji je prouzrukovao interupt promjeni to mo¾e biti odmah a mo¾e biti i puno...

Ja sam napravio ovako desi se interupt , program skaæe na interupt rutinu, obavlja kod onda napravim pauzu (æekam promjenuna pinu) i ako nakon te pauze ni9je do¹lo do promjene objavljujem alarm i vrtim se u petlji i ¹aljem poruke o alarmu , ali ta petlja je unutar interupt rutine.....ako se stanje na pinu promjeni program izlazi iz te petlje i izlazi iz interupt rutine......

Dali bi bilo mo¾da bolje okrenut neku boolean varijablu izaæ iz interupt rutine , i s obzirom na tu bool varijablu vrtit petlju negdje izvan ....??

Hvala na savjetima

Reply to
inz

Vezao bih taj pin preko buffera (244) na eksterne interrupte. 8051 ih ima, jednog bih na¹timao na rastuæi, a drugog na padajuæi brid (ili bih uzeo AVR, on ima interrupte koji reagiraju na promjenu stanja). Ako je u pitanju tipkalo ili slièno, na njega ide hardverski debounce. Kod pauza, raznih brojaèa protoka vremena i ostalih gluposti, uzme se jedan od timer interrupta i on slu¾i kao generator takta za sve one koji trebaju mjeriti neko vrijeme. U interrupt petlji se samo inkrementiraju brojaèi i eventualno se pogleda je li ispunjen neki uvjet, pa se setira flag koji se provjerava iz main funkcije. Isto tako, software se ne zadr¾ava dugo u bilo kojoj od funkcija, osim ako je ta skalamerija jednostavna, pa si mogu dopustiti luksuz zadr¾avanja nekoliko milisekundi u nekoj od funkcija.

Ako ima stvarno puno stvari kojima je bitno toèno mjerenje vremena, iskoristio bih neèiji gotov task switcher ili ako imam dosta resursa na raspolaganju, RTOS. No, to se odluèuje prije pisanja koda, u fazi dizajniranja.

Na kraju, ako nema resursa za brojanje vremena (svi timeri su iskori¹teni za ne¹to drugo), izbacio bih brojanje vremena iz mikrokontrolera u GAL.

Reply to
Mario Malenica

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.