TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: LEONARDO_59 en 02 de Enero de 2008, 18:44:24
-
Amigos, tengo este programa, pero aun no he podido RX datos por puerto serial, puedo TX sin problemas y a muchos les puede ayudar, pero quiero saber si alguien puede apoyarme con la parte de la RX de datos, necesito que reciba los datos y active el PORTA,1 ... les envio el programita por si alguien puede ayudarme
;PROGRAMA
LIST p=16f877
INCLUDE "p16f877.inc"
;------------------------------------------------------------------
dato_serie EQU 0x01 ; dato serie desde la PC
;------------------------------------------------------------------
ORG 0000h
goto inicio
inicio
ORG 20h
;Configurar el puerto B y A como salida RB7 y RA0
;y como entradas RB0,RB1,RB4 y RB5
bsf STATUS,RP0
bsf TRISB,0
bsf TRISB,1
bsf TRISB,4
bsf TRISB,5
bcf TRISA,1
bcf TRISB,7
bcf STATUS,RP0
programa
call sg1 ; Subrutina para hacer sonar dos veces la
; chicharra
call sg60 ; retardo de 60 segundos.
programa1
movlw 04h ; muevo el nº 04h al W.
movwf 06h ; muevo W al registro 11h
btfss PORTB,0
goto comprueba1
btfss PORTB,1
goto comprueba2
btfss PORTB,4
goto comprueba3
btfss PORTB,5
goto comprueba4
call ACTIV_DESAC
comprueba1
btfsc PORTB,0 ; compruebo si el sensor 0 está activo o no
goto cuatro1 ; salto incondicional a la etiqueta “cuatro1”
; para comprobar 4 veces si está activado el
; sensor 0 conectado a RB0
bcf PORTB,7 ; pongo a cero RB7, o sea, apago la chicharra
; si no está activado el sensor 0
comprueba2
btfsc PORTB,1 ; compruebo si el sensor 1 está activo o no
goto cuatro2 ; salto incondicional a la etiqueta “cuatro2”
; para comprobar 4 veces si está activado el
; sensor 1 conectado a RB1
bcf PORTB,7 ; pongo a cero RB7, o sea, apago la chicharra
; si no está activado el sensor 1
comprueba3
btfsc PORTB,4 ; compruebo si el sensor 0 está activo o no
goto cuatro3 ; salto incondicional a la etiqueta “cuatro3”
; para comprobar 4 veces si está activado el
; sensor 0 conectado a RB4
bcf PORTB,7 ; pongo a cero RB7, o sea, apago la chicharra
; si no está activado el sensor 0
comprueba4
btfsc PORTB,5 ; compruebo si el sensor 1 está activo o no
goto cuatro4 ; salto incondicional a la etiqueta “cuatro4”
; para comprobar 4 veces si está activado el
; sensor 1 conectado a RB5
bcf PORTB,7 ; pongo a cero RB7, o sea, apago la chicharra
; si no está activado el sensor 1
comprueba5
btfsc dato_serie,0 ; se fija si hay dato RS232
call ACTIV_DESAC ; resetea la alarma y la desactiva para
; cualquier requerimiento
bcf PORTB,7 ; pongo a cero RB7, o sea, apago la chicharra
; si no está activado el sensor 1
movlw 04h ; cargo con el nº 04h el W
movwf 06h ; cargo el registro 11h con W
goto comprueba1 ; salto incondicional a la etiqueta
; “comprueba1”
cuatro1
call sg120 ; suena una vez la chicharra retardo de 120 segundos
decfsz 06h,1 ; decrementa el registro 11h y si vale cero salta
btfsc PORTB,0 ; compruebo si el sensor 0 está activo o no
call datos
call buzzer120
cuatro2
call datos
decfsz 06h,1 ; decrementa el registro 11h y si vale cero salta
btfsc PORTB,1 ; compruebo si el sensor 1 está activo o no
call buzzer120
cuatro3
call datos
decfsz 06h,1 ; decrementa el registro 11h y si vale cero salta
btfsc PORTB,4 ; compruebo si el sensor 1 está activo o no
call buzzer120
cuatro4
call datos
decfsz 06h,1 ; decrementa el registro 11h y si vale cero salta
btfsc PORTB,5 ; compruebo si el sensor 1 está activo o no
call buzzer120
;--------------------------------------------
;Tx de Datos
;--------------------------------------------
datos
bsf STATUS,RP0 ; Banco-1
movlw .25
movwf SPBRG ; Vtx = 9600bps
movlw B'00100100'
movwf TXSTA ; Tx = 8 bits / TX-ON / BRGH=1
bcf STATUS,RP0 ; Banco-0
bsf RCSTA,SPEN ; SPEN=1
btfsc PORTB,0 ; compruebo si el sensor 0 está activo o no
goto DATOS1 ; salto incondicional a la etiqueta “DATOS1”
btfsc PORTB,1 ; compruebo si el sensor 1 está activo o no
goto DATOS2 ; salto incondicional a la etiqueta “DATOS2”
btfsc PORTB,4 ; compruebo si el sensor 4 está activo o no
goto DATOS3 ; salto incondicional a la etiqueta “DATOS3”
btfsc PORTB,5 ; compruebo si el sensor 5 está activo o no
goto DATOS4 ; salto incondicional a la etiqueta “DATOS4”
;-----------------------------------------------
DATOS1
movlw '#'
call TX_DATO
movlw 'I'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '1'
call TX_DATO
return
;-----------------------------------------------
DATOS2
movlw '#'
call TX_DATO
movlw 'M'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '1'
call TX_DATO
return
;-----------------------------------------------
DATOS3
movlw '#'
call TX_DATO
movlw 'C'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '1'
call TX_DATO
return
;-----------------------------------------------
DATOS4
movlw '#'
call TX_DATO
movlw 'V'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '1'
call TX_DATO
return
;-----------------------------------------------
TX_DATO
bsf STATUS,RP0 ; Banco-1
btfss TXSTA,TRMT ; ¿Buffer vacio?
goto $-1 ; .NO
bcf STATUS,RP0 ; Banco-0
movwf TXREG ; Inicia Tx
clrf TXREG
return
;------------------------------------------------
; ESTADO ALARMA
;------------------------------------------------
ACTIV_DESAC
bsf STATUS,RP0 ; Banco-1
movlw .25
movwf SPBRG ; Vtx = 9600bps
movlw B'00100100'
movwf TXSTA ; Tx = 8 bits / TX-ON / BRGH=1
bcf STATUS,RP0 ; Banco-0
movlw B'10010000'
movwf RCSTA
bsf RCSTA,SPEN ; SPEN=1
goto recibeRS232
;------------------------------------------------------------------------------
recibeRS232
btfss PIR1,RCIF ; se fija si hay dato RS232
movf RCREG,W ; guarda dato recibido en W
movwf dato_serie
btfss dato_serie,0
call msg_activa
btfsc dato_serie,0
call msg_desactiva
return
;------------------------------------------------------------------------
msg_activa
goto ACTIVADA
return
;------------------------------------------------------------------------
msg_desactiva
goto DESACTIVADA ; salto incondicional a la etiqueta “DESACTIVADA”
bsf PORTA,1 ; RA1 es '1'
;-------------------------------------------------
ACTIVA
movlw '#'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '1'
call TX_DATO
return
;-------------------------------------------------
DESACTIVA
movlw '#'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
return
;---------------------------------------------
;Subrutinas de la chicharra (buzzer)
;---------------------------------------------
buzzer1
bsf PORTB,7
call sg1
bcf PORTB,7
return
buzzer2
bsf PORTB,7
call sg1
bcf PORTB,7
call sg1
bsf PORTB,7
call sg1
bcf PORTB,7
return
buzzer120
bsf PORTB,7
call sg120
bcf PORTB,7
btfss PORTB,7
bsf PORTA,1
;---------------------------------
;Subrutinas de retardos.
;---------------------------------
sg1
movlw 0ffh
movwf 0ch
movlw 0ffh
movwf 0dh
movlw 05h
movwf 0eh
repite
decfsz 0ch,1
goto repite
decfsz 0dh,1
goto repite
decfsz 0eh,1
goto repite
return
;---------------------------------------
sg2
clrw
movlw 0ffh
movwf 20h
movlw 0ffh
movwf 21h
movlw 05h
movwf 22h
repite2
decfsz 20h,1
goto repite2
decfsz 21h,1
goto repite2
decfsz 22h,1
goto repite2
return
;------------------------------------------
;Retardo de 60 segundos.
;Incrementaremos un registro, 10h, cargado
;con el nº C3h hasta llegar a 00h (60 veces)
;-------------------------------------------
sg60
movlw 0c3h
movwf 10h
call sg1
incfsz 10h,1
return
;--------------------------------------------
;Retardo de 120 segundos.
;Incrementaremos un registro, 10h, cargado
;con el nº C3h hasta llegar a 00h (60 veces)
;-------------------------------------------
sg120
movlw 0c3h
movwf 10h
otro120
call sg2
incfsz 10h,1
goto otro120
return
end
-
;Configurar el puerto B y A como salida RB7 y RA0
;y como entradas RB0,RB1,RB4 y RB5
bsf STATUS,RP0
bsf TRISB,0
bsf TRISB,1
bsf TRISB,4
bsf TRISB,5
bcf TRISA,1
bcf TRISB,7
bcf STATUS,RP0
en esta parte veo que no configuraste bien
" bcf TRISA,1 "
acoso no tiene que ser
" bcf TRISA,0 "
-
recibeRS232
btfss PIR1,RCIF ; se fija si hay dato RS232
movf RCREG,W ; guarda dato recibido en W
movwf dato_serie
btfss dato_serie,0
call msg_activa
btfsc dato_serie,0
call msg_desactiva
return
este es lo que escriviste
si entiendo bien en ambos casos si ah recibido o no guarda un dato en "dato_serie"
-
Hola
Para poder recibir datos necesitas configurar el pin como entrada como bien te dicen en el post anterior.
Otra cosa , cuantos datos deberias recibir, porque puedes tener un buffer de 2 bytes y el tercero que entrara se perderia.
recibeRS232
btfss PIR1,RCIF ; se fija si hay dato RS232
movf RCREG,W ; guarda dato recibido en W
movwf dato_serie
btfss dato_serie,0
call msg_activa
btfsc dato_serie,0
call msg_desactiva
return
ESPERA_DATO
btfss PIR1,RCIF ; espera hasta tener dato completo
goto ESPERA_DATO
movf dato_serie
tu demás código
.
.
.
return
Saludos
Atentamente
Akenafab
-
Gracias por sus respuestas, en lo que respecta a la configuraciòn del pin A0, tuve un error al tipeo de la explicaciòn inicial, si ven todo el programa el pin que configuro es siempre el A1
Lo que no me queda claro es lo de la cantidad de bytes que recibirìa el buffer, en este caso es solo uno para cada opcion, les adjunto el programa que funciona bien ahora.....
Si pueden darme una manito con lo que es la posibilidad de que se reciba un dato completo en el buffer,
por ejem. PLACA-LKM420... todo este texto que sea recibido en un solo bloque
;PROGRAMA
LIST p=16f877
INCLUDE "p16f877.inc"
CBLOCK 0x20
count1
count2
count3
ENDC
;------------------------------------------------------------------
dato_serie EQU 01h ; dato serie desde la PC
;------------------------------------------------------------------
ORG 0000h
goto inicio
inicio
ORG 20h
;Configurar el puerto B y A como salida RB7 y RA0
;y como entradas RB0,RB1,RB4 y RB5
bsf STATUS,RP0
bsf TRISB,0
bsf TRISB,1
bsf TRISB,4
bsf TRISB,5
bcf TRISA,1
bcf TRISB,7
bcf STATUS,RP0
programa
call sg1 ; Subrutina para hacer sonar dos veces la
; chicharra
call sg60 ; retardo de 60 segundos.
programa1
movlw 04h ; muevo el nº 04h al W.
movwf 06h ; muevo W al registro 06h
call msg_activa
comprueba1
btfsc PORTB,0
call sg120 ; suena una vez la chicharra retardo de 120 segundos
btfsc PORTB,0 ; compruebo si el sensor 0 está activo o no
goto cuatro1 ; salto incondicional a la etiqueta “cuatro1”
; para comprobar 4 veces si está activado el
; sensor 0 conectado a RB0
bcf PORTB,7 ; pongo a cero RB7, o sea, apago la chicharra
; si no está activado el sensor 0
comprueba2
btfsc PORTB,1 ; compruebo si el sensor 1 está activo o no
goto cuatro2 ; salto incondicional a la etiqueta “cuatro2”
; para comprobar 4 veces si está activado el
; sensor 1 conectado a RB1
bcf PORTB,7 ; pongo a cero RB7, o sea, apago la chicharra
; si no está activado el sensor 1
comprueba3
btfsc PORTB,4 ; compruebo si el sensor 0 está activo o no
goto cuatro3 ; salto incondicional a la etiqueta “cuatro3”
; para comprobar 4 veces si está activado el
; sensor 0 conectado a RB4
bcf PORTB,7 ; pongo a cero RB7, o sea, apago la chicharra
; si no está activado el sensor 0
comprueba4
btfsc PORTB,5 ; compruebo si el sensor 1 está activo o no
goto cuatro4 ; salto incondicional a la etiqueta “cuatro4”
; para comprobar 4 veces si está activado el
; sensor 1 conectado a RB5
bcf PORTB,7 ; pongo a cero RB7, o sea, apago la chicharra
; si no está activado el sensor 1
comprueba5
btfsc PIR1,RCIF ; se fija si hay dato RS232
call ACTIV_DESAC ; resetea la alarma y la desactiva para
; cualquier requerimiento
bcf PORTB,7 ; pongo a cero RB7, o sea, apago la chicharra
; si no está activado el sensor 1
movlw 04h ; cargo con el nº 04h el W
movwf 06h ; cargo el registro 06h con W
goto comprueba1 ; salto incondicional a la etiqueta
; “comprueba1”
cuatro1
call datos
decfsz 06h,1 ; decrementa el registro 06h y si vale cero salta
btfsc PORTB,0 ; compruebo si el sensor 0 está activo o no
call buzzer120
call compara
btfsc PORTB,0
goto comprueba1
btfsc PORTB,1
goto comprueba1
btfsc PORTB,4
goto comprueba1
btfsc PORTB,5
goto comprueba1
call msg_activa
cuatro2
call datos
decfsz 06h,1 ; decrementa el registro 11h y si vale cero salta
btfsc PORTB,1 ; compruebo si el sensor 1 está activo o no
call buzzer120
call compara
btfsc PORTB,0
goto comprueba1
btfsc PORTB,1
goto comprueba1
btfsc PORTB,4
goto comprueba1
btfsc PORTB,5
goto comprueba1
call msg_activa
cuatro3
call datos
decfsz 06h,1 ; decrementa el registro 11h y si vale cero salta
btfsc PORTB,4 ; compruebo si el sensor 1 está activo o no
call buzzer120
call compara
btfsc PORTB,0
goto comprueba1
btfsc PORTB,1
goto comprueba1
btfsc PORTB,4
goto comprueba1
btfsc PORTB,5
goto comprueba1
call msg_activa
cuatro4
call datos
decfsz 06h,1 ; decrementa el registro 11h y si vale cero salta
btfsc PORTB,5 ; compruebo si el sensor 1 está activo o no
call sg120
call compara
btfsc PORTB,0
goto comprueba1
btfsc PORTB,1
goto comprueba1
btfsc PORTB,4
goto comprueba1
btfsc PORTB,5
goto comprueba1
call msg_activa
;--------------------------------------------
;Tx de Datos
;--------------------------------------------
datos
bsf STATUS,RP0 ; Banco-1
movlw .25
movwf SPBRG ; Vtx = 9600bps
movlw B'00100100'
movwf TXSTA ; Tx = 8 bits / TX-ON / BRGH=1
bcf STATUS,RP0 ; Banco-0
bsf RCSTA,SPEN ; SPEN=1
btfsc PORTB,0 ; compruebo si el sensor 0 está activo o no
goto DATOS1 ; salto incondicional a la etiqueta “DATOS1”
btfsc PORTB,1 ; compruebo si el sensor 1 está activo o no
goto DATOS2 ; salto incondicional a la etiqueta “DATOS2”
btfsc PORTB,4 ; compruebo si el sensor 4 está activo o no
goto DATOS3 ; salto incondicional a la etiqueta “DATOS3”
btfsc PORTB,5 ; compruebo si el sensor 5 está activo o no
goto DATOS4 ; salto incondicional a la etiqueta “DATOS4”
;-----------------------------------------------
DATOS1
movlw '#'
call TX_DATO
movlw 'I'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '1'
call TX_DATO
return
;-----------------------------------------------
DATOS2
movlw '#'
call TX_DATO
movlw 'M'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '1'
call TX_DATO
return
;-----------------------------------------------
DATOS3
movlw '#'
call TX_DATO
movlw 'C'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '1'
call TX_DATO
return
;-----------------------------------------------
DATOS4
movlw '#'
call TX_DATO
movlw 'V'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '1'
call TX_DATO
return
;-----------------------------------------------
TX_DATO
bsf STATUS,RP0 ; Banco-1
btfss TXSTA,TRMT ; ¿Buffer vacio?
goto $-1 ; .NO
bcf STATUS,RP0 ; Banco-0
movwf TXREG ; Inicia Tx
clrf TXREG
return
;------------------------------------------------
; ESTADO ALARMA
;------------------------------------------------
ACTIV_DESAC
bsf STATUS,RP0 ; Banco-1
movlw .25
movwf SPBRG ; Vtx = 9600bps
movlw B'00100100'
movwf TXSTA ; Tx = 8 bits / TX-ON / BRGH=1
bcf STATUS,RP0 ; Banco-0
movlw B'10010000'
movwf RCSTA
bsf RCSTA,SPEN ; SPEN=1
bsf RCSTA,CREN
goto recibeRS232
;---------------------------------------------------
recibeRS232
btfss PIR1,RCIF ; se fija si hay dato RS232
goto $-1
movf RCREG,W ; guarda dato recibido en W
movwf dato_serie
btfsc dato_serie,0
call msg_activa
btfss dato_serie,0
call msg_desactiva
return
;---------------------------------------------------
msg_activa
bsf STATUS,RP0 ; Banco-1
movlw .25
movwf SPBRG ; Vtx = 9600bps
movlw B'00100100'
movwf TXSTA ; Tx = 8 bits / TX-ON / BRGH=1
bcf STATUS,RP0 ; Banco-0
movlw B'10010000'
movwf RCSTA
bsf RCSTA,SPEN ; SPEN=1
bsf RCSTA,CREN
btfsc PIR1,RCIF ; se fija si hay dato RS232
movf RCREG,W ; guarda dato recibido en W
movwf dato_serie
call ACTIVADA
goto comprueba1
;---------------------------------------------------
msg_desactiva
goto DESACTIVADA ; salto incondicional a “DESACTIVADA”
;-------------------------------------------------
ACTIVADA
movlw '#'
call TX_DATO
movlw 'X'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '1'
call TX_DATO
return
;-------------------------------------------------
DESACTIVADA
movlw '#'
call TX_DATO
movlw 'Y'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
movlw '0'
call TX_DATO
call compara
call recibeRS232
;---------------------------------------------
;Subrutinas de la chicharra (buzzer)
;---------------------------------------------
buzzer1
bsf PORTB,7
call sg1
bcf PORTB,7
return
buzzer2
bsf PORTB,7
call sg1
bcf PORTB,7
call sg1
bsf PORTB,7
call sg1
bcf PORTB,7
return
buzzer120
bsf PORTB,7
call sg120
bcf PORTB,7
return
;---------------------------------
;Subrutinas de retardos.
;---------------------------------
sg1
movlw 0ffh
movwf 0ch
movlw 0ffh
movwf 0dh
movlw 05h
movwf 0eh
repite
decfsz 0ch,1
goto repite
decfsz 0dh,1
goto repite
decfsz 0eh,1
goto repite
return
;---------------------------------------
sg2
movlw .10
movwf count1
lazo1
movlw .75
movwf count2
lazo2
movlw .75
movwf count3
repite2
btfsc PIR1,RCIF
call ACTIV_DESAC
nop
decfsz count3
goto repite2
decfsz count2
goto lazo2
decfsz count1
goto lazo1
return
;------------------------------------------
;Retardo de 60 segundos.
;Incrementaremos un registro, 10h, cargado
;con el nº C3h hasta llegar a 00h (60 veces)
;-------------------------------------------
sg60
movlw 0c3h
movwf 10h
call sg1
incfsz 10h,1
return
;--------------------------------------------
;Retardo de 120 segundos.
;Incrementaremos un registro, 10h, cargado
;con el nº C3h hasta llegar a 00h (120 veces)
;-------------------------------------------
sg120
movlw 0dfh
movwf 10h
otro120
call sg2
incfsz 10h,1
goto otro120
return
;------------------------------------------
;Resetea alarma
;------------------------------------------
compara
bcf PORTB,7
btfsc PORTB,7
goto compara
return
end
LEONARDO_59