Portal    Foro    Talleres    Buscar    FAQ    Registrarse    Conectarse
Publicar Nuevo Tema  Responder al Tema Página 3 de 5
Ir a la Página Anterior  1, 2, 3, 4, 5  Siguiente
PIC16F877A
Autor Mensaje
Responder Citando  
Mensaje Re: PIC16F877A 
 
Bueno,

Cita:
; Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal
; de cuarzo a 4 MHz. Como cada ciclo máquina son 4 ciclos de reloj, resulta que cada
; ciclo máquina tarda 4 x 1/4MHz = 1 µs.


ahí bien claro te indica que los retardos han sido obtenidos para trabajar con un cristal de 4MHz. Por lo tanto si deseas migrar a un 16F877 esta aplicación, tendrás que usar un cristal de 4MHz, caso contrario tienes que recalcular todos los retardos en base al nuevo valor del cristal que desees usar.

Suerte.
  




____________
Comparte el conocimiento !!!

Si lo oigo, lo olvido; Si lo veo, lo recuerdo; Si lo hago, lo entiendo.
Proverbio.


Just Burz
Diario del Ingeniebrio
Desconectado Ver perfil del usuario Enviar Mensaje Privado Visitar sitio Web del Usuario MSN Messenger Skype
Descargar Mensaje Volver arriba Página Inferior
AQUÍ PUEDE IR TU PUBLICIDAD
Responder Citando  
Mensaje Re: PIC16F877A 
 
bueno entonces, el programa a grabar en el pic sera el sguiente, y las librerias seran las adjuntas con la respectiva modificatoria de la libreria LCD_4BOT.INC

       LIST    P=16F877A
        INCLUDE<P16F877A.INC>

        CBLOCK 0X0C
        GuardaDato
        ENDC

        ORG        0
Inicio
        call     LCD_Inicializa
        call     RS232_Inicializa

Principal

        call     RS232_LeeDato
        movwf    GuardaDato
        call    LCD_Caracter

        movf    GuardaDato,W
        call     RS232_EnviaDato
        goto    Principal

        INCLUDE<RS232.INC>
        INCLUDE<LCD_4BIT.INC>
        INCLUDE<RETARDOS.INC>
        END



;***************************** 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
;    ===================================================================









;**************************** Librería "RETARDOS.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
;    ===================================================================
;
; Librería con múltiples subrutinas de retardos, desde 4 microsegundos hasta 20 segundos.
; Además se pueden implementar otras subrutinas muy fácilmente.
;
; Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal
; de cuarzo a 4 MHz. Como cada ciclo máquina son 4 ciclos de reloj, resulta que cada
; ciclo máquina tarda 4 x 1/4MHz = 1 µs.
;
; En los comentarios, "cm" significa "ciclos máquina".
;
; ZONA DE DATOS *********************************************************************

    CBLOCK
    R_ContA                        ; Contadores para los retardos.
    R_ContB
    R_ContC
    ENDC
;
; RETARDOS de 4 hasta 10 microsegundos ---------------------------------------------------
;
; A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4 MHZ,
; la llamada a subrutina "call" tarda 2 ciclos máquina, el retorno de subrutina
; "return" toma otros 2 ciclos máquina y cada instrucción "nop" tarda 1 ciclo máquina.
;
Retardo_10micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
Retardo_5micros                    ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
Retardo_4micros                    ; La llamada "call" aporta 2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.
;
; RETARDOS de 20 hasta 500 microsegundos ------------------------------------------------
;
Retardo_500micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    movlw    d'164'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_200micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    movlw    d'64'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_100micros                ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'31'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_50micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    movlw    d'14'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_20micros                ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'5'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
;
; El próximo bloque "RetardoMicros" tarda:
; 1 + (K-1) + 2 + (K-1)x2 + 2 = (2 + 3K) ciclos máquina.
;
RetardoMicros
    movwf    R_ContA                ; Aporta 1 ciclo máquina.
Rmicros_Bucle
    decfsz    R_ContA,F            ; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar).
    goto    Rmicros_Bucle        ; Aporta (K-1)x2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_500micros:    2 + 1 + 1 + 2 + (2 + 3K) = 500 cm = 500 µs. (para K=164 y 4 MHz).
; - Retardo_200micros:    2 + 1 + 1 + 2 + (2 + 3K) = 200 cm = 200 µs. (para K= 64 y 4 MHz).
; - Retardo_100micros:    2     + 1 + 2 + (2 + 3K) = 100 cm = 100 µs. (para K= 31 y 4 MHz).
; - Retardo_50micros :    2 + 1 + 1 + 2 + (2 + 3K) =  50 cm =  50 µs. (para K= 14 y 4 MHz).
; - Retardo_20micros :    2     + 1     + (2 + 3K) =  20 cm =  20 µs. (para K=  5 y 4 MHz).
;
; RETARDOS de 1 ms hasta 200 ms. --------------------------------------------------------
;
Retardo_200ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'200'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_100ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'100'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_50ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'50'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_20ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'20'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_10ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'10'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_5ms                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'5'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_2ms                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'2'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_1ms                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'1'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
;
; El próximo bloque "Retardos_ms" tarda:
; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =
; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina
; que a 4 MHz son 1002 µs = 1 ms.
;
Retardos_ms
    movwf    R_ContB                ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
    movlw    d'249'                ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
    movwf    R_ContA                ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
    nop                            ; Aporta KxMx1 ciclos máquina.
    decfsz    R_ContA,F            ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
    goto    R1ms_BucleInterno    ; Aporta (K-1)xMx2 ciclos máquina.
    decfsz    R_ContB,F            ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
    goto    R1ms_BucleExterno     ; Aporta (M-1)x2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_200ms:    2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).
; - Retardo_100ms:    2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).
; - Retardo_50ms :    2 + 1 + 2 + (2 + 4M + 4KM) =  50007 cm =  50 ms. (M= 50 y K=249).
; - Retardo_20ms :    2 + 1 + 2 + (2 + 4M + 4KM) =  20007 cm =  20 ms. (M= 20 y K=249).
; - Retardo_10ms :    2 + 1 + 2 + (2 + 4M + 4KM) =  10007 cm =  10 ms. (M= 10 y K=249).
; - Retardo_5ms  :    2 + 1 + 2 + (2 + 4M + 4KM) =   5007 cm =   5 ms. (M=  5 y K=249).
; - Retardo_2ms  :    2 + 1 + 2 + (2 + 4M + 4KM) =   2007 cm =   2 ms. (M=  2 y K=249).
; - Retardo_1ms  :    2 + 1     + (2 + 4M + 4KM) =   1005 cm =   1 ms. (M=  1 y K=249).
;
; RETARDOS de 0.5 hasta 20 segundos ---------------------------------------------------
;
Retardo_20s                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'200'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
    goto    Retardo_1Decima        ; Aporta 2 ciclos máquina.
Retardo_10s                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'100'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
    goto    Retardo_1Decima        ; Aporta 2 ciclos máquina.
Retardo_5s                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'50'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
    goto    Retardo_1Decima        ; Aporta 2 ciclos máquina.
Retardo_2s                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'20'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
    goto    Retardo_1Decima        ; Aporta 2 ciclos máquina.
Retardo_1s                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'10'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
    goto    Retardo_1Decima        ; Aporta 2 ciclos máquina.
Retardo_500ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'5'                ; Aporta 1 ciclo máquina. Este es el valor de "N".
;
; El próximo bloque "Retardo_1Decima" tarda:
; 1 + N + N + MxN + MxN + KxMxN + (K-1)xMxN + MxNx2 + (K-1)xMxNx2 +
;   + (M-1)xN + Nx2 + (M-1)xNx2 + (N-1) + 2 + (N-1)x2 + 2 =
; = (2 + 4M + 4MN + 4KM) ciclos máquina. Para K=249, M=100 y N=1 supone 100011
; ciclos máquina que a 4 MHz son 100011 µs = 100 ms = 0,1 s = 1 décima de segundo.
;
Retardo_1Decima
    movwf    R_ContC                ; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
    movlw    d'100'                ; Aporta Nx1 ciclos máquina. Este es el valor de "M".
    movwf    R_ContB                ; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
    movlw    d'249'                ; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
    movwf    R_ContA                ; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno          
    nop                            ; Aporta KxMxNx1 ciclos máquina.
    decfsz    R_ContA,F            ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
    goto    R1Decima_BucleInterno    ; Aporta (K-1)xMxNx2 ciclos máquina.
    decfsz    R_ContB,F            ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
    goto    R1Decima_BucleExterno    ; Aporta (M-1)xNx2 ciclos máquina.
    decfsz    R_ContC,F            ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
    goto    R1Decima_BucleExterno2    ; Aporta (N-1)x2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_20s:    2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 cm = 20 s.
;            (N=200, M=100 y K=249).
; - Retardo_10s:    2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 cm = 10 s.
;            (N=100, M=100 y K=249).
; - Retardo_5s:        2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  5000207 cm =  5 s.
;            (N= 50, M=100 y K=249).
; - Retardo_2s:        2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  2000087 cm =  2 s.
;            (N= 20, M=100 y K=249).
; - Retardo_1s:        2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  1000047 cm =  1 s.
;            (N= 10, M=100 y K=249).
; - Retardo_500ms:    2 + 1     + (2 + 4N + 4MN + 4KMN) =   500025 cm = 0,5 s.
;            (N=  5, M=100 y K=249).

;    ===================================================================
;      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
;    ===================================================================



Última edición por nbmk el 20 Nov 2007 16:34; editado 1 vez 




Desconectado Ver perfil del usuario Enviar Mensaje Privado
Descargar Mensaje Volver arriba Página Inferior
Responder Citando  
Mensaje Re: PIC16F877A 
 
hola aqi sta lo q hice =)
. la modificacion del los puertos,

;**************************** Librería "LCD_4BIT.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 un módulo LCD de 2
; líneas por 16 caracteres, compatible con el modelo LM016L.
;
; El visualizador LCD está conectado al Puerto B del PIC mediante un bus de 4 bits. Las
; conexiones son:
; -    Las 4 líneas superiores del módulo LCD, pines <DB7:DB4>  se conectan a las 4
;    líneas superiores del Puerto B del PIC, pines <RB7:RB4>.
; -    Pin RS del LCD a la línea RA0 del PIC.
; -    Pin R/W del LCD a la línea RA1 del PIC, o a masa.
; -    Pin Enable del LCD a la línea RA2 del PIC.
;
; Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la librería
; RETARDOS.INC.
;
; ZONA DE DATOS *********************************************************************

    CBLOCK
    LCD_Dato
    LCD_GuardaDato
    LCD_GuardaTRISD
    LCD_Auxiliar1
    LCD_Auxiliar2
    ENDC

LCD_CaracteresPorLinea    EQU    .16            ; Número de caracteres por línea de la pantalla.

#DEFINE  LCD_PinRS    PORTB,0
#DEFINE  LCD_PinRW    PORTB,1
#DEFINE  LCD_PinEnable    PORTB,2
#DEFINE  LCD_BusDatos    PORTD

; Subrutina "LCD_Inicializa" ------------------------------------------------------------
;
; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software,
; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la
; configuración inicial hay que hacerla como sigue:
;
LCD_Inicializa
    bsf        STATUS,RP0                ; Configura las líneas conectadas al pines RS,
    bcf        LCD_PinRS                ; R/W y E.
    bcf        LCD_PinEnable
    bcf        LCD_PinRW
    bcf        STATUS,RP0
    bcf        LCD_PinRW                ; En caso de que esté conectado le indica
                                    ; que se va a escribir en el LCD.
    bcf        LCD_PinEnable            ; Impide funcionamiento del LCD poniendo E=0.
    bcf     LCD_PinRS                ; Activa el Modo Comando poniendo RS=0.
    call    Retardo_20ms
    movlw    b'00110000'    
    call    LCD_EscribeLCD            ; Escribe el dato en el LCD.
    call    Retardo_5ms    
    movlw    b'00110000'    
    call    LCD_EscribeLCD
    call    Retardo_200micros
    movlw    b'00110000'    
    call    LCD_EscribeLCD
    call    Retardo_20micros        ; Este retardo es necesario para simular en PROTEUS.
    movlw    b'00100000'                ; Interface de 4 bits.
    call    LCD_EscribeLCD
    call    Retardo_20micros        ; Este retardo es necesario para simular en PROTEUS.
    
; Ahora configura el resto de los parámetros:

    call    LCD_2Lineas4Bits5x7        ; LCD de 2 líneas y caracteres de 5x7 puntos.
    call    LCD_Borra                ; Pantalla encendida y limpia. Cursor al principio
    call    LCD_CursorOFF            ; de la línea 1. Cursor apagado.
    call    LCD_CursorIncr            ; Cursor en modo incrementar.
    return

; Subrutina "LCD_EscribeLCD" -----------------------------------------------------------
;
; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin
; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que
; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se
; vuelve a enviar este dato sin cambiarlo.

LCD_EscribeLCD
    andlw    b'11110000'                ; Se queda con el nibble alto del dato que es el
    movwf    LCD_Dato                ; que hay que enviar y lo guarda.
    movf    LCD_BusDatos,W            ; Lee la información actual de la parte baja
    andlw    b'00001111'                ; del Puerto B, que no se debe alterar.
    iorwf    LCD_Dato,F                ; Enviará la parte alta del dato de entrada
                                    ; y en la parte baja lo que había antes.
    bsf        STATUS,RP0                ; Acceso al Banco 1.
    movf    TRISD,W                    ; Guarda la configuración que tenía antes TRISB.
    movwf    LCD_GuardaTRISD
    movlw    b'00001111'                ; Las 4 líneas inferiores del Puerto B se dejan
    andwf    PORTD,F                    ; como estaban y las 4 superiores como salida.
    bcf        STATUS,RP0                ; Acceso al Banco 0.
;
    movf    LCD_Dato,W                ; Recupera el dato a enviar.
    movwf    LCD_BusDatos            ; Envía el dato al módulo LCD.
    bsf        LCD_PinEnable            ; Permite funcionamiento del LCD mediante un pequeño
    bcf        LCD_PinEnable            ; pulso y termina impidiendo el funcionamiento del LCD.
    bsf        STATUS,RP0                ; Acceso al Banco 1. Restaura el antiguo valor en
    movf    LCD_GuardaTRISD,W        ; la configuración del Puerto B.
    movwf    TRISD
    bcf        STATUS,RP0                ; Acceso al Banco 0.
    return

; Subrutinas variadas para el control del módulo LCD -----------------------------------------
;
;Los comandos que pueden ser ejecutados son:
;
LCD_CursorIncr                        ; Cursor en modo incrementar.
    movlw    b'00000110'
    goto    LCD_EnviaComando
LCD_Linea1                            ; Cursor al principio de la Línea 1.
    movlw    b'10000000'                ; Dirección 00h de la DDRAM
    goto    LCD_EnviaComando
LCD_Linea2                            ; Cursor al principio de la Línea 2.
    movlw    b'11000000'                ; Dirección 40h de la DDRAM
    goto    LCD_EnviaComando
LCD_Linea3                            ; Cursor al principio de la Línea 3
    movlw    b'10010100'                ; Dirección 14h de la DDRAM
    goto    LCD_EnviaComando
LCD_Linea4                            ; Cursor al principio de la Línea 4
    movlw    b'11010100'                ; Dirección 54h de la DDRAM
    goto    LCD_EnviaComando
LCD_PosicionLinea1                    ; Cursor a posición de la Línea 1, a partir de la
    iorlw    b'10000000'                ; dirección 00h de la DDRAM más el valor del
    goto    LCD_EnviaComando        ; registro W.
LCD_PosicionLinea2                    ; Cursor a posición de la Línea 2, a partir de la
    iorlw    b'11000000'                ; dirección 40h de la DDRAM más el valor del
    goto    LCD_EnviaComando        ; registro W.
LCD_OFF                                ; Pantalla apagada.
    movlw    b'00001000'
    goto    LCD_EnviaComando
LCD_CursorON                        ; Pantalla encendida y cursor encendido.
    movlw    b'00001110'
    goto    LCD_EnviaComando
LCD_CursorOFF                        ; Pantalla encendida y cursor apagado.
    movlw    b'00001100'
    goto    LCD_EnviaComando
LCD_Borra                            ; Borra toda la pantalla, memoria DDRAM y pone el
    movlw    b'00000001'                ; cursor a principio de la línea 1.
    goto    LCD_EnviaComando
LCD_2Lineas4Bits5x7                    ; Define la pantalla de 2 líneas, con caracteres
    movlw    b'00101000'                ; de 5x7 puntos y conexión al PIC mediante bus de
;    goto    LCD_EnviaComando        ; 4 bits.

; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ------------------------------------
;
; "LCD_EnviaComando". Escribe un comando en el registro del módulo LCD. La palabra de
; comando ha sido entregada a través del registro W.  Trabaja en Modo Comando.
; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carácter ASCII introducido a
; a través del registro W. Trabaja en Modo Dato.
;
LCD_EnviaComando
    bcf        LCD_PinRS                ; Activa el Modo Comando, poniendo RS=0.
    goto    LCD_Envia
LCD_Caracter
    bsf        LCD_PinRS                ; Activa el "Modo Dato", poniendo RS=1.
    call    LCD_CodigoCGROM            ; Obtiene el código para correcta visualización.
LCD_Envia
    movwf    LCD_GuardaDato            ; Guarda el dato a enviar.
    call    LCD_EscribeLCD            ; Primero envía el nibble alto.
    swapf    LCD_GuardaDato,W        ; Ahora envía el nibble bajo. Para ello pasa el
                                    ; nibble bajo del dato a enviar a parte alta del byte.
    call    LCD_EscribeLCD            ; Se envía al visualizador LCD.
    btfss    LCD_PinRS                ; Debe garantizar una correcta escritura manteniendo
    call    Retardo_2ms                ; 2 ms en modo comando y 50 µs en modo cáracter.
    call    Retardo_50micros
    return    

; Subrutina "LCD_CodigoCGROM" -----------------------------------------------------------
;
; A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la
; tabla CGROM del LM016L no coinciden con los códigos ASCII. Así por ejemplo, el código
; ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh.
;
; Esta subrutina convierte los códigos ASCII de la "Ñ", "º" y otros, a códigos CGROM para que
; que puedan ser visualizado en el módulo LM016L.
;
; Entrada:    En (W) el código ASCII del carácter que se desea visualizar.
; Salida:    En (W) el código definido en la tabla CGROM.

LCD_CodigoCGROM
    movwf    LCD_Dato                ; Guarda el valor del carácter y comprueba si es
LCD_EnheMinuscula                    ; un carácter especial.
    sublw    'ñ'                     ; ¿Es la "ñ"?
    btfss    STATUS,Z
    goto    LCD_EnheMayuscula        ; No es "ñ".
    movlw    b'11101110'                ; Código CGROM de la "ñ".
    movwf    LCD_Dato
    goto    LCD_FinCGROM
LCD_EnheMayuscula
    movf    LCD_Dato,W                ; Recupera el código ASCII de entrada.
    sublw    'Ñ'                     ; ¿Es la "Ñ"?
    btfss    STATUS,Z
    goto    LCD_Grado                ; No es "Ñ".
    movlw    b'11101110'                ; Código CGROM de la "ñ". (No hay símbolo para
    movwf    LCD_Dato                ; la "Ñ" mayúscula en la CGROM).
    goto    LCD_FinCGROM    
LCD_Grado
    movf    LCD_Dato,W                ; Recupera el código ASCII de entrada.
    sublw    'º'                     ; ¿Es el símbolo "º"?
    btfss    STATUS,Z
    goto    LCD_FinCGROM            ; No es "º".
    movlw    b'11011111'                ; Código CGROM del símbolo "º".
    movwf    LCD_Dato
LCD_FinCGROM
    movf    LCD_Dato,W                ; En (W) el código buscado.
    return

; Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" --------------------------------
;
; Visualiza espacios en blanco.

LCD_LineaEnBlanco
    movlw    LCD_CaracteresPorLinea
    goto    LCD_EnviaBlancos
LCD_UnEspacioBlanco
    movlw    .1
    goto    LCD_EnviaBlancos
LCD_DosEspaciosBlancos
    movlw    .2
    goto    LCD_EnviaBlancos
LCD_TresEspaciosBlancos
    movlw    .3
LCD_EnviaBlancos
    movwf    LCD_Auxiliar1            ; (LCD_Auxiliar1) se utiliza como contador.
LCD_EnviaOtroBlanco    
    movlw    ' '                        ; Esto es un espacio en blanco.
    call    LCD_Caracter            ; Visualiza tanto espacios en blanco como se
    decfsz    LCD_Auxiliar1,F            ; haya cargado en (LCD_Auxiliar1).
    goto    LCD_EnviaOtroBlanco
    return

; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" --------------------------------------------
;
; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el
; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE".
;
; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero
; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' visualiza "AE"
; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante).
;
; Utilizan la subrutina "LCD_Nibble" que se analiza más adelante.
;
LCD_Byte
    movwf    LCD_Auxiliar2            ; Guarda el valor de entrada.
    andlw    b'11110000'                ; Analiza si el nibble alto es cero.
    btfss    STATUS,Z                ; Si es cero lo apaga.
    goto    LCD_VisualizaAlto        ; No es cero y lo visualiza.
    movlw    ' '                        ; Visualiza un espacio en blanco.
    call    LCD_Caracter
    goto    LCD_VisualizaBajo

LCD_ByteCompleto
    movwf    LCD_Auxiliar2            ; Guarda el valor de entrada.
LCD_VisualizaAlto
    swapf    LCD_Auxiliar2,W            ; Pone el nibble alto en la parte baja.
    call    LCD_Nibble                ; Lo visualiza.
LCD_VisualizaBajo
    movf    LCD_Auxiliar2,W            ; Repite el proceso con el nibble bajo.
;    call    LCD_Nibble                ; Lo visualiza.
;    return

; Subrutina "LCD_Nibble" ----------------------------------------------------------------
;
; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble
; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos:
; - Si (W)=b'01010110', se visualizará "6".
; - Si (W)=b'10101110', se visualizará "E".
;
LCD_Nibble
    andlw    b'00001111'                ; Se queda con la parte baja.
    movwf    LCD_Auxiliar1            ; Lo guarda.
    sublw    0x09                    ; Comprueba si hay que representarlo con letra.
    btfss    STATUS,C    
    goto    LCD_EnviaByteLetra
    movf    LCD_Auxiliar1,W
    addlw    '0'                        ; El número se pasa a carácter ASCII sumándole
    goto     LCD_FinVisualizaDigito    ; el ASCII del cero y lo visualiza.
LCD_EnviaByteLetra
    movf    LCD_Auxiliar1,W
    addlw    'A'-0x0A                ; Sí, por tanto, se le suma el ASCII de la 'A'.
LCD_FinVisualizaDigito
    goto    LCD_Caracter            ; Y visualiza el carácter. Se hace con un "goto"
                                    ; para no sobrecargar la pila.
                        
;    ===================================================================
;      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
;    ===================================================================

  



Desconectado Ver perfil del usuario Enviar Mensaje Privado
Descargar Mensaje Volver arriba Página Inferior
Responder Citando  
Mensaje Re: PIC16F877A 
 
Burzredion Escribió: [Ver Mensaje]
Pues si,

pues dichas librerías usan las líneas del puerto A y B, no está difícil modificar eso, en tu caso lo tienes que hacer, te recomiendo que cambies las líneas que hacen mención al puerto B (PORTB y TRISB) por las del puerto D del 16F877 y las que hacen mención al puerto A (PORTA y TRISA) por las del puerto B. Lo otro que tienes que revisar, es la librería RETARDO, ya que hace llamado a unos retardos los cuales no aparecen en las librerías LCD, y verificar si dichos retardos están diseñados para trabajar a la velocidad de tu cristal. Manda las librerías de Retardo en todo caso para hecharles un ojo, luego las publico todas juntas.

Jorge.


Hola jorge,

bueno qeria preguntarte xq la modificatoria de eso de los puertos ?


gracias
  



Desconectado Ver perfil del usuario Enviar Mensaje Privado
Descargar Mensaje Volver arriba Página Inferior
Responder Citando  
Mensaje Re: PIC16F877A 
 
Hola,

por cierto feliz cumpleaños.

bueno, el cambio te lo decía porque el puerto A del 16F877A después de un Reset está automáticamente configurado como Entradas Analógicas, así que tendrías que agregar líneas de código para modificarlo. El puerto B pues puede quedar en B y usar solo el puerto B, o solo el D que son los que más se usan en el 16F877A para I/O.

A ver si haces la prueba y nos avisas como te fue...  Cool
  




____________
Comparte el conocimiento !!!

Si lo oigo, lo olvido; Si lo veo, lo recuerdo; Si lo hago, lo entiendo.
Proverbio.


Just Burz
Diario del Ingeniebrio
Desconectado Ver perfil del usuario Enviar Mensaje Privado Visitar sitio Web del Usuario MSN Messenger Skype
Descargar Mensaje Volver arriba Página Inferior
Responder Citando  
Mensaje Re: PIC16F877A 
 
Holas, super el tutorial, Very Happy  me esta ayudando mucho, pero continuenlo q esta muy interesante, solo una pregunta, ¿Cual es la difrencia entre un 16F877A y un 16F877 ? ayudenme por fa que necesito saber
  



Desconectado Ver perfil del usuario Enviar Mensaje Privado
Descargar Mensaje Volver arriba Página Inferior
Responder Citando  
Mensaje Re: PIC16F877A 
 
deshired Escribió: [Ver Mensaje]
Holas, super el tutorial, Very Happy  me esta ayudando mucho, pero continuenlo q esta muy interesante, solo una pregunta, ¿Cual es la difrencia entre un 16F877A y un 16F877 ? ayudenme por fa que necesito saber


hola deshired , mm bueno habria q ver los datasheet de ambos microcontroladores pic y ver las diferencias entre el 16ff87 y el 16f87a  =)

bueno, mm en cuanto a lo de mi proyecto debo comunicarles q si me salio   wink   ojo, pero con el 16f84 jeje,

mm bueno a continuacion les envio todos los pasos a seguir para quien quiere hacer este proyecto  Smile

salu2,  Razz
  



Desconectado Ver perfil del usuario Enviar Mensaje Privado
Descargar Mensaje Volver arriba Página Inferior
Responder Citando  
Mensaje Re: PIC16F877A 
 
mm bueno, el programa principal seria el sgte. con el mplab lo abren y lo graban en el pic con las respectivas librerias que stan ajuntas

;zONA DE DATOS*********************


    LIST    P=16F84A
    INCLUDE <P16F84A.INC>

    CBLOCK0x0C
    GuardaDato
    ENDC


;ZONA DE CODIGOS********************

    ORG    0
Inicio
    call    LCD_Inicializa        ;inicializa el lcd y las lineas que se van a usar
    call    RS232_Inicializa        ;CON LA COMUNICACION CON EL PUERTO RS232
Principal
    call    RS232_LeeDato        ;espera recibir un caracter
    movwf    GuardaDato        ;guarda el dato recibido
    call    LCD_Caracter        ;lo visualiza
    movf    GuardaDato,W        ;y ahora lo reenvia otra vez al ordenador
    call    RS232_EnviaDato    
    goto    Principal            ;repite el proceso

    INCLUDE <RS232.INC>
    INCLUDE <LCD_4BIT.INC>
    INCLUDE <RETARDOS.INC>
    END



mm bueno despues tienen q hacer el diagrama circuital para quemar la placa. tbn adjunto la figura, mm y listo, mm a bueno la alimentacion de los componentes es de 5 voltios =)
  



Desconectado Ver perfil del usuario Enviar Mensaje Privado
Descargar Mensaje Volver arriba Página Inferior
Responder Citando  
Mensaje Re: PIC16F877A 
 
necesito enlasar el codigo del lcd, con un teclado PS/2;  encontyre codigo para el teclado, pero no es seguro, por favor si tienes algo que me pueda servir tambien estoy tarabajando para el  pic18f77a...
Asi tambie nesesito saber la manera de enlasar los codigos del Lcd y del teclado para poder escribir por medio del teclado y desplegaralo en el mencionado lcd

saludos Mr. Green
  



Desconectado Ver perfil del usuario Enviar Mensaje Privado
Descargar Mensaje Volver arriba Página Inferior
Responder Citando  
Mensaje Re: PIC16F877A 
 
Hola me pare muy bueno el tutorial y me ayudo mucho, pero ahora estoy tratando de hacer funcionar las entradas análogas del puerto a estuve investigando como configurarlas pero tengo confusión, me podrías ayudar???? y  además quería que se visualice el valor en un lcd pero ahí está el otro problema que no sé como por fa ayúdame a entender estas partes o un ejemplo.....
O tal vez alguien que tenga algo parecido ….es un programa que visualice en un lcd una entrada análoga que podría ser un potenciómetro… yo estaba usando la señal que me da un  lm35 acoplado un amplificador operación para llevarla hasta el pic… pero con el potenciómetro me conformo
  



Desconectado Ver perfil del usuario Enviar Mensaje Privado
Descargar Mensaje Volver arriba Página Inferior
Mostrar mensajes anteriores:
Resumen de Valoraciones:
Media de Valoración Valoración Mínima Valoración Máxima Número de Valoraciones
5.96 1 10 27
Ver Información Detallada
Elegir Valoración: 
Publicar Nuevo Tema  Responder al Tema   Página 3 de 5
Ir a la Página Anterior  1, 2, 3, 4, 5  Siguiente

Usuarios navegando en este Tema: 0 Registrados, 0 Ocultos y 0 Invitados
Usuarios Registrados conectados: Ninguno


 
Lista de Permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No Puede descargar archivos
Puede enviar eventos al Calendario