INFORMES DE PRÁCTICAS

Imanol Río Uriondo 3º EO SDA

EJERCICIO 1:
Descripción general del programa:
El programa se encarga de sumar dos números, que serán el 5 y el 7. El resultado de dicha suma se almacenará en la posición '0x10' de la memoria de datos. En este caso no se ha considerado que el usuario tenga que introducir los números ni tampoco mostrar el resultado físicamente (LEDs, displays de 7 segmentos...), sino que simplemente los números 5 y 7 se introducen en la programación y el resultado queda almacenado.

Organigrama:

Código y descripción por líneas:
-----------------------------------------------------------------------------------------------------------------------List p=16F84 ;Tipo de procesador include "P16F84.INC" ;Definiciones de registros internos Resultado org goto org Inicio movlw equ 0x00 Inicio 0x05 0x05 ;Mueve el número 5 al acumulador 0x10 ;Define la posición del resultado ;Vector de reset. La instrucción org ;fuerza la escritura de la siguiente ;instrucción en la posición indicada

;y después se le suma 7 ;Mueve el contenido del acumulador ;a 'Resultado' (posición '0x10') end ;Fin del programa fuente ------------------------------------------------------------------------------------------------------------------------

addlw movwf

0x07 Resultado

EJERCICIO 2:
Descripción general del programa:
Es un programa que suma dos números, de 16 bits cada uno. Como la memoria de datos es de 8 bits serán necesarios dos posiciones para cada número. Primero se sumarán las posiciones bajas de cada número, y el resultado se almacenará en la posición baja del resultado. Se hará lo mismo con las posiciones altas, pero se tendrá en cuenta si en la operación de las posiciones bajas ha habido acarreo. Si es así, se deberá sumar uno al resultado alto, y sino se dejará como estaba.

Organigrama:

Código y descripción por líneas:
-----------------------------------------------------------------------------------------------------------------------List P=16F84 ;Tipo de procesador include "P16F84.INC" ;Definiciones de registros internos Dato_A_L Dato_A_H Dato_B_L Dato_B_H Resultado_L Resultado_H equ 0x10 equ 0x11 equ 0x12 equ 0x13 equ 0x14 equ 0x15 org goto org Inicio movf addwf movwf movf btfsc addlw addwf movwf 0x00 Inicio 0x05 Dato_A_L,W Dato_B_L,W Resultado_L Dato_A_H,W STATUS,C 1 Dato_B_H,W Resultado_H ;Define la posición del dato A (bajo) ;Define la posición del dato A (alto) ;Define la posición del dato B (bajo) ;Define la posición del dato B (alto) ;Define la posición del resultado (bajo) ;Define la posición del resultado (alto) ;Vector de reset ;Salta el vector de interrupción ;Mueve 'Dato_A_L' al acumulador ;Suma 'Dato_B_L' con el acumulador ;Mueve el acumulador a 'Resultado_L' ;Mueve 'Dato_A_H' al acumulador ;Mira si ha habido acarreo en la suma de ;los datos bajos, y sumar uno en ese caso ;Suma 'Dato_B_H' con el acumulador ;Mueve el acumulador a 'Resultado_H'

end ;Fin del programa ------------------------------------------------------------------------------------------------------------------------

EJERCICIO 3:
Descripción general del programa:
Este programa lee si en los pines del puerto A, configurados todos como entradas, hay un nivel lógico alto o bajo, y lo refleja en el puerto B, cuyos pines están configurados como salidas. Por ejemplo, con 'RA0' y 'RA2' a nivel lógico alto obtendremos un nivel lógico alto en 'RB0' y 'RB2', y los demás pines del puerto B permanecerán a nivel bajo. El programa, una vez hecha la configuración, permanecerá en un bucle realizando constantemente la operación de leer el puerto A, pasarlo al acumulador y escribir el contenido de éste en el puerto B, por lo que será conveniente desactivar el watchdog en el momento de grabar el programa en el microcontrolador, aunque no sea estrictamente necesario, ya que al ejecutarse las instrucciones a tan alta velocidad el ojo humano no puede apreciar el tiempo en el que los LEDs están apagados, que es mientras se está haciendo la configuración antes de entrar en el bucle mencionado. Para comprobar el funcionamiento de este programa utilizaremos la MicroPic Trainer, usando sus interruptores como entradas y los LEDs como salidas. Veremos cómo al accionar un interruptor se enciende su LED correspondiente. Se utilizará el microcontrolador PIC16F84 de Microchip.

Organigrama:

Código y descripción por líneas:
-----------------------------------------------------------------------------------------------------------------------List p=16F84 ;Tipo de procesador include "P16F84.inc" ;Definiciones de registros internos org goto Inicio org clrf bsf clrf movlw movwf bcf movf movwf goto 0x00 Inicio 0x05 PORTB STATUS,RP0 TRISB b'00011111' TRISA STATUS, RP0 PORTA,W PORTB Loop ;Vector de reset ;Salta el vector de interrupcion ;Pone a cero el 'PORTB' ;Sel. 'banco1' de memoria de datos ;Configura 'PORTB' como salidas ;Pasar el número al acumulador para ;configurar 'PORTA' como entradas ;Sel. 'banco0' de memoria de datos ;Lee lo que hay en 'PORTA', lo pasa ;al acumulador y saca por 'PORTB' ;Hace volver al principio del bucle

Loop

end ;Fin del programa ------------------------------------------------------------------------------------------------------------------------

EJERCICIO 4:
Descripción general del programa:
La función de este programa es hacer que se enciendan secuencialmente 8 LEDs, conectados al puerto B, de derecha a izquierda o de izquierda a derecha, según esté a 0 o a 1 un interruptor conectado al pin 'RA0' del puerto A. Cada LED deberá permanecer encendido aproximadamente 250 ms, para lo que se implementará un delay mediante el 'Timer0'. Calculando los tiempos, decidimos contar 10 veces 25 ms, ya que el Timer 0 es capaz de temporizar como máximo 65 ms, con un cristal oscilador de 4 MHz. Para temporizar esos 25 ms pondremos el prescaler a 128 y el valor de 'TMR0' deberá ser de 60. Para visualizar el funcionamiento de dicho programa se utilizará la MicroPIC Trainer con un microcontrolador PIC16F84 de Microchip.

Organigrama:

Código y descripción por líneas:
-----------------------------------------------------------------------------------------------------------------------List p=16F84 ;Tipo de procesador Include "P16F84.INC" ;Definiciones de registros internos Contador equ org goto Delay Delay_0 Delay_1 org movlw movwf bcf movlw movwf clrwdt btfss goto decfsz goto return clrf bsf clrf movlw movwf movlw movwf bcf bsf call btfsc goto rlf goto rrf goto 0x0c 0x00 Inicio 0x05 .10 Contador INTCON,T0IF 0x3c TMR0 INTCON,T0IF Delay_1 Contador,F Delay_0 PORTB STATUS,RP0 TRISB b'00011111' TRISA b'00000110' OPTION_REG STATUS,RP0 STATUS,C Delay PORTA,0 A_Dcha PORTB,F Loop PORTB,F Loop ;Variable para la temporización ;Vector de reset ;Salta el vector de interrupción ;Pasa el número 10 al acumulador, y ;después el acumulador a 'Contador' ;Borra el flag de overflow del 'Timer0' ;Carga el valor 60 en el acumulador ;Pasa el acumulador a 'TMR0' ;Resetea el watchdog ;Nos quedamos esperando hasta ;que el flag de overflow esté a 1 ;Decrementa en una unidad el ;contador. Si 0 salir del bucle 'Delay' ;Vuelve a donde llamamos a 'Delay' ;Pone a cero el 'PORTB' ;Sel. 'banco1' de memoria de datos ;Configura 'PORTB' como salidas ;Pasar el número al acumulador para ;configurar 'PORTA' como entradas ;Ponemos a 128 el prescaler con ;los bits PS2:PS0 de 'OPTION_REG' ;Sel. 'banco0' de memoria de datos ;Pone a 1 el indicador de acarreo ;Espera en bucle 'Loop' a que haya ;un cambio en la entrada que dice el ;sentido de la rotación. Para que los ;LED permanezcan ON un tiempo ;llamamos a 'Delay'. Mediante las ;instrucciones 'rlf' y 'rrf' se determina ;el sentido de la rotación.

Inicio

Loop A_Izda A_Dcha

end ;Fin del programa fuente ------------------------------------------------------------------------------------------------------------------------

EJERCICIO 5:
Descripción general del programa:
El objetivo del programa es leer una combinación binaria por el puerto A del microcontrolador y visualizarla mediante un display de 7 segmentos, conectado al puerto B. El programa principal realizará constantemente la tarea de pasar al acumulador lo que haya en el puerto A (aplicando una máscara para asegurar que en el acumulador los 4 bits más significativos sean cero), convertir este código binario a 7 segmentos mediante 'Tabla' y pasar el contenido del acumulador al puerto B, que será el código de 7 segmentos que nos ha devuelto 'Tabla'. 'Tabla' se encarga de pasar el código binario que tenemos en el acumulador a código de 7 segmentos, el cuál también dejará en el acumulador. Para conseguir esto actuamos de la siguiente forma: se le suma al 'Contador de programa' el número binario que queremos convertir, y esto, al estar modificándolo, hará que saltemos a la línea donde esté la instrucción que nos devuelva en el acumulador el código de 7 segmentos de nuestro código binario, y después volverá a donde hemos llamado a 'Tabla'. El microcontrolador que utilizaremos será el PIC16F84, y a las entradas (puerto A) irán conectados los interruptores de la MicroPIC Trainer. Veremos cómo al introducir un código binario mediante los mencionados interruptores obtenemos en el display de 7 segmentos su código hexadecimal equivalente.

Organigrama:

Código y descripción por líneas:
-----------------------------------------------------------------------------------------------------------------------List p=16F84 ;Tipo de procesador include "P16F84.INC" ;Definiciones de registros internos org goto Tabla org addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw clrf bsf clrf movlw movwf bcf clrwdt movf andlw call movwf goto 0x00 Inicio 0x05 PCL,F b'00111111' b'00000110' b'01011011' b'01001111' b'01100110' b'01101101' b'01111101' b'00000111' b'10000000' b'01100111' b'01110111' b'01111100' b'00111001' b'01011110' b'01111001' b'01110001' PORTB STATUS,RP0 TRISB b'00011111' TRISA STATUS,RP0 PORTA,W b'00001111' Tabla PORTB Loop ;Vector de reset ;Salta el vector de interrupción ;Desplazamiento sobre la tabla ;Digito 0 ;Digito 1 ;Digito 2 ;Digito 3 ;Digito 4 ;Digito 5 ;Digito 6 ;Digito 7 ;Digito 8 ;Digito 9 ;Digito A ;Digito B ;Digito C ;Digito D ;Digito E ;Digito F ;Pone a cero el 'PORTB' ;Sel. 'banco1' de memoria de datos ;Configura 'PORTB' como salidas ;Pasar el número al acumulador para ;configurar 'PORTA' como entradas ;Sel. 'banco0' de memoria de datos ;Inicializa el perro guardián ;Pasa 'PORTA' al acumulador ;Asegura que en 'W' sólo los LSB ;Envía binario, devuelve 7 segm. ;Pasa el código 7 segm. al 'PORTB' ;Hace volver al principio del bucle

Inicio

Loop

end ;Fin del programa fuente ------------------------------------------------------------------------------------------------------------------------

EJERCICIO 6:
Descripción general del programa:

Organigrama:

Código y descripción por líneas:
-----------------------------------------------------------------------------------------------------------------------List p=16F84

include conta aux

"P16F84.INC" equ equ org goto 0x0c 0x0d 0x00 Inicio 0x05 PCL,F b'00111111' b'00000110' b'01011011' b'01001111' b'01100110' b'01101101' b'01111101' b'00000111' b'10000000' b'01100111' b'01110111' b'01111100' b'00111001' b'01011110' b'01111001' b'01110001' .10 aux INTCON,T0IF 0x3d TMR0 INTCON,T0IF Loop_1 aux,F Loop_0 PORTB STATUS,RP0 TRISB b'00011111' TRISA b'00000111' OPTION_REG STATUS,RP0 conta Delay PORTA,0 ;Desplazamiento sobre la tabla ;Digito 0 ;Digito 1 ;Digito 2 ;Digito 3 ;Digito 4 ;Digito 5 ;Digito 6 ;Digito 7 ;Digito 8 ;Digito 9 ;Digito A ;Digito B ;Digito C ;Digito D ;Digito E ;Digito F

Tabla

org addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw movlw movwf bcf movlw movwf clrwdt btfss goto decfsz goto return clrf bsf clrf movlw movwf movlw movwf bcf clrf clrwdt call btfsc

Delay Loop_0 Loop_1

Inicio

Bucle

Sumar Restar

goto incf goto decf movf andlw movwf call movwf goto

Restar conta,F $+2 conta,F conta,W b'00001111' conta Tabla PORTB Bucle

end ------------------------------------------------------------------------------------------------------------------------

EJERCICIO 7:
Descripción general del programa:

Organigrama:

Código y descripción por líneas:

EJERCICIO 8:
Descripción general del programa:

Organigrama:

Código y descripción por líneas:
-----------------------------------------------------------------------------------------------------------------------List p=16F873 ;Tipo de procesador include "P16F873.INC" ;Definiciones de registros internos

contador

equ org goto

0x0d 0x00 Inicio 0x05 PORTA PORTB STATUS,RP0 STATUS,RP1 TRISB b'00000111' TRISA b'00000111' OPTION_REG b'00001110' ADCON1 STATUS,RP0 b'01000001' ADCON0 PORTA,2 Tiempo_24 PORTA,1 Tiempo_3 Delay_0 .10 contador Delay_0 PORTA,2 Tiempo_4 .5 contador Delay_0 .20 contador Delay_0 INTCON,T0IF .61 TMR0 INTCON,T0IF Delay_1 contador,F Delay_0 Led ;Vector de Reset ;Salta el vector de interrupción ;Limpiar los puertos A y B ;Ir al banco 1 ;Configurar PORTB como salida ;Configurar PORTA como entrada ;Prescales 256 ;Configurar el convertidor A/D ;Ir al banco 0

Inicio

org clrf clrf bsf bcf clrf movlw movwf movlw movwf movlw movwf bcf movlw movwf clrwdt btfsc goto btfsc goto goto movlw movwf goto btfsc goto movlw movwf goto movlw movwf goto bcf movlw movwf clrwdt btfss goto decfsz goto goto

Loop

;Si RA2=1 vamos a TIEMPO24 ;Si está a 0 analizamos RA1 ;Si RA1=1 vamos a TIEMPO3 ;Si RA1=0 vamos a delay

Tiempo_3

;Multiplicar por 10 el delay ;Si RA2=1 vamos a TIEMPO4 ;Si RA2=0 multiplicamos delay por 5

Tiempo_24

Tiempo_4

;Multiplicamos por 20 el delay

Delay_0 Delay_1

Led

bsf btfsc goto movf movwf goto

ADCON0,GO ADCON0,GO $-1 ADRESH,W PORTB Loop

end ------------------------------------------------------------------------------------------------------------------------

EJERCICIO 9:
Descripción general del programa:

Organigrama:

Código y descripción por líneas: