contador programable pic16f877a

buenas tardes

tengo una duda con un contador que necesito implementar para hoy mismo y no he podido espero alguien me pueda colaborar, estoy manejando el pic 16f877a programacion en asembler
tengo que implementar un programa que capture dos numeros de dos cifras cada uno y los compare. luego que por una salida de display me indique si los numeros ingresados son iguales o si uno es mayor o menor que el otro.

el ingeniero me dijo que armara parejas osea ingreso uni= primer dijito, ingreso dec=segundo dijito y que los comparara para que me diera la cifra completa. el comparador consta de una multiplicacion por 10 que es el numero que corresponde a las decenas y a el resultado de esa multiplicacion le sumo la unidad.

ejemplo uni=2 dec=5 comparo para obtener 25 la pareja.
el inconveniente esta en que no se como implementar el comparador.
agradezco a quien me pueda colaborar. ES URGENTE.
mil gracias
 
mira tengo esta rutina que es la de una multiplicacion sencilla solo que estoy tratando de dejar el datoa fijo en 10 para que en el momento en que yo quiera armar la pareja de la q anteriormente hablaba ose el 25 (por ejemplo) ingreso el 2 que es mi decimal lo multiplico por 10 me da 20 a ese resultado le sumo mi unidad y llegare asi a el 25
como te digo tengo esta rutina de multiplicacion pero no se por que no me da, osea si multiplico 2*10 esto da=30 0*10=10 y asi. como vez no da el resultado que es asi que te agradeceria si me puedes ayudar a correjirla.

la rutina es:
movf portb,0
movwf datoa
movf portc,0
movwf datob
MOVLW .10 ;esto lo puse para dejar el dato a indicado como un 10 permanente
MOVWF datoa
A1 addwf datob,0
decfsz datoa,1
goto A1
movwf portd
goto inicio

te agradezco tu atencion y espero me puedas colaborar la verdad estoy muy enrredada. ya envie la rutina. gracias
 
Última edición:
si muchas gracias si me sirve, el problema que tengo ahora es que no se como hacer para que me identifique si el numero ingresado es mayor o menor.
tengo pensado tomar las dos parejas de numeros y restarlas una respecto a la otra, si me da cero quiere decir que los numeros son iguales, ¿como hago para decir que son mayores o menores y que el programa lo entienda?
gracias por su ayuda.
 
si haces num1-num2 y num1 es mayor que num2 el resultado sera positivo, si el resultado es positivo el bit C=1, de lo contrario c=0

Mira la parte de la resta del siguiente código, esto es una calculadora que hice y tenía que comprobar en la resta si el resultado era negativo o positivo, si era negativo salía en un display -, y si era positivo salía en el display P.


Código:
; Calculadora de 4 bits con un PIC16f84 a 4Mhz que realiza operaciones de
; suma, resta, and, or y xor

        LIST    P=16F84
        RADIX   HEX


; Zona de etiquetas

ESTADO          EQU     0X03
TMR0_OPT        EQU     0X01
PORTA           EQU     0X05
PORTB           EQU     0X06
CONTA           EQU     0X0C
INTCON          EQU     0X0B
PCL             EQU     0X02
OPER1           EQU     0X0E
OPER2           EQU     0X0F
OPERADOR        EQU     0X10
W               EQU     0
F               EQU     1
DATOS           EQU     0X12
CONTB           EQU     0X11       ; en CONTB almacenaremos un numero del
                                   ; 1 al 3 que nos indicara si el valor
                                   ; introducido es el primer operando,
                                   ; el segundo o el operador
DECENAS         EQU     0X13
CONTE           EQU     0X14
CONTF           EQU     0X15
CONTG           EQU     0X16

                ORG     0

                GOTO    INICIO
               
                



INICIO          BSF     ESTADO,5     ; cambio al banco 1
                MOVLW    0XFF
                MOVWF   PORTA        ; puerta a entradas
                CLRF    PORTB        ; puerta b salidas
                MOVLW   B'11010111'  ;tmr0 como contador, y divisor 256
                MOVWF   TMR0_OPT
                BCF     ESTADO,5     ; cambio al banco 0
                CLRF    CONTB      
                CLRF    PORTB
                CLRF    PORTA
                


LEER            BTFSS   PORTA,4  ;esperamos a recibir un pulso por ra4
                GOTO    LEER
LEER2           BTFSC   PORTA,4  ;comprobamos que ra4 no se ha quedado activada
                GOTO    LEER2
                INCF    CONTB,F  ;incrementamos contb cada vez que leemos porta
                MOVF    PORTA,W
                MOVWF   DATOS    ;movemos porta a datos
                MOVLW   1        
                SUBWF   CONTB,W  ;restamos contb - 1
                BTFSC   ESTADO,2  
                GOTO    OPERANDO1 ;si el resultado es 0 se trata del operando1
                MOVLW   2         ;si no se trata del operando1 comprobamos si
                                  ;se trata del operando2
                SUBWF   CONTB,W
                BTFSC   ESTADO,2
                GOTO    OPERANDO2 ;si el resultado es 0 se trata del operando2
                CLRF    CONTB     ; ponemos a 0 contb ya que si se ejecuta esta
                                  ; instruccion se trata del operador
                MOVF    DATOS,W
                MOVWF   OPERADOR
                GOTO    OPERACION


OPERANDO1       MOVF    DATOS,W   ; guardamos el operando1 en oper1
                MOVWF   OPER1
                GOTO    NUMERO

OPERANDO2       MOVF    DATOS,W   ; guardamos el operando2 en oper2
                MOVWF   OPER2
                GOTO    NUMERO



NUMERO          CLRF    DECENAS                                       
BUCLE           MOVLW   D'10'
                SUBWF   DATOS,W   ; restamos datos - 10 = w
                BTFSS   ESTADO,0  ;si hay  acarreo salta, es decir, si el
                                  ;numero es mayor que 9 salta
                GOTO    MOSTRAR   ; si el numero es menor que 9 vamos a mostrar
                INCF    DECENAS,F ;si es mayor que 9, decenas=decenas+1
                MOVWF   DATOS     ;datos=datos-10
                GOTO    BUCLE     ;repetimos hasta tener guardadas las decenas
                                  ;en decenas y las unidades en datos

MOSTRAR         MOVF    DECENAS,W 
                CALL    DISPLAY   
                MOVWF   PORTB     ;sacamos las decenas por el display
                CALL    RETARDO
                MOVF    DATOS,W
                CALL    DISPLAY
                MOVWF   PORTB     ;sacamos las unidades por el display
                CALL    RETARDO
                CLRF    PORTB     ;apagamos el display
                GOTO    LEER


DISPLAY         ADDWF   PCL,F           ; salta w instrucciones
                RETLW   0X3F            ; saca un 0 en el display
                RETLW   0X06            ; saca un 1 en el display
                RETLW   0X5B            ; saca un 2 en el display
                RETLW   0X4F            ; saca un 3 en el display
                RETLW   0X66            ; saca un 4 en el display
                RETLW   0X6D            ; saca un 5 en el display
                RETLW   0X7D            ; saca un 6 en el display
                RETLW   0X07            ; saca un 7 en el display
                RETLW   0X7F            ; saca un 8 en el display
                RETLW   0X6F            ; saca un 9 en el display




RETARDO         MOVLW   D'40'       ; Mediante contadores y bucles anidados
                                    ; contamos 5 segundos siempre que el pic
                                    ; trabaje a 4Mhz
                MOVWF   CONTE
BUCLE2          MOVLW   D'100'
                MOVWF   CONTF
BUCLE1          MOVLW   D'249'
                MOVWF   CONTG
BUCLE0          NOP
                DECFSZ  CONTG,F     ;decrementa 1 unidad contg, si da 0 salta
                GOTO    BUCLE0
                DECFSZ  CONTF,F
                GOTO    BUCLE1
                DECFSZ  CONTE,F
                GOTO    BUCLE2

                RETURN

OPERACION       ADDWF   PCL,F  ; salta w instrucciones
                GOTO    SUMA                 
                GOTO    RESTA
                GOTO    AND
                GOTO    OR
                GOTO    XOR




SUMA            MOVF    OPER2,W
                ADDWF   OPER1,W
                MOVWF   DATOS
                GOTO    POSITIVO



RESTA           MOVF    OPER2,W
                SUBWF   OPER1,W
                MOVWF   DATOS
                BTFSC   ESTADO,0
                GOTO    POSITIVO
                COMF    DATOS,F
                INCF    DATOS,F
                MOVLW   B'01000000'
                MOVWF   PORTB
                CALL    RETARDO
                GOTO    NUMERO


AND             MOVF    OPER2,W
                ANDWF   OPER1,W
                MOVWF   DATOS
                GOTO    POSITIVO

OR              MOVF    OPER2,W
                IORWF   OPER1,W
                MOVWF   DATOS
                GOTO    POSITIVO

XOR             MOVF    OPER2,W
                XORWF   OPER1,W
                MOVWF   DATOS
                GOTO    POSITIVO

POSITIVO        MOVLW   B'01110011'
                MOVWF   PORTB
                CALL    RETARDO
                GOTO    NUMERO


                END





:S no salen los espacios para que se vean las etiquetas claramente, algun experto del foro sería tan amable de decirme como puedo hacer para respetar los espacios del texto original?
 
Última edición:
Hola erik: El corto segmento de codigo que subiste no hace ninguna "comparacion"... solo esta "ensamblando" los datos de entrada, para su posterior comparacion.

Pero si lo piensas con calma no necesitas hacer el "ensamble" para hacer la comparacion. Mira el siguiente pseudocodigo:

- Leer decenas de la cifra 1: alojarlo en la variable Dec_cifra1
- Leer unidades de la cifra 1: alojarlo en la variable Uni_cifra1
- Leer decenas de la cifra 2: alojarlo en la variable Dec_cifra2
- Leer unidades de la cifra 2: alojarlo en la variable Uni_cifra2

Ahora, solo tienes que comparar las cuatro cantidades:

- Si Dec_cifra1 es mayor a Dec_cifra2 => cifra 1 es mayor a cifra 2 y se termina la comparacion.
- Si Dec_cifra1 es menor a Dec_cifra2 => cifra 1 es menor a cifra 2 y se termina la comparacion.
- Si Dec_cifra1 es igual a Dec_cifra2, entonces se hace la comparacion entre las respectivas unidades de ambas cifras.... etc.

Nota que de esta manera el algoritmo tiene un tiempo de ejecucion independiente del valor de las
cifras, lo que no ocurre con tu algoritmo.

Saludos
 
Última edición:
Hola a todos en esta ocasiÓn tengo un programa el cual considero se encuentra bien es un contador el cual le ingreso un numero de dos cifras por teclado y luego de que me lo visualize debe decrementar hasta llegar a cero no se que se encuentre mal peo no obtengo nada que sirva es como si el micro no me estuviera asumiendo el pic o no se y bota unos nÚmeros que no van en orden y se enloquece, no se si sea programa o montaje este ultimo ya lo he revisado mucho y segÚn lo encontrado esta bien pero tengo dudas si lo que falla es el programa. No se que mas hacer. AgradecerÍa su ayuda.
Adjunto el programa
 

Adjuntos

  • CONTADOR.txt
    3.5 KB · Visitas: 97
erik: Una recomendacion de orden general... documenta tus programas. No solo te haces la vida mas facil sino que nos ayuda a ayudarte. Acerca de CONTADOR.txt noto que defines unas variables que estan contenidas en p16f877a.inc lo cual es innecesario y puede llevar a conflictos, me explico, por ejemplo, status equ 0x03 ya esta definido en el archivo p16f877a.inc. Abre este ultimo archivo y encontraras dicha definicion y otras mas que estas repitiendo.
Elimina las definiciones redundantes, compila de nuevo y comenta los resultados.
Saludos
 
tecnogirl
TE AGRADEZCO MUCHO TU ATENCIÓN SOLO QUE TENGO UN PROBLEMA LAS VARIABLES DE LAS QUE TU HABLAS NO LAS PUEDO QUITAR POR QUE ME PRODUCE ERROR ME DICE QUE SON VARIABLES NO DEFINIDAS ASI QUE NO SE QUE HACER NO SE POR QUE NO FUNCIONA SI YO CREERIA QUE ESTA BIEN. MIL GRACIAS
 

Adjuntos

  • CONTADOR.txt
    4.8 KB · Visitas: 54
erik: No mandes nada, creo haber encontrado un error en el control de flujo del programa, en el siquiente segmento de codigo:
Código:
stop ; Chequea el final del conteo
 movlw .0  ; W <- 0
 xorwf uni,0  ; comparelo con uni y lleve el valor a W
 btfss status,2 ; si uni = 0 salte, si no retorne
 return
 movlw .0  ; W <- 0
 xorwf dec,0  ; comparelo con dec
 btfss status,2 ; si dec = 0  ir a inicio si no return
 return
 goto inicio
La ultima linea es "goto inicio", creo que esta mal ya que "stop" es una subrutina que se invoca mediante un "call" y se sale de la misma solo mediante "return" a fin de que el stack del micro se reponga correctamente, pero esto no ocurre si sales con un goto. Lo mas seguro es que estas desbordando el stack.
Revisa, corrige, compila, ejecuta y comenta los resultados... Si hay error, envia el archivo *.lst, como te indicó Chico3001.
Saludos
 
Atrás
Arriba