INFORMÁTICA INDUSTRIAL. 3º INGENIERÍA TÉCNICA INDUSTRIAL. ESPECIALIDAD ELECTRÓNICA BOLETÍN 1. CURSO 2003/04 1. Se colocan tres interruptores en las líneas RA0, RA1 y RA2 de la puerta A de un PIC16F84. Y se colocan cuatro diodos led en las líneas RB0, RB1, RB2 y RB3 del puerto B. Mediante los interruptores se programa un número binario de 3 bits. Desarrollar un programa en ensamblador que lea el número binario introducido, le sume 5 y represente en los leds el valor binario resultante. Un led apagado representa un 0 y encendido un 1. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 2. LIST RADIX P=16F84 HEX ;Comando que indica el PIC usado ;Los valores se representaran en hexadecimal PUERTAA EQU 0X05 PUERTAB ESTADO W EQU EQU EQU 0X06 0X03 0 ;La etiqueta "PUERTAA" queda identificada con ;la direccion 0x05, que si corresponde con el ;banco 0 es el valor de PUERTAA y si es del ;banco 1 con el de TRISA. ;Equivalencia de la etiqueta PUERTAB ;Estado corresponde con el valor 0x03. ;Identifica W con el valor 0. ORG 0 ;Comando que indica al Ensamblador la ;direccion de la memoria donde se ;situara la instrucion siguiente bsf ESTADO,5 movlw movwf movlw movwf bcf 0xff PUERTAA 0x00 PUERTAB ESTADO,5 movf PUERTAA,W Addlw movwf 5 PUERTAB Goto inicio ;Pone a 1 el bit 5 de ESTADO para direccionar ;la pagina 1 de la memoria de datos. ;W <-- FF(Hex) ;W --> TRISA ;W <-- 0 ;W --> TRISB (Las lineas de PB salidas) ;Pone a 0 el bit 5 de ESTADO pasando a ;acceder al banco 0. ;W <-- PUERTAA. Se introduce el valor binario ;de los interruptores. ;W <-- W + 2 ;W --> PUERTAB. El valor de W sale por las ;lineas de PB a los led. ;Salta a la instruccion precedida por la ;etiqueta de inicio. Inicio END Se dispone de cinco interruptores que actúan como periféricos de entrada y se conectan a las cinco líneas de la puerta A de un PIC16F84 funcionando a 4MHz con oscilador externo de tipo XT. Como periféricos de salida actúan cinco diodos led unidos a las líneas RB4-RB0 de la puerta B. Se dispone también de un pulsador manual para provocar el Reset. Confeccionar un programa ensamblador que explore el estado de los interruptores e ilumine el led correspondiente al interruptor que se encuentre cerrado (con camino a tierra). 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 PORTB PORTA STATUS RP0 W Inicio Loop LIST RADIX EQU EQU EQU EQU EQU P=16F84 HEX 0x06 0x05 0x03 0x01 0x00 org goto 0x00 Inicio ;Vector de Reset org 0x05 ;Salva el vector de interrupción clrf bsf clrf movlw movwf bcf PORTB STATUS,RP0 PORTB b'00011111' PORTA STATUS,RP0 movf movwf goto PORTA,W PORTB Loop end ;Borra los latch de salida ;Selecciona banco 1 ;Puerta B se configura como salida ;Puerta A se configura como entrada ;Selecciona banco 0 ;Leer las entradas RA0-RA4 ;Reflejar en las salidas ;Bucle sin fin ;Fin del programa fuente 3. Se desea confeccionar un programa para el PIC16F84 funcionando a 4MHz, que comience poniendo a cero el contador CONTA. Después irá incrementando de uno en uno el contador hasta llegar al valor 0x5F, momento en el que se detiene en un bucle infinito no operativo. El valor del contador en binario se visualizará con 8 diodos led conectados a las líneas de la puerta B. Se pide el organigrama del algoritmo así como el código ensamblador. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 4. P=16F84 HEX EQU EQU EQU EQU EQU 0x00 0x01 0x06 0x03 0x0C ; Comienzo del campo de etiquetas. ORG goto ORG 0 inicio 5 ; El programa comienza en la direccion 0 y ; salta a la direccion 5 para sobrepasar ; el vector de interrupcion. bsf movlw movwf bcf ESTADO,5 0x00 PUERTAB ESTADO,5 ; Seleciona el banco 1 ; Se configura PuertaB como salida clrf CONTA ; CONTA = 0 bucle1 incf movf movwf movlw subwf btfss goto CONTA,F CONTA,W PUERTAB 0x5f CONTA,W ESTADO,2 bucle1 ; ; ; ; ; ; ; bucle2 goto end bucle2 ; si Z = 1 se produce un bucle infinito W F PUERTAB ESTADO CONTA inicio ; Seleccion del banco 0 CONTA + 1 --> CONTA CONTA se carga en W W se carga en el registro de datos PB W <-- 0x5f CONTA - W --> W Explora Z y si vale 1 se produce "brinco" Si Z = 0 se vuelve a bucle1 Se tiene un PIC16F84 trabajando con un reloj de 1MHz y tiene un led conectado en la línea RB7. Se pide el programa ensamblador que haga parpadear al led con un frecuencia de 8,2 ms. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 5. LIST RADIX LIST RADIX P=16F84 HEX EQU EQU EQU EQU 0x06 0x01 0x03 0x01 ORG bsf movlw movwf movlw movwf bcf clrf 0 ESTADO,5 b’11010110’ OPTION 0x00 PUERTAB ESTADO,5 PUERTAB ; Inicio del programa en direccion 0 ; Banco 1 ; Valor a cargar en OPTION parpa bsf call bcf call goto PUERTAB,7 retardo PUERTAB,7 retardo parpa ; Enciende el led RB7 = 1 ; Llamada a subrutina de RETARDO ; Apaga el led, RB7 = 0 retardo explora clrf btfss goto return TMR0 TMR0,4 explora ; ; ; ; ; PUERTAA OPTION ESTADO TMR ; La Puerta B salida ; Banco 0 ; Las lineas de salida de PB a 0 TMR0 = 0 y empieza su incremento TMR0<4> = 1? No ha llegado TMR0 a 16d Ha llegado TMR0 al valor 16d y retorna al programa principal END Se tiene un PIC16F84 con un oscilador interno controlado por un cristal de cuarzo de 4 MHz. Las líneas RA0 y RA1 están conectadas a dos interruptores A y B respectivamente. Las líneas RB0 y RB1 están conectadas a dos leds A’ y B’. Existe además otro led conectado a RB7. Se pide elaborar un programa que mantenga por un lado parpadeando al led conectado a RB7 con un periodo de 1 segundo, y por otro lado que refleje en los leds A’ y B’ el estado de los interruptores A y B. 01 02 03 04 05 06 07 W F TMR_OPT ESTADO LIST RADIX P=16F84 HEX EQU EQU EQU EQU 0 1 0x01 0x03 ; TMRO en banco 0 OPTION en banco 1 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 6. PUERTAA PUERTAB INTCON CONTA inicio bucle ra0_1 ra1x ra1_1 bucle2 inter conta_0 rb7_1 seguir EQU EQU EQU EQU 0x05 0x06 0x0B 0x10 ; PA en banco 0 TRISA en banco 1 ; PB en banco 0 TRISB en banco 1 ORG goto ORG goto ORG 0 inicio 4 Inter. 5 ; Vector de Reset bsf clrf movlw movwf movlw movwf bcf movlw movwf movlw movwf movlw movwf btfsc goto bcf goto ESTADO,5 PUERTAB b'00000011' PUERTAA b'00000111' TMR_OPT ESTADO,5 b'10100000' INTCON 0x10 CONTA 0x0c TMR_OPT PUERTAA,0 ra0_1 PUERTAB,0 ra1x bsf btfsc goto bcf goto bsf goto decfsz goto movlw movwf btfsc goto bsf goto bcf movlw movwf movlw movwf retfie ; Contador auxiliar ; Vector de Interrupcion ; Salta a comienzo de rutina de interrupcion ; Seleccion del banco 1 ; Configura PUERTA B como salida ; Configura RA0, RA1 como entradas ; Banco 0 ; Se permite interrupcion del ; TMR0 y la global (GIE) ; Se carga CONTA con 16 decimal ; ; ; ; ; Se carga TMR0 con 12 decimal Explora RA0 y brinco si vale 0 salta a RA0_1 Si RA0 = 0 se saca por RB0 un 0 A explorar RA1 PUERTAB,0 PUERTAA,1 ra1_1 PUERTAB,1 bucle2 PUERTAB,1 bucle ; ; ; ; Si RA0 = 1 se saca por RB0 un 1 Examina ra1 y brinco si es 0 Salta si RA1 = 1 Si RA1 = 0, RB1 = 0 CONTA,1 seguir 0x10 CONTA PUERTAB,7 rb7_1 PUERTAB,7 seguir PUERTAB,7 b'10100000' INTCON 0x0c TMR_OPT ; RSI. Decrementa CONTA y brinco si vale 0 ; Si RA1 = 1 , RB1 = 1 ; Bucle indefinido, se sale por la interupcion ; Si CONTA = 0 se carga ; Si RB7 = 0, brinco ; Si RB7 = 0, se invierte ; Si RB7 = 1 , se invierte ; Se restaura INTCON por desactivar las ; interrupciones el procesador ; Se recarga TMR0 con 12 END Disponemos de un display 7-segmentos de un dígito más un punto conectado a un PIC16F84 a través del puerto B. Además se dispone de tres interruptores conectados a las tres líneas menos significativas del puerto A. Se pide realizar el programa que visualice en el display el valor decimal del número binario recibido a través de los interruptores. f a b c d e f g dp b g e c d dp 01 02 03 04 05 06 07 08 09 10 11 12 13 w f PCL PUERTAA PUERTAB ESTADO VALOR LIST RADIX P=16F84 HEX EQU EQU EQU EQU EQU EQU EQU 0 1 02 05 06 03 12 RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7 ; Registro auxiliar ; RUTINA PRINCIPAL: Lectura de los interruptores y calculo del valor a visualizar 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 7. inicio explora bit_1 bit_2 visual ORG goto ORG bsf clrw movwf movlw movwf bcf movf movwf comf clrw btfss goto addlw btfss goto addlw btfss goto addlw call 0 inicio 5 ESTADO,5 ; Para saltar el Vector de Interrupcion ; Seleccion del banco 1 PUERTAB 0xff PUERTAA ESTADO,5 PUERTAA,w VALOR VALOR,f ; Puerta B salida ; ; ; ; ; puerta A entrada Seleccion banco 0 Se cargan los interruptores en W Se usa un registro auxiliar Invertir los niveles de interruptores VALOR,0 bit_1 0x01 VALOR,1 bit_2 0x02 VALOR,2 visual 0x04 display ; ; ; ; ; ; ; ; ; ; Si RA0 = 1, brinca Salta a explorar el bit_1 Si RA0 =1, se suma 1 Si RA1 = 1, brinca Salta a explorar el bit_2 Si RA1 = 1, se suman 2 Si RA2 = 1, brinca Salta al modulo del display Si RA2 = 1, se suman 4 Salta al modulo del display ; DISPLAY: Rutina de visualizaci¢n del acumulador en el display de 7 segmentos bucle movwf PUERTAB goto bucle ; Al retornar de la subrutina ; el valor de W se saca por la Puerta B ; bucle infinito ; TABLA DE CONVERSION--------------------------------------------------------display addwf PCL,f retlw retlw retlw retlw retlw retlw retlw retlw 0x3F 0x06 0x5b 0x4f 0x66 0x6d 0x7d 0x07 ; ; ; ; ; ; ; ; ; ; ; pcl + W -> W El pcl se incrementa con el valor de W proporcionando un salto Retorna con el valor del codigo del 0 Retorna con el c¢digo del 1 Retorna con el c¢digo del 2 Retorna con el c¢digo del 3 Retorna con el c¢digo del 4 Retorna con el c¢digo del 5 Retorna con el c¢digo del 6 Retorna con el c¢digo del 7 END Escribir un programa que transfiera a las N primeras posiciones de la EEPROM de datos las direcciones 0x10 a 0x10+N-1 de la memoria RAM. El valor de N se encuentra almacenado en la dirección 0x0F del primer banco de la memoria. Tras escribir la cadena el programa comprobará que la escritura es correcta y deja W a 0 si ha sido así y a un valor distinto de 0 si la comprobación no es satisfactoria. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 DATA_CON1 ADDR_CON2 STATUS N INICIO INDF FSR INTCON EECON1 INI ESCRIBE LIST EQU EQU EQU EQU EQU EQU EQU EQU EQU p= 16F84 08h 09h 03h 0Fh 10h 00h 04h 0Bh 88h ORG goto ORG retfie bcf movf movwf andwf btfsc goto 0 INI 4 STATUS,5 N,0 ADDR_CON2 ADDR_CON2,0 STATUS,2 FIN decf movf addlw movwf movf movwf ADDR_CON2,1 ADDR_CON2,0 INICIO FSR INDF,0 DATA_CON1 bcf bsf movlw movwf INTCON,7 STATUS,5 0x55 ADDR_CON2 ; Interrupcion sin tratamiento ; Pagina 0 ; Guardamos en W el contador ; Refrescamos los flags ; Si FZ=1 saltamos a FIN ; ; ; ; ; ; ; ; ; ; ; ; Inicialmente en ADDR esta el numero de byte a escribir + 1 (de N+1 a 1 ) Se escriben en orden inverso DirEEPROM en Addr DirEEPROM en W INICIO+DirEEPROM= DirRAM (en W) Direccionamiento indirecto En W dato a escribir Dato a escribir en EEDATA Secuencia de escritura GIE=0 Banco 1 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 WAIT ; WAIT movlw movwf 0xAA ADDR_CON2 movlw movwf bsf bsf bsf btfss goto sleep b'11000000' INTCON DATA_CON1,2 DATA_CON1,1 STATUS,5 EECON1,2 WAIT bcf clrw addwf btfss goto STATUS,5 ; Pagina 0 ADDR_CON2,0 STATUS,2 ESCRIBE ; ADDR_CON2=0 ? ; Si FZ=1 saltamos a COMPROB movf movwf N,0 ADDR_CON2 FIN decf movf addlw movwf bsf bsf bcf ADDR_CON2,1 ADDR_CON2,0 INICIO FSR STATUS,5 DATA_CON1,0 STATUS,5 movf subwf btfsc goto INDF,0 DATA_CON1,0 STATUS,2 FIN clrw addwf btfss goto sleep goto END GIE=1 EEIE=1 WREN=1 Orden de escritura Banco 1 Esperamos a que se escriba ; Otra posibilidad. El WD siempre tarda mas en ; rebosar que la escritura en completarse COMPROB LEE ; ; ; ; ; ADDR_CON2,0 STATUS,2 LEE FIN ; Iniciamos comprobacion de la escritura ; Guardamos en W el contador ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; Inicialmente en ADDR esta el numero de byte a leer + 1 (de N+1 a 1 ) Se escriben en orden inverso DirEEPROM en Addr DirEEPROM en W DirRAM en W Direccionamiento indirecto Pagina 1 Orden de lectura Pagina 0 comprobacion Dato de la RAM en W DATA-W -> W Si FZ=1 todo ha ido bien Si no Error y W <> 0 Siguiente ; ADDR_CON2=0 ? ; Si FZ=1 saltamos a FIN ; Lee el sigueinte