Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
buenas a todos, alguien podria decirme como recibir una cadena de caracteres por rs 232 para luego analizarla?
Gracias
;***************************** Librería "RS232.INC" *************************************
;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Estas subrutinas permiten realizar las tareas básicas de control de la transmisión
; seríe asincrona según normas RS-232.
;
; Los parámetros adoptados para la comunicación son los siguientes:
; - Velocidad de transmisión de 9600 baudios. La duración de cada bit será 104 µs.
; - Un bit de inicio o Start a nivel bajo.
; - Dato de 8 bits.
; - Sin paridad.
; - Dos bits de final o Stop a nivel alto.
;
; El tiempo entre bit y bit debe coincidir con el periodo de la señal leída o enviada.
; Como la velocidad de transmisión o recepción es de 9600 baudios, el periodo será:
; 1/9600 Baudios = 104 µs. Se utilizará pues la subrutina Retardos_100micros.
CBLOCK
RS232_ContadorBits
RS232_Dato
ENDC
#DEFINE RS232_Entrada PORTA,4 ; Línea por la que se reciben los datos.
#DEFINE RS232_Salida PORTA,3 ; Línea por la que se envían los datos.
;
; Subrutina "RS232_Inicializa" -------------------------------------------------------------
;
; Configura las líneas de salida y entrada del microcontrolador.
RS232_Inicializa
bsf RS232_Salida ; Al principio salida en alto para resposo.
bsf STATUS,RP0
bsf RS232_Entrada ; Esta línea se configura como entrada.
bcf RS232_Salida ; Esta línea se configura como salida.
bcf STATUS,RP0
return
; Subrutina "RS232_LeeDato" -------------------------------------------------------------
;
; El microcontrolador lee el dato por la línea de entrada comenzando por el bit de menor
; peso. El dato leído se envía finalmente en el registro de trabajo W.
;
; El ordenador parte siempre de un nivel alto, que es el estado que tiene cuando no
; envía información. La secuencia utilizada es:
; 1º Espera que se ejecute el pulso negativo del bit Start o flanco de bajada.
; 2º Deja pasar un tiempo una y media veces mayor que el periodo de transmisión para
; saltarse el bit de Start y lee el primer bit en su mitad.
; 3º Lee el resto de los bits de datos, esperando un tiempo igual a la duración del
; período entre lectura y lectura para testearlos en mitad del bit.
;
; Salida: En el registro de trabajo W el byte leído.
RS232_LeeDato
movlw d'8' ; Número de bits a recibir.
movwf RS232_ContadorBits
RS232_EsperaBitStart
btfsc RS232_Entrada ; Lee la entrada y espera a que sea "0".
goto RS232_EsperaBitStart ; No, pues espera el nivel bajo.
call Retardo_100micros ; El primer bit debe leerlo un tiempo igual a una
call Retardo_50micros ; vez y media el periodo de transmisión.
RS232_LeeBit
bcf STATUS,C ; Ahora lee el pin. En principio supone que es 0.
btfsc RS232_Entrada ; ¿Realmente es cero?
bsf STATUS,C ; No, pues cambia a "1".
rrf RS232_Dato,F ; Introduce el bit en el registro de lectura.
call Retardo_100micros ; Los siguientes bits los lee un periodo más tarde.
decfsz RS232_ContadorBits,F ; Comprueba que es el último bit.
goto RS232_LeeBit ; Si no es el último bit pasa a leer el siguiente.
call Retardo_200micros ; Espera un tiempo igual al los 2 bits de Stop.
movf RS232_Dato,W ; El resultado en el registro W.
return
; Subrutinas "RS232_EnviaDato" y "RS232_EnviaNúmero" -------------------------------------
;
; El microcontrolador envía un dato por la línea de salida comenzando por el bit de menor
; peso. En dato enviado será el que le llegue a través del registro de trabajo W.
; 1º. Envía un "0" durante un tiempo igual al periodo de la velocidad de transmisión.
; Este es el bit de "Start".
; 2º. Envía el bit correspondiente:
; - Si va a enviar un "0" permanece en bajo durante el periodo correspondiente.
; - Si va a escribir un "1" permanece en alto durante el periodo correspondiente.
; 3º. Envía dos bits "1" durante un tiempo igual al período de la velocidad de
; transmisión cada uno. Estos son los dos bits de Stop.
;
; Entrada: En (W) el dato a enviar.
RS232_EnviaNumero ; Envía el código ASCII de un número.
addlw '0' ; Lo pasa a código ASCII sumándole el ASCII del 0.
RS232_EnviaDato
movwf RS232_Dato ; Guarda el contenido del byte a transmitir.
movlw d'8' ; Este es el número de bits a transmitir.
movwf RS232_ContadorBits
bcf RS232_Salida ; Bit de Start.
call Retardo_100micros
RS232_EnviaBit ; Comienza a enviar datos.
rrf RS232_Dato,F ; Lleva el bit que se quiere enviar al Carry para
btfss STATUS,C ; deducir su valor. ¿Es un "1" el bit a transmitir?
goto RS232_EnviaCero ; No, pues envía un "0".
RS232_EnviaUno
bsf RS232_Salida ; Transmite un "1".
goto RS232_FinEnviaBit
RS232_EnviaCero
bcf RS232_Salida ; Transmite un "0".
RS232_FinEnviaBit
call Retardo_100micros ; Este es el tiempo que estará en alto o bajo.
decfsz RS232_ContadorBits,F ; Comprueba que es el último bit.
goto RS232_EnviaBit ; Como no es el último bit repite la operación.
bsf RS232_Salida ; Envía dos bits de Stop.
call Retardo_200micros
return
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
Hola, tengo una duda... Puedo manejar el registro W como si fuera otro registro mas de la ram? y asi poder ejecutar insctrucciones con él? Por ejemplo...
COMF W,W; Complementa W y lo guarda en W
LIST P=16F84A
INCLUDE <P16F84A.INC>
CBLOCK 0x0C
REGISTRO50ms
ENDC
TMR0_CARGA50ms EQU d'256'-d'195'
CARGA_1S EQU d'20'
ORG 0
GOTO INICIO
ORG 4
GOTO TIMER0_INTERRUPCION
INICIO
BSF STATUS,5
CLRF TRISB
;MOVLW b'00000001'
;MOVWF TRISA
MOVLW b'00000111'
MOVWF OPTION_REG
BCF STATUS,5
MOVLW TMR0_CARGA50ms
MOVWF TMR0
MOVLW CARGA_1S
MOVWF REGISTRO50ms
MOVLW b'10100000'
MOVWF INTCON
PRINCIPAL
GOTO $
;SUBRUTINA "TIMER0_INTERRUPCION"
TIMER0_INTERRUPCION
BSF STATUS,C
MOVLW TMR0_CARGA50ms
MOVWF TMR0
DECFSZ REGISTRO50ms,F
GOTO FININTERRUPCION
RLF PORTB,F
GOTO TIMER0_INTERRUPCION
FININTERRUPCION
BCF INTCON,TOIF
RETFIE
Hola soy nuevo en el foro, pero tengo que agradecerles que este tutorial me ha servido de mucho, pero hay una duda que no he podido resolver y espero que me ayuden y es sobre las instrucciones sublw y subwf y como afectan el flag DC ya que no entiendo exactamente que hace el programa para activar y desactivar este flag. Por ejemplo: cuando resto 0xF - 0xF= 0 la bandera se activa, pero cuando hago 0x10-0x10=0 no se activa y no entiendo por que. Gracias por anticipado