TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: pepocor en 04 de Diciembre de 2004, 09:22:00
-
Hola a todos. Hace muy poco que estoy en esto de la programación y me ha surgido una duda que me trae de cabeza. Conseguí hacerme un programador para el 16f877/a pero no consigo programar según me gustaría.
Mi problema es que necesito hacer un programa que al tiempo que parpadea un led conectado a RB1 se visualice un contador en un display de 7 segmentos. Según las pulsaciones de un switch conectado a RB0 podré aumentar/disminuir la cuenta y si la pulsación es mayor a un segundo cambiar el tipo de cuenta y en lugar de mostrar números, mostrar una serie de símbolos.
El problema que no consigo resolver es como hacer las pausas para mostrar el parpadeo y el display sin que ello me estorbe a las posibles lecturas del switch. He probado con interrupciones pero no resuelvo nada.
Cualquier sugerencia o código similar sería agradecido enormemente.
-
Por que no colocas el codigo del programa de los que has realizado hasta el momento. Muchos te podemos ayudar.
gfp
-
Hola de nuevo, ya conseguí más o menos solucionar el problema anterior mediante el uso del timer0.
Ahora planteo otra duda que espero también resolver en breve. Es sobre el conversor A/D. Se supone que recibo por RA0 una tensión proveniente de un potenciómetro y de acuerdo con esta señal tendré que hacer que el circuito (led + contador) parpadeen a una determinada frecuencia (dependiendo de la posición del potenciómetro). Ahora bien, mi duda es como transformar los 10 bits del conversor (0-1023) en un número decimal con el que poder trabajar usando registros de 8 bits. Lo que se me había ocurrido era decrementar el total recibido en la conversión por el factor que diferencia a un estado de otro (suponiendo, por ejemplo, 15 posibles posiciones del potenciómetro) e incrementar una variable que sería la velocidad con la que actuaría el sistema.
Conversor_AD
movlw 0xA
movwf cont_pot
bsf ADCON0,GO ;Comenzamos la conversión A/D
Espera
btfsc ADCON0,GO ;Esperamos a que se complete la
goto Espera ;conversión, para ello preguntamos
;por el estado del bit GO
movf ADRESL,W ;Cogemos la parte baja de la direccíón
;
movwf Potencia ;LEDs
; Potencia será un valor entre 0 y 1023, dependiendo de la tensión que entre
; por la puerta RA0 y, por tanto, de la situación de nuestro potenciómetro.
; Como no tenemos registros de 10 bits cogemos la parte baja del resultado
; que comprenderá valores de 0 - 255.
; Como no nos interesa más que un múltiplo de dicho valor dividiremos el
; resultado entre 15, los posibles estados de nuestro sistema y nos dará
; el valor de cada intervalo, 17
movlw D"17"
movwf incremento
suma
btfss STATUS,0 ; Mientras se active el flag de acarreo (borrow)
; tendremos un número mayor y seguimos restando
return
movfw incremento
subwf Potencia,0 ;Vamos decrementando a la cantidad obtenida
; del potenciómetro
movwf Potencia ; el valor base con el que dividimos la frecuencia de
; parpadeo
incf cont_pot ; e incrementamos el contador de frecuencia
goto suma
Muchas gracias por leer el ladrillo. Un saludo.
-
Con respecto al código anterior, aclarar que en un principio en lugar de justificar a la derecha lo hice a la izquierda y en lugar de seleccionar los bits de ADRESL lo hice de ADRESH y tampoco me funcionaba el mismo código.
En teoría me daría completamente igual que la conversión fuera de 8 bits en lugar de 10 para poder trabajar con ellos pero en la práctica este ejemplo anterior no funciona.
Gracias de nuevo y espero disculpen mi torpeza de primerizo.