Takaisin
;*****************************************************************************************
; *
; Tiedostonimi: testib.asm *
; Päiväys: 28.02 2005 *
; Tiedosto versio: 1A *
; *
; Omistaja: Matti Järvinen *
; *
;*****************************************************************************************
; *
; Ohjelman toiminta lyhyesti: *
; Ohjelma vilkuttaa LEDiä painikkeella valittavassa PORTB:n *
; lähdössä. *
; Painikkeet PORTB:n bitit 0-3 ja LEDit 4-7 *
;*****************************************************************************************
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ö- ja tuloportin 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:n tuloissa 0-3 olevia painikkeita
; painettaessa.
; PORTB:n tuloihin ylösvetovastus n.2,7k +5V:iin ja pinni kytketään painikkeella maahan.
; LEDit kytketään 470ohmin vastuksella pinnistä maahan.
;*****************************************************************************************
MOVLW b'00000000' ; Asetetaan W rekisteriin luku 00000000
MOVWF PORTB ; ja siirretään PORTB:n lähdöksi.
PAINIKKEET
BTFSS PORTB,0 ; Ohitetaan seuraava jos painiketta 0 EI paineta
GOTO VILKKUB4 ; Painettaessa painiketta 0 vilkutetaan PORTB 4
BTFSS PORTB,1 ; Ohitetaan seuraava jos painiketta 1 EI paineta
GOTO VILKKUB5 ; Painettaessa painiketta 0 vilkutetaan PORTB 5
BTFSS PORTB,2 ; Ohitetaan seuraava jos painiketta 2 EI paineta
GOTO VILKKUB6 ; Painettaessa painiketta 0 vilkutetaan PORTB 6
BTFSS PORTB,3 ; Ohitetaan seuraava jos painiketta 3 EI paineta
GOTO VILKKUB7 ; Painettaessa painiketta 0 vilkutetaan PORTB 7
GOTO PAINIKKEET ; Uusi kierros jos painikkeita ei painettu
VILKKUB4
BSF PORTB,4 ; Asetetaan PORTB bit4 = 1
MOVLW d'2' ; Asetetaan aikalaskijalle COUNT2 luku 2, kerroin 0,1s
CALL AIKA0X0 ; Kulutetaan aikaa n.0,2s
BCF PORTB,4 ; Asetetaan PORTB bit4 = 0
MOVLW d'2' ; Asetetaan aikalaskijalle COUNT2 luku 2, kerroin 0,1s
CALL AIKA0X0 ; Kulutetaan aikaa n.0,2s
GOTO PAINIKKEET ; Uusi kierros
VILKKUB5
BSF PORTB,5 ; Asetetaan PORTB bit5 = 1
MOVLW d'2' ; Asetetaan aikalaskijalle COUNT2 luku 2, kerroin 0,1s
CALL AIKA0X0 ; Kulutetaan aikaa n.0,2s
BCF PORTB,5 ; Asetetaan PORTB bit5 = 0
MOVLW d'2' ; Asetetaan aikalaskijalle COUNT2 luku 2, kerroin 0,1s
CALL AIKA0X0 ; Kulutetaan aikaa n.0,2s
GOTO PAINIKKEET ; Uusi kierros
VILKKUB6
BSF PORTB,6 ; Asetetaan PORTB bit6 = 1
MOVLW d'2' ; Asetetaan aikalaskijalle COUNT2 luku 2, kerroin 0,1s
CALL AIKA0X0 ; Kulutetaan aikaa n.0,2s
BCF PORTB,6 ; Asetetaan PORTB bit6 = 0
MOVLW d'2' ; Asetetaan aikalaskijalle COUNT2 luku 2, kerroin 0,1s
CALL AIKA0X0 ; Kulutetaan aikaa n.0,2s
GOTO PAINIKKEET ; Uusi kierros
VILKKUB7
BSF PORTB,7 ; Asetetaan PORTB bit7 = 1
MOVLW d'2' ; Asetetaan aikalaskijalle COUNT2 luku 2, kerroin 0,1s
CALL AIKA0X0 ; Kulutetaan aikaa n.0,2s
BCF PORTB,7 ; Asetetaan PORTB bit7 = 0
MOVLW d'2' ; Asetetaan aikalaskijalle COUNT2 luku 2, kerroin 0,1s
CALL AIKA0X0 ; Kulutetaan aikaa n.0,2s
GOTO PAINIKKEET ; 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.X x 100ms. Yhden kierroksen suorittamiseen kuluva
; aika 100ms
AIKA0X0
MOVWF COUNT2 ; Aikalaskijalle on annettu luku jo ennen aliohjelmakutsua
AIKA0X0A
CALL AIKA10 ; 1 ; Kulutetaan aikaa 100ms
DECFSZ COUNT2,F ; 1 ; Vähennetään laskijaa COUNT1
GOTO AIKA0X0A ; 1 ; Jos EI nolla vähennetään lisää
RETURN ; 1 ; Jos ON nolla jatketaan kutsutusta paikasta
;*****************************************************************************************
END ; Ohjelmakoodi loppuu tähän.
Takaisin