TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Kardia en 12 de Diciembre de 2008, 23:08:32
-
Primeramente soy nuevo en el foro :), inicio mi primer tema para encontrar los errores que estoy cometiendo, ya que uno no nace aprendiendo de la noche a la mañana :lol: :lol:
Les explico en que consiste lo que quiero implementar; pero antes yo siempre empiezo por una previa simulacion de cualquier diagrama antes de implementarlo. Pues consta de un brazo robotico de 2 grados; ya se que hay muchos por la red (5 a 6 grados) pero muy pocos trabajan con el lenguaje ASM, es por ello que quiero empezar yo con este diseño; me defiendo en el ASM, pero mi problema ahora es que no he trabajado mucho con los LCD; un LCD por que??? en si solo para poder visualizar una serie de mensajes que seran activados por unos pulsadores que permiten girar los motores paso a paso.
Empeze primeramente con el programa en MPLAB para el giro de los motores 8) 8) pero cuando empeze a insertar el codigo del LCD no me cuadra donde tiene que ir :shock: :shock: y veo que estoy cometiendo errores muy altos y no se en donde????
he aqui mi codigo, porsiaca no uso las rutinas retardos.inc ni otra que conosca, esta rutina es la que mayormente usan algunos.
LIST P=16F84A
INCLUDE <P16F84A.inc>
RADIX HEX
STATUS EQU 03h ; REGISTRO ESTADO
PORTA EQU 05h ; PUERTO A
PORTB EQU 06h ; PUERTO B
OPTION_REG EQU 81h ; REGISTRO DE INTERRUPCION
INTCON EQU 0bh
TRISA EQU 85h ; REGISTRO CONFIGURACION PUERTO A
TRISB EQU 86h ; REGISTRO CONFIGURACION PUERTO B
CONTA EQU 0X0D ;Damos el nombre de CONTA a dir. 0Dh(USO GENERAL)
CONTB EQU 0X0E ;Damos el nombre de CONTB a dir. 0Eh(USO GENERAL)
CONTC EQU 0X0F ;Damos el nombre de CONTC a dir. 0Fh(USO GENERAL)
ORG 00h ; INDICA AL COMPILADOR DONDE COMIENZA EL PROGRAMA
GOTO INICIO ; VA A SUBRUTINA INICIO
ORG 04h
INICIO
BSF STATUS,5
MOVLW B'11111' ; CARGA '11111' EN EL REGISTRO DE TRABAJO 'W'
MOVWF TRISA ; CARGA 'W' EN EL PUERTO A
MOVLW B'00000000' ; CARGA '00000000' EN EL REGISTRO DE TRABAJO 'W'
MOVWF TRISB ; CARGA 'W' EN EL PUERTO B
MOVLW B'00000111' ; CARGA '00000111' EN EL REGISTRO DE TRABAJO 'W'
MOVWF OPTION_REG ; CONFIGURAMOS TMR0 COMO CONTADOR DESCENDENTE
BCF STATUS,5 ; VUELVE A 0
CLRF PORTA
CLRF PORTB
GIRO
BTFSC PORTA,0 ; EN ESTE PUERTO DA EL GIRO A LA IZQUIERDA
GOTO GIRO1
GOTO IZQUIERDA
GIRO1
BTFSC PORTA,1 ; EN ESTE PUERTO DA EL GIRO A LA DERECHA
GOTO GIRO2
GOTO DERECHA
GIRO2
BTFSC PORTA,2 ; EN ESTE PUERTO ABRE
GOTO GIRO3
GOTO ABRE
GIRO3
BTFSC PORTA,3 ; EN ESTE PUERTO CIERRA
GOTO GIRO
GOTO CIERRA
DERECHA
MOVLW B'00001100' ; PRIMER PASO.
MOVWF PORTB
CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGIENTE PASO
MOVLW B'00000110' ; SEGUNDO PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'00000011' ; TERCER PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'00001001' ; CUARTO PASO
MOVWF PORTB
CALL TIEMPO
GOTO GIRO ; SE VUELE A GIRO PARA MIRAR EL ESTADO DEL BIT
IZQUIERDA
MOVLW B'00001001' ; PRIMER PASO
MOVWF PORTB
CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGIENTE PASO
MOVLW B'00000011' ; SEGUNDO PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'00000110' ; TERCER PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'00001100' ; CUARTO PASO
MOVWF PORTB
CALL TIEMPO
GOTO GIRO ; SE VUELVE A GIRO PARA MIRAR EL ESTADO DEL BIT
CIERRA
MOVLW B'11000000' ; PRIMER PASO.
MOVWF PORTB
CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGIENTE PASO
MOVLW B'01100000' ; SEGUNDO PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'00110000' ; TERCER PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'10010000' ; CUARTO PASO
MOVWF PORTB
CALL TIEMPO
GOTO GIRO ; SE VUELE A GIRO PARA MIRAR EL ESTADO DEL BIT
ABRE
MOVLW B'10010000' ; PRIMER PASO
MOVWF PORTB
CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGIENTE PASO
MOVLW B'00110000' ; SEGUNDO PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'01100000' ; TERCER PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'11000000' ; CUARTO PASO
MOVWF PORTB
CALL TIEMPO
GOTO GIRO ; SE VUELVE A GIRO PARA MIRAR EL ESTADO DEL BIT
TIEMPO
movwf PORTB ;sacamos los pasos por el PORTb
call Retardo_100ms ;realizamos el llamado para el retardo
return ;retorno de donde fue llamado
Retardo_100ms ;retardo de 100 milisegundos
movlw d'1000' ;OJO d100=100mlsegundos cambio otros valores como ejemplo d50=50mlsegundos
goto Retardos_ms
Retardos_ms
movwf CONTB
R1ms_BucleExterno
movlw d'249'
movwf CONTA
R1ms_BucleInterno
nop
decfsz CONTA,F
goto R1ms_BucleInterno
decfsz CONTB,F
goto R1ms_BucleExterno
return
END
Ahora como empiezo e inserto el codigo del LCD??? y que entradas tomo para la visualizacion del mismo????
Salu2 y gracias :-/ :-/ :-/
-
Hola:
Podrias insertar los mensajes en los puntos que te menciono por ejemplo:
ORG 00h ; INDICA AL COMPILADOR DONDE COMIENZA EL PROGRAMA
GOTO INICIO ; VA A SUBRUTINA INICIO
ORG 04h
INICIO
BSF STATUS,5
MOVLW B'11111' ; CARGA '11111' EN EL REGISTRO DE TRABAJO 'W'
MOVWF TRISA ; CARGA 'W' EN EL PUERTO A
MOVLW B'00000000' ; CARGA '00000000' EN EL REGISTRO DE TRABAJO 'W'
MOVWF TRISB ; CARGA 'W' EN EL PUERTO B
MOVLW B'00000111' ; CARGA '00000111' EN EL REGISTRO DE TRABAJO 'W'
MOVWF OPTION_REG ; CONFIGURAMOS TMR0 COMO CONTADOR DESCENDENTE
BCF STATUS,5 ; VUELVE A 0
CLRF PORTA
CLRF PORTB
;**** AQUI INSERTA UNA LLAMADA A LA INICIALIZACIÓN DEL LCD
GIRO
BTFSC PORTA,0 ; EN ESTE PUERTO DA EL GIRO A LA IZQUIERDA
GOTO GIRO1
GOTO IZQUIERDA
GIRO1
BTFSC PORTA,1 ; EN ESTE PUERTO DA EL GIRO A LA DERECHA
GOTO GIRO2
GOTO DERECHA
GIRO2
BTFSC PORTA,2 ; EN ESTE PUERTO ABRE
GOTO GIRO3
GOTO ABRE
GIRO3
BTFSC PORTA,3 ; EN ESTE PUERTO CIERRA
GOTO GIRO
GOTO CIERRA
DERECHA
;****** AQUI COLOCA EL MENSAJE DESEADO PARA ESTE CASO EN EL LCD
MOVLW B'00001100' ; PRIMER PASO.
MOVWF PORTB
CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGIENTE PASO
MOVLW B'00000110' ; SEGUNDO PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'00000011' ; TERCER PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'00001001' ; CUARTO PASO
MOVWF PORTB
CALL TIEMPO
GOTO GIRO ; SE VUELE A GIRO PARA MIRAR EL ESTADO DEL BIT
IZQUIERDA
;****** AQUI COLOCA EL MENSAJE DESEADO PARA ESTE CASO EN EL LCD
MOVLW B'00001001' ; PRIMER PASO
MOVWF PORTB
CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGIENTE PASO
MOVLW B'00000011' ; SEGUNDO PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'00000110' ; TERCER PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'00001100' ; CUARTO PASO
MOVWF PORTB
CALL TIEMPO
GOTO GIRO ; SE VUELVE A GIRO PARA MIRAR EL ESTADO DEL BIT
CIERRA
;****** AQUI COLOCA EL MENSAJE DESEADO PARA ESTE CASO EN EL LCD
MOVLW B'11000000' ; PRIMER PASO.
MOVWF PORTB
CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGIENTE PASO
MOVLW B'01100000' ; SEGUNDO PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'00110000' ; TERCER PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'10010000' ; CUARTO PASO
MOVWF PORTB
CALL TIEMPO
GOTO GIRO ; SE VUELE A GIRO PARA MIRAR EL ESTADO DEL BIT
ABRE
;****** AQUI COLOCA EL MENSAJE DESEADO PARA ESTE CASO EN EL LCD
MOVLW B'10010000' ; PRIMER PASO
MOVWF PORTB
CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGIENTE PASO
MOVLW B'00110000' ; SEGUNDO PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'01100000' ; TERCER PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'11000000' ; CUARTO PASO
MOVWF PORTB
CALL TIEMPO
GOTO GIRO ; SE VUELVE A GIRO PARA MIRAR EL ESTADO DEL BIT
TIEMPO
movwf PORTB ;sacamos los pasos por el PORTb
call Retardo_100ms ;realizamos el llamado para el retardo
return ;retorno de donde fue llamado
Retardo_100ms ;retardo de 100 milisegundos
movlw d'1000' ;OJO d100=100mlsegundos cambio otros valores como ejemplo d50=50mlsegundos
goto Retardos_ms
Retardos_ms
movwf CONTB
R1ms_BucleExterno
movlw d'249'
movwf CONTA
R1ms_BucleInterno
nop
decfsz CONTA,F
goto R1ms_BucleInterno
decfsz CONTB,F
goto R1ms_BucleExterno
return
END
Tambien inserta los retardos antirebote para los pulsadores al entrar a cada subrutina.
Javicho.
-
Revisando bien las rutinas que tengo encontre mi otro error en la configuracion del mismo, en realidad lo que quiero obtener en el LCD es un mensaje por cada boton de entrada (RA0...RA3), por ejemplo: presiono el bton RA0 por lo tanto obtengo un mensaje GIRO DERECHA. y asi sucesivamente. Ademas de la configuracion de los pines del LCD (PInes del 1 al 5).
Veo que no me deje entender bien en mi anterior post.
Salu2
-
Por eso te puse en tu programa con asterisco **** donde debes colocar tus mensajes para el LCD, algo asi:
movlw 'D'
call Enviar_al_LCD
movlw 'E'
call Enviar_al_LCD
movlw 'R'
call Enviar_al_LCD
movlw 'E'
call Enviar_al_LCD
movlw 'C'
call Enviar_al_LCD
movlw 'H'
call Enviar_al_LCD
movlw 'A'
call Enviar_al_LCD
Donde "Enviar_al_LCD" es una subrutina que se encarga de gestionar la comunicación con el LCD y enviarle el dato que se desea mostrar en el mismo.
Javicho.