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