Você está na página 1de 8

MANEJO DE TABLAS.

La parte alta del contador de programa (PCH) no se puede acceder directamente, ella debe cargarse desde los 5 bits ms bajos del registro llamado PCLATCH (direccin 0x08). En la creacin de tablas, la posicin a leer de la misma se realiza con el control del registro PCL. Este registro es de 8 bits, por lo que direcciona solo 256 posiciones, por ello se debe tener en cuenta la posicin de la tabla en la memoria de programa o tambin controlar los bits ms significativos de PC (Si nuestra tabla tiene ms de 255 posiciones, si o si debemos manejar estos bits [PCLATCH]). Para devolver el valor direccionado se utiliza retlw, esta instruccin devuelve un valor en el acumulador al retornar de una subrutina. La creacin de la tabla se har de la siguiente forma: Cdigo 1. 2. 3. 4. 5. 6. 7. Tabla addwf retlw retlw retlw retlw ;

PCL,f Valor0 Valor1 Valor2 Valor3 ....

Donde Valor0, Valor1, Valor2... etc. son los valores que queremos almacenar en la tabla. La estrategia a seguir para consultar algn valor de la tabla es cargar en el acumulador (W) la direccin de la tabla donde se encuentra el valor que quieres leer y despus llamar a la subrutina TABLA (con un CALL). Advertencia: la carga de W no puede superar el nmero de valores de la tabla, sino se estar ejecutando una instruccin errnea provocando un mal funcionamiento del programa. Addwf: es una instruccin que toma un valor x y lo incremente en uno en el caso de la tabla arranca en cero al presionar el botn le suma uno y se va a la siguiente instruccin. Retlw: Regresa de la posicin de la tabla llevando a W, el valor que se le encuentre asignado.

EVITAR EL REBOTE EN PULSADORES. Al presionar un pulsador se presenta un rebote propio debido a la presin que la persona le ejerce, existen dos formas de evitarlo uno es colocando en paralelo al pulsador un capacitor y la otra es provocando un retardo. En este caso se hara por programa con un retardo de 20 mseg.
1. Demora_20ms 2. movlw 0xFF 3. movwf Contador1 4. Repeticion1 5. movlw 0x19 6. movwf Contador2 7. Repeticion2 ; ; Iniciamos contador1.; ; Iniciamos contador2

8.

decfsz Contador2,1 sale.9. goto Repeticion2 10. decfsz Contador1,1 11. goto Repeticion1 ciclo.return

; Decrementa Contador2 y si es 0 ; Si no es 0 repetimos ciclo.; Decrementa Contador1.; Si no es cero repetimos

Calcular el valor del retardo.

Numero de ciclos "reg 3" = 3 x "grueso" = 3 x 80 (ya que 50 Hex = 80 decimal) = 240 ciclos de instruccin Para el registro 2 Ahora vemos que el loop intermedio dura 2 + 1 + 1 + 1 = 5 ciclos de instruccin a los cuales se les suman los 240 ciclos del loop m s interno. En total seran 5 + 240 = 245. Pero este loop es recorrido hasta que el hexadecimal 40 (equivalente al decimal 64) se anule: Numero de ciclos "reg 2" = 245 x medio = 245 x 64 = 15.860 ciclos de instruccin.

Para el registro 1 Numero de ciclos "reg 1" = 15.860 x fino = 15.860 x 64 = 1.015.040 ciclos de instruccin.
Si el cristal es de 1.015 segundos. , cada instruccin dura por tanto el retardo anterior corresponde a

MANEJO DEL DISPLAY DE 7 SEGMENTOS. Para el display de segmentos se debe crear una subrutina que contenga una tabla la cual se realizara dndole encendido a los leds del display dependiendo de cual numero se est ejecutando y si este es de nodo o de ctodo. Para ctodo esta es la subrutina. BCD7SEG: ; retlw b'gfedcba' para display ctodo comn addwf PCL,1 retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw clrf retlw b'0111111' b'0000110' b'1011011' b'1001111' b'1100110' b'1101101' b'1111101' b'0000111' b'1111111' b'1101111' Contador b'0111111' ; Se incrementa el contador del programa.;0 ;1 ;2 ;3 ;4 ;5 ;6 ;7 ;8 ;9 ; Si llega 10, se resetea contador ;0

En el caso de nodo comn donde se encuentre el numero 0 se pone 1 y viceversa.

REALIZAR UNA SECUENCIA. Para crear una secuencia es necesario almacenar un valor en el registro w y rotarlo a la derecha o la izquierda. Para eso se utiliza cualquiera de estas dos instrucciones.

RLF RRF

f,d rotar celda a travs del carry a la izquierda f,d rotar celda a travs del carry a la derecha

ppal

movlw 01 ;se carga w con 01h movwf Rot ;se descarga w en el registro rot

; preparndolo para la rotacin. sec movf Rot,0 ;el contenido de rot pasa a w

movwf ptob ;enciende el led conectado donde indica w ;call rlf btfss goto goto demora ;se mantiene encendido el led. Rot ;se mueven los bits de "rot". Rot,4 ;se comprueba el 5 bit. sec ;si el 5 bit es cero se reenva a sec. ppal ;si el 5 bit es uno se reenva a ppal.

MULTIPLEXACION DE SEALES. Para multiplexar una seal es necesario colocar una habilitacin para los bits que se van a mostrar, esto se hace conectando un transistor funcionando entre corte y saturacin. Fundamentalmente esto se utiliza para los display de 7 segmentos cuando se van a mostrar valores que superan el numero 9. Se conectan al microcontrolador de la siguiente forma. El siguiente circuito realiza un conteo automtico de eventos hasta 999

Aqu se utilizan los bits del puerto A para habilitar el display que va a mostrar el nmero segn proceda. ; **** Conteo de 0 a 999 **** list p=16F84A #include P16F84A.inc __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;**** Definicin de variables **** Unidad equ 0x0C ; Guardamos conteo unidad Decena equ 0x0D ; Centena equ 0x0E ; Contador1 equ 0x0F ; Registro utilizado en demora.Contador2 equ 0x10 ; Registro utilizado en demora.Contador equ 0x11 ; Control de Refresco de Display.MuestroU MuestroD MuestroC equ equ equ 2 1 0 ; Para control del 1 Display ; Para control del 2 Display ; Para control del 3 Display

;**** Inicio del Micro **** Reset org 0x00 goto Inicio

; Aqu comienza el micro.; Salto a inicio de mi programa.-

;**** Tabla de conversin BCD a 7 Segmentos **** ; Se coloca al inicio para asegurar ubicacin en Pgina.-

org BCD7SEG

0x05 ; Origen del cdigo de tabla.; retlw b'gfedcba' para display catodo comun addwf PCL,1 ; Se incrementa el contador del programa.DT 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F

;**** Programa principal **** ;**** Configuracion de puertos **** Inicio bsf clrf clrf bcf clrf clrf clrf clrf goto STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.TRISA ; PORTA como salida TRISB ; PORTB como salida.STATUS,RP0 ; Paso del Banco 1 al Banco 0 PORTA ; Desactivo todos los Displays Unidad ; Comienza en cero --> 0 0 0.Decena Centena Actualizo_Display ; Esta rutina multiplexa los

displays.;**** Testeo de Pulsador **** Bucle incf Unidad,1 ; Incremeto Unidad. movlw d'10' ; Si es 10 reseteo e incremento Decena subwf Unidad,0 ; btfss STATUS,Z ; goto Actualizo_Display ; no es 10 clrf Unidad ; Si, reseteo.incf Decena,1 ; Incremento Decena.movlw d'10' ; Si Decena = 10, reseteo e incremento Centena subwf Decena,0 ; btfss STATUS,Z ; goto Actualizo_Display ; No es 10.clrf Decena ; Si, reseteo.incf Centena,1 ; Incremento Centena.movlw d'10' ; Si es 10 Reseteo.subwf Centena,0 btfss STATUS,Z goto Actualizo_Display ; No es 10.clrf Centena ; Si, reseto ;**** Se multiplexan los Display **** Actualizo_Display movlw d'20' ; Cargo Contador = 20

movwf Contador del mismo valor

; Para repeticiones de visualizacion ; durante 150 ms.-

Refresco movfw Unidad para Unidad.call BCD7SEG ; bcf PORTA,MuestroC ; Apago Display de Centena, Se entiende al mirar rutina.movwf PORTB ; Cargo unidad en PORTB.bsf PORTA,MuestroU ; Enciendo Display de Unidad.call Demora_5ms movfw Decena ; Obtengo codigo 7 Segmentos para Decena.call BCD7SEG bcf PORTA,MuestroU ; Apago Display de Unidad.movwf PORTB ; Cargo PORTB con Decena.bsf PORTA,MuestroD ; Enciendo Display de Decena.call Demora_5ms movfw Centena ; Obtengo codigo de 7 Segmentos para Centena.call BCD7SEG bcf PORTA,MuestroD ; Apago Display de Decena.movwf PORTB ; Cargo PORTB con Centena.bsf PORTA,MuestroC ; Enciendo Display Centena.call Demora_5ms decfsz Contador,1 ; Pregunto si ya se ha repetido 10 veces el ciclo? goto Refresco ; No, repito.goto Bucle ; Si, actualizo cuenta.;**** Demora **** Demora_5ms movlw 0xFF ; movwf Contador1 ; Iniciamos contador1.Repeticion1 movlw 0x05 ; movwf Contador2 ; Iniciamos contador2 Repeticion2 ; Obtengo codigo de 7 Segmentos

decfsz Contador2,1 sale.goto Repeticion2 decfsz Contador1,1 goto Repeticion1 return end

; Decrementa Contador2 y si es 0 ; Si no es 0 repetimos ciclo.; Decrementa Contador1.; Si no es cero repetimos ciclo.; Regresa de la subrutina.-

Você também pode gostar