využitie TIMERA
Moderátori: psichac, Moderátori
využitie TIMERA
Hojte programátori
Hral som sa s MCU a skúšal som si rozbehať TIMER_A , podarilo sa mi to rozchodiť , prišiel som na to čo a ako nastaviť .
Vec sa má tak že nastavím mod timera , či už UP/DOWN/UP-DOWN/CONTINOUS , nastavím hodnotu v registri po ktorú má počítať , to všetko funguje , lenže ho viem pooužiť iba tak že po pretečení vyvolá interupt , ja by som ho ale chcel použiť ako oneskorovaci ( delay ) mimo interuptu,niekde v programe , ako to mám spraviť ?
Hral som sa s MCU a skúšal som si rozbehať TIMER_A , podarilo sa mi to rozchodiť , prišiel som na to čo a ako nastaviť .
Vec sa má tak že nastavím mod timera , či už UP/DOWN/UP-DOWN/CONTINOUS , nastavím hodnotu v registri po ktorú má počítať , to všetko funguje , lenže ho viem pooužiť iba tak že po pretečení vyvolá interupt , ja by som ho ale chcel použiť ako oneskorovaci ( delay ) mimo interuptu,niekde v programe , ako to mám spraviť ?
- bobo87
- Ultimate člen
- Príspevky: 1916
- Dátum registrácie: 15 Feb 2007, 00:00
- Vek: 37
- Kontaktovať používateľa:
Re: využitie TIMERA
Spravit sa to da tak, ze mimo tu delay funkciu definujes nejaku volatile premennu, ktora sa bude menit v preruseni. V pseudokode by to mohlo vyzerat nejako takto:
volatile int koniec_delay = 0;
fcia_prerusenia(){
koniec_delay = 1;
}
fcia_delay(){
priprav_prerusenie;
koniec_delay = 0;
spusti_timer;
while(!koniec_delay)
;
}
Tej premennej koniec_delay sa potom nadava flag(priznak).
volatile int koniec_delay = 0;
fcia_prerusenia(){
koniec_delay = 1;
}
fcia_delay(){
priprav_prerusenie;
koniec_delay = 0;
spusti_timer;
while(!koniec_delay)
;
}
Tej premennej koniec_delay sa potom nadava flag(priznak).
0
float l,I,Q,_,o;int E;main(){I=1.125;while(I>=-1.225){for(l=-2;l<=1;l+=3/79.0){Q=_=0;for(E=127;Q*Q+_*_<4.0&&--E>32;){o=Q;Q=Q*Q-_*_+l;_=2*o*_+I;}putchar(E);}putchar(10);I-=9/88.0;}}
Re: využitie TIMERA
Ja som moc neporozumel tvojej otazke. Ty chces oneskorenie po kazdom preteceni alebo po kazdom impulze ktory postriehne citac? Alebo este nejak inak?right13 napísal:Hojte programátori
Hral som sa s MCU a skúšal som si rozbehať TIMER_A , podarilo sa mi to rozchodiť , prišiel som na to čo a ako nastaviť .
Vec sa má tak že nastavím mod timera , či už UP/DOWN/UP-DOWN/CONTINOUS , nastavím hodnotu v registri po ktorú má počítať , to všetko funguje , lenže ho viem pooužiť iba tak že po pretečení vyvolá interupt , ja by som ho ale chcel použiť ako oneskorovaci ( delay ) mimo interuptu,niekde v programe , ako to mám spraviť ?
0
Darovanému tranzistoru sa na kremík nepozeraj.
Re: využitie TIMERA
no, po pretečení vyvolá interupt , ale ja ho necehm použiť v interupte , chcem si vytvoriť čakanie na základe timera
nejak takto
inštrukcia A
čakaj xxx pretečení timera
inštrukcia B
lenže ako počítať pretečenia Timera mimo interupt ?
nejak takto
inštrukcia A
čakaj xxx pretečení timera
inštrukcia B
lenže ako počítať pretečenia Timera mimo interupt ?
- bobo87
- Ultimate člen
- Príspevky: 1916
- Dátum registrácie: 15 Feb 2007, 00:00
- Vek: 37
- Kontaktovať používateľa:
Re: využitie TIMERA
right:
Presne tak, ako som pred chvilou ukazoval, ale ked chces pocitat, tak napriklad v preruseni ho nenastavi na jednotku, ale bude premennu inkrementovat. A tak isto sa aj upravi ta podmienka while, aby sa zastavila, ked bude premenna rovna, alebo vacsia, ako hodnota, aku chces dosiahnut.
Presne tak, ako som pred chvilou ukazoval, ale ked chces pocitat, tak napriklad v preruseni ho nenastavi na jednotku, ale bude premennu inkrementovat. A tak isto sa aj upravi ta podmienka while, aby sa zastavila, ked bude premenna rovna, alebo vacsia, ako hodnota, aku chces dosiahnut.
0
float l,I,Q,_,o;int E;main(){I=1.125;while(I>=-1.225){for(l=-2;l<=1;l+=3/79.0){Q=_=0;for(E=127;Q*Q+_*_<4.0&&--E>32;){o=Q;Q=Q*Q-_*_+l;_=2*o*_+I;}putchar(E);}putchar(10);I-=9/88.0;}}
Re: využitie TIMERA
samozrejme , to som skúšal , v interupte som dal inkrementovať nejakú premennú , v programe som ju čítal a podľa hodnoty nej sa mal vykonávať nejaký príkaz , lenže som sa nevedel prekúsať tým , že na začiatku programu som dal
unsigned int i;
i = 0;
void main()
(
použita premenna i na čítanie
)
interupt
pouzitá premenná i na zápis
stále mi to hádzalo chybu , že premenná je použitá skôr ako sa do nej niečo zapisuje , takže to nevedelo čo má robiť
unsigned int i;
i = 0;
void main()
(
použita premenna i na čítanie
)
interupt
pouzitá premenná i na zápis
stále mi to hádzalo chybu , že premenná je použitá skôr ako sa do nej niečo zapisuje , takže to nevedelo čo má robiť
- bobo87
- Ultimate člen
- Príspevky: 1916
- Dátum registrácie: 15 Feb 2007, 00:00
- Vek: 37
- Kontaktovať používateľa:
Re: využitie TIMERA
Tak to by mal byt maximalne warning. Ale musis ju mat aj ako volatile, t.j. napriklad volatile unsigned int i = 0; aby bolo prekladacu jasne, ze sa moze zmenit mimo hlavy tok vykonavania programu.
0
float l,I,Q,_,o;int E;main(){I=1.125;while(I>=-1.225){for(l=-2;l<=1;l+=3/79.0){Q=_=0;for(E=127;Q*Q+_*_<4.0&&--E>32;){o=Q;Q=Q*Q-_*_+l;_=2*o*_+I;}putchar(E);}putchar(10);I-=9/88.0;}}
Re: využitie TIMERA
Presne, treba pouzit carovne slovicko VOLATILE.
No ale aj tak stale nevidim dovod preco robit oneskorenie cez casovac, pretoze ak oneskorenie ma byt konstantne staci pouzit funkciu ms_delay(); samozrejme ak kodis v Cecku.
No ale aj tak stale nevidim dovod preco robit oneskorenie cez casovac, pretoze ak oneskorenie ma byt konstantne staci pouzit funkciu ms_delay(); samozrejme ak kodis v Cecku.
0
Darovanému tranzistoru sa na kremík nepozeraj.
Re: využitie TIMERA
right, Timery sa používanú ne úplne in é veci, toto nedáva zmysel. nechápem stále prečo nepoužiješ ten DELAY ako sme sa bavili. neskôr pochopíš, keď budeš reálne programovať a budeš timery používať, akou blbosťou sa už dva dni zaoberáš. alebo máš nejaký špeciálny dôvod namiesto čakacej slučky použiť timer?
0
osvitka: http://tinyurl.com/7e58nul
pec: http://tinyurl.com/zr3gw8t
maska: http://tinyurl.com/hodwv79
leptanie: http://tinyurl.com/gpsgq6g
prekovy: http://tinyurl.com/zr48jn2
pec: http://tinyurl.com/zr3gw8t
maska: http://tinyurl.com/hodwv79
leptanie: http://tinyurl.com/gpsgq6g
prekovy: http://tinyurl.com/zr48jn2
Re: využitie TIMERA
len ma to zaujíma ako to použiť , skúšal som timer, tak som sa s tým hral a chcel to použiť aj mimo , tak som to riešil že ako, nevyriešil , tak sa pýtam
Re: využitie TIMERA
ak by si kodil v assembleri , tak tato metoda riesenia oneskorenia by nebola zla. Ale v cecku, tu sa snazime si vsetko zjednodusit , zrychlit, zefektivnit a podobne.
0
Darovanému tranzistoru sa na kremík nepozeraj.
- zawin
- Administrátor
- Príspevky: 2646
- Dátum registrácie: 17 Júl 2006, 00:00
- Vek: 35
- Kontaktovať používateľa:
Re: využitie TIMERA
Funkcia _delay_ms(); alebo _delay_us(); vsak nieje taka presna ako pri pouzity Citaca/casovaca. Teda zavisi to od toho ake presne casovanie treba.
0
Sú dve veci, ktoré sú nekonečné - vesmír a ľudská hlúposť. Ale s vesmírom som si ešte nie celkom istý. /Einstein/
- lucky62
- Zaslúžilý člen
- Príspevky: 1151
- Dátum registrácie: 14 Feb 2012, 20:16
- Bydlisko: Liptovský Mikuláš, SK
Re: využitie TIMERA
mám len jednu otázku, je problém v C-čku prečítať aktuálnu hodnotu z toho timeru?...
sorry, ak je otázka mimo - neprogramujem v C.. zatiaľ..
sorry, ak je otázka mimo - neprogramujem v C.. zatiaľ..
0
Re: využitie TIMERA
Pouzivam na programovanie MCU, CCS kompilator, nie je najmensi problem nastavit TImer, aby ratal od urcitej hodnoty, alebo kedykolvek z neho hodnotu precitat.
0
- lucky62
- Zaslúžilý člen
- Príspevky: 1151
- Dátum registrácie: 14 Feb 2012, 20:16
- Bydlisko: Liptovský Mikuláš, SK
Re: využitie TIMERA
V tom prípade v tom nevidím problém, urob to tak ako si napísal:
inštrukcia A
čakaj xxx pretečení timera
inštrukcia B
len tú časť "čakaj xxx pretečení timera" musíš rozvinúť, v nejakom cykle čítať obsah timera a počítať si, koľkokrát pretiekol.
inštrukcia A
čakaj xxx pretečení timera
inštrukcia B
len tú časť "čakaj xxx pretečení timera" musíš rozvinúť, v nejakom cykle čítať obsah timera a počítať si, koľkokrát pretiekol.
0
Re: využitie TIMERA
Keby mal cakat, kym pretecie, tak to rovno moze robit cez pretecenia. Ak ma dobre nastaveny timer, teda spravny clock, vsetko zavisi od nastavenia. napr. while(get_timer0() <= cas); Tym padom bude cakat a nezastavi sa cyklus, kym bude hodnota z casovaca mensia ako cas, ktory potrebuje. Ak napr ma clock na 128us a potrebuje cakat 2s, tak cas bude mat hodnotu 15625. Samozrejme nastavit sa to da hocijako, idealne predtym vymazat set_timer0(0);lucky62 napísal:V tom prípade v tom nevidím problém, urob to tak ako si napísal:
inštrukcia A
čakaj xxx pretečení timera
inštrukcia B
len tú časť "čakaj xxx pretečení timera" musíš rozvinúť, v nejakom cykle čítať obsah timera a počítať si, koľkokrát pretiekol.
0
- lucky62
- Zaslúžilý člen
- Príspevky: 1151
- Dátum registrácie: 14 Feb 2012, 20:16
- Bydlisko: Liptovský Mikuláš, SK
Re: využitie TIMERA
asi si chcel napísať "prerušenia"...Andy99 napísal:Keby mal cakat, kym pretecie, tak to rovno moze robit cez pretecenia.
Jasné, že môže, ale on písal, že si to chce len vyskúšať.
Za druhé, písal, že chce počkať niekoľko pretečení časovača...
takže ja by som to urobil asi takto:
Kód: Vybrať všetko
čakaj kým časovač nie je v polovici (t.j. ak max je 255 tak čakaj kým nebude viac ako 127)
je_za_polovicou=1 # nastavenie flagu
čakaj kým časovač nepretečie (t.j. kým nie je menší ako 127)
ak je_za_polovicou (test flagu)
inkrementuj pocet_preteceni
vynuluj flag
opakuj všetko znova ak počet pretečení je menší ako požadovaný...
Do jazyka C si to musíte preložiť sami....
EDIT: teraz som si uvedomil, že ten flag a jeho testovanie je zbytočné..
postačí:
Kód: Vybrať všetko
čakaj kým časovač nie je v polovici (t.j. ak max je 255 tak čakaj kým nebude viac ako 127)
čakaj kým časovač nepretečie (t.j. kým nie je menší ako 127)
inkrementuj pocet_preteceni
opakuj všetko znova ak počet pretečení je menší ako požadovaný...
0
Re: využitie TIMERA
zawin napísal:Funkcia _delay_ms(); alebo _delay_us(); vsak nieje taka presna ako pri pouzity Citaca/casovaca. Teda zavisi to od toho ake presne casovanie treba.
no to akože timer je presnejší ako SW slučka? to je divné , ale asi som ťa nepochopil. bolo by diné ak by TIMER išiel inak ako samotný krok programu. ale asi si to myslel že sa delay nedá nadstaviť presne ja jeden takt, ale ani to sa mi nezdá, lebo ja si to nadstavím úplne presne na počet krokov aj s odskokmi.
inak stále nechápem čo riešite, oneskorenie ktorých tam bude mať 30000 x a to rôzne a on sa bude zakaždým stať s nadstavovaním TIEMERU, no to by som chcel vidieť. škoda zaťažovať timer blbosťou , teda obyčajnou čakacou slučkou o ktorú mu ide. takže nerobte z toho zložitý problém, ktorý tu vôbec neni ..... mimochodom ak bude robiť normálne funkčné zariadenie isto bude používať WDT.
0
osvitka: http://tinyurl.com/7e58nul
pec: http://tinyurl.com/zr3gw8t
maska: http://tinyurl.com/hodwv79
leptanie: http://tinyurl.com/gpsgq6g
prekovy: http://tinyurl.com/zr48jn2
pec: http://tinyurl.com/zr3gw8t
maska: http://tinyurl.com/hodwv79
leptanie: http://tinyurl.com/gpsgq6g
prekovy: http://tinyurl.com/zr48jn2
- zdeno33
- Okoloidúci
- Príspevky: 32
- Dátum registrácie: 05 Apr 2012, 17:57
- Bydlisko: Varin
- Vek: 69
- Kontaktovať používateľa:
Re: využitie TIMERA
ja se maximalne psovi vyhybam, protoze to je zdrojem nikdy nekoncicich problemu. Staci jakakoli prodleva v programu, treba cekani na USART, klavesnici, display apod. a cela ochrana pres psa muze jit do haje. Pokud se pise jednoduchy program, tak je to v pohode, ale cim je to vetsi a pridavaji se podle zakaznika dalsi funkce, tak ten pes vyvolava jen problemy.mato3000 napísal: ..... mimochodom ak bude robiť normálne funkčné zariadenie isto bude používať WDT.
---
Mnohem lepsi je vychytat vsechny nelinearity a vyjimky. Absolutne nenavidim vsechny knihovny, kde tyto vyjimky nejsou osetrene. Klasika je deleni nulou nebo index pole je vetsi nez je deklarovane. Pokud to nezachyti prekladac, tak je zadelane na pekny prusvih.
0
nikdy neříkej, že to nejde,
určite se najde blbec, který to dokáže.
určite se najde blbec, který to dokáže.