Ejemplos de lenguaje ensamblador para pic 16f84
description
Transcript of Ejemplos de lenguaje ensamblador para pic 16f84
Ejemplos de lenguaje ensamblador para PIC16f84.
;Programa entrenador04 ;Por el Puerto B se obtiene el dato del Puerto A invertidos los unos y los ceros. Por ejemplo si por el Puerto A seintroduce xxx11001 por el Puerto B deberá aparecer 00000110
;***********************************************************
;Zona de Datos**********************************************
__CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de Codigos *******************************************
INICIO bsf STATUS,RP0; Entra al modo de configuracion de los puertos
;Configuracion de puertos*********************************** movlw b'11100000';LAS LINEAS DEL PUERTO B CONFIGURADAS COMO SALIDAS
movwf TRISB; se mueve al puerto B
movlw b'00011111'; Las lineas del puerto A configuradas como entrada movwf TRISA; Mueve w al registro f
; Cero si es salida y uno si es entrada
Rutina bcf STATUS,RP0; Sale del modo de configuracion de los puertos
movf PORTA,W; carga el registro del puerto A en (W) COMF PORTA,W ; Esta instrucción complementa un registro, es decir, los unos por ceros y los ceros porunos
movwf PORTB; El contenido de W se deposita en el puerto de salida
goto Rutina; Crea un bucle cerrado e infinito
END; Fin del programa
;Programa entrenador03 ;Por el Puerto B se obtiene el dato del Puerto A multiplicado por 2, es necesario poner 5 switches en todos lospines del puerto A
;Zona de Datos**********************************************
__CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de Codigos *******************************************
INICIO bsf STATUS,RP0; Entra al modo de configuracion de los puertos
;Configuracion de puertos***********************************
clrf TRISB; LAS LINEAS DEL PUERTO B CONFIGURADAS COMO SALIDAS
movlw b'00011111'; Las lineas del puerto A configuradas como entrada movwf TRISA; Mueve w al registro f ; Cero si es salida y uno si es entrada
Rutina bcf STATUS,RP0; Sale del modo de configuracion de los puertos
; Inicio del programa de Bucle*********************************************
movf PORTA,W; carga el registro del puerto A en (W)
addwf PORTA,W; SUMA EL CONTENIDO DEL PUERTO A CON W movwf PORTB; El contenido de W se deposita en el puerto de salida
goto Rutina; Crea un bucle cerrado e infinito END; Fin del programa.
;Programa entrenador02 ;El Puerto B, que actúa como salida, es controlado por el bit 0 del Puerto A, que actúa como entrada. De maneratal, que:
;Si RA0=1, se encienden todos los LEDs de salida;Si RA0=0, se encienden sólo los LEDs del nibble alto
;***********************************************************
;Zona de Datos**********************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de Codigos *******************************************
INICIO bsf STATUS,RP0; Entra al modo de configuracion de los puertos
;Configuracion de puertos***********************************
clrf TRISB; LAS LINEAS DEL PUERTO B CONFIGURADAS COMO SALIDAS
movlw b'00000001'; Las lineas del puerto A configuradas como entrada movwf TRISA; Mueve w al registro f ; Cero si es salida y uno si es entrada
bcf STATUS,RP0; Sale del modo de configuracion de los puertos
; Inicio del programa de Bucle*********************************************
Principal ; Inicio del bucle del programa
BTFSC PORTA, 0; Instruccion para elejir una opcion dependiendo del bit 0 en el puerto A
GOTO Principal1; Envia a los nibbles de arribaGOTO Principal2; Envia a todos los nibbles
Principal1 movlw b'11110000'; Manda a encender los nibles de arriba Movwf PORTB; manda w a los registros de B GOTO Principal ; Envia al inicio del programa
Principal2 movlw b'11111111'; Manda a encender todos los leds Movwf PORTB; Manda a las Salidas
GOTO Principal; Crea un bucle cerrado e infinito END; Fin del programa
;Programa entrenador01 ;enciende el nibble alto de la barra de LEDS;y apaga el nibble bajo;***********************************************************
;Zona de datos**********************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de codigos********************************************
bsf STATUS,RP0; Entra al modo de configuracion de los puertos ;Configuracion de puertos***********************************
movlw b'00000000'; Las lineas del puerto B configuradas como salidas
movwf TRISB; Mueve w al registro f movlw b'00000001'; Registra todos los puertos de A como salidas movwf TRISA; Mueve w al registro f
bcf STATUS,RP0; Sale del modo de configuracion de los puertos ; Inicio del programa de Bucle*********************************************
INICIO ; Inicio del bucle del programa
movlw b'11110000'; manda a las salidas a w Movwf PORTB; manda w a los registros de B END; Fin del programa .
;Programa tiempos03. ;Los puertos A y B se usaran como salidas, ;debe de haber conectados 13 leds, ;inicialmente se deben encender los leds conectados a RA0 y a RB7, ;después de medio segundo deben de apagarse y encenderse los leds conectados a RA1 y RB6,
;medio segundo después, se apagan y se encienden los leds conectados a RA2 y RB5,;medio segundo mas tarde, se apagan y encienden los leds de RA3 y RB4, el proceso sigue así, ;para RA4 y RB3, RB1 y RB2, cuando se apaguen RB1 y RB2 debe pasar un segundo, ;y deben encenderse todos los leds por 2 segundos, apagarse por 2 segundos, ;encenderse por un segundo, apagarse un segundo, encenderse por medio segundo, ;apagarse, esperar un segundo y volver a repetir desde el principio.
;***********************************************************
;Zona de Datos**********************************************
__CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_XT_OSC
LIST P=16F84A; Procesador Utilizado.
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados.
CBLOCK 0x0C; Definimos algunas constantes y etiqutasENDC ; Salimos del modo de definicon.
SEC1 equ b'00000000';Cada una de estas etiquetasSEC2 equ b'10000000';tiene asignado un movimentoSEC3 equ b'01000000';de la secuancia deseada.SEC4 equ b'00100000';Se inicia todos los puertos a ceroSEC5 equ b'00010000';para que la secuencia no se desfase.SEC6 equ b'00001000'SEC7 equ b'00000110'SEC8 equ b'00000000'
SEC9 equ b'00000001'SEC10 equ b'00000010'SEC11 equ b'00000100'SEC12 equ b'00001000'SEC13 equ b'00010000'SEC14 equ b'00000000'SEC15 equ b'00000000'SEC16 equ b'11111111'
;Zona de Codigos ******************************************* ORG 0;Indica en que parte de la memoria incia el programa.
BSF STATUS,5 ; activa la pagina 1 MOVLW B'00000' ; carga 00000 en W MOVWF TRISA ; puerto A se configura como salida MOVLW B'00000000' ; carga 00000000 en W MOVWF TRISB ; puerto B se configura como salida BCF STATUS,5 ; volvemos a la pagina 0 CLRF PORTA; ponemos a cero el puerto ACLRF PORTB ; ponemos a cero el puerto B
Inicio ; inicio del programa de bucle.
Repetir. ;Etiqueta de la secuencia deseada
MOVLW SEC8 ; carga el valor de SEC8 en WMOVWF PORTA; carga w en el puerto A MOVLW SEC1 ; carga el valor de SEC1 en WMOVWF PORTB; carga el valor de W en el puerto B CALL Retardo_500ms ; demora de 500ms
MOVLW SEC9 ; carga el valor de SEC9 en WMOVWF PORTA ; carga w en el puerto A MOVLW SEC2 ; carga el valor de SEC2 en WMOVWF PORTB ; carga el valor de W en el puerto BCALL Retardo_500ms ; demora de 500ms
MOVLW SEC10 ; carga el valor de SEC10 en WMOVWF PORTA ; carga w en el puerto A MOVLW SEC3 ; carga el valor de SEC3 en WMOVWF PORTB ; carga el valor de W en el puerto BCALL Retardo_500ms ; demora de 500ms
MOVLW SEC11 ; carga el valor de SEC11 en WMOVWF PORTA ; carga w en el puerto A MOVLW SEC4 ;carga el valor de SEC4 en WMOVWF PORTB ;carga el valor de W en el puerto BCALL Retardo_500ms ; demora de 500ms
MOVLW SEC12 ; carga el valor de SEC12 en WMOVWF PORTA ; carga w en el puerto A MOVLW SEC5 ;carga el valor de SEC5 en WMOVWF PORTB ;carga el valor de W en el puerto BCALL Retardo_500ms ; demora de 500ms
MOVLW SEC13 ; carga el valor de SEC13 en WMOVWF PORTA ; carga w en el puerto A MOVLW SEC6 ;carga el valor de SEC6 en WMOVWF PORTB ; carga el valor de W en el puerto BCALL Retardo_500ms ; demora de 500ms
MOVLW SEC14 ; carga el valor de SEC14 en WMOVWF PORTA ; carga w en el puerto A MOVLW SEC7 ;carga el valor de SEC7 en WMOVWF PORTB ;carga el valor de W en el puerto BCALL Retardo_500ms ; demora de 500ms
MOVLW SEC15 ; carga el valor de SEC15 en WMOVWF PORTA ; carga w en el puerto A MOVLW SEC15 ; carga el valor de SEC15 en WMOVWF PORTB ; carga el valor de W en el puerto BCALL Retardo_1s ; demora de 500ms
MOVLW SEC16 ; carga el valor de SEC16 en WMOVWF PORTA ; carga w en el puerto B MOVLW SEC16 ; carga el valor de SEC16 en W
MOVWF PORTB ; carga el valor de W al puerto BCALL Retardo_2s ; demora de 500ms
MOVLW SEC15 ; carga el valor de SEC15 en WMOVWF PORTA ; carga w en el puerto A MOVLW SEC15 ; carga el valor de SEC15 en WMOVWF PORTB ; carga el valor de W en el puerto BCALL Retardo_2s ; demora de 500ms
MOVLW SEC16 ; carga el valor de SEC16 en WMOVWF PORTA ; carga w en el puerto A MOVLW SEC16 ; carga el valor de SEC16 en WMOVWF PORTB ; carga el valor de W en el puerto BCALL Retardo_1s ; demora de 500ms
MOVLW SEC15 ; carga el valor de SEC15 en WMOVWF PORTA ; carga w en el puerto A MOVLW SEC15 ; carga el valor de SEC15 en WMOVWF PORTB ; carga el valor de W en el puerto BCALL Retardo_1s ; demora de 500ms
MOVLW SEC16 ; carga el valor de SEC16 en WMOVWF PORTA ; carga w en el puerto A MOVLW SEC16 ;carga el valor de SEC16 en WMOVWF PORTB ;carga el valor de W en el puerto BCALL Retardo_500ms ; demora de 500ms
MOVLW SEC15 ; carga el valor de SEC15 en WMOVWF PORTA ; carga w en el puerto A MOVLW SEC15 ; carga SEC15 en WMOVWF PORTB ; carga el valor de W en el puerto BCALL Retardo_500ms ; demora de 500msGOTO Inicio
INCLUDE <RETARDOS.INC>;Biblioteca de retardos.END; Fin del programa.
;Programa Selector.;Por la barra de LEDS conectada al puerto de salida se visualiza un juego de luces con;la secuencia expresada en binario 1,1,2,3...233, es decir los números de la sucesión;de Fibonacci. La velocidad del movimiento será fijada por la lectura de 3 switches;conectados al puerto A de manera que se visualice cada posición durante un tiempo:;Si (PORTA)=0, cada posición se visualiza durante 0x100 ms=0 ms;Si (PORTA)=1, cada posición se visualiza durante 1x100 ms=100;Si (PORTA)=2, cada posición se visualiza durante 2x100 ms=200;Si (PORTA)=3, cada posición se visualiza durante 3x100 ms=300;Si (PORTA)=4, cada posición se visualiza durante 4x100 ms=400;Si (PORTA)=7, cada posición se visualiza durante 7x100 ms=700
;***********************************************************
;Zona de Datos**********************************************
__CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
CBLOCK 0x0C ;define el valo de una cosntante o vectorTablaLongitud ;etiquetasTablaPosicion ;etiquetasContadorTiempo ;etiquetasGuardaContador ;etiqutasENDC ;termina c
;Zona de Codigos *******************************************
ORG 0 ;indica al compilador que el código por debajo de ella debealojarse a partir de la posición de memoria 0 del PICInicio
bsf STATUS,RP0 ; Entra al modo de configuracion de puertos.clrf PORTB ; Limpia el puerto B.movlw b'00000111' ; El puerto A se configura como entrada.movwf PORTA ;Mueve el valor al puerto A.bcf STATUS,RP0 ;Sale del modo de configuracion de puertos.
Principalclrf PORTB ; El puerto de salida esta apagado.movf PORTA,W ; Lee el puerto de entrada.andlw b'00000111' ; Almacena la información válida.movwf ContadorTiempo ; Lo pasa al contadormovwf GuardaContador ; y a su copia.movf ContadorTiempo,F ; Comprueba si es cero.btfsc STATUS,Z ; Si es cero sale fuera.goto Finmovlw TablaFin-TablaInicio ; Calcula la longitud de la tabla y la carga enmovwf TablaLongitud ; este registro que actuará como contador.clrf TablaPosicion ; Apunta a la primera posición de la tabla.
VisualizaOtraPosicionmovf TablaPosicion,W ; Aquí posición a leer de la tabla.call LeeTabla ; Visualiza la posición de la tabla.movwf PORTB ; El resultado se visualiza por la salida.movf GuardaContador,W ; Recupera el valor del contador.movwf ContadorTiempo
MantieneVisualizacion ; Durante un tiempo igual a (ContadorTiempo)x100 ms.call Retardo_100msdecfsz ContadorTiempo,F ;aplica el retardo.goto MantieneVisualizacion; aplica el bucle incf TablaPosicion,F ; apunta a la siguiente posición por visualizar.decfsz TablaLongitud,F ; ¿Ha terminado la tabla?goto VisualizaOtraPosicion ; No, pues visualiza la siguiente posición.
Fin goto Principal ; aplica el bucle infinito desde principal
; Subrutina "LeeTabla" ------------------------------------------------------------------
;LeeTabla
addwf PCL,FTablaInicio ; Indica la posición inicial de la tabla.
retlw b'00000000' ; Cada uno de los siguientes valores es retlw b'00000001' ; forma parte de la sucesion de fibonacciretlw b'00000001' ; en binarioretlw b'00000010'retlw b'00000011'retlw b'00000101'retlw b'00001000'retlw b'00001101'retlw b'00010101'retlw b'00100010'retlw b'00110111'retlw b'01011001'retlw b'10010000'retlw b'11101001'
TablaFin ; Indica la posición final de la tabla.
INCLUDE <RETARDOS.INC>; Utiliza la biblioteca de retardosEND.
;Programa Contador.;Se pone el 0 en binario, y en incrementos de 50 milisegundos, muestra sucesivamente;el 1,2,3,4…255 en binario, una vez que llegue al 255 que son los 8 leds encendidos,;comienza la cuenta regresiva 254,253,252,…0 y de ahí comenzar nuevamente el;programa.
;Zona de Datos**********************************************__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de Codigos *******************************************
ORG 0 bsf STATUS,RP0; Entra al modo de configuracion de los puertos
;Configuracion de puertos***********************************
clrf TRISB; LAS LINEAS DEL PUERTO B CONFIGURADAS COMO SALIDAS
movlw b'00011111'; Las lineas del puerto A configuradas como entrada movwf TRISA; Mueve w al registro f
; Cero si es salida y uno si es entrada
bcf STATUS,RP0; Sale del modo de configuracion de los puertos
; Inicio del programa de Bucle*********************************************g
CBLOCK 0X0C ; Define a numero NumeroENDCmovlw d'0' ; Mueve numero al registro wmovwf Numero ; Mueve Numero a F
Rutina
suma incfsz Numero,f; incrementa una unidad a numero, si es mayor que 255 salta a la siguiente intruccion
goto Bucle ; Envia a salida del puerto Bgoto Bucle2 ; Es mas de 255 y envia a la resta
Bucle movf Numero,W ; mueve numero a Wmovwf PORTB ; Mueve w al puerto BCALL Retardo_50ms ; Llama a retardo de 50 msgoto Rutina ; Envia al inicio de la suma
Bucle2 decfsz Numero,f ; Decrece en una unidad si es diferente de 0 sigue si igual a cero salta a la siguienteinstruccion
goto Bucle3 ; Envia a la salida del puerto Bgoto suma ; Como es cero envia a la suma
Bucle3 movf Numero,W ;Envia numero a Wmovwf PORTB ;Envia W al puerto B (salida)
CALL Retardo_50ms ;Llama a retardo de 50 msgoto Bucle2 ;Manda a la resta
INCLUDE <RETARDOS.INC> ; Incluye la libreria de retardosEND ; Fin del Programa
;Programa Selector.;Compara el numero definido '21', con el numero asignado con las entradas;del puerto A. ;************************************************************
;Zona de Datos**********************************************__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado.
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados.
;Zona de Codigos *******************************************
ORG 0 ; indica a la memoria en que posicion iniciar. bsf STATUS,RP0; Entra al modo de configuracion de los puertos.
;Conconfiguracion de puertos***********************************
clrf TRISB; Las lineas del púerto B se configuran como salidas.
movlw b'00011111'; Las lineas del puerto A configuradas como entradas. movwf TRISA; Mueve w al registro f. ; Cero si es salida y uno si es entrada.
bcf STATUS,RP0; Sale del modo de configuracion de los puertos
; Inicio del programa de Bucle********************************************* CBLOCK 0X0C ; Definimos etiquetas y constantes.Numero ;Etiqueta.ENDC ;Sale del modo de definicion.movlw d'21'; Mueve numero al registro wmovwf Numero ; Mueve Numero a F
Rutina movf PORTA,W ; mueve el valor del puerto A a W
subwf Numero,W ; hace la resta PORTA - numero
menor movlw b'00001111';Supone que la entrada es menor
btfss STATUS,C; Verifica el valor el C de la resta si es C=1 salta al siguiente comando goto salida ; Envia a la salida igual movlw b'11111111'; Supone que los dos numeros son iguales son iguales
btfsc STATUS,Z ; Ve si Z=0 si es cero salta a siguiente comando
goto salida ; si Z=1 son iguales y envia a la salida
mayor movlw b'11110000' ; Z=0 y entonces no son iguales, por lo tanto la entrada es mayor
salida movwf PORTB ;Envia a salida
Goto Rutina; Bucle de proceso infinito
END; Fin del programa
;Programa Suma.;Programa donde desde la computadora se teclea un número, ;lo manda al pic, y el pic regresa el numero mas 3. Los números ;que se introducen son del 0 al 6.;************************************************************
;Zona de Datos**********************************************__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de Codigos *******************************************
CBLOCK 0x0C ;Define VariableGuardaDatoNumeroENDC ;Termina definir variable.
; Inicio del programa de Bucle*********************************************
Inicio ORG 0
call LCD_Inicializa ;Llama a la sub rutina de LCD
call RS232_Inicializa ; Inicia la comunicación con el puerto
Principal
call RS232_LeeDato ; Envia a subrutina para leer dato
movwf GuardaDato ; Lo envia a GuardaDato
call LCD_Caracter ; Se visualiza el dato en pantalla
Suma ;Subrutina Suma
movf GuardaDato,W ;pone el dato de entrada en W
addlw 3 ;le suma 3
call RS232_EnviaDato ;llama a la subrutina
Goto Principal ;bucle infinito
INCLUDE <RS232.INC> ; Incluye libreria de conexion INCLUDE <LCD_4BIT.INC> ; Incluye libreria de LCDINCLUDE <RETARDOS.INC> ; Incluye la libreria de retardos
END ; Fin del Programa
;Programa Mundo;Guarda un mensaje en el PIC, por ejemplo:;Hola Mundo;Mi nombre es:Erick. Y lo despliega en el monitor de la computadora repetidamente a intervalos de 1 segundo.;************************************************************
;Zona de Datos**********************************************__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de Codigos *******************************************
CBLOCK 0X0C ;Inicimos el valor de etiquetas.ENDC
RetornoCarro EQU .13 ;Definimos el valor de las etiquetas.CambioLinea EQU .10
; Inicio del programa de Bucle*********************************************
Inicio
call LCD_Inicializa ;Llama a la sub rutina de LCD
call RS232_Inicializa ; Inicia la comunicación con el puerto
Principal
movlw Mensaje0 ; Mueve Mensaje a W
call RS232_Mensaje ; Llama a subrutina de Mensaje
call Retardo_1s ; Llama a retardo de un 1s
Goto Principal ; Envia a Principal
;Configuración de Mensaje *******************************************************************
Mensajes
addwf PCL,F ; Suma PCL a F
Mensaje0
DT RetornoCarro ; Envia a pantalla un espacio
DT "Hola Mundo" ;Envia el mensaje Hola Mundo
DT RetornoCarro, CambioLinea ; Envia a pantalla un espacio
DT "Mi nombre es Erick" ; Envia a pantalla Mi nombre es Erick
DT CambioLinea, CambioLinea, CambioLinea, 0X00 ; Envia a pantalla 3 espacios
INCLUDE <RS232.INC> ; Incluye libreria de conexion INCLUDE <RS232MEN.INC> ;Incluye libreria de conexionINCLUDE <LCD_4BIT.INC> ; Incluye libreria de LCDINCLUDE <RETARDOS.INC> ; Incluye la libreria de retardos
END ; Fin del Programa
;Programa Leds.;Hacer un programa que desde la computadora mande una señal para prender 8 leds y;otra para apagarlos. Con 1 que se enciendan y con 0 que se apaguen;*********************************************************************************
;Zona de Datos********************************************************************
__CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
CBLOCK 0x0C TeclaPulsada ; Va a guardar el contenido de la tecla pulsada. MensajeApuntado ; Va a guarda la dirección del mensaje apuntado. ENDC #DEFINE Salida1 PORTB,7 ; Define puerto de salidas #DEFINE Salida2 PORTB,6 ; Define dónde se sitúa cada una de las salidas. #DEFINE Salida3 PORTB,5 #DEFINE Salida4 PORTB,4 #DEFINE Salida5 PORTB,3 #DEFINE Salida6 PORTB,2 #DEFINE Salida7 PORTB,1 #DEFINE Salida8 PORTB,0
TECLA1_ON EQU '1' ; Código de las teclas utilizadas. TECLA1_OFF EQU '0'
;Zona de Codigos *****************************************************************
ORG 0
; Inicio del programa de Bucle*********************************************
Inicio call LCD_Inicializa ; Inicializa el display LCD
call RS232_Inicializa ; Inicializa RS232 bsf STATUS,RP0 ; Configura como salidas las 8 líneas del bcf Salida1 ; del Puerto B bcf Salida2 bcf Salida3 bcf Salida4
bcf Salida5 bcf Salida6 bcf Salida7 bcf Salida8
bcf STATUS,RP0 ;Sale de la configuracion de puertos call Parado ;En un pricipio los leds deben estar apagados
Principal ; apagados.call RS232_LeeDato ; Espera a recibir un carácter.call TesteaTeclado ; Verifica caracter recibido y ejecuta acciongoto Principal ; Loop Infinito;**************************************************************************** ;* Testea Teclado * ;* * ;* Verifica caracer recibido y decide que accion ejecutar * ;**************************************************************************** TesteaTeclado movwf TeclaPulsada ; Guarda el contenido de la tecla pulsada. xorlw TECLA1_ON ; ¿Es la tecla del movimiento hacia adelante? btfsc STATUS,Z ; goto R1_ON ; Sí, se desea movimiento hacia adelante. movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada. xorlw TECLA1_OFF ; ¿Es la tecla del movimiento hacia atrás? btfsc STATUS,Z ; goto R1_OFF ; Sí, se desea movimiento hacia atrás. goto Fin R1_ON bsf Salida1 ;Mantiene todas las salidas prendidas bsf Salida2 bsf Salida3 bsf Salida4
bsf Salida5 bsf Salida6 bsf Salida7 bsf Salida8
goto Fin
R1_OFF bcf Salida1 ;Mantiene todas las salidas apagadas bcf Salida2 bcf Salida3 bcf Salida4
bcf Salida5 bcf Salida6 bcf Salida7 bcf Salida8
goto Fin
Parado bcf Salida1 ;Mantiene todas las salidas apagadas, el sistema se encuentra detenido bcf Salida2 bcf Salida3 bcf Salida4
bcf Salida5 bcf Salida6 bcf Salida7 bcf Salida8
Finreturn
INCLUDE <RS232.INC> ;Librerias utilizadas.INCLUDE <RETARDOS.INC>
INCLUDE <LCD_4BIT.INC>
END ;Fin del programa
;Programa Encendido.;Hacer un programa que desde la computadora mande un numero entre 1 y 8;de acuerdo con esto se enciendan 1 led, 2 led y asi hasta 8;cualquier otra tecla no debe generar algun efecto.;*********************************************************************************
;Zona de Datos********************************************************************
__CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
CBLOCK 0x0C TeclaPulsada ; Va a guardar el contenido de la tecla pulsada. MensajeApuntado ; Va a guarda la dirección del mensaje apuntado. ENDC
#DEFINE Salida1 PORTB,7 ; Define puerto de salidas #DEFINE Salida2 PORTB,6 ; Define dónde se sitúa cada una de las salidas. #DEFINE Salida3 PORTB,5 #DEFINE Salida4 PORTB,4 #DEFINE Salida5 PORTB,3 #DEFINE Salida6 PORTB,2 #DEFINE Salida7 PORTB,1 #DEFINE Salida8 PORTB,0
UnLed EQU '1' ; Código de las teclas utilizadas. DosLed EQU '2' TresLed EQU '3' CuatroLed EQU '4' CincoLed EQU '5' SeisLed EQU '6' SieteLed EQU '7' OchoLed EQU '8';Zona de Codigos *****************************************************************
ORG 0
; Inicio del programa de Bucle*********************************************
Inicio call LCD_Inicializa ; Inicializa el display LCD
call RS232_Inicializa ; Inicializa RS232 bsf STATUS,RP0 ; Configura como salidas las 8 líneas del bcf Salida1 ; del Puerto B bcf Salida2 bcf Salida3 bcf Salida4
bcf Salida5 bcf Salida6 bcf Salida7 bcf Salida8
bcf STATUS,RP0 ;Sale de la configuracion de puertos call Parado ;En un pricipio los leds deben estar apagados
Principal ; apagados.call RS232_LeeDato ; Espera a recibir un carácter.call TesteaTeclado ; Verifica caracter recibido y ejecuta acciongoto Principal ; Loop Infinito;**************************************************************************** ;* Testea Teclado * ;* * ;* Verifica caracer recibido y decide que accion ejecutar * ;**************************************************************************** TesteaTeclado movwf TeclaPulsada ; Guarda el contenido de la tecla pulsada. xorlw UnLed ; ¿Es la tecla del movimiento hacia adelante? btfsc STATUS,Z ; goto L1_ON ; Sí, se desea movimiento hacia adelante. movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw DosLed ; ¿Es la tecla del movimiento hacia atrás? btfsc STATUS,Z ; goto L2_ON ; Sí, se desea movimiento hacia atrás.
movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada. xorlw TresLed ; ¿Es la tecla del movimiento hacia adelante? btfsc STATUS,Z ; goto L3_ON ; Sí, se desea movimiento hacia adelante.
movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada. xorlw CuatroLed ; ¿Es la tecla del movimiento hacia adelante? btfsc STATUS,Z ; goto L4_ON ; Sí, se desea movimiento hacia adelante.
movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada. xorlw CincoLed ; ¿Es la tecla del movimiento hacia adelante? btfsc STATUS,Z ; goto L5_ON ; Sí, se desea movimiento hacia adelante.
movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada. xorlw SeisLed ; ¿Es la tecla del movimiento hacia adelante? btfsc STATUS,Z ; goto L6_ON ; Sí, se desea movimiento hacia adelante. movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada. xorlw SieteLed ; ¿Es la tecla del movimiento hacia adelante? btfsc STATUS,Z ; goto L7_ON ; Sí, se desea movimiento hacia adelante.
movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada. xorlw OchoLed ; ¿Es la tecla del movimiento hacia adelante? btfsc STATUS,Z ; goto L8_ON ; Sí, se desea movimiento hacia adelante. ; goto Lomismo ;tecla no valida
L8_ON ;Definimos el modo en que deseamosque se ejecute bsf Salida1 ;cada una de las salidas, desde un solo led encendido bsf Salida2 ; hasta los 8 mas una rutina donde todos se encuentran bsf Salida3 ; apagados y otra donde no se realiza alguna accion bsf Salida4
bsf Salida5 bsf Salida6 bsf Salida7 bsf Salida8
goto Fin
L1_ON ;Un led encendido bsf Salida1 bcf Salida2 bcf Salida3
bcf Salida4 bcf Salida5 bcf Salida6 bcf Salida7 bcf Salida8
goto Fin
L2_ON ;Dos led encendidos bsf Salida1 bsf Salida2 bcf Salida3 bcf Salida4
bcf Salida5 bcf Salida6 bcf Salida7 bcf Salida8
goto Fin
L3_ON ;Tres led encendidos bsf Salida1 bsf Salida2 bsf Salida3 bcf Salida4
bcf Salida5 bcf Salida6 bcf Salida7 bcf Salida8
goto Fin
L4_ON ;Cuatro led encendidos bsf Salida1 bsf Salida2 bsf Salida3 bsf Salida4
bcf Salida5 bcf Salida6 bcf Salida7 bcf Salida8
goto Fin
L5_ON ;Cinco led encendidos bsf Salida1 bsf Salida2 bsf Salida3 bsf Salida4
bsf Salida5 bcf Salida6 bcf Salida7 bcf Salida8
goto Fin
L6_ON ;Seis Led encendidos bsf Salida1
bsf Salida2 bsf Salida3 bsf Salida4
bsf Salida5 bsf Salida6 bcf Salida7 bcf Salida8
goto Fin
L7_ON ;Siete eld encendidos. bsf Salida1 bsf Salida2 bsf Salida3 bsf Salida4
bsf Salida5 bsf Salida6 bsf Salida7 bcf Salida8
goto Fin Parado ;Todos apagados bcf Salida1 bcf Salida2 bcf Salida3 bcf Salida4
bcf Salida5 bcf Salida6 bcf Salida7 bcf Salida8
Lomismo ;no hace algun cambio.
Fin ;Regresareturn
INCLUDE <RS232.INC>INCLUDE <RETARDOS.INC>
INCLUDE <LCD_4BIT.INC>
END ;Fin del programa
;Programa Motores.;Dos motores están conectados al pic mediante el driver L293B (usar en la simulación el L293D);Se usan 4 interruptores, un interruptor para determinar el sentido de giro de cada uno de los motores.;Las combinaciones de los otros dos interruptores, deben seguir la siguiente tabla.;Interruptor 1 Interruptor 2 Motor 1 Motor 2;1 1 Encendido Encendido;0 1 Encendido Apagado;1 0 Apagado Encendido;0 0 Apagado
Apagado
;******************************************************************************************************;Zona dedatos***************************************************************************************** __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC LIST P=16F84A ;PIC usado INCLUDE <P16F84A.INC> ;Paqueteria usada.#DEFINE SalidaSentido PORTB,0 ; Definimos el valor de cada uno de los bits#DEFINE SalidaSentido2 PORTB,7#DEFINE SalidaMarcha PORTB,1#DEFINE SalidaMarcha2 PORTB,6#DEFINE EntradaMarcha PORTA,0#DEFINE EntradaMarcha2 PORTA,4#DEFINE EntradaSentido PORTA,1#DEFINE EntradaSentido2 PORTA,3
; ZONA DE CÓDIGOS *********************************************************************
ORG 0 ;El programa incia en el bit cero de la memoriaInicio
bsf STATUS,RP0 ;Entramos al modo de configuracion de puertos.bsf EntradaMarcha ; Configura las líneas de entrada y salida.bsf EntradaSentidobsf EntradaMarcha2bsf EntradaSentido2bcf SalidaMarchabcf SalidaSentidobcf SalidaMarcha2bcf SalidaSentido2bcf STATUS,RP0
Principal btfsc EntradaMarcha ; Comprueba el estado del interruptor de funcionamiento.
goto Gira ; Si el interruptor esta encendido, envia a la subrutina.bcf SalidaMarcha ; Para el motor, poniendo a cero la línea de habilitacion.
Principal2btfsc EntradaMarcha2 ; Comprueba el estado del interruptor de funcionamiento.goto Gira2bcf SalidaMarcha2 ; Para el motor, poniendo a cero la línea de habilitacion.
Principal3 btfsc EntradaSentido ; Comprueba el estado del interruptor de funcionamiento.
goto Gira3bcf SalidaSentido ; Para el motor, poniendo a cero la línea de habilitacion.
Principal4btfsc EntradaSentido2 ; Comprueba el estado del interruptor de funcionamiento.goto Gira4bcf SalidaSentido2 ; Para el motor, poniendo a cero la línea de habilitacion.;goto Fin3 ; habilitación y sale.
Girabsf SalidaMarcha ; Pone en marcha el motor.goto Fin
Gira2bsf SalidaMarcha2 ; Pone en marcha el motor.goto Fin2
Gira3bsf SalidaSentidogoto Fin3
Gira4bsf SalidaSentido2 ; Pone en marcha el motor.goto Fin4
Fin ;Inicia los bucles infinitos.goto Principal2Fin2goto Principal3Fin3goto Principal4Fin4goto Principal
END
;Laboratorio de Robotica y control;Programa:Motor compu;Desde la computadora, dependiendo de la tecla, se obtiene lo siguiente:
;Tecla Efecto
;1 Enciende todos los motores;0 Apaga todos los motores;D Los motores giran a la derecha;I Los motores giran a la izquierda;M Un motor gira a la derecha y otro a la izquierda;L Los motores se mueven a la mitad de la velocidad máxima ;A Los motores se mueven a velocidad máxima
;************************************************************
;Zona de Datos**********************************************__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
;Zona de Codigos *******************************************
ORG 0 bsf STATUS,RP0; Entra al modo de configuracion de los puertos
;Configuracion de puertos***********************************
clrf TRISB; LAS LINEAS DEL PUERTO B CONFIGURADAS COMO SALIDAS
; Cero si es salida y uno si es entrada
bcf STATUS,RP0; Sale del modo de configuracion de los puertos
;Zona de Codigos *******************************************
CBLOCK 0x0C ;Define VariableTeclaPulsadaCiclos_ONCiclos_OFFGuardaEntradaENDC
movlw d'0' ; Mueve numero al registro wmovwf GuardaEntrada ; Mueve Numero a F
;Definicion de Teclas
EnciendeTodos EQU '1' ; Código de las teclas utilizadas. ApagaTodos EQU '0' TodosDerecha EQU 'd' TodosIzquierda EQU 'i' DerechaIzquierda EQU 'm' MitadV EQU 'l' MaximaV EQU 'a'
call LCD_Inicializa
call RS232_Inicializa ; Inicia la comunicación con el puerto
Principal
call RS232_LeeDato ; Envia a subrutina para leer dato
call TesteaTeclado ;; Verifica caracter recibido y ejecuta accion
goto Principal;****************************************************************************;* Teclado *;* *;* Verifica caracer recibido y decide que accion ejecutar *;****************************************************************************
TesteaTeclado
movwf TeclaPulsada ; Guarda el contenido de la tecla pulsada. xorlw EnciendeTodos ; ¿Es la tecla del encendido? btfsc STATUS,Z ; goto TodosEncendidos ; Sí movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada. xorlw ApagaTodos ; ¿Es la tecla de todos apagados? btfsc STATUS,Z ; goto TodosApagados ; Sí
movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada. xorlw TodosDerecha ; ¿Es la tecla de todos derecha? btfsc STATUS,Z ; goto Derecha ; Sí
movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada. xorlw TodosIzquierda ; ¿Es la tecla de todos izquierda? btfsc STATUS,Z ; goto Izquierda ; Sí
movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada. xorlw DerechaIzquierda ; ¿Es la tecla de uno derecha y otro opuesto? btfsc STATUS,Z ; goto DI ; Sí
movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada. xorlw MitadV ; ¿Es la tecla de mitad de velocidad? btfsc STATUS,Z ; goto MediaVelocidad ; Sí movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada. xorlw MaximaV ; ¿Es la tecla de maxima velocidad? btfsc STATUS,Z ; goto AltaVelocidad ; Sí
TodosEncendidos
movlw b'10100110' ; envia a todos encendidos
goto ActivaSalida ; envia a la sailida de puerto
TodosApagados
clrf PORTB ; Apaga los motores
goto ActivaSalida ; envia a salida de puerto
Derecha
movlw b'10100110' ; Los motores hacia la derecha
goto ActivaSalida ; envia a la salida de puerto
Izquierda
movlw b'01100101' ; los dos motores hacia la izquierda
goto ActivaSalida ; encia a salida de puerto
DI
movlw b'01100110' ; Un motor hacia la derecha y otro en direccion opuesta
goto ActivaSalida ; envia salida de puerto
MediaVelocidad
movlw Ciclos_OFF ; Mueve ciclos a wmovf GuardaEntrada,W; envia guardar dato a wmovwf Ciclos_ON ; Envia ciclos on a f
motor_ON
movlw b'10100110' ;Enciende los motoresmovwf PORTBcall Retardo_5ms ; Llama a un retardo de 5msdecfsz Ciclos_ON,F ;Si es 0 salta a la siguiente instrucciongoto motor_ON+2 ; envia a motor encendido +2
motor_OFF
clrf PORTB ;pone a ceros el puerto bcall Retardo_5ms ;llama a un retardo de 5msdecfsz Ciclos_OFF,F ;verifica si ciclos off es 0 si es asi salta a la siguiente instrucciongoto motor_OFF+1 ;envia a motor off +1goto ActivaSalida ; envia a salida
AltaVelocidad
movlw b'10100110' ;Enciende los dos motores a maxima velocidad
goto ActivaSalida ; Envia a Salida del puerto
; Salida de Puerto ********************************************************
ActivaSalida
movwf PORTB ;Manda a la salida del puerto B
return ;termina subrutina Crea un bucle cerrado e infinito
INCLUDE <RS232.INC> ; Incluye libreria de conexion INCLUDE <RETARDOS.INC>INCLUDE <LCD_4BIT.INC>
END ; Fin del Programa
;Robotica y control;Programa:Giro;Programa para controlar un motor de corriente directa (DC);El puerto A se define como entrada, se conectaran 2 interruptores;El puerto B se usara como salida;El interruptor RA0 si manda 1, el motor se mueve, si manda 0, el motor se detiene;El interruptor RA1 determina si el giro es para la derecha o para la izquierda.;************************************************************
;Zona de Datos**********************************************__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A; Procesador Utilizado
INCLUDE <P16F84A.INC>; Definicion algunos Operados utilizados
#DEFINE EntradaMarcha PORTA,0 ;Define el puerto y su utilización (encendido o apagado)
#DEFINE EntradaSentido PORTA,1 ;Define el puerto y su utilización (giro derecha o izquierda)
;Zona de Codigos *******************************************
ORG 0Inicio bsf STATUS,RP0; Entra al modo de configuracion de los puertos
bsf EntradaMarcha
bsf EntradaSentido
clrf PORTB ; Las lineas del puerto B configuradas como salidas
bcf STATUS,RP0
Principal
clrw ;Con esta combinacion se detiene el motor
btfsc EntradaMarcha ;Comprueba el estado del interruptor de funcionamiento
goto ActivaSalida
movlw b'00000110' ;Gira en un sentido
btfsc EntradaSentido
movlw b'00000101' ;Gira en otro sentido
ActivaSalida
movwf PORTB ;Manda a la salida del puerto B
goto Principal ; Crea un bucle cerrado e infinito
END; Fin del programa
;Robotica y control.;Programa:robot seguidor.
; Programa de control para el microbot TRASTO, el cual se desplaza siguiendo una línea negra; marcada sobre fondo blanco a modo de pista.;; Los sensores ópticos de reflexión CNY70 están situados en la parte delantera inferior del; microbot: El sensor de la derecha está conectado a RA0 y el sensor de la izquierda a RA1. ;; El programa adopta la estrategia de seguir la línea por el borde derecho:; - Si detecta que está en el borde derecho: sensor izquierdo sobre negro y derecho sobre; blanco sigue en hacia delante.; - Si el sensor de la derecha detecta línea negra gira hacia la derecha buscando el borde,; independientemente de como esté el sensor de la izquierda.; - Si el microbot tiene los dos sensores fuera de la línea, se le hace girar a la izquierda; hasta que vuelva a encontrarla.;; La señal de los sensores CNY70 se aplican a las entradas del microcontrolador a través de un; inversor 40106 de manera tal, que para color:; - Color Blanco --> transistor saturado --> entrada al inversor "0" --> RAx = "1".; (No está encima de la línea negra, se ha salido de la pista); - Color Negro --> transistor en corte --> entrada al inversor "1" --> RAx = "0".; (Está encima de la línea negra, está dentro de la pista);; ZONA DE DATOS **********************************************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSCLIST P=16F84AINCLUDE <P16F84A.INC>
#DEFINE SensorDerecha PORTA,0 ; Sensor óptico Derecho.#DEFINE SensorIzquierda PORTA,1 ; Sensor óptico Izquierdo.
; ZONA DE CÓDIGOS ********************************************************************
ORG 0Inicio
bsf STATUS,RP0 ; Selecciona Banco 1 de registros.bsf SensorDerecha ; Estas líneas se configuran como entrada.
bsf SensorIzquierdaclrf PORTB ; Las líneas del Puerto B se configuran como salidas.bcf STATUS,RP0 ; Selecciona Banco 0 de registros.
Principalmovlw b'00001110' ; Para girar a la derecha.btfss SensorDerecha ; ¿Ha salido por la derecha?, ¿detecta blanco?goto ActivaSalida ; No, el detector derecho está encima de la línea
; negra, gira a la derecha.movlw b'00000111' ; Para girar a la izquierda.btfss SensorIzquierda ; ¿Ha salido también por la izquierda?movlw b'00001111' ; No, está en el borde derecho. Sigue recto.
ActivaSalidamovwf PORTBgoto Principal
END
;Robotica y control.;Programa:robot baliza; Programa de control para Microbot TRASTO el cual detecta una baliza que genera; una señal infrarroja modulada a 38 kHz.;; Los sensores ópticos SFH5110 están situados en la parte frontal del microbot:; El sensor de la derecha está conectado a RA2 y el sensor de la izquierda a RA3. ;; Cuando el sensor SFH5110 detecta luz infrarroja modulada, proporciona un nivel bajo en su; línea de salida.;; El programa adopta la estrategia siguiente:; - Si no se detecta la baliza por ningún sensor el microbot gira siempre a la derecha.; - Si los dos sensores detectan portadora el microbot avanza hacia adelante.; - Si se detecta portadora en el sensor de la izquierda y no en el de la derecha el; microbot gira a la izquierda hasta que los dos sensores detecten la baliza.; - Si se detecta portadora en el sensor de la derecha y no en el de la izquierda el; microbot gira a la derecha hasta que los dos sensores detecten la baliza.;; ZONA DE DATOS *********************************************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSCLIST P=16F84AINCLUDE <P16F84A.INC>
#DEFINE SensorDerecha PORTA,2 ; Sensor Derecho.#DEFINE SensorIzquierda PORTA,3 ; Sensor Izquierdo.
; ZONA DE CÓDIGOS *********************************************************************
ORG 0Inicio
bsf STATUS,RP0 ; Selecciona Banco 1 de registros.bsf SensorDerecha ; Estas líneas se configuran como entrada.bsf SensorIzquierdaclrf PORTB ; Las líneas del Puerto B se configuran como salidas.
bcf STATUS,RP0 ; Selecciona Banco 0 de registros.Principal
btfsc SensorDerecha ; ¿Ha detectado señal por la derecha?goto Ver_Izquierda ; No recibe por la derecha.btfsc SensorIzquierda ; Sí, ¿también señal por la izquierda?goto GiroDerecha ; No, solo señal por la derecha, gira a derecha.movlw b'00001111' ; Sí, recibe por los dos sensores. Sigue recto.goto ActivaSalida
Ver_Izquierdabtfsc SensorIzquierda ; Por la derecha no recibe. ¿Y por la izquierda?goto GiroDerecha ; Tampoco, ni por la derecha ni por la izquierda.
GiroIzquierdamovlw b'00000111' ; Gira a la izquierda.goto ActivaSalida
GiroDerechamovlw b'00001110' ; Gira a la derecha.
ActivaSalidamovwf PORTBgoto Principal
END