ako nastavit spozdenie jedneho cyklu?
Moderátori: psichac, Moderátori
- juraj_hero
- Nový člen
- Príspevky: 57
- Dátum registrácie: 17 Júl 2015, 17:38
- Bydlisko: Lučenec
- Vek: 26
ako nastavit spozdenie jedneho cyklu?
Ako mám nastaviť spozdenie jedného cyklu na Atmega8? Viem, že existuje príkaz _delay_us(), lenže problém je v tom, že to nie je presné. Napríklad ak si vypočítam koľko trvá jeden cyklus a vyjde mi periodické číslo, tak už mi vznikne nepresnosť. Tak dá sa to v jazyku C? V assembleri som nikdy neprogramoval, takže do toho by som sa nerád púšťal, aj keď mám také tušenie, že tam by sa to dalo jednoduchšie urobiť.
Eštte mi napadlo, že by som si mohol nejako presne definovať jeden cyklus a ten zadať do píkazu delay. Len neviem ako to urobiť
Eštte mi napadlo, že by som si mohol nejako presne definovať jeden cyklus a ten zadať do píkazu delay. Len neviem ako to urobiť
0
Re: ako nastavit spozdenie jedneho cyklu?
Pre casovanie vrele odporucam pouzit HW nastroje procesora - Timer.
0
Re: ako nastavit spozdenie jedneho cyklu?
Presne jeden cyklus:
Kód: Vybrať všetko
__asm__ __volatile__ ("nop");
0
- juraj_hero
- Nový člen
- Príspevky: 57
- Dátum registrácie: 17 Júl 2015, 17:38
- Bydlisko: Lučenec
- Vek: 26
Re: ako nastavit spozdenie jedneho cyklu?
__asm__ __volatile__ ("nop"); Toto je v céčku, alebo asembleri?
0
-
- Ultimate člen
- Príspevky: 2564
- Dátum registrácie: 20 Júl 2010, 00:00
- Bydlisko: okolie KE
- Vek: 27
Re: ako nastavit spozdenie jedneho cyklu?
V Céčku.juraj_hero napísal:__asm__ __volatile__ ("nop"); Toto je v céčku, alebo asembleri?
0
- juraj_hero
- Nový člen
- Príspevky: 57
- Dátum registrácie: 17 Júl 2015, 17:38
- Bydlisko: Lučenec
- Vek: 26
Re: ako nastavit spozdenie jedneho cyklu?
Takze v samotnom assembleri by príkaz bol iba:
čiže nop?
Kód: Vybrať všetko
clr r16 ; Clear r16
ser r17 ; Set r17
out$18,r16 ; Write zeros to Port B
nop ; Wait (do nothing)
out$18,r17 ; Write ones to Port B
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: ako nastavit spozdenie jedneho cyklu?
Nerozumiem tvojej otázke.
Ten assemblerovský kód je päť inštrukcií (príkazov) vrátane jedného nop. Na čo sa pýtaš?
Konkrétne to robí cvičenie s portom B. Najprv tam pošle nuly a potom samé jednotky.
Ak potrebuješ pracovať s takýmto časovým rozlíšením, assembleru sa nevyhneš. Ale pravdepodobne nepotrebuješ a správny prístup ti povedal xmiloš v druhom príspevku.
Ten assemblerovský kód je päť inštrukcií (príkazov) vrátane jedného nop. Na čo sa pýtaš?
Konkrétne to robí cvičenie s portom B. Najprv tam pošle nuly a potom samé jednotky.
Ak potrebuješ pracovať s takýmto časovým rozlíšením, assembleru sa nevyhneš. Ale pravdepodobne nepotrebuješ a správny prístup ti povedal xmiloš v druhom príspevku.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
Re: ako nastavit spozdenie jedneho cyklu?
ak chceš spozdenie o jeden strojový takt, tak použi inštrukciu NOP , MCU nič nerobí okrem inkrementácie PC, o viac , tak musíš procesor zamestnať len skákanim v nejakých nezmyselných slučkách. Alebo ako lňpísal miloš - TIMER, lenže to je zložitejšie.
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: ako nastavit spozdenie jedneho cyklu?
Áno.juraj_hero napísal:Takze v samotnom assembleri by príkaz....
čiže nop?
Funkcia _delay_us();, pokiaľ sa dobre pamätám, je kompilátorom nahrádzaná_delay_loop_1 alebo 2. Min. počet cyklov je 3 pri _delay_loop_1. S timerom si to neviem predstaviť, ako by si ho nastavil a čekol v jednom cykle.
0
- juraj_hero
- Nový člen
- Príspevky: 57
- Dátum registrácie: 17 Júl 2015, 17:38
- Bydlisko: Lučenec
- Vek: 26
Re: ako nastavit spozdenie jedneho cyklu?
Je možné nastaviť pomocou čítača/časovača výstupnú frekvenciu (CLK) takú istú ako je takt avr MCU? AKo?
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: ako nastavit spozdenie jedneho cyklu?
Možno aj dá. Ale otázka je k čomu by to bolo dobré? Ak potrebuješ von z procesora dostať impulzný signál rovný Fosc tak na to je fuse CKOUT. Napríklad taka ATMega88 ju má. Inak si neviem predstaviť na čo by mi bežal timer ktorý by mal výstup rovný Fosc. Jediný účinok by bol zvýšenie spotreby.
Ešte k tvojej predchádzajúcej otázke. Pozrel som si ako sa kompiluje funkcia _delay_us(). Zistil som že je urobená naozaj veľmi dobre. Ak je časový úsek do 1/Fosc tak tam dkompilátor dá len NOP
Ak ten čas vyjde do 2/Fosc tak tam dá RJMP +0 čo je a uspornejšie ako dva nop a trvá to 2 cykly.
Potom do 5/Fosc to kompiluje rôzne kombinácie týchto dvoch inštrukcií. Nad 6/Fosc to dá spomínaný cyklus plus tie inštrukcie aby to bolo maximálne presné.
Samozrejme že nepresnosť tam vnášajú prerušenia ak sú povolené a nastanú.
Ešte k tvojej predchádzajúcej otázke. Pozrel som si ako sa kompiluje funkcia _delay_us(). Zistil som že je urobená naozaj veľmi dobre. Ak je časový úsek do 1/Fosc tak tam dkompilátor dá len NOP
Ak ten čas vyjde do 2/Fosc tak tam dá RJMP +0 čo je a uspornejšie ako dva nop a trvá to 2 cykly.
Potom do 5/Fosc to kompiluje rôzne kombinácie týchto dvoch inštrukcií. Nad 6/Fosc to dá spomínaný cyklus plus tie inštrukcie aby to bolo maximálne presné.
Samozrejme že nepresnosť tam vnášajú prerušenia ak sú povolené a nastanú.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
-
- Podobné témy
- Odpovedí
- Zobrazení
- Posledný príspevok
-
- 6 Odpovedí
- 638 Zobrazení
-
Posledný príspevok od používateľa alexandr
-
- 13 Odpovedí
- 2003 Zobrazení
-
Posledný príspevok od používateľa hal_sk
-
- 0 Odpovedí
- 880 Zobrazení
-
Posledný príspevok od používateľa lato
-
- 17 Odpovedí
- 2306 Zobrazení
-
Posledný príspevok od používateľa kapor
-
- 1 Odpovedí
- 866 Zobrazení
-
Posledný príspevok od používateľa enigma