TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: nanii en 16 de Noviembre de 2009, 00:54:03
-
ola...antes que nada, soy nueva :-/ en esto...bueno ay les va...Deseo ayuda en una tarea :D, la cual consta y dice asi: Se trata de un contador up/down de tres digitos que cuenta desde 000 hasta 999. la entrada de pulsos a contar se aplica por ra4 es sensible al flanco descendente. la entrada ra3 determina si la cuenta es ascendente "1" o descendente "0"...ay les va el codigo .asm (quiero saber si tiene algun error, pork lo checo en el mplab y me manda errores, pero ni idea, y si poor fiis, tambien podrian decirme donde le puedo componer para que vayan mas rapido los numero, sk lo paso en proteus y los numero van k buelan :D) gracias y espero me hayan entendido, pork hasta yo me hize bolas,...jajaja!!! :shock:
;Pratcica9
;contador Up/down de 3 digitos
;se trata de un contador Up/down de 3 digitos que cuenta desde 000 hasta 999. la entrada de
;pulsos a contar se aplica por RA4 es sensible al flanco descendente. la entrada RA3 determina
;si la cuenta es ascendente "1" o descendete "0"
List p=16F84
INCLUDE "P16F84.INC" ; definiciones de registros internos
DIG0 equ 0x0c ;variable para el digito 0
DIG1 equ 0x0d ;variable para el digito 1
DIG2 equ 0x0e ;variable para el digito 2
Delay_Fijo equ 0x0f ;variable de temporizacion fija
org 0x00 ;vector de reset
goto Inicio
org 0x05 ;salva vector de interrupcion
;Tabla_7_seg: esta rutina convierte el codigo BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmenstos. el codigo 7 segmentos retornos retorna tambien
; en el reg. W
Tabla_7_seg addwf PCL,F ;desplaza al pc tantas posiciones como indique el valor del registro W
retlw b'11000000' ;codigo 7 seg del digito 0
retlw b'11111001' ;codigo del 1
retlw b'10100100' ;2
retlw b'10110000' ;3
retlw b'10011001' ;4
retlw b'10010010' ;5
retlw b'10000010' ;6
retlw b'11111000' ;7
retlw b'10000000' ;8
retlw b'10011000' ;9
;Display: esta rutina activa secuencialemnte cada uno de los digitos D0, D1 Y D2
;conectados a RA0 Y RA1 Y RA2 respectivamente, a la vez que visualiza en cada uno de
;ellos el contenido de las variables DIG1, DIG2 Y DIG3, previa conversion a 7 segmentos
Display bsf PORTA,0 ;ACTIVA DIGITO0
movf DIG0,W ;CARGA VARIANLE DIGO
call Tabla_7_seg ;convierte 7 segmentos
movwf PORTB ;visualiza DIG0 sobre el digito 0
call Delay ;Temporiza 1ms
bcf PORTA,0 ;desactiva digito 0
movlw b'11111111'
movwf PORTB
bsf PORTA,1 ;activa digito 1
movf DIG1,W ;CARGA VARIABLE DIG1
call Tabla_7_seg ;convierte a 7 segmentos
movwf PORTB ;visualiza dig1 sobre el digito 1
call Delay ;temporiza 1mS
bcf PORTA,1 ;desactiva digito 1
movlw b'11111111'
movwf PORTB ;desactiva segmentos
bsf PORTA,2 ;ACTVIA DIGITO 2
movf DIG2,W ;carga variable DIG2
call Tabla_7_seg ;convierte a 7 segmentos
movwf PORTB ;VISUALIIZA dig2 sobre el digito 2
call Delay ;temporiza 1mS
bcf PORTA,2 ;desactiva digito 2
movlw b'11111111'
movwf PORTB ;desactiva segementos
return ;fin del multiplexado
;Delay: rutina de tmeporizacion por software. Un bucle hae decermentar una variable hasta alcanzar 0. El tiempo que consue su ejecucion es del orden de 1mS, dado que la ejecucion de
;tres instrucciones que consumen 4 uS, se repite 255 veces
Delay clrf Delay_Fijo ;se manda repetir el bucle 255 veces
Delay_1 nop ;consume 1uS le quite el nop
decfsz Delay_Fijo,F ;consume 1uS
goto Delay_1 ;consume 2uS
return
;*************************************************************
;*******************************************************
;Incrementa en una unidad las variables DIG0, DIG1, y DIG2 con el correspondiente ajuste BCD
Incrementa incf DIG0,F ;Incrementa DIG0 en una unidad
movlw 0x0a
subwf DIG0,W
btfss STATUS,Z ;ES MAYOR DE 9??
return ;no
;movlw .10 esta de mas
clrf DIG0 ;SI, AJUSTA A 0 VARIABLE DIG0
incf DIG1,F ;INCREMENTA DIG1
movlw 0x0a
subwf DIG1,W
btfss STATUS,Z ;ES MAYOR DE 9
return ;no
; movlw .10 "esta de mas----"
clrf DIG1 ;SI, AJUSTA A 0 VARIABLE DIG1
incf DIG2,F ;incrementa DIG2
movlw 0x0a
subwf DIG2,W
btfss STATUS,Z ;ES MAYOR QUE 9??
return ;no
;movlw .10 esta de masss
clrf DIG2 ;SI, AGISTA A 0 VARIABLE DIG2
return
;*********************************
;***********************************
;Decrementa en una unidad las variables dig1, dig1, y dig2 con el correspondiente ajuste BCD
;
Decrementa decf DIG0,F ;decrementa dig0 en una unidad
movlw 0xff
subwf DIG0,W
btfss STATUS,Z ;ES MENOR DE 0?
return ;no
movlw .9
movwf DIG0 ;si ajuste de DIG0
decf DIG1,F ;DECREMENTA DIG1
movlw 0xff
subwf DIG1,W
btfss STATUS,Z ;ES MEOR DE 0?
return ;no
movlw .9
movwf DIG1 ;SI, AJUSTA DIG1
decf DIG2,F ; se agrego
movlw 0xff ;se agrego
subwf DIG2,W ; se agrego de masss
btfss STATUS,Z ;ES MENOR DE 0?
return ;no
movlw .9
movwf DIG2 ;SI, AJUSTA DIG2
return
Inicio movlw b'11111111'
movwf PORTB ;PONE LOS LATCH DE SALIDA
clrf PORTA ;desconecta los digitos
bsf STATUS,RP0 ;SELECCIONA BANCO 1
clrf TRISB ;PUERTA B SE COFIGURA COMO SALIDA
movlw b'00011000'
movwf TRISA ;RA0-RA2 SE CONFIGURA COMO SALIDA
movlw b'00000111'
movwf OPTION_REG ;presscaler de 256 para el TMR0
bcf STATUS,RP0 ;SELECCIONA BANCO 0
clrf DIG0
clrf DIG1
clrf DIG2 ;CARGA LAS VARIABLES CON VALOR INICIAL 000
Loop clrwdt ;refrescar el wdt
btfsc PORTA,4 ;FLACO ASCENENTE EN RA4??
goto Descendente ;Si
call Display ;no, mantiene el refresco del display
goto Loop ;Esperar
Descendente clrwdt ;refrescar el wdt
btfss PORTA,4 ;FLANCO DECENDETE EN RA4
goto Pulso ;si ha habido un pulso en RA4
call Display ;no, mantiene el refresco del display
goto Descendente ;esperar
Pulso btfss PORTA,3 ;RA3 ESTA A "1"??
goto Dec_Cont ;no
call Incrementa ;si, incrementa el contador
goto Loop ; esperar al siguiente pulso
Dec_Cont call Decrementa ;decrementar el contador
goto Loop ;esperar el siguiente pulso
end ;fin
-
Exactamente que errores marca? Respecto a la velocidad, dependerá de los pulsos recibidos en RA4, es quien maneja el contador así que revisa eso.
Saludos!
-
.
Al parecer el programa no tiene errores. El problema con el MPLAB puede deberse a que tenés seleccionado otro pic (en Configure->Select Device) o que no agregaste el archivo P16F84.INC en la carpeta Header files de la ventana de proyecto (tal archivo lo encontrás en la carpeta MPASM Suite donde tenés instalado el MPLAB). Seguramente también te está dando unos cuantos warnings que dicen algo como "Operand not in bank 1". Por estos últimos no te preocupes, pues son más bien una advertencia del programa que un error en realidad. Los podés desactivar escribiendo ERRORLEVEL -302 debajo del include.
Espero haber sido de ayuda. ¡Saludos!
-
wooo gracias...pero como eso de la velocidad..k en ra4?? sk la verdad el maestro solo nos dio el monton de practicas y en especial dan lata la 9 y 10 y no nos explicoo niii tantitoo..asi k yaa sabras k tan gravee esta mi situacion jajaja....
Besos y muchas gracias x sus respuestas:::)
-
wooo gracias...pero como eso de la velocidad..k en ra4?? sk la verdad el maestro solo nos dio el monton de practicas y en especial dan lata la 9 y 10 y no nos explicoo niii tantitoo..asi k yaa sabras k tan gravee esta mi situacion jajaja....
Besos y muchas gracias x sus respuestas:::)
Lee las reglas del foro y reescribe las dudas, no es el lenguaje adecuado.
Saludos!