Takaisin
;*****************************************************************************************
; *
; Tiedostonimi: testi.asm *
; Päiväys: 28.02 2005 *
; Tiedosto versio: 1B *
; *
; Omistaja: Matti Järvinen *
; *
;*****************************************************************************************
; *
; Ohjelman toiminta lyhyesti: *
; Ohjelma vilkuttaa LEDiä PORTIN B bitissä 7, pinni 13 *
; *
;*****************************************************************************************
list p=16F84 ; list määrittää käytetyn piirin
#include <p16F84.inc> ; Prosessorille valmiiksi määritellyt
; muuttujat tiedostossa p16F84.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;*****************************************************************************************
; Muuttujien määritys.
COUNT0 EQU 0X20 ; Aikalaskija 0
COUNT1 EQU 0X21 ; Aikalaskija 1
COUNT2 EQU 0X22 ; Aikalaskija 2
;*****************************************************************************************
ORG 0x000 ; Resetointi osoite, ohjelma alkaa aina tästä osoitteesta
GOTO ALKU ; Hyppykäsky varsinaisen ohjelman aloituskohtaan
;*****************************************************************************************
ALKU ; Käynnistyksen ja määrittelyjen jälkeen varsinainen
; ohjelma alkaa tästä.
;*****************************************************************************************
; OHJELMAKOODI. Aloitetaan piirin asetuksilla.
; Ajastimen määritys.
BSF STATUS,RP0 ; Asetetaan STATUS rekisterin Bitti 5 1:ksi
MOVLW b'11010001' ; OPTION_REG Lasketaan sisäisiä käskyjaksoja PSA (5)=0
MOVWF OPTION_REG ; Käytetään esijakajaa T0CS (3)=0 ja jakajaa asetuksella
; n/2 PS2-PS0 (2-0)=001
; Lähtöportin määritys.
MOVLW b'00001111' ; Portin bitit 7-4 lähdöksi ja 3-0 tuloksi.
MOVWF TRISB ; Siirretään portin B asetukseksi.
BCF STATUS,RP0 ; Asetetaan STATUS rekisterin Bitti 5 0:ksi
;*****************************************************************************************
; Asetusten jälkeen ohjelma joka vilkuttaa LEDiä PORTB bit7 pinnissä 13
; Samoilla määrityksillä voidaan käyttää myös muita PORTIN B bittejä 6,5,4 LEDin
; vilkutukseen muuttamalla (PORTB,7) seiskaa, 6, 5 tai 4:ksi.
VILKKUPIN8
BSF PORTB,7 ; Asetetaan PORTB bit7 = 1
CALL AIKA050 ; Kulutetaan aikaa n.0,5s
BCF PORTB,7 ; Asetetaan PORTB bit7 = 0
CALL AIKA050 ; Kulutetaan aikaa n.0,5s
GOTO VILKKUPIN8 ; Uusi kierros
;*****************************************************************************************
; Ajan määritys aliohjelmat.
; Käytettäessä 4MHz kidettä, jokaiseen ohjelmakäskyyn kuluva aika on 1/4 kellotaajuudesta
; eli kellojakso on 1/4000000MHz=0,00000025s ja käskyjakso on 4 X kellojakso = 0,000001s
; Jos nyt aikoo saada näkyvää vilkutusta jollekin LEDille lähtöporttiin niin tarvitaan
; esimerkiksi 0,5s:n aikaan, jonka ajan LED palaa, 500000 käskyjaksoa ja saman verran aikaan
; jonka LED on sammuneena. Tämä pitäisi toteuttaa laskijoilla jotka ovat 8 bittiä, eli
; laskija laskee 0-255, jonka jälkeen se aloittaa taas nollasta, tai päinvastoin eli
; vähennetään, jolloin 0:n jälkeen tulee 255. Jollei aika ole tarkka voidaan käyttää esi
; jakajaa (t0pre), jolla jaetaan käskyjaksot 2,4,8,16,32,64,128,256:lla, joka määritellään
; OPTION_REG rekisterissä, PS2-PS0 bitit 2-0. Samoin määritellään T0CS bitti 5=0, jolloin
; käytetään sisäistä käskyjaksoa ja PSA bitti 3=0 jolloin esijakaja on käytössä.
; Option rekisterin bittejä päästään muuttamaan, kun ensin vaihdetaan STATUS rekisterin
; bitti 5 (RP0) 0:sta 1:n.
; Näitten määritysten jälkeen voidaan kirjoittaa jonkinkaltainen aliohjelma joka kuluttaa
; määritellyn ajan.
;
;-----------------------------------------------------------------------------------------
; Aika joka kuluu tähän silmukkaan on n.500us. Yhden käskyn suorittamiseen kuluva aika 1us
AIKA01
MOVLW d'247' ; 1 ; Asetetaan laskijaan COUNT0 luku 247
MOVWF COUNT0 ; 1
AIKA01A
DECFSZ COUNT0,F ; 1 ; Vähennetään laskijaa COUNT0
GOTO AIKA01A ; 1 ; Jos EI nolla vähennetään lisää
RETURN ; 1 ; Jos ON nolla jatketaan kutsutusta paikasta
;-----------------------------------------------------------------------------------------
; Aika joka kuluu tähän silmukkaan on n.100ms. Yhden kierroksen suorittamiseen kuluva aika
; 500us
AIKA10
MOVLW d'200' ; 1 ; Asetetaan laskijaan COUNT1 luku 200
MOVWF COUNT1 ; 1
AIKA10A
CALL AIKA01 ; 1 ; Kulutetaan aikaa 500us
DECFSZ COUNT1,F ; 1 ; Vähennetään laskijaa COUNT1
GOTO AIKA10A ; 1 ; Jos EI nolla vähennetään lisää
RETURN ; 1 ; Jos ON nolla jatketaan kutsutusta paikasta
;-----------------------------------------------------------------------------------------
; Aika joka kuluu tähän silmukkaan on n.500ms. Yhden kierroksen suorittamiseen kuluva aika
; 100ms
AIKA050
MOVLW d'5' ; 1 ; Asetetaan laskijaan COUNT2 luku 5
MOVWF COUNT2 ; 1
AIKA050A
CALL AIKA10 ; 1 ; Kulutetaan aikaa 100ms
DECFSZ COUNT2,F ; 1 ; Vähennetään laskijaa COUNT1
GOTO AIKA050A ; 1 ; Jos EI nolla vähennetään lisää
RETURN ; 1 ; Jos ON nolla jatketaan kutsutusta paikasta
;*****************************************************************************************
END ; Ohjelmakoodi loppuu tähän.
Takaisin