You are on page 1of 26

Microcontrolador :: PIC16F877A Portal Foro Talleres Buscar FAQ Registrarse Conectarse Portal Foro Taller Microcontrolador PIC16F877A Fecha

echa y hora actual: Noviembre 01 2011, 14:16 Pgina 3 de 5 Ir a la Pgina Anterior 1, 2, 3, 4, 5 Siguiente PIC16F877A AutorMensaje Jorge Valerio Site Admin

Registrado: Junio 2006 Mensajes: 644 Edad: 34 Ubicacin: Lima-Per Nombre Real: Jorge Valerio

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 mquina son 4 ciclos de reloj, resulta que cada ; ciclo mquina 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 aplicacin, tendrs 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 #21 20 Nov 2007 09:50

Sponsor AQU PUEDE IR TU PUBLICIDAD nbmk Es un Bender Registrado: Noviembre 2007 Mensajes: 9 Edad: 24 Nombre Real: carlos sotomayor

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 Cdigo: [Descargar] [Ocultar] [Seleccionar] Cdigo: [Descargar] [Mostrar] LIST P=16F877A INCLUDE<P16F877A.INC> CBLOCK 0X0C GuardaDato ENDC ORG Inicio call call Principal call movwf call movf call goto RS232_LeeDato GuardaDato LCD_Caracter GuardaDato,W RS232_EnviaDato Principal LCD_Inicializa RS232_Inicializa 0

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

Cdigo: [Descargar] [Ocultar] [Seleccionar] Cdigo: [Descargar] [Mostrar] ;***************************** Librera "RS232.INC"

************************************* ; ; ============================================================== ===== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. Lpez. www.pic16f84a.com ; Editorial Ra-Ma. www.ra-ma.es ; ============================================================== ===== ; ; Estas subrutinas permiten realizar las tareas bsicas de control de la transmisin ; sere asincrona segn normas RS-232. ; ; Los parmetros adoptados para la comunicacin son los siguientes: ; - Velocidad de transmisin de 9600 baudios. La duracin 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 seal leda o enviada. ; Como la velocidad de transmisin o recepcin 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 ; Lnea por la que se reciben los datos. #DEFINE RS232_Salida PORTA,3 ; Lnea por la que se envan los datos. ; ; Subrutina "RS232_Inicializa" ------------------------------------------------------------; ; Configura las lneas de salida y entrada del microcontrolador. RS232_Inicializa bsf RS232_Salida en alto para resposo. bsf STATUS,RP0 bsf RS232_Entrada configura como entrada. bcf RS232_Salida configura como salida. ; Al principio salida ; Esta lnea se ; Esta lnea se

bcf STATUS,RP0 return ; Subrutina "RS232_LeeDato" ------------------------------------------------------------; ; El microcontrolador lee el dato por la lnea de entrada comenzando por el bit de menor ; peso. El dato ledo se enva finalmente en el registro de trabajo W. ; ; El ordenador parte siempre de un nivel alto, que es el estado que tiene cuando no ; enva informacin. 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 transmisin 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 duracin del ; perodo entre lectura y lectura para testearlos en mitad del bit. ; ; Salida: En el registro de trabajo W el byte ledo. RS232_LeeDato movlw d'8' recibir. movwf RS232_ContadorBits RS232_EsperaBitStart btfsc RS232_Entrada espera a que sea "0". goto RS232_EsperaBitStart bajo. call Retardo_100micros leerlo un tiempo igual a una call Retardo_50micros de transmisin. RS232_LeeBit bcf STATUS,C principio supone que es 0. btfsc RS232_Entrada bsf STATUS,C "1". rrf RS232_Dato,F el registro de lectura. call Retardo_100micros ; Nmero de bits a

; Lee la entrada y ; No, pues espera el nivel ; El primer bit debe ; vez y media el periodo

; Ahora lee el pin. En ; Realmente es cero? ; No, pues cambia a ; Introduce el bit en ; Los siguientes bits los

lee un periodo ms 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_EnviaNmero" ------------------------------------; ; El microcontrolador enva un dato por la lnea de salida comenzando por el bit de menor ; peso. En dato enviado ser el que le llegue a travs del registro de trabajo W. ; 1. Enva un "0" durante un tiempo igual al periodo de la velocidad de transmisin. ; Este es el bit de "Start". ; 2. Enva 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. Enva dos bits "1" durante un tiempo igual al perodo de la velocidad de ; transmisin cada uno. Estos son los dos bits de Stop. ; ; Entrada: En (W) el dato a enviar. ; Enva el cdigo ASCII ; Lo pasa a cdigo ; Guarda el contenido ; Este es el nmero de ; Bit de Start. ; Comienza a enviar ; Lleva el bit que se ; deducir su valor. Es ; No, pues enva un ; Transmite un "1". ; Transmite un "0". ; Este es el tiempo que ; Comprueba que es el ; Como no es el ltimo ; Enva dos bits de

RS232_EnviaNumero de un nmero. addlw '0' ASCII sumndole el ASCII del 0. RS232_EnviaDato movwf RS232_Dato del byte a transmitir. movlw d'8' bits a transmitir. movwf RS232_ContadorBits bcf RS232_Salida call Retardo_100micros RS232_EnviaBit datos. rrf RS232_Dato,F quiere enviar al Carry para btfss STATUS,C un "1" el bit a transmitir? goto RS232_EnviaCero "0". RS232_EnviaUno bsf RS232_Salida goto RS232_FinEnviaBit RS232_EnviaCero bcf RS232_Salida RS232_FinEnviaBit call Retardo_100micros estar en alto o bajo. decfsz RS232_ContadorBits,F ltimo bit. goto RS232_EnviaBit bit repite la operacin. bsf RS232_Salida Stop.

call Retardo_200micros return ; ============================================================== ===== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. Lpez. www.pic16f84a.com ; Editorial Ra-Ma. www.ra-ma.es ; ============================================================== =====

Cdigo: [Descargar] [Ocultar] [Seleccionar] Cdigo: [Descargar] [Mostrar] ;**************************** Librera "RETARDOS.INC" ********************************* ; ; ============================================================== ===== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. Lpez. www.pic16f84a.com ; Editorial Ra-Ma. www.ra-ma.es ; ============================================================== ===== ; ; Librera con mltiples subrutinas de retardos, desde 4 microsegundos hasta 20 segundos. ; Adems se pueden implementar otras subrutinas muy fcilmente. ; ; Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal ; de cuarzo a 4 MHz. Como cada ciclo mquina son 4 ciclos de reloj, resulta que cada ; ciclo mquina tarda 4 x 1/4MHz = 1 s. ; ; En los comentarios, "cm" significa "ciclos mquina". ; ; ZONA DE DATOS ************************************************************** *******

CBLOCK R_ContA ; Contadores para los retardos. R_ContB R_ContC ENDC ; ; RETARDOS de 4 hasta 10 microsegundos --------------------------------------------------; ; A continuacin retardos pequeos teniendo en cuenta que para una frecuencia de 4 MHZ, ; la llamada a subrutina "call" tarda 2 ciclos mquina, el retorno de subrutina ; "return" toma otros 2 ciclos mquina y cada instruccin "nop" tarda 1 ciclo mquina. ; Retardo_10micros ; La llamada "call" aporta 2 ciclos mquina. nop ; Aporta 1 ciclo mquina. nop ; Aporta 1 ciclo mquina. nop ; Aporta 1 ciclo mquina. nop ; Aporta 1 ciclo mquina. nop ; Aporta 1 ciclo mquina. Retardo_5micros ; La llamada "call" aporta 2 ciclos mquina. nop ; Aporta 1 ciclo mquina. Retardo_4micros ; La llamada "call" aporta 2 ciclos mquina. return ; El salto del retorno aporta 2 ciclos mquina. ; ; RETARDOS de 20 hasta 500 microsegundos -----------------------------------------------; Retardo_500micros ; La llamada "call" aporta 2 ciclos mquina. nop ; Aporta 1 ciclo mquina. movlw d'164' ; Aporta 1 ciclo mquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos mquina. Retardo_200micros ; La llamada "call" aporta 2 ciclos mquina. nop ; Aporta 1 ciclo mquina. movlw d'64' ; Aporta 1 ciclo mquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos mquina. Retardo_100micros ; La llamada "call" aporta 2 ciclos mquina. movlw d'31' ; Aporta 1 ciclo mquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos mquina. Retardo_50micros ; La llamada "call" aporta 2 ciclos mquina. nop ; Aporta 1 ciclo mquina. movlw d'14' ; Aporta 1 ciclo mquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos mquina.

Retardo_20micros ; La llamada "call" aporta 2 ciclos mquina. movlw d'5' ; Aporta 1 ciclo mquina. Este es el valor de "K". ; ; El prximo bloque "RetardoMicros" tarda: ; 1 + (K-1) + 2 + (K-1)x2 + 2 = (2 + 3K) ciclos mquina. ; RetardoMicros movwf R_ContA ; Aporta 1 ciclo mquina. 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 mquina. return ; El salto del retorno aporta 2 ciclos mquina. ; ;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 mquina. movlw d'200' ; Aporta 1 ciclo mquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos mquina. Retardo_100ms ; La llamada "call" aporta 2 ciclos mquina. movlw d'100' ; Aporta 1 ciclo mquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos mquina. Retardo_50ms ; La llamada "call" aporta 2 ciclos mquina. movlw d'50' ; Aporta 1 ciclo mquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos mquina. Retardo_20ms ; La llamada "call" aporta 2 ciclos mquina. movlw d'20' ; Aporta 1 ciclo mquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos mquina. Retardo_10ms ; La llamada "call" aporta 2 ciclos mquina. movlw d'10' ; Aporta 1 ciclo mquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos mquina.

Retardo_5ms ; La llamada "call" aporta 2 ciclos mquina. movlw d'5' ; Aporta 1 ciclo mquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos mquina. Retardo_2ms ; La llamada "call" aporta 2 ciclos mquina. movlw d'2' ; Aporta 1 ciclo mquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos mquina. Retardo_1ms ; La llamada "call" aporta 2 ciclos mquina. movlw d'1' ; Aporta 1 ciclo mquina. Este es el valor de "M". ; ; El prximo 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 mquina. Para K=249 y M=1 supone 1002 ciclos mquina ; que a 4 MHz son 1002 s = 1 ms. ; Retardos_ms movwf R_ContB ; Aporta 1 ciclo mquina. R1ms_BucleExterno movlw d'249' ; Aporta Mx1 ciclos mquina. Este es el valor de "K". movwf R_ContA ; Aporta Mx1 ciclos mquina. R1ms_BucleInterno nop ; Aporta KxMx1 ciclos mquina. decfsz R_ContA,F ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar). goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos mquina. decfsz R_ContB,F ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar). goto R1ms_BucleExterno ; Aporta (M-1)x2 ciclos mquina. return ; El salto del retorno aporta 2 ciclos mquina. ; ;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) = 2 ms. (M= 2 y K=249). ; - Retardo_1ms : 2 + 1 + (2 + 4M + 4KM) =

2007 cm = 1005 cm =

1 ms. (M= 1 y K=249). ; ; RETARDOS de 0.5 hasta 20 segundos --------------------------------------------------; Retardo_20s ; La llamada "call" aporta 2 ciclos mquina. movlw d'200' ; Aporta 1 ciclo mquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos mquina. Retardo_10s ; La llamada "call" aporta 2 ciclos mquina. movlw d'100' ; Aporta 1 ciclo mquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos mquina. Retardo_5s ; La llamada "call" aporta 2 ciclos mquina. movlw d'50' Este es el valor de "N". goto Retardo_1Decima Retardo_2s ciclos mquina. movlw d'20' Este es el valor de "N". goto Retardo_1Decima Retardo_1s ; Aporta 1 ciclo mquina. ; Aporta 2 ciclos mquina. ; La llamada "call" aporta 2 ; Aporta 1 ciclo mquina. ; Aporta 2 ciclos mquina. ; La llamada "call" aporta 2

ciclos mquina. movlw d'10' ; Aporta 1 ciclo mquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos mquina. Retardo_500ms ; La llamada "call" aporta 2 ciclos mquina. movlw d'5' ; Aporta 1 ciclo mquina. Este es el valor de "N". ; ; El prximo 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 mquina. Para K=249, M=100 y N=1 supone 100011 ; ciclos mquina que a 4 MHz son 100011 s = 100 ms = 0,1 s = 1 dcima de segundo. ; Retardo_1Decima movwf R_ContC ; Aporta 1 ciclo mquina. R1Decima_BucleExterno2 movlw d'100' ; Aporta Nx1 ciclos mquina. Este es el valor de "M". movwf R_ContB ; Aporta Nx1 ciclos

mquina. R1Decima_BucleExterno movlw d'249' mquina. Este es el valor de "K". movwf R_ContA mquina. R1Decima_BucleInterno nop mquina. decfsz R_ContA,F salta) + MxNx2 cm (al saltar). goto R1Decima_BucleInterno ciclos mquina. decfsz R_ContB,F salta) + Nx2 cm (al saltar). goto R1Decima_BucleExterno

; Aporta MxNx1 ciclos ; Aporta MxNx1 ciclos ; Aporta KxMxNx1 ciclos ; (K-1)xMxNx1 cm (si no ; Aporta (K-1)xMxNx2 ; (M-1)xNx1 cm (cuando no ; Aporta (M-1)xNx2 ciclos

mquina. decfsz R_ContC,F ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar). goto R1Decima_BucleExterno2 ; Aporta (N-1)x2 ciclos mquina. return ; El salto del retorno aporta 2 ciclos mquina. ; ;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. Lpez. www.pic16f84a.com ; Editorial Ra-Ma. www.ra-ma.es ; ============================================================== =====

ltima edicin por nbmk el 20 Nov 2007 16:34; editado 1 vez

#22 nbmk

20 Nov 2007 13:40

Es un Bender Registrado: Noviembre 2007 Mensajes: 9 Edad: 24 Nombre Real: carlos sotomayor

Re: PIC16F877A hola aqi sta lo q hice =) . la modificacion del los puertos, Cdigo: [Descargar] [Ocultar] [Seleccionar] Cdigo: [Descargar] [Mostrar] ;**************************** Librera "LCD_4BIT.INC" *********************************** ; ; ============================================================== ===== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. Lpez. www.pic16f84a.com ; Editorial Ra-Ma. www.ra-ma.es ; ============================================================== ===== ; ; Estas subrutinas permiten realizar las tareas bsicas de control de un mdulo LCD de 2 ; lneas 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 lneas superiores del mdulo LCD, pines <DB7:DB4> se conectan a las 4 ; lneas superiores del Puerto B del PIC, pines <RB7:RB4>. ; Pin RS del LCD a la lnea RA0 del PIC. ; Pin R/W del LCD a la lnea RA1 del PIC, o a masa. ; Pin Enable del LCD a la lnea RA2 del PIC. ; ; Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la librera

; RETARDOS.INC. ; ; ZONA DE DATOS ************************************************************** ******* CBLOCK LCD_Dato LCD_GuardaDato LCD_GuardaTRISD LCD_Auxiliar1 LCD_Auxiliar2 ENDC LCD_CaracteresPorLinea EQU .16 caracteres por lnea de la pantalla. #DEFINE #DEFINE #DEFINE #DEFINE LCD_PinRS PORTB,0 LCD_PinRW PORTB,1 LCD_PinEnable PORTB,2 LCD_BusDatos PORTD ; Nmero de

; Subrutina "LCD_Inicializa" -----------------------------------------------------------; ; Inicializacin del mdulo LCD: Configura funciones del LCD, produce reset por software, ; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la ; configuracin inicial hay que hacerla como sigue: ; LCD_Inicializa bsf STATUS,RP0 ; Configura las lneas 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 parmetros: call LCD_2Lineas4Bits5x7 caracteres de 5x7 puntos. call LCD_Borra limpia. Cursor al principio call LCD_CursorOFF apagado. call LCD_CursorIncr incrementar. return ; LCD de 2 lneas y ; Pantalla encendida y ; de la lnea 1. Cursor ; Cursor en modo

; Subrutina "LCD_EscribeLCD" ----------------------------------------------------------; ; Enva el dato del registro de trabajo W al bus de dato y produce un pequeo pulso en el pin ; Enable del LCD. Para no alterar el contenido de las lneas de la parte baja del Puerto B que ; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas lneas y despus se ; vuelve a enviar este dato sin cambiarlo. LCD_EscribeLCD andlw b'11110000' nibble alto del dato que es el movwf LCD_Dato guarda. movf LCD_BusDatos,W actual de la parte baja andlw b'00001111' se debe alterar. iorwf LCD_Dato,F del dato de entrada que haba antes. bsf STATUS,RP0 movf TRISD,W configuracin que tena antes TRISB. movwf LCD_GuardaTRISD movlw b'00001111' inferiores del Puerto B se dejan andwf PORTD,F superiores como salida. bcf STATUS,RP0 ; movf LCD_Dato,W enviar. movwf LCD_BusDatos LCD. bsf LCD_PinEnable ; Se queda con el ; que hay que enviar y lo ; Lee la informacin ; del Puerto B, que no ; Enviar la parte alta ; y en la parte baja lo ; Acceso al Banco 1. ; Guarda la ; Las 4 lneas ; como estaban y las 4 ; Acceso al Banco 0. ; Recupera el dato a ; Enva el dato al mdulo ; Permite

funcionamiento del LCD mediante un pequeo 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 configuracin del Puerto B. movwf TRISD bcf STATUS,RP0 ; Acceso al Banco 0. return ; Subrutinas variadas para el control del mdulo 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 Lnea 1. movlw b'10000000' DDRAM goto LCD_EnviaComando LCD_Linea2 la Lnea 2. movlw b'11000000' DDRAM goto LCD_EnviaComando LCD_Linea3 la Lnea 3 movlw b'10010100' DDRAM goto LCD_EnviaComando LCD_Linea4 la Lnea 4 movlw b'11010100' DDRAM goto LCD_EnviaComando LCD_PosicionLinea1 la Lnea 1, a partir de la iorlw b'10000000' DDRAM ms el valor del goto LCD_EnviaComando LCD_PosicionLinea2 la Lnea 2, a partir de la iorlw b'11000000' DDRAM ms el valor del goto LCD_EnviaComando LCD_OFF movlw b'00001000' goto LCD_EnviaComando LCD_CursorON cursor encendido. movlw b'00001110' ; Direccin 00h de la ; Cursor al principio de ; Direccin 40h de la ; Cursor al principio de ; Direccin 14h de la ; Cursor al principio de ; Direccin 54h de la ; Cursor a posicin de ; direccin 00h de la ; registro W. ; Cursor a posicin de ; direccin 40h de la ; registro W. ; Pantalla apagada. ; Pantalla encendida y

goto LCD_EnviaComando LCD_CursorOFF cursor apagado. movlw b'00001100' goto LCD_EnviaComando LCD_Borra memoria DDRAM y pone el movlw b'00000001' de la lnea 1. goto LCD_EnviaComando LCD_2Lineas4Bits5x7 2 lneas, con caracteres movlw b'00101000' conexin al PIC mediante bus de ; goto LCD_EnviaComando

; Pantalla encendida y

; Borra toda la pantalla, ; cursor a principio ; Define la pantalla de ; de 5x7 puntos y ; 4 bits.

; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" -----------------------------------; ; "LCD_EnviaComando". Escribe un comando en el registro del mdulo LCD. La palabra de ; comando ha sido entregada a travs del registro W. Trabaja en Modo Comando. ; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carcter ASCII introducido a ; a travs 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 cdigo para correcta visualizacin. LCD_Envia movwf LCD_GuardaDato ; Guarda el dato a enviar. call LCD_EscribeLCD ; Primero enva el nibble alto. swapf LCD_GuardaDato,W ; Ahora enva el nibble bajo. Para ello pasa el ; nibble bajo del dato a enviar a parte alta del byte. call LCD_EscribeLCD ; Se enva 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 cracter. call Retardo_50micros return ; Subrutina "LCD_CodigoCGROM" ----------------------------------------------------------; ; A partir del carcter ASCII nmero 127 los cdigos de los

caracteres definidos en la ; tabla CGROM del LM016L no coinciden con los cdigos ASCII. As por ejemplo, el cdigo ; ASCII de la "" en la tabla CGRAM del LM016L es EEh. ; ; Esta subrutina convierte los cdigos ASCII de la "", "" y otros, a cdigos CGROM para que ; que puedan ser visualizado en el mdulo LM016L. ; ; Entrada: En (W) el cdigo ASCII del carcter que se desea visualizar. ; Salida: En (W) el cdigo definido en la tabla CGROM. LCD_CodigoCGROM movwf LCD_Dato carcter y comprueba si es LCD_EnheMinuscula sublw '' btfss STATUS,Z goto LCD_EnheMayuscula movlw b'11101110' "". movwf LCD_Dato goto LCD_FinCGROM LCD_EnheMayuscula movf LCD_Dato,W ASCII de entrada. sublw '' btfss STATUS,Z goto LCD_Grado movlw b'11101110' "". (No hay smbolo para movwf LCD_Dato CGROM). goto LCD_FinCGROM LCD_Grado movf LCD_Dato,W ASCII de entrada. sublw '' btfss STATUS,Z goto LCD_FinCGROM movlw b'11011111' smbolo "". movwf LCD_Dato LCD_FinCGROM movf LCD_Dato,W buscado. return ; Guarda el valor del ; un carcter especial. ; Es la ""? ; No es "". ; Cdigo CGROM de la

; Recupera el cdigo ; Es la ""? ; No es "". ; Cdigo CGROM de la ; la "" mayscula en la

; Recupera el cdigo ; Es el smbolo ""? ; No es "". ; Cdigo CGROM del

; En (W) el cdigo

; 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 utiliza como contador. LCD_EnviaOtroBlanco movlw ' ' en blanco. call LCD_Caracter en blanco como se decfsz LCD_Auxiliar1,F (LCD_Auxiliar1). goto LCD_EnviaOtroBlanco return

; (LCD_Auxiliar1) se ; Esto es un espacio ; Visualiza tanto espacios ; haya cargado en

; 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 ms adelante. ; LCD_Byte movwf LCD_Auxiliar2 ; Guarda el valor de entrada. andlw b'11110000' ; Analiza si el nibble alto es cero. btfss STATUS,Z goto LCD_VisualizaAlto visualiza. movlw ' ' en blanco. call LCD_Caracter goto LCD_VisualizaBajo LCD_ByteCompleto movwf LCD_Auxiliar2 entrada. LCD_VisualizaAlto swapf LCD_Auxiliar2,W en la parte baja. ; Guarda el valor de ; Pone el nibble alto ; Si es cero lo apaga. ; No es cero y lo ; Visualiza un espacio

call LCD_Nibble LCD_VisualizaBajo movf LCD_Auxiliar2,W el nibble bajo. ; call LCD_Nibble ; return

; Lo visualiza. ; Repite el proceso con ; Lo visualiza.

; 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 nmero se pasa a carcter ASCII sumndole 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 carcter. Se hace con un "goto" ; para no sobrecargar la pila. ; ============================================================== ===== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. Lpez. www.pic16f84a.com ; Editorial Ra-Ma. www.ra-ma.es ; ============================================================== =====

#23 nbmk

20 Nov 2007 13:43

Es un Bender Registrado: Noviembre 2007 Mensajes: 9 Edad: 24 Nombre Real: carlos sotomayor

Re: PIC16F877A Burzredion Escribi: [Ver Mensaje] Pues si, pues dichas libreras usan las lneas del puerto A y B, no est difcil modificar eso, en tu caso lo tienes que hacer, te recomiendo que cambies las lneas que hacen mencin al puerto B (PORTB y TRISB) por las del puerto D del 16F877 y las que hacen mencin al puerto A (PORTA y TRISA) por las del puerto B. Lo otro que tienes que revisar, es la librera RETARDO, ya que hace llamado a unos retardos los cuales no aparecen en las libreras LCD, y verificar si dichos retardos estn diseados para trabajar a la velocidad de tu cristal. Manda las libreras 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

#24

20 Nov 2007 16:41

Jorge Valerio Site Admin

Registrado: Junio 2006 Mensajes: 644 Edad: 34 Ubicacin: Lima-Per

Nombre Real: Jorge Valerio

Re: PIC16F877A Hola, por cierto feliz cumpleaos. bueno, el cambio te lo deca porque el puerto A del 16F877A despus de un Reset est automticamente configurado como Entradas Analgicas, as que tendras que agregar lneas de cdigo para modificarlo. El puerto B pues puede quedar en B y usar solo el puerto B, o solo el D que son los que ms se usan en el 16F877A para I/O. A ver si haces la prueba y nos avisas como te fue...

____________ Comparte el conocimiento !!! Si lo oigo, lo olvido; Si lo veo, lo recuerdo; Si lo hago, lo entiendo. Proverbio. Just Burz Diario del Ingeniebrio #25 21 Nov 2007 00:27 deshired Es un Bender Registrado: Diciembre 2007 Mensajes: 1 Edad: 28 Nombre Real: Shirley

Re: PIC16F877A Holas, super el tutorial, 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

#26

17 Dec 2007 12:03

nbmk Es un Bender Registrado: Noviembre 2007 Mensajes: 9 Edad: 24 Nombre Real: carlos sotomayor

Re: PIC16F877A deshired Escribi: [Ver Mensaje] Holas, super el tutorial, 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 ojo, pero con el 16f84 jeje,

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

#27 nbmk

21 Dec 2007 13:39

Es un Bender Registrado: Noviembre 2007 Mensajes: 9 Edad: 24 Nombre Real: carlos sotomayor

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 Cdigo: [Descargar] [Ocultar] [Seleccionar] Cdigo: [Descargar] [Mostrar] ;zONA DE DATOS********************* LIST P=16F84A INCLUDE <P16F84A.INC> CBLOCK0x0C GuardaDato ENDC ;ZONA DE CODIGOS******************** ORG 0 Inicio call LCD_Inicializa lineas que se van a usar call RS232_Inicializa EL PUERTO RS232 Principal call RS232_LeeDato movwf GuardaDato call LCD_Caracter movf GuardaDato,W al ordenador call RS232_EnviaDato goto Principal INCLUDE <RS232.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END

;inicializa el lcd y las ;CON LA COMUNICACION CON ;espera recibir un caracter ;guarda el dato recibido ;lo visualiza ;y ahora lo reenvia otra vez ;repite el proceso

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

#28

21 Dec 2007 14:30

kien_kike Es un Bender Registrado: Enero 2008 Mensajes: 1 Edad: 24

Nombre Real: RAUL ENRIQUE CANTO

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

#29

16 Jan 2008 14:02

juniorcrisanto Es un Bender Registrado: Mayo 2008 Mensajes: 1 Edad: 31 Nombre Real: LUIS CRISANTO

Re: PIC16F877A Hola me pare muy bueno el tutorial y me ayudo mucho, pero ahora estoy tratando de hacer funcionar las entradas anlogas del puerto a estuve investigando como configurarlas pero tengo confusin, me podras ayudar???? y adems quera que se visualice el valor en un lcd pero ah est el otro problema que no s como por fa aydame 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 anloga que podra ser un potencimetro yo estaba usando la seal que me da un lm35 acoplado un amplificador operacin para llevarla hasta el pic pero con el potencimetro me conformo

#30

12 Mayo 2008 22:58 Mostrar mensajes anteriores:Todos los mensajes1 Da7

Das2 Semanas1 Mes3 Meses6 Meses1 Ao El ms antiguo primeroEl ms reciente primero Resumen de Valoraciones: Media de ValoracinValoracin MnimaValoracin MximaNmero de Valoraciones 5.4611024 Ver Informacin Detallada Elegir Valoracin: 12345678910 Pgina 3 de 5 Ir a la Pgina Anterior 1, 2, 3, 4, 5 Siguiente Portal Foro Taller Microcontrolador PIC16F877A Fecha y hora actual: Noviembre 01 2011, 14:16 Todas las horas estn en UTC - 5 Horas Usuarios navegando en este Tema: 0 Registrados, 0 Ocultos y 0 Invitados Usuarios Registrados conectados: Ninguno Lista de Permisos 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

Foro --General

--Bienvenidos

--Ayudas

--Bugs

--Sugerencias --Presentacin --Avisos --Consultas --Eventos --Noticias --Concurso: Logo RobotsPERU --Eventos 2007 --BEASTIE BOTS 2007 - UTP --CONCURSO DE ROBOTS PUCP-2007 --I CONCURSO PERUANO IEEE DE ROBOTICA - UNI --OLIMPIADA ROBOTICA 2007 - UNA --IV FOINTEC 2007 ICA --I ROBOTEC 2007 - UNH --SEMTEC 2007 IEEE UPAO --I TORNEO DE ROBOTICA - UNMSM --Eventos 2008 - Nacionales --Intercon 2008 --Robotmana - UPC --I KantuRobot - UNE --V Olimpiada Robtica - UNA (Puno) --V Fointec - UNSLG (Ica) --Roboticuss 2008 - USS (Chiclayo) --III Robotec - ISP JAE (Puno) --I Torneo De Robotica INTI-BOT (UCSM - Arequipa) --Eventos 2008 - Internacionales --CER2008-ESPOCH-ECUADOR --EVENTOS 2009 - Nacionales --IV SEMANA ELECTRNICA UNSAAC --II Torneo De Robotica INTI-BOT

(UCSM - Arequipa) --INTERCON 2009 - UNSA --II KantuRobot - UNE --ROBOT PUCP 2009 --VI Olimpiada Robtica - UNA (Puno) --I CONATEL III ROBOTEC UNH 2009 --ROBOTICUSS 2009 --EVENTOS 2009 - Internacionales --Destruccin Robtica/UTN -Ecuador/Ibarra --EVENTOS 2010 Nacionales --III OLIMPIADA ROBTICA - UNSAAC --INTERCON 2010 --EXPOFIM 2010 --III KANTUROBOT 2010 --VII FOINTEC 2010 - UNSLG / CA --III VILLATRONICA 2010 - UNFV / LIMA --INTIBOT 2010 --EVENTOS 2010 - Internacionales --CER 2010 --EVENTOS 2011 - Nacionales --Reunin de la Comunidad Robotera --INTERCON 2011 - UNI --VISION 2011 - USMP --II Concurso de Robots - UNA Puno -05 y 06 Octubre --II ROBOTICAUNAC --ROBOT PUCP 2011 --EVENTOS INTERNACIONALES 2011 --Taller --Alimentacin y Bateras --Motores y Drivers --Chasis --Control --Sensores --Radio Frecuencia (RF) --Microcontrolador --Software --Mecanismos --Audio --Leds --Robotilandia --Robotea --Tus Robots Favoritos --Robtica Educativa --LEGO MINDSTORMS --RCX --NXT --Otras Alternativas --Videoteca --Robots made in Per --Robots extranjeros --Robots on-line --Proyectos y/o Tutoriales --Robot Seguidor de Lnea --Robot BEAM --Tus Proyectos --Robots SUMO --Proyecto AmiGO --Brazo Robot --Robots de Combate --Robots Soccer --Recursos --Diseo de Tarjetas --Libros, Contactos, Info --Linux --Otros --Comuncate --Cumpleaos --Robots en la TV. --ROBOT ARENA 2 --Proyectos Electrnica

Powered by Icy Phoenix based on phpBB Traduccin al Espaol por phpBB-Es Versin Lo-Fi Pgina Generada en: 0.2778s (PHP: 89% SQL: 11%) Consultas SQL: 18 - Debug On - GZIP Desactivado Design by Mighty Gorgon 13331 Ataques Bloqueados

You might also like