TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: ma77ias en 15 de Noviembre de 2008, 19:45:54
-
q tal! Con un pic 16f84a estoy haciendo un velocimetro con 3 display de 7 segmentos pero no se como puedo hacer para mostrar los valores que me da un contador y uicarlos en centena, decena y unidad. Estuve viendo en otro tema pero la solucion te la daban en C y yo solo me manejo con assembler :? . Alguien me podria ayudar con un ejemplo?
-
Me imagino que lo que te está dando problemas es la conversión de tu número binario en centenas, decenas y unidades. De tu número binario final debes dividirlo primero entre 100 para obtener las centenas y después entre 10 para obtener las decenas. Puesto que en ASM no hay división debes realizarla mediante restas sucesivas. A tu número le restas de 100 en 100 hasta que el resultado sea negativo. Las veces que alcanzaste a obtener las divisón son tus centenas. De igual forma para las decenas.
Supongamos que tu número binario de velocidad es 123
123 - 100 = 23 y el resultado no fue negativo. Centenas = 1.
23 - 100 = -77. Resultado negativo. Hasta aquí llegaron las centenas, vamos con las decenas ahora restando sucesivamente 10.
23 - 10 = 13 y el resultado no fue negativo. Decenas = 1.
13 - 10 = 3 y el resultado no fue negativo. Decenas = 2.
3 - 10 = -7. Resultado negativo. Hasta aquí llegaron las decenas, vamos con las unidades.
3 - 1 (aquí ya no tiene ningún caso hacer la resta. Automáticamente éste último valor que te queda son las unidades).
Binario = 123... Centenas = 1, Decenas = 2, Unidades = 3.
-
UH! gracias por el razonamiento... me quede toda la noche programando pero al final lo hice con 2 display de 7 segmentos, ahora tengo el programa en asm en donde uso RB4 como contador de pulsos externos en 1 segundo (pienso ponerle un CI555 para simularlo) ; RA0 y RA1 como señales independientes a la entrada del anodo de cada display y asi multiplexarlos... Me surgio un problema, pense que me iba a andar bien pero lo probe en el proteus y pic simulator IDE y no me funciono. Yo soy nuevo en esto del pic por eso queria saber si me podrian dar una mano y pegarle un vistazo porque por ahi le pifie en algo y no me di cuenta...desde ya gracias!!!
REG1 EQU 0X0C
REG2 EQU 0X0D
REG3 EQU 0X0E
cont_timerd EQU 0X0F ;valor de contador deL tmr0 para calcular decena
cont_dec EQU 0X10 ;valor final de decena
cont_uni EQU 0X20 ;valor final de unidad
multiplex EQU 0X30 ;realiza el multiplexado
cont_timeru EQU 0X40 ;valor de contador del TMR0 para calcular unidad
org 0x0000
INICIO bsf status,rp0
clrf trisb
bsf trisa,4
movlw b'00111000'
movwf option_reg
bcf status,rp0
TIMER clrf tmr0 ; comienza timer en cero
RETARDO movlw 0x45 ;retardo de 1 seg
movwf REG3
TRES movlw 0x45
movwf REG2
DOS movlw 0x45
movwf REG1
UNO decfsz REG1,1
goto UNO
decfsz REG2,1
goto DOS
decfsz REG3,1
goto TRES
PRINCIPAL
movf tmr0,w ;despues de transcurrido el tiempo se lee cuantos pulsos hubo en el contador
movwf cont_timerd
DECENA movlw d'10' ;carga 10 para compararlo con el contador y sacar decenas
subwf cont_timerd,0
btfsc status,0
goto UNIDAD
movwf cont_timerd
movlw 0x00
movwf cont_dec
incf cont_dec,1
goto DECENA
UNIDAD bcf status,0
movf tmr0,w
movwf cont_timeru
movlw d'1' ;carga 1 para compararlo con el contador y sacar unidades
subwf cont_timeru,0
btfsc status,0
goto CALCUL
movwf cont_timeru
movlw 0x00
movwf cont_uni
incf cont_uni,1
goto UNIDAD
CALCUL movlw b'00000010' ; valor para visualizar 1° display
movwf multiplex
movf multiplex,0
movwf porta
movf cont_dec,0
call DISPLAY
movwf portb
bcf status,0
rrf multiplex,1 ;valor para visualizar 2° display
movf multiplex,0
movwf porta
movf cont_uni,0
call DISPLAY
movwf portb
goto TIMER ;vuelve a contar
DISPLAY addwf pcl,f ;tabla del display de 7 segmentos
retlw 3fh
retlw 06h
retlw 5bh
retlw 4fh
retlw 66h
retlw 6dh
retlw 7dh
retlw 07h
retlw 7fh
retlw 6fh
end