www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

PIC - pomoč pri razumevanju programa

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
TRIROG
Član
Član



Pridružen-a: Čet 30 Avg 2007 12:23
Prispevkov: 84
Aktiv.: 0.42
Kraj: Ljubljana

PrispevekObjavljeno: Čet Nov 25, 2010 4:13 pm    Naslov sporočila:  PIC - pomoč pri razumevanju programa Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dule26
Član
Član



Pridružen-a: Tor 28 Sep 2010 7:30
Prispevkov: 26
Aktiv.: 0.16
Kraj: Murska Sobota

PrispevekObjavljeno: Čet Nov 25, 2010 4:26 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mucek4
Član
Član



Pridružen-a: Sob 18 Jun 2005 20:52
Prispevkov: 2952
Aktiv.: 13.29
Kraj: Tržič - Mesto med gorami

PrispevekObjavljeno: Čet Nov 25, 2010 4:29 pm    Naslov sporočila:   Odgovori s citatom

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 Smile
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
TRIROG
Član
Član



Pridružen-a: Čet 30 Avg 2007 12:23
Prispevkov: 84
Aktiv.: 0.42
Kraj: Ljubljana

PrispevekObjavljeno: Čet Nov 25, 2010 4:31 pm    Naslov sporočila:   Odgovori s citatom

Ž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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
TRIROG
Član
Član



Pridružen-a: Čet 30 Avg 2007 12:23
Prispevkov: 84
Aktiv.: 0.42
Kraj: Ljubljana

PrispevekObjavljeno: Čet Nov 25, 2010 4:32 pm    Naslov sporočila:   Odgovori s citatom

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 Smile


Aha torej gre tukaj dejansko zato da 255 krat odšteva 255?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mucek4
Član
Član



Pridružen-a: Sob 18 Jun 2005 20:52
Prispevkov: 2952
Aktiv.: 13.29
Kraj: Tržič - Mesto med gorami

PrispevekObjavljeno: Čet Nov 25, 2010 4:46 pm    Naslov sporočila:   Odgovori s citatom

Točno tako.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
red_mamba
Član
Član



Pridružen-a: Ned 20 Feb 2005 17:56
Prispevkov: 1486
Aktiv.: 6.69
Kraj: Yogyakarta

PrispevekObjavljeno: Čet Nov 25, 2010 11:54 pm    Naslov sporočila:   Odgovori s citatom

mucek4 je napisal/a:
Točno tako.


mislim da naredi 256x255 ciklov
prva zanka naredi tudi korak 0->255 remember Mr. Green

_________________
Bad things happen to good people all the time for no reason!
Blog
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
GJ
Član
Član



Pridružen-a: Čet 02 Nov 2006 15:51
Prispevkov: 946
Aktiv.: 4.46
Kraj: Ljubljana

PrispevekObjavljeno: Pet Nov 26, 2010 12:45 am    Naslov sporočila:   Odgovori s citatom

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 Mr. Green


Narobe misliš... Wink
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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
red_mamba
Član
Član



Pridružen-a: Ned 20 Feb 2005 17:56
Prispevkov: 1486
Aktiv.: 6.69
Kraj: Yogyakarta

PrispevekObjavljeno: Pet Nov 26, 2010 8:04 am    Naslov sporočila:   Odgovori s citatom

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 Mr. Green


Narobe misliš... Wink
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 Mr. Green
č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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
TRIROG
Član
Član



Pridružen-a: Čet 30 Avg 2007 12:23
Prispevkov: 84
Aktiv.: 0.42
Kraj: Ljubljana

PrispevekObjavljeno: Tor Nov 30, 2010 3:50 pm    Naslov sporočila:   Odgovori s citatom

č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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group