Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

09/05/2011 #1


Ayuda con libreria lcd_4bit.inc
Hola comunidad de foros de electronica, me he rondado mucho esta pagina y siempre aclaraba mi duda pero esta vez no he podido, la cuestion es que quiero aprender a utilizar una pantalla LCD pero solo con 4 bits, ya me lei todo el capitulo del libro microcontrolador pic16f84 desarrollo de proyectos y pues si le entendi. Bueno el programa tiene que hacer lo siguiente, al momento de accionar un boton que estara conectado al puerto a en el bit 3 aparecera en la pantalla
"Bienvenido" primera liena
"Mecatroyer" segunda linea
despues por medio de otro boton que estara en el portb bit 0, aparecera un mensaje que diga
"Autodestruccion" primera linea
"En: 9" segunda linea
cuando acabe de decrementa 9 aparecera un mensaje diciendo bye y se apaga la pantalla. Eso es todo jejeje.

Este es el codigo

Código:
       list p=16f84a
		#include <p16f84a.inc>
        	__CONFIG _XT_OSC & _WDT_OFF & _CP_OFF & _PWRTE_ON  
	
	CONT	EQU	0X0C
	
		CBLOCK	0X0D
		ENDC
			
	ORG	0
	BSF	STATUS,5
	MOVLW	0X18
	MOVWF	TRISA
	MOVLW	0X0F
            	BCF	STATUS,5      
	
OTRO	BTFSS	PORTA,3
	GOTO	OTRO
	CALL	LCD_Inicializa
	CALL	LCD_CursorOFF
	MOVLW	'B'
	CALL	LCD_Caracter
	MOVLW	'i'
	CALL	LCD_Caracter
	MOVLW	'e'
	CALL	LCD_Caracter
	MOVLW	'n'
	CALL	LCD_Caracter
	MOVLW	'v'
	CALL	LCD_Caracter
	MOVLW	'e'
	CALL	LCD_Caracter
	MOVLW	'n'
	CALL	LCD_Caracter
	MOVLW	'i'
	CALL	LCD_Caracter
	MOVLW	'd'
	CALL	LCD_Caracter
	MOVLW	'o'
	CALL	LCD_Caracter
	MOVLW	4
	CALL	LCD_PosicionLinea2
       	MOVLW	'M'
	CALL	LCD_Caracter
	MOVLW	'e'
	CALL	LCD_Caracter
	MOVLW	'c'
	CALL	LCD_Caracter
	MOVLW	'a'
	CALL	LCD_Caracter
	MOVLW	't'
	CALL	LCD_Caracter
	MOVLW	'r'
	CALL	LCD_Caracter
	MOVLW	'o'
	CALL	LCD_Caracter
	MOVLW	'y'
	CALL	LCD_Caracter
	MOVLW	'e'
	CALL	LCD_Caracter
	MOVLW	'r'
	CALL	LCD_Caracter
BOTON	BTFSS	PORTB,0
	GOTO	BOTON
	CALL	LCD_Borra
	MOVLW	'A'		;SEGUNDO MENSAJE
	CALL	LCD_Caracter
	MOVLW	'u'
	CALL	LCD_Caracter
	MOVLW	't'
	CALL	LCD_Caracter
	MOVLW	'o'
	CALL	LCD_Caracter
	MOVLW	'D'
	CALL	LCD_Caracter
	MOVLW	'e'
	CALL	LCD_Caracter
	MOVLW	's'
	CALL	LCD_Caracter
	MOVLW	't'
	CALL	LCD_Caracter
	MOVLW	'r'
	CALL	LCD_Caracter
	MOVLW	'u'
	CALL	LCD_Caracter
	MOVLW	'c'
	CALL	LCD_Caracter
	MOVLW	'c'
	CALL	LCD_Caracter
	MOVLW	'i'
	CALL	LCD_Caracter
	MOVLW	'o'
	CALL	LCD_Caracter
	MOVLW	'n'
	CALL	LCD_Caracter
	MOVLW	6
	CALL	LCD_PosicionLinea2
	MOVLW	'E'
	CALL	LCD_Caracter
	MOVLW	'n'
	CALL	LCD_Caracter
	MOVLW	':'
	CALL	LCD_Caracter
	CALL	LCD_UnEspacioBlanco
	MOVLW	10
	MOVWF	CONT
MUGEN	MOVLW	10
	CALL	LCD_PosicionLinea2
	MOVF	CONT,0
	CALL	TABLA
	DECFSZ	CONT,1
	GOTO	MUGEN
	CALL	LCD_Borra
	MOVLW	8
	CALL	LCD_PosicionLinea1
	MOVLW	'B'
	CALL	LCD_Caracter
	MOVLW	'Y'
	CALL	LCD_Caracter
	MOVLW	'E'
	CALL	LCD_Caracter
	CALL	Retardo_1s
	CALL	LCD_OFF
	
	
TABLA	addwf	PCL,1
	retlw	'S'
	retlw	'0'
	retlw	'1'
	retlw	'2'
	retlw	'3'
	retlw	'4'
	retlw	'5'
	retlw	'6'
	retlw	'7'	
	retlw	'8'
	retlw	'9'
	
	INCLUDE <LCD_4BIT.INC>
	INCLUDE <RETARDOS.INC>
	END
Esta es la imagen del circuito



Y estas son las librerias que estoy utilizando, y son las que bienen en el CD del libro supongo que no tienen errores.

INCLUDE <LCD_4BIT.INC>
Código:
;**************************** Librería "LCD_4BIT.INC" ***********************************
;
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.
; 	  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_GuardaTRISB
	LCD_Auxiliar1
	LCD_Auxiliar2
	ENDC

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

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

; 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
	movlw	b'00100000'		; Interface de 4 bits.
	call	LCD_EscribeLCD

; 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	TRISB,W		; Guarda la configuración que tenía antes TRISB.
	movwf	LCD_GuardaTRISB
	movlw	b'00001111'		; Las 4 líneas inferiores del Puerto B se dejan 
	andwf	PORTB,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_GuardaTRISB,W	; la configuración del Puerto B.
	movwf	PORTB			; Realmente es TRISB.
	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_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.
; 	  Editorial Ra-Ma.  www.ra-ma.es
;	===================================================================
INCLUDE <RETARDOS.INC>
Código:
;**************************** Librería "RETARDOS.INC" *********************************
;
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.
; 	  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.
; 	  Editorial Ra-Ma.  www.ra-ma.es
;	===================================================================
De antemano muchas gracias, y ojala puedan ayudarme.
25/09/2011 #2
Moderador

Avatar de D@rkbytes

Booommm
Upps!!! Nadie contesto este Post desde Mayo,
Bueno, como no a caducado me puse a programar este sencillo programa.
Esta en PBP para no quebrarse el coco ja ja ja
Mas su simulación en Proteus 7.8
Esta divertido.
Aqui lo dejo.
30/12/2011 #3


Darkbytes dijo: Ver Mensaje
Upps!!! Nadie contesto este Post desde Mayo,
Bueno, como no a caducado me puse a programar este sencillo programa.
Esta en PBP para no quebrarse el coco ja ja ja
Mas su simulación en Proteus 7.8
Esta divertido.
Aqui lo dejo.
un saludo cordial amigo,tengo una pregunta he leido el libro desarrollo de proyectos pic 16f84a.
y he tratado de hacer el programa del manejo de lcd con una eeprom 24lc ...pero lo que sucede es que deseo hacerlo con otro pic el 16f628a he modificado el origen de inicio de la ram ya que son diferentes estoy incluyendo las librerias pero me sale este error:

Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Program Files\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F628A "pantallita.asm" /l"pantallita.lst" /e"pantallita.err"
Error[105] D:\JAIME\PRUEBASMPLAB\PANTALLITA.ASM 86 : Cannot open file (Include File "BUS_I2C.INC" not found)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 29 : Symbol not previously defined (I2C_EnviaStart)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 31 : Symbol not previously defined (I2C_EnviaByte)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 33 : Symbol not previously defined (I2C_EnviaByte)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 35 : Symbol not previously defined (I2C_EnviaByte)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 46 : Symbol not previously defined (I2C_UltimoByteLeer)
Error[128] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 46 : Missing argument(s)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 47 : Symbol not previously defined (I2C_EnviaStart)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 49 : Symbol not previously defined (I2C_EnviaByte)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 51 : Symbol not previously defined (I2C_EnviaByte)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 53 : Symbol not previously defined (I2C_EnviaByte)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 54 : Symbol not previously defined (I2C_EnviaStop)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 56 : Symbol not previously defined (I2C_EnviaStart)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 58 : Symbol not previously defined (I2C_EnviaByte)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 78 : Symbol not previously defined (I2C_LeeByte)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 98 : Symbol not previously defined (I2C_UltimoByteLeer)
Error[128] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 98 : Missing argument(s)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 99 : Symbol not previously defined (I2C_LeeByte)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 100 : Symbol not previously defined (I2C_EnviaStop)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 118 : Symbol not previously defined (I2C_UltimoByteLeer)
Error[128] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 118 : Missing argument(s)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 138 : Symbol not previously defined (I2C_LeeByte)
Message[302] D:\JAIME\PRUEBASMPLAB\LCD_4BIT.INC 90 : Register in operand not in bank 0. Ensure that bank bits are correct.
Halting build on first failure as requested.
----------------------------------------------------------------------
Release build of project `D:\JAIME\PRUEBASMPLAB\pantallita.disposable_mcp' failed.
Language tool versions: MPASMWIN.exe v5.43, mplink.exe v4.41, mplib.exe v4.41
Fri Dec 30 12:42:23 2011
----------------------------------------------------------------------
BUILD FAILED




por favor necesito ayuda.muchas gracias
30/12/2011 #4
Moderador

Avatar de D@rkbytes

jco dijo: Ver Mensaje
un saludo cordial amigo,tengo una pregunta he leido el libro desarrollo de proyectos pic 16f84a.
y he tratado de hacer el programa del manejo de lcd con una eeprom 24lc ...pero lo que sucede es que deseo hacerlo con otro pic el 16f628a he modificado el origen de inicio de la ram ya que son diferentes estoy incluyendo las librerias pero me sale este error:

Executing: "C:\Program Files\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F628A "pantallita.asm" /l"pantallita.lst" /e"pantallita.err"
Error[105] D:\JAIME\PRUEBASMPLAB\PANTALLITA.ASM 86 : Cannot open file (Include File "BUS_I2C.INC" not found)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 29 : Symbol not previously defined (I2C_EnviaStart)
Error[113] D:\JAIME\PRUEBASMPLAB\M24LC256.INC 31 : Symbol not previously defined (I2C_EnviaByte)
Message[302] D:\JAIME\PRUEBASMPLAB\LCD_4BIT.INC 90 : Register in operand not in bank 0. Ensure that bank bits are correct.
Halting build on first failure as requested.
----------------------------------------------------------------------
Release build of project `D:\JAIME\PRUEBASMPLAB\pantallita.disposable_mcp' failed.
Language tool versions: MPASMWIN.exe v5.43, mplink.exe v4.41, mplib.exe v4.41
Fri Dec 30 12:42:23 2011
----------------------------------------------------------------------
BUILD FAILED

por favor necesito ayuda.muchas gracias
Asegurate de que tengas la libreria BUS_I2C.INC en el mismo lugar de tu proyecto pantallita.asm
Y fijate también en las dependencias que usa BUS_I2C.INC debes tener el proyecto completo.
Si lo subes dentro de un zip o rar te podria ayudar mejor.
30/12/2011 #5


ok amigo eso hare buscare la manera de enviarlo
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.