Autor Tema: Comparador de 4 bits en pic16f877a con salidas por un anodo comun de 7 segmentos  (Leído 3461 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Skelton

  • PIC10
  • *
  • Mensajes: 12
Hola, necesito ayuda respecto a este codigo que estoy realizando, no logro que la salida me aparezca en el anodo comun

quiero realizar que permita comparar dos datos A y B de 4 bits cada uno
A>B se debe mostrar la letra A
B>A se debe mostrar la letra B
A=B se debe mostrar la letra E
A y B son numeros pares se enciendeled rojo

Voy de esta manera:

 List P=16F877A ; Procesador PIC16f877A
#include "p16f877a.inc" ;Incluye las librerias
   
; CONFIGURACION DEL PIC16F84A
 __CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _CP_OFF
 
 ;CODIGO

    ORG       0
INICIO
    BSF       STATUS,RP0
    CLRF    TRISC   ;PORTC todo como salida
    CLRF    TRISD       ;PORT D RD0,RD1 como salida para el led
    MOVWF   TRISA    ; PORTA CON RA0, RA1, RA2, RA3  como entrada
    MOVWF   TRISB   ; PORTB CON RB1,RB2,RB4,RB5 como entrada
    BCF       STATUS,RP0

START
    ; Si la resta = positiva, C=1 Z=0
    ; Si la resta = cero, C=1 Z=1
    ; Si la resta = negativo, C=0 Z=0
    MOVLW   PORTA ; A -> W
    SUBWF   PORTB,W ; A - B = se almacena en W
    retlw   A'B'; B > A muestra la B
    BTFSC   STATUS,C
    retlw   A'A'; A > B Muestra la A
    BTFSC   STATUS,Z 
    retlw   A'E'; A = B Muestra la E
    MOVWF   PORTC;  W -> PORTC
    GOTO    START
    END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comparador de 4 bits en pic16f877a con salidas por un anodo comun de 7 segmentos
« Respuesta #1 en: 03 de Octubre de 2019, 23:32:01 »
Código: ASM
  1. List P=16F877A ; Procesador PIC16f877A
  2. #include "p16f877a.inc" ;Incluye las librerias
  3.    
  4. ; CONFIGURACION DEL PIC16F84A
  5.  __CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _CP_OFF
  6.  
  7.  ;CODIGO
  8.  
  9. VAL1 EQU 0x20
  10. VAL2 EQU 0x21
  11.  
  12.     ORG       0
  13. INICIO
  14.     BSF     STATUS,RP0
  15.     CLRF    TRISC           ;PORTC todo como salida
  16.     CLRF    TRISD           ;PORT D RD0,RD1 como salida para el led
  17.     MOVWF   TRISA           ; PORTA CON RA0, RA1, RA2, RA3  como entrada
  18.     MOVWF   TRISB           ; PORTB CON RB1,RB2,RB4,RB5 como entrada
  19.     MOVLW   0x06
  20.     MOVWF   ADCON1          ; PORTB como digital
  21.     BCF     STATUS,RP0
  22.  
  23.  
  24.  
  25.    ; Cambiar las salidas del display para que no muestre nada.
  26.  
  27. START
  28.     ; Propongo delay aca
  29.  
  30.     ; Preparo los registros para que por mas que cambie
  31.     ; el PORTA/B entre comparaciones no me afecte, para facilitarme
  32.     ; el trabajo uso 2 registros, 1 para A y otro para B
  33.  
  34.     MOVF    PORTA, W
  35.     MOVWF   VAL1        ; VAL1 = x:A
  36.     MOVF    PORTB, W
  37.     MOVWF   VAL2        ; VAL2 = x:B
  38.     MOVLW   0x0F        
  39.     ANDWF   VAL1, F     ; VAL1 = A  (Elimino cualquier cosa de los 4 bits superiores)
  40.     ANDWF   VAL2, F     ; VAL2 = B  (Elimino cualquier cosa de los 4 bits superiores)
  41.  
  42.     ; Comienzo la comparacion
  43.     ; ¿Pares? Ambos bits 0 deben ser 0
  44.     MOVF    VAL1, W
  45.     IORWF   VAL2, W     ; VAL1 OR VAL2
  46.     ANDLW   0x01        ; Dejo unicamente el bit 0
  47.     BTFSC   STATUS, Z   ; Pregunto si todo W es 0, si lo es entonces son pares
  48.     GOTO    SONPARES
  49.     BCF     LEDROJO
  50. IGUAL:
  51.     MOVF    VAL1, W
  52.     SUBWF   VAL2, W
  53.     BTFSC   STATUS,Z
  54.     GOTO    IGUALES
  55.     BTFSC   STATUS,C
  56.     GOTO    VAL2MAYOR
  57.     MOVLW   'A'         ; Cambiar por el valor que encienda una A
  58.     ;Aca actualizar puerto con display
  59.     GOTO    START
  60. IGUALES:
  61.     MOVLW    'E'        ; Cambiar por el valor que encienda una E
  62.     ;Aca actualizar puerto con display
  63.     GOTO     START
  64. VAL2MAYOR:
  65.     MOVLW    'B'        ; Cambiar por el valor que encienda una B
  66.     ;Aca actualizar puerto con display
  67.     GOTO     START
  68. SONPARES:
  69.     BSF     LEDROJO
  70.     GOTO    IGUAL


No lo probé.... Pero la idea es la siguiente:

Uso 2 registros para guardar el valor de PORTA, se toma una única ves, lo que menos queres es que entre medio de preguntas de PORTA te cambie algún valor, tal ves en este caso no sea algo que cambie tu panorama, pero en otros si.

Entonces uso los registros VAL1 y VAL2, luego de hacerles una AND y dejar únicamente los 4 bits de menos peso en cada uno, tengo separado cual es A y cual es B.

Solo resta empezar la comparación. Uno podría pensar que podría usar la resta para ver si son pares los números. Pero ocurre que si se cumple que es par cuando restamos 2 números pares, pero también es par cuando restamos dos números impares. Por lo tanto no es útil... Lo que hice fue usar una OR, de esa forma si el bit 0 de alguno de los 2 (A o B ) es 1, este bit quedaría en 1... Luego la AND 0x01 me deja únicamente el bit ese y los demás en 0, si el bit 0 ya ERA cero (ambos pares) entonces W queda igual a 0 y activa el flag Z.
Queda observar que en este caso el cero se considera par que no es correcto.

Finalmente pasamos a la comparación de los 2 valores. Con una resta tal y cual lo hiciste.
Primeros verificamos igualdad, segundo si es mayor y como ultima opcion si no se cumple ninguno es obviamente menor.
En cada caso puse un MOVLW con una letra, deberás cambiarlo por el valor binario con los segmentos correctos que deben encenderse.

Como es un solo display, el micro es MUY rápido, entonces no es necesario manejar el ánodo del display. Simplemente manejar que mostrar.
Otro tema es que tal ves sea mejor agregar un pequeño retardo al programa, que la lectura del puerto de entrada no sea tan rapido. Supongamos cada 100ms.
Y tambien agregue codigo para que el puerto B se pueda usar como digital, cambiando el registro ADCON1, ya que inicialmente todos los pines estan como entradas analogicas.

Desconectado Skelton

  • PIC10
  • *
  • Mensajes: 12
Re:Comparador de 4 bits en pic16f877a con salidas por un anodo comun de 7 segmentos
« Respuesta #2 en: 04 de Octubre de 2019, 12:14:37 »
Muchisimas gracias!, me hiciste entender cosas que deje por fuera del algoritmo. Demasiado agradecido, ya me pongo a realizar los cambios que me dices y lo probare!.


 

anything