ako nastavit spozdenie jedneho cyklu?

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
juraj_hero
Nový člen
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?

Príspevok od používateľa juraj_hero » 27 Júl 2016, 10:52

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ť :confused:
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: ako nastavit spozdenie jedneho cyklu?

Príspevok od používateľa xmilos » 27 Júl 2016, 12:44

Pre casovanie vrele odporucam pouzit HW nastroje procesora - Timer.
0

Používateľov profilový obrázok
budvar10
Pokročilý člen
Pokročilý člen
Príspevky: 986
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: ako nastavit spozdenie jedneho cyklu?

Príspevok od používateľa budvar10 » 27 Júl 2016, 13:00

Presne jeden cyklus:

Kód: Vybrať všetko

	__asm__ __volatile__ ("nop");
0

Používateľov profilový obrázok
juraj_hero
Nový člen
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?

Príspevok od používateľa juraj_hero » 27 Júl 2016, 13:15

__asm__ __volatile__ ("nop"); Toto je v céčku, alebo asembleri?
0

maskrtnik01
Ultimate člen
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?

Príspevok od používateľa maskrtnik01 » 27 Júl 2016, 13:19

Cez __asm__ v C kóde vykonávate inštrukcie assemblera.
0

Používateľov profilový obrázok
budvar10
Pokročilý člen
Pokročilý člen
Príspevky: 986
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: ako nastavit spozdenie jedneho cyklu?

Príspevok od používateľa budvar10 » 27 Júl 2016, 14:24

juraj_hero napísal:__asm__ __volatile__ ("nop"); Toto je v céčku, alebo asembleri?
V Céčku.
0

Používateľov profilový obrázok
juraj_hero
Nový člen
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?

Príspevok od používateľa juraj_hero » 27 Júl 2016, 18:03

Takze v samotnom assembleri by príkaz bol iba:

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
čiže nop?
0

peterple
Ultimate člen
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?

Príspevok od používateľa peterple » 27 Júl 2016, 18:16

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.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

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

Re: ako nastavit spozdenie jedneho cyklu?

Príspevok od používateľa mato3000 » 27 Júl 2016, 21:56

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

Používateľov profilový obrázok
budvar10
Pokročilý člen
Pokročilý člen
Príspevky: 986
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: ako nastavit spozdenie jedneho cyklu?

Príspevok od používateľa budvar10 » 28 Júl 2016, 08:26

juraj_hero napísal:Takze v samotnom assembleri by príkaz....
čiže nop?
Áno.

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

Používateľov profilový obrázok
juraj_hero
Nový člen
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?

Príspevok od používateľa juraj_hero » 03 Aug 2016, 17:03

Je možné nastaviť pomocou čítača/časovača výstupnú frekvenciu (CLK) takú istú ako je takt avr MCU? AKo?
0

peterple
Ultimate člen
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?

Príspevok od používateľa peterple » 03 Aug 2016, 18:15

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ú.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok