využitie TIMERA

C,C++,C#

Moderátori: psichac, Moderátori

neznamy

využitie TIMERA

Príspevok od používateľa neznamy » 21 Apr 2012, 14:48

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ť ?

Používateľov profilový obrázok
bobo87
Ultimate člen
Ultimate člen
Príspevky: 1913
Dátum registrácie: 15 Feb 2007, 00:00
Vek: 36
Kontaktovať používateľa:

Re: využitie TIMERA

Príspevok od používateľa bobo87 » 21 Apr 2012, 14:59

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).
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;}}

24mato
Stály člen
Stály člen
Príspevky: 301
Dátum registrácie: 09 Jún 2011, 00:00
Bydlisko: PD

Re: využitie TIMERA

Príspevok od používateľa 24mato » 21 Apr 2012, 15:40

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ť ?
Ja som moc neporozumel tvojej otazke. Ty chces oneskorenie po kazdom preteceni alebo po kazdom impulze ktory postriehne citac? Alebo este nejak inak?
0
Darovanému tranzistoru sa na kremík nepozeraj.

neznamy

Re: využitie TIMERA

Príspevok od používateľa neznamy » 21 Apr 2012, 15:46

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 ?

Používateľov profilový obrázok
bobo87
Ultimate člen
Ultimate člen
Príspevky: 1913
Dátum registrácie: 15 Feb 2007, 00:00
Vek: 36
Kontaktovať používateľa:

Re: využitie TIMERA

Príspevok od používateľa bobo87 » 21 Apr 2012, 15:49

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. :)
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;}}

neznamy

Re: využitie TIMERA

Príspevok od používateľa neznamy » 21 Apr 2012, 15:55

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ť

Používateľov profilový obrázok
bobo87
Ultimate člen
Ultimate člen
Príspevky: 1913
Dátum registrácie: 15 Feb 2007, 00:00
Vek: 36
Kontaktovať používateľa:

Re: využitie TIMERA

Príspevok od používateľa bobo87 » 21 Apr 2012, 15:57

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;}}

24mato
Stály člen
Stály člen
Príspevky: 301
Dátum registrácie: 09 Jún 2011, 00:00
Bydlisko: PD

Re: využitie TIMERA

Príspevok od používateľa 24mato » 21 Apr 2012, 16:16

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.
0
Darovanému tranzistoru sa na kremík nepozeraj.

mato3000
Power user
Power user
Príspevky: 9767
Dátum registrácie: 04 Jan 2009, 00:00
Bydlisko: BA

Re: využitie TIMERA

Príspevok od používateľa mato3000 » 21 Apr 2012, 16:23

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

neznamy

Re: využitie TIMERA

Príspevok od používateľa neznamy » 21 Apr 2012, 16:43

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

24mato
Stály člen
Stály člen
Príspevky: 301
Dátum registrácie: 09 Jún 2011, 00:00
Bydlisko: PD

Re: využitie TIMERA

Príspevok od používateľa 24mato » 21 Apr 2012, 16:57

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.

Používateľov profilový obrázok
zawin
Administrátor
Administrátor
Príspevky: 2639
Dátum registrácie: 17 Júl 2006, 00:00
Vek: 34
Kontaktovať používateľa:

Re: využitie TIMERA

Príspevok od používateľa zawin » 21 Apr 2012, 17:21

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/

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: využitie TIMERA

Príspevok od používateľa lucky62 » 21 Apr 2012, 17:43

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ľ..:-)
0

Používateľov profilový obrázok
Andy99
Stály člen
Stály člen
Príspevky: 339
Dátum registrácie: 05 Mar 2008, 00:00
Bydlisko: BA
Vek: 35

Re: využitie TIMERA

Príspevok od používateľa Andy99 » 21 Apr 2012, 17:46

Pouzivam na programovanie MCU, CCS kompilator, nie je najmensi problem nastavit TImer, aby ratal od urcitej hodnoty, alebo kedykolvek z neho hodnotu precitat.
0

neznamy

Re: využitie TIMERA

Príspevok od používateľa neznamy » 21 Apr 2012, 17:52

V CCS4 robím aj ja , otázka od lucky62 by zaujímala aj mňa

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: využitie TIMERA

Príspevok od používateľa lucky62 » 21 Apr 2012, 17:56

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

Používateľov profilový obrázok
Andy99
Stály člen
Stály člen
Príspevky: 339
Dátum registrácie: 05 Mar 2008, 00:00
Bydlisko: BA
Vek: 35

Re: využitie TIMERA

Príspevok od používateľa Andy99 » 21 Apr 2012, 18:04

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.
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);
0

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: využitie TIMERA

Príspevok od používateľa lucky62 » 21 Apr 2012, 18:16

Andy99 napísal:Keby mal cakat, kym pretecie, tak to rovno moze robit cez pretecenia.
asi si chcel napísať "prerušenia"...

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ý...
Samozrejme predtým si treba nastaviť a spustiť časovač..
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

mato3000
Power user
Power user
Príspevky: 9767
Dátum registrácie: 04 Jan 2009, 00:00
Bydlisko: BA

Re: využitie TIMERA

Príspevok od používateľa mato3000 » 21 Apr 2012, 18:52

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

Používateľov profilový obrázok
zdeno33
Okoloidúci
Okoloidúci
Príspevky: 32
Dátum registrácie: 05 Apr 2012, 17:57
Bydlisko: Varin
Vek: 68
Kontaktovať používateľa:

Re: využitie TIMERA

Príspevok od používateľa zdeno33 » 21 Apr 2012, 19:09

mato3000 napísal: ..... mimochodom ak bude robiť normálne funkčné zariadenie isto bude používať WDT.
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.
---
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.

Napísať odpoveď