|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
TRIROG Član
Pridružen-a: Čet 30 Avg 2007 12:23 Prispevkov: 84 Aktiv.: 0.41 Kraj: Ljubljana
|
Objavljeno: Čet Nov 25, 2010 4:13 pm Naslov sporočila: PIC - pomoč pri razumevanju programa |
|
|
Zdravo!
Lotevam se programiranja PICev in se poučujem o osnovah vendar mi nekaj ne gre v račun.
Gledam naslednji programček in ga poskušam razumeti vendar imam težavo:
Koda: |
;*****Set up the Constants****
STATUS equ 03h ;Address of the STATUS register
TRISA equ 85h ;Address of the tristate register for port A
PORTA equ 05h ;Address of Port A
COUNT1 equ 08h ;First counter for our delay loops
COUNT2 equ 09h ;Second counter for our delay loops
;****Set up the port****
bsf STATUS,5 ;Switch to Bank 1
movlw 00h ;Set the Port A pins
movwf TRISA ;to output.
bcf STATUS,5 ;Switch back to Bank 0
;****Turn the LED on****
Start movlw 02h ;Turn the LED on by first putting
movwf PORTA ;it into the w register and then ;on the port
;****Start of the delay loop 1****
Loop1 decfsz COUNT1,1 ;Subtract 1 from 255
goto Loop1 ;If COUNT is zero, carry on.
decfsz COUNT2,1 ;Subtract 1 from 255
goto Loop1 ;Go back to the start of our loop. ;This delay counts down from ;255 to zero, 255 times
;****Delay finished, now turn the LED off****
movlw 00h ;Turn the LED off by first putting
movwf PORTA ;it into the w register and then on ;the port
;****Add another delay****
Loop2 decfsz COUNT1,1 ;This second loop keeps the
goto Loop2 ;LED turned off long enough for
decfsz COUNT2,1 ;us to see it turned off
goto Loop2 ;
;****Now go back to the start of the program
goto Start
|
V naslednji kodi mi nekaj ni čisto jasno.
Koda: |
Loop1 decfsz COUNT1,1 ;Subtract 1 from 255
goto Loop1 ;If COUNT is zero, carry on.
decfsz COUNT2,1 ;Subtract 1 from 255
goto Loop1 ;Go back to the start of our loop
|
Kar mi ni jasno je naslednje:
Ko bo COUNT1 dosegel 0, bo program preskočil vrstico goto Loop1 in začel odštevati COUNT2.
Vendar bo vsakič ponovno poskusil odštevati tudi COUNT1, vendar bo to preskočil ker bo COUNT1 enak 0 in zato bo nadaljeval z odštevanjem COUNT2 dokler tudi ta ne bo dosegel 0. Ko bo COUNT2 enak 0 bo program nadaljeval svojo pot...
In tukaj je del kjer se mi ustavi. Ni mi namreč jasno kdaj se COUNT1 in COUNT2 ponovno vrneta v stanje 255 ko pride do ponovnega odštevanja iz istega registra v Loop2.
Če do tega pride, tako da ko se v Loop2 izvede ukaz
decfsz COUNT1,1
in se tedaj register iz 0 postavi na 255 me zanima kaj torej preprečuje v spodnji kodi, da se COUNT1 ne začne ponovno odštevati od 255 ampak da začne odštevati od COUNT2?
Koda: |
Loop1 decfsz COUNT1,1 ;Subtract 1 from 255
goto Loop1 ;If COUNT is zero, carry on.
decfsz COUNT2,1 ;Subtract 1 from 255
goto Loop1 ;Go back to the start of our loop
|
|
|
Nazaj na vrh |
|
|
dule26 Član
Pridružen-a: Tor 28 Sep 2010 7:30 Prispevkov: 26 Aktiv.: 0.16 Kraj: Murska Sobota
|
Objavljeno: Čet Nov 25, 2010 4:26 pm Naslov sporočila: |
|
|
Prvič ko doseže COUNT1 = 0, preskoči naslednji ukaz, in COUNT2 odsteje za ena in preveri če je enako nič, v naslednjem koraku zopet z ukazom decfsz odšteješ COUNT1, ki pa je trenutno enak nič, kar pomeni da bo COUNT1 = 255, saj si od 0 odštel 1, COUNT1 je nepredznačena 8-bitna spremenljivka. |
|
Nazaj na vrh |
|
|
mucek4 Član
Pridružen-a: Sob 18 Jun 2005 20:52 Prispevkov: 2952 Aktiv.: 13.24 Kraj: Tržič - Mesto med gorami
|
Objavljeno: Čet Nov 25, 2010 4:29 pm Naslov sporočila: |
|
|
Ni čisto res
DECFSZ je ukaz, ki se bere "Decrement F, skip if zero".
Torej v tvojem primeri gre nekako takole...
COUNT1 = 1
po ukazu defzs se zmanjša za 1 in postane 0, ker je nič preskoči GOTO in gre zmanjšat COUNT2. Nato se vrne nazaj na prvi decfsz.
Ta ukaz spet zmanjša COUNT1 (0x00 - 1 = 0xff) in ta postane 255. Ker 255 ni nič program spet ponovi 255 ciklov z COUNT1 da le ta pride do 0, itd...
Če želiš preveri v simulatorju, lahko ti pa tudi pomagam.
Če je za hobby brezplačno |
|
Nazaj na vrh |
|
|
TRIROG Član
Pridružen-a: Čet 30 Avg 2007 12:23 Prispevkov: 84 Aktiv.: 0.41 Kraj: Ljubljana
|
Objavljeno: Čet Nov 25, 2010 4:31 pm Naslov sporočila: |
|
|
Že že, samo potem takem gre za neskončno zanko?!
ker če dobro razumem bi morala biti count zanka napisana ločeno
[code]
Loop1 decfsz COUNT1,1 ;Subtract 1 from 255
goto Loop1 ;If COUNT is zero, carry on.
Loop2 decfsz COUNT2,1 ;Subtract 1 from 255
goto Loop2 ;Go back to the start of our loop
... in potem dalje
[code]
ker v nasprotnem primeru, bo spet začel od COUNT1 odštevati vsakič ko bo odštel 1 pri COUNT2
(saj pravilno razumem decfsz COUNT1,1 -> odštej 1 od COUNT1 in nadaljuj - ali gre za Odštevaj 1 od COUNT1 dokler ne prideš do 0?)
[/code] |
|
Nazaj na vrh |
|
|
TRIROG Član
Pridružen-a: Čet 30 Avg 2007 12:23 Prispevkov: 84 Aktiv.: 0.41 Kraj: Ljubljana
|
Objavljeno: Čet Nov 25, 2010 4:32 pm Naslov sporočila: |
|
|
mucek4 je napisal/a: |
Ni čisto res
DECFSZ je ukaz, ki se bere "Decrement F, skip if zero".
Torej v tvojem primeri gre nekako takole...
COUNT1 = 1
po ukazu defzs se zmanjša za 1 in postane 0, ker je nič preskoči GOTO in gre zmanjšat COUNT2. Nato se vrne nazaj na prvi decfsz.
Ta ukaz spet zmanjša COUNT1 (0x00 - 1 = 0xff) in ta postane 255. Ker 255 ni nič program spet ponovi 255 ciklov z COUNT1 da le ta pride do 0, itd...
Če želiš preveri v simulatorju, lahko ti pa tudi pomagam.
Če je za hobby brezplačno |
Aha torej gre tukaj dejansko zato da 255 krat odšteva 255? |
|
Nazaj na vrh |
|
|
mucek4 Član
Pridružen-a: Sob 18 Jun 2005 20:52 Prispevkov: 2952 Aktiv.: 13.24 Kraj: Tržič - Mesto med gorami
|
Objavljeno: Čet Nov 25, 2010 4:46 pm Naslov sporočila: |
|
|
Točno tako. |
|
Nazaj na vrh |
|
|
red_mamba Član
Pridružen-a: Ned 20 Feb 2005 17:56 Prispevkov: 1486 Aktiv.: 6.66 Kraj: Yogyakarta
|
Objavljeno: Čet Nov 25, 2010 11:54 pm Naslov sporočila: |
|
|
mucek4 je napisal/a: |
Točno tako. |
mislim da naredi 256x255 ciklov
prva zanka naredi tudi korak 0->255 remember _________________ Bad things happen to good people all the time for no reason!
Blog |
|
Nazaj na vrh |
|
|
GJ Član
Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.45 Kraj: Ljubljana
|
Objavljeno: Pet Nov 26, 2010 12:45 am Naslov sporočila: |
|
|
red_mamba je napisal/a: |
mucek4 je napisal/a: |
Točno tako. |
mislim da naredi 256x255 ciklov
prva zanka naredi tudi korak 0->255 remember |
Narobe misliš...
Prva zanka se izvede 256 * 256 krat, oziroma celotna pauza znaša((3 * 256 -1) + 3) * 256 -1 strojnih ciklov, če sta vrednosti COUNT1 in COUNT2 na začetku 0.
Prvi klic pavze ni definiran, saj se v programu vrednosti COUNT1 in COUNT2 ne nastavita, ob resetu so vrednosti naključne.
P.S.
Mimogrede ti lahko povem, da je tvoj pristop do učenja nepravilen!
Vedno uporabljaj Microchipove "processor include" datoteke.
Na primer:
Koda: |
Include "P16F1934.INC" |
Pa namesto absolute model raje uporabljaj relocatable model kode.
Microchip opušča absolute model kode. Je zgolj za kompatibilnost za nazaj.
LP GJ
LP GJ |
|
Nazaj na vrh |
|
|
red_mamba Član
Pridružen-a: Ned 20 Feb 2005 17:56 Prispevkov: 1486 Aktiv.: 6.66 Kraj: Yogyakarta
|
Objavljeno: Pet Nov 26, 2010 8:04 am Naslov sporočila: |
|
|
GJ je napisal/a: |
red_mamba je napisal/a: |
mucek4 je napisal/a: |
Točno tako. |
mislim da naredi 256x255 ciklov
prva zanka naredi tudi korak 0->255 remember |
Narobe misliš...
Prva zanka se izvede 256 * 256 krat, oziroma celotna pauza znaša((3 * 256 -1) + 3) * 256 -1 strojnih ciklov, če sta vrednosti COUNT1 in COUNT2 na začetku 0.
Prvi klic pavze ni definiran, saj se v programu vrednosti COUNT1 in COUNT2 ne nastavita, ob resetu so vrednosti naključne.
|
predpostavljeno je bilo da sta nastavljena na 255
če pa sta na 0 se pa strinjam da je 65535 ciklov _________________ Bad things happen to good people all the time for no reason!
Blog |
|
Nazaj na vrh |
|
|
TRIROG Član
Pridružen-a: Čet 30 Avg 2007 12:23 Prispevkov: 84 Aktiv.: 0.41 Kraj: Ljubljana
|
Objavljeno: Tor Nov 30, 2010 3:50 pm Naslov sporočila: |
|
|
če se ne motim imajo vse neposeljene lokacije po defaultu vrednost 255.
no niti ni pomembno ... šlo je bolj za razumevanje programa in kako se odvija.
programa pa nisem pisal jaz, zato include datotek ni ... |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 76 dni
Powered by phpBB © 2001, 2005 phpBB Group
|