Miten tämä toimii?

viivesilmukka

Aloittelen assyn opiskelua ja ostin kaupasta Pickit2 paketin, jossa on pieni piiri, jonka ledejä tässä välkyttelen. Esimerkkiohjelmassa on viive toteutettu tavalla, jota en ymmärrä. Mitä tässä tapahtuu?

Ensin määritellään muuttujat
cblock 0x20
Delay1 ; Define two file registers for the
Delay2 ; delay loop
endc

Sitten laitetaan jotain alustuksia ja toteutetaan viive seuraavalla tavalla:

MainLoop
bsf PORTC,1 ; turn on LED C0
OndelayLoop
decfsz Delay1,f ; Waste time.
goto OndelayLoop ; The Inner loop takes 3 instructions per loop * 256 loopss =
; 768 instructions
decfsz Delay2,f ; The outer loop takes and additional 3 instructions per lap
; * 256 loops
goto OndelayLoop ; (768 3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
; call it a two-tenths of a second.

bcf PORTC,1 ; Turn off LED C0
OffDelayLoop
decfsz Delay1,f ; same delay as above
goto OffDelayLoop
decfsz Delay2,f
goto OffDelayLoop
goto MainLoop ; Do it again...
end

Millä perustein tuo silmukka toimii kuten toimii? Missään ei aseteta Delay1 tai Delay2 muuttujille arvoja.

Muissa esimerkeissä toimitaan muuten vastaavati, mutta silmukkamuuttujille asetetaan arvoja eksplisiittisesti ja ne ovat suht suoraviivaisia ymmärtää.

Minulle on myös epäselvää miten eri rekisterit toimivat, joten kyse voi olla file-rekisterin jostain fiitsöristä mistä en ole tietoinen.

Onko tässä kyse siitä, että muuttujille on varattu yksi tavu, joka alustetaan automaagisesti alussa nollaksi? Tämän jälkeen siitä lähdetään vähentämään yksi kerrallaan kunnes se tulee nollaksi ja pyörähtää ympäri arvoon 255?

2

1022

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Jotakin....

      Jep, aivan kuten oletit, eli siihen ympäri pyörimiseen se perustuu. Eli 0 - 1 = 255, 255 - 1 = 254, 254 - 1 = 253, ..., 2 - 1 = 1, 1 - 1 = 0 (kierros loppuu). Tuskin niitä kahta 8-bittistä muuttujaa Delay1 (muistipaikassa 0x20) ja Delay2 (muistipaikassa 0x21) erikseen alustetaan nolliksi, (silloin se pitäisi näkyä koodissa jotenkin, esim. käsky riveinä: clrf Delay1 ja clrf Delay2).

      Kyseisissä muistipaikoissa on ensimmäisellä ajokerralla (käynnistyksen jälkeen) se arvo mikä niissä on ohjelman käynnistyksen yhteydessä ollut. Niiden arvo siis riippuu siitä mitä prosessorin muistille käy erilaisissa käynnistys tilanteissa (Power up, Reset, Watchdog reset, tms.). Kyseiset muistipaikat kuitenkin menevät nollaksi kun viive silmukat on vedetty kerran läpi, koska viivesilmukka vähentää kumpaakin muistipaikkaa yhdellä niin kauan kunnes vähentämisen tulos on nolla. Eli ensimmäisen ajokerran jälkeen voidaan olla varmoja, että viive silmukka alkaa siten, että Delay1 ja Delay2:n arvot ovat nollia. Viiveellä kuitenkin ohjataan LED:iä ja jos ensimmäinen viive ei olekaan 0.197s vaan pienempi, niin se tuskin haittaa. Tuo ohjelma vastaa suunnilleen seuraavan kaltaista C ohjelmaa.



      unsigned char delay1;
      unsigned char delay2;


      void inline viive(void)
      {
         do {
            do {
               delay1 = delay1 - 1;
            } while(delay1 != 0);
            
            delay2 = delay2 - 1;
         } while(delay2 != 0);
      }


      int main()
      {
         while(1) {
            ledOn();
            viive();
            ledOff();
            viive();
         }
      }

      • viivesilmukka

        Mietinkin, että alustuvatko muuttujat automaagisesti nollaksi ja se tuntui hieman hölmöltä.

        Kiitos.

        Kohta varmaan palaan, koska en saanut ledejä välkkymään haluamallani tavalla :)


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Porvarimediat paniikissa demareiden huiman kannatuksen vuoksi

      Piti sitten keksiä "nimettömiin lähteisiin" perustuen taas joku satu. Ovat kyllä noloja, ja unohtivat sen, että vaalit
      Maailman menoa
      98
      6348
    2. KATASTROFI - Tytti Tuppurainen itse yksi pahimmista kiusaajista!!!

      STT:n lähteiden mukaan SDP:n eduskuntaryhmän puheenjohtaja Tytti Tuppurainen on käyttäytynyt toistuvasti epäasiallisesti
      Maailman menoa
      355
      5865
    3. Mikä siinä on ettei persuille leikkaukset käy?

      On esitetty leikkauksia mm. haitallisiin maataloustukiin, kuin myös muihin yritystukiin. Säästöjä saataisiin lisäksi lei
      Maailman menoa
      60
      2833
    4. Lääppijä Lindtman jäi kiinni itse teosta

      Lindtman kyselemättä ja epäasiallisesti koskettelee viestintäpäällikköä. https://www.is.fi/politiikka/art-2000011780852
      Maailman menoa
      107
      2268
    5. Juuri nyt! Tytti Tuppurainen on käyttäytynyt toistuvasti epäasiallisesti

      Ai että mä nautin, Tytti erot vireille! "Käytös on kohdistunut avustajia ja toisia kansanedustajia kohtaan, uutisoi STT
      Maailman menoa
      107
      1958
    6. Onko kaivattusi

      liian vetovoimainen seksuaalisesti?
      Ikävä
      125
      1754
    7. Puolen vuoden koeaika

      Voisi toimia meillä. Ensin pitäis selvittää "vaatimukset" puolin ja toisin, ennen kuin mitään aloittaa. Ja matalalla pro
      Ikävä
      19
      1633
    8. Tytti Tuppurainen nöyryyttää avustajiaan

      Tytti Tuppurainen nöyryyttää SDP:n eduskuntaryhmän kokouksissa sekä avustajia että kansanedustajia. Hän nolaa ihmisiä ju
      Kotimaiset julkkisjuorut
      181
      1300
    9. On todella hassua

      Ajatella että pitäisit erityisen kuumana tai seksikkäänä?
      Ikävä
      73
      1197
    10. Huomaatteko Demari Tytti ei esitä pahoitteluitaan

      Samanlainen ilmeisesti kuin Marin eli Uhriutuu no he ovat Demareita ja muiden yläpuolella siis omasta mielestään
      Maailman menoa
      33
      1108
    Aihe