You are here

PIC16F877 Pontos időzítés kiszámolása problem Fosc/4=Tcy és hasonlók... (Megoldódott!)

16 posts / 0 new
Last post
Zolg

Sziasztok!

Minden bizonnyal a hiba az én fejemben van, de nem értem a következőt:
"
Kesleltet
movlw d'250' ; 250 ms késleltetés (4 MHz-es órajellel)
movwf count1
K1
movlw 0xC7
movwf counta
movlw 0x01 ; 1 ms késleltetés
movwf countb
Kesleltet_0
decfsz counta,f
goto $+2
decfsz countb,f
goto Kesleltet_0
decfsz count1,f
goto K1
retlw 0x00
"

A szintaxis tiszta, a szemantika úgyszintén, csak azt nem értem hogy lesz neki ezekkel a counta és countb értékekkel 4MHz-en 1 ms a késleltetés (az már egyértelmű hogy 250*1 ms= 250 ms :) ) Most ástam bele magam ebbe az időzítésesdibe, de az eddig összeszedett infók alapján egy utasításciklus(Tcy) az a frekvencia (Fosc) negyede. Tehát ha Fosc/4 = Tcy akkor ha 4 MHz-en vagyunk akkor ez 1MHz-es utasításciklust eredményez. Mivel counta=0xC7 vagyis decimális 199 countb pedig 1 az összesen 200. tehát ha 1MHz-et 200-al osztom akkor 10^6 / 200 = 5*10^3 vagyis 5KHz és mivel f=1/t könnyen kiszámolhatjuk hogy t=2*10^-4 vagyis 20ms... Mivel a programrészlet nem egy kezdőtől származik, gyanítom hogy én értelmezek rosszul valamit. Ebben kérem a segítségeteket...szerintetek hol hibáztam? Előre is köszönet! Zolg

U.i.:
Bocs a kód külalakjáért de a tabulátorokat nem hozta át...nem tudtam rájönni hogy tudnám megcsinálni, space-ezni meg nem akartam.

Comments
gzsolt99

Zsolt
szia
nem egyszerűbb elinditani egy timer-t ?

0

Vote up!

You voted ‘up’

nantal
nantal's picture

Hali!
Ilyen időzítések tervezésekor nagyon hasznos segítség a Delay code generator

0

Vote up!

You voted ‘up’

Zolg

Wow! Köszönet érte...borzasztó hasznos kis progi...repül a kedvencek közé! :D

0

Vote up!

You voted ‘up’

Oszi11
Oszi11's picture

Szia,

nem ilyen egyszerű az a számítás! Addig rendben hogy az utasítás ciklus 1MHz, ami azt jelenti, hogy egy 1 ciklus hosszú utasítást a processzor 1µs alatt hajt végre. Az utasítások ciklusokba vannak szervezve tehát többször végrehajtódnak ez mindig + 1µs, de hogy az élet ne legyen ilyen egyszerű minden ugrás 2 ciklust igényel, így a valós időt akkor kapod meg ha ha minden egyes utasításhoz odaírod hányszor futott le.
Csináltam egy gyors ciklusszámítást (ido.txt), lehet hibáztam benne, de elég jól kiadta az időket!
A másik lehetőség, debuggolod a programot az mplab-ban és meg tudod nézni mennyi idő alatt fut le a program.

Üdv,
Oszi

File csatolás: 

0

Vote up!

You voted ‘up’

Zolg

Nos tehát. Beszerkesztettem így már könnyebben olvasható (lsd. csatolmány) Ha a ciklusmagban levő értékeket összeadom akkor 994-et kapok ami azt jelenti hogy 994us (ami kb 1ms tekintsünk el a valószínűleg számolásból adódó hibáimtól) ebben a ciklusban eltöltött idő. Mivel ez hajtódik végre 255-ször így a tényleges időzítés 255 ms. Jól gondolom? Mert ha nem akkor vmit rosszul értettem meg.

File csatolás: 

0

Vote up!

You voted ‘up’

Zolg

Való igaz tetszik a módszer ezt alkalmazni fogom. Viszont nem hibás a számítás csak más: elmondom a te módszereddel:
Kesleltet_0
decfsz counta,f (198 + 2) 200
goto $+2 198*2 396
decfsz countb,f 2 2
goto Kesleltet_0 198*2 396
decfsz count1,f 2 2

Itt most nem vesszem figyelembe a 255-ös külső ciklust csak az érdekel hogy ez tényleg 1ms-e. ha összeadogatom akkor 996-ot kapok ez ugye us-ban így valóban
1 ms időzítést generál a ciklusmag. És mivel 255-ször hajtódik végre az 1 ms-os időzíts az 255 ms-os késleltetést eredményez....vagy rossz a logika?

0

Vote up!

You voted ‘up’

otlm

Számold meg, hogy a program hány órajel ciklus alatt képes végrehajtódni, ha 1 utasításos a parancs akkor adj hozzá 1-et ha utána jön egy 2 utasításos akkor 2-t, ha ciklus van a progiban akkor a ciklusszámmal szorozz stb. Aztán az órajelet elosztva ezzel a kapott szummával meg lesz az osztási arány.

0

Vote up!

You voted ‘up’

Zolg

Szia!
Pontosítanék:
"
All instructions are executed within one single instruction
cycle, unless a conditional test is true or the program
counter is changed as a result of an instruction.
In this case, the execution takes two instruction cycles
with the second cycle executed as a NOP. One instruction
cycle consists of four oscillator periods. Thus, for
an oscillator frequency of 4 MHz, the normal instruction
execution time is 1 μs. If a conditional test is true, or the
program counter is changed as a result of an instruction,
the instruction execution time is 2 μs.
"

16F877 datasheet 135. oldal.
Eszerint részben igazad van, mert minden utasítás 1 utasításciklus (Tcy) alatt hajtódik végre ami 4MHz esetén 1us időtartam. Kivéve abban az esetben ha végrehajtás közben a PC írva lett mert akkor ez 2 Tcy-t vesz igénybe. De bogarat tettél a fülembe mert van goto benne ami módosítja a PC-t....nah ezt ki kell számolnom...de tökéletes gondolatokat ébresztettél!;)

0

Vote up!

You voted ‘up’

Zolg

Upsz...látom miközben én írtam a választ te is módosítottál így már teljesen igazad van és nem sok értelme van annak amit írtam de azért itt hagyom mert hasznos lehet még valakinek.;)

0

Vote up!

You voted ‘up’

Zolg

És ki is számoltam.Ott a pont!;) Mivel a ciklusmagban van egy decfsz ami (1 Tcy) és két goto (ami 2 Tcy) így ez már 5 Tcy. És akkor ezért kellett külön változó annak a hex 1-nek mert így tud bele rakni két goto-t hogy meglegyen a pontosan 5 Tcy. Mert 5 Tcy*200 az már 1000 Tcy és 1000*Tcy= 4000. És ha 4MHz-et osztom 4000-el az már 1kHz és 1 kHz-nél a t=1 ms!!!:):) Heuréka! Megvan!!:D Köszönöm a segítséget! Remélem érthető voltam...ha nem akkor világosítok! ;)

0

Vote up!

You voted ‘up’

otlm

Azért módosítottam a hsz-em, mert közben eszembe jutott hogy biztos az előosztóval számoltad a négyes osztást.
Az a lényeg hogy kijött! :)

0

Vote up!

You voted ‘up’

Istvan-lab
Istvan-lab's picture

Szia!

Bocsi, én sem vagyok egy agytröszt...
Ezt a sort nem értem: "goto $+2"
Ez megfelelne egy NOP parancsnak ?!

Kérdés: Van szkópod ?
Más: Ezen analógia alapján, rakj össze egy nagyobb időzítést, ami hallható hangot eredményez.
Kísérletezéssel (számításokkal :) ) ez megoldható.

PS: "Tehát ha Fosc/4 = Tcy akkor ha 4 MHz-en vagyunk akkor ez 1MHz-es utasításciklust eredményez" - ez OK.
Az 5KHz után lévő számításod szerintem hibás, de lehet én nem látom jól, ugyanis 1/5Khz az nálam 200us vagyis 0.2ms

Üdv: Dénes István

0

Vote up!

You voted ‘up’

Zolg

Jaaaj...én váltottam át rosszul...valóban 0,2 ms! Mea culpa! :)

0

Vote up!

You voted ‘up’

Zolg

Szia!

Nem, nem NOP.
A goto $+2 azt jelenti hogy ugorj 2 memóriacímmel lejjebb. Gyakorlatilag 2 sort ugrik. Ez lehet $-n vagy $+n is.
Igen van szkópom, jóféle digitális tárolós...;)

Próbálgatás...nem rossz gondoltam rá, csak attól félek hogy sok idő elmenne vele és mostanában nem sokat vagyok a műhely közelében, net viszont mindig van és annyi sok okos ember van a világban és biztos akad olyan itt a tanyán aki már találkozott hasonló problémával és kisujjból megoldja az ilyen problémákat. :)

Újraszámoltam:
1/5000Hz = 0,0002 s (legalábbis a számológépem ezt dobja ki :) ). Normál alakban 2*10^-4 s, azaz 20ms...vagy rosszul váltom normál alakra? Az elképzelhető...vagy a számológépem a buta.

0

Vote up!

You voted ‘up’

Bicika

Sziasztok

A normál alak az jó, de nekem azt tanították régen, hogy a sec., és a millisec. között 1000 a váltószám, tehát 3 helyiértékkel viszem jobbra a tizedesvesszőt.

0,0002s=0,2ms
:)

0

Vote up!

You voted ‘up’

More similar content