;disene un progama que sea capaz de leer la información que le llega a dos puertos del pic16f877
;una palabra de 16bits cada 30ms y que luego la envie a una registro de desplazamiento(16 bits)
;conectado al puerto serial y a la ves sea capaz de leer el dato enviado al regitro de desplazamiento
;si el dato recibido es distinto del que se leyo en los puerto, el programa se detendra. Nota:
;configure el (los)timers y el puerto(velocidad y modo de comunicación a criterio)
;LUIS TORRES C.I.: 15.903.815
list p=16f877
include "p16f877.inc"
; *************************************************************************************************
; * Bloque de definición de variables *
; *************************************************************************************************
cblock 0x20
dato_A
dato_B
dato_1
dato_2
PCLATH_temp
STATUS_temp
W_temp
endc
org 0x00
goto inicio ; salva el vector interuupción
ORG 0X04
GOTO INTERR
;**************************************************************************************************
; PROGRAMA PRINCIPAL *
;**************************************************************************************************
org 0x09
inicio call initD ; inicializa el puerto D
call initB ; inicializa el puerto B
MOVLW 0x36 ; número de incrementos del timer msb
MOVWF TMR1H ; inicializa la cuenta de TMR1
MOVLW 0X00 ; número de incrementos del timer lsb
MOVWF TMR1L ; inicializa la cuenta de TMR1
BCF PIR1,TMR1IF ; limpia bandera de sobreflujo
MOVLW 0x31 ; dato de configuración para el timer1
MOVWF T1CON ; modo temporizador, preescalador 1/8, habilita timer 1
BSF INTCON,GIE ; Habilita interrupciones globales
BSF STATUS,RP0 ; banco 1
BSF PIE1,TMR1IE ; Habilita interrupcion
BCF STATUS,RP0 ; banco 0
trans BSF STATUS,RP0 ; banco 1
BCF TXSTA,BRGH ; pone bit BRGH=0 (velocidad baja)
MOVLW 0x17 ; valor para 9600 Bauds (Fosc=14.7456 Mhz)
MOVWF SPBRG ; configura 9600 Bauds
BCF TXSTA,SYNC ; limpia bit SYNC (modo asíncrono)
BSF TXSTA,TXEN ; pone bit TXEN=1 (habilita transmisión)
BCF STATUS,RP0 ; regresa al banco 0
BSF RCSTA,SPEN ; pone bit SPEN=1 (habilita puerto serie)
BSF RCSTA,CREN ; Habilita recepción
envia_1 BSF STATUS,RP0 ; banco 1
esp_1 BTFSS TXSTA,TRMT ; checa si el buffer de transmisión
GOTO esp_1 ; si está ocupado espera
BCF STATUS,RP0 ; regresa al banco 0
MOVF PORTB,W ; rescata dato a enviar
MOVWF TXREG ; lo envía
recib_1 BTFSS PIR1,RCIF ; checa el buffer de recepción
GOTO recib_1 ; si no hay dato listo espera
MOVF RCREG,W ; si hay dato, lo lee
MOVWF dato_1 ; lo almacena en dato
MOVF dato_A,W
SUBWF dato_1,W ; es igual?
BTFSS STATUS,Z ;
GOTO fin ; si es igual termina
envia_2 BSF STATUS,RP0 ; banco 1
esp_2 BTFSS TXSTA,TRMT ; checa si el buffer de transmisión
GOTO esp_2 ; si está ocupado espera
BCF STATUS,RP0 ; regresa al banco 0
MOVF dato_B,W ; rescata dato a enviar
MOVWF TXREG ; lo envía
recib_2 BTFSS PIR1,RCIF ; checa el buffer de recepción
GOTO recib_2 ; si no hay dato listo espera
MOVF RCREG,W ; si hay dato, lo lee
MOVWF dato_2 ; lo almacena en dato
MOVF dato_B,W
SUBWF dato_2,W ; es igual?
BTFSS STATUS,Z ;
GOTO fin ; si es igual termina
GOTO envia_1 ; repite
GOTO fin ; ciclo infinito
;**************************************************************************************************
; Subrutina de inicialización del puerto B: *
;**************************************************************************************************
initB CLRF STATUS ;Selecciona Banco 0
CLRF PORTB ;Inicializa latches de datos de PORTB
BSF STATUS,RP0 ;Selecciona Banco 1
MOVLW 0xFF ;configura RB7,...,RB4
MOVWF TRISB ;y RB3,RB2,RB1 como salidas
BCF OPTION_REG,7 ;Conecta todas las resistencias Pull-Up
BCF STATUS,RP0 ;regresa al Banco 0
RETURN
;**************************************************************************************************
; Subrutina de inicialización del puerto D: *
;**************************************************************************************************
initD CLRF STATUS ;Selecciona Banco 0
CLRF PORTD ;Inicializa latches de datos de PORTD
BSF STATUS,RP0 ;Selecciona Banco 1
MOVLW 0xFF ;configura RD7,...,RD4
MOVWF TRISD ;y RD3,RD2,RD1 como salidas
BCF STATUS,RP0 ;regresa al Banco 0
RETURN
;**************************************************************************************************
; Subrutina que atiende la interrupción de timer0 * *
;**************************************************************************************************
INTERR movwf W_temp ; Salva el registro W en en un registro temporal
swapf STATUS,W ; Copia STATUS en W (usa SWAP para no alterarlo al copiarlo)
clrf STATUS ; Banco cero, sin importar banco actual
movwf STATUS_temp ; Salva STATUS en STATUS_temp (Banco 0)
movf PCLATH,W ; sólo se requiere si se están usando las páginas 1,2,y/o 3
movwf PCLATH_temp ; salva PCLATH
clrf PCLATH ; página 0 sin importar página actual
BCF PIR1,TMR1IF ;
MOVF PORTB,W ;
MOVWF dato_A ; GUARDA LA MITAD DE LA PALABRA
MOVF PORTD,W ; GUARDA LOS SIGUIENTES 8 BITS DE LA PALABRA
MOVWF dato_B ;
MOVLW 0x36 ; número de incrementos del timer msb
MOVWF TMR1H ; inicializa la cuenta de TMR1
MOVLW 0X00 ; número de incrementos del timer lsb
MOVWF TMR1L ; inicializa la cuenta de TMR1
BSF PIR1,TMR1IF ;
BCF PIR1,TMR1IF ; limpia bandera de sobreflujo
movf PCLATH_temp,W ; rescata PCLATH
movwf PCLATH ; si se usan las paginas 1,2 y/o 3
swapf STATUS_temp,W ; rescata el STATUS original
movwf STATUS ; restablece banco original
swapf W_temp,F ; rescata el W original
swapf W_temp,W ; sin alterar el STATUS ya rescatado.
retfie
fin NOP
end
Progama que sea capaz de leer la información que le llega a dos puertos del pic16f877
Publicado por
Sergio Velasquez
en
19:15
viernes, 3 de abril de 2009
Etiquetas:
Microcontroladores





No response to “Progama que sea capaz de leer la información que le llega a dos puertos del pic16f877”
Publicar un comentario