Autor Tema: Funcion IF  (Leído 2125 veces)

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

Desconectado JanG

  • PIC10
  • *
  • Mensajes: 3
Funcion IF
« en: 19 de Octubre de 2023, 02:40:49 »
Saludos!!!

resulta que tengo que hacer un contador de 0 a 99 con solo una BCD, la cuestión es que estoy haciendo el proceso median condicion If Else

INCREMENTO
      
   IF   UNI==.9
   CLRF   UNI
   CALL   MOSTRAR
   ELSE   
   INCF   UNI,1
   CALL   MOSTRAR

   ENDIF
   RETURN
MOSTRAR
   MOVF   UNI,0
   MOVWF   PORTD
   RETURN



Cada vez que sea 9, reset, de primera instancia, ya que quiero hacer primero el contador de unidades. Pero pasa que sigue contando hasta 15 y vuelta a 0 (claro que después del 9, el display 7 segmentos da errores hasta reset en 0)


Tengo duda en como establecer las variables, pq tengo a UNI EQU 0



Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Funcion IF
« Respuesta #1 en: 19 de Octubre de 2023, 09:59:29 »
IF,ELSE,ENDIF   son directivas de ensamblado condicional, no genera instrucciones.

Ahí el bloque  de  CLRF   UNI   no se ensambla,  solamente lo de INCF

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Funcion IF
« Respuesta #2 en: 19 de Octubre de 2023, 10:59:41 »
Saludos!!!

resulta que tengo que hacer un contador de 0 a 99 con solo una BCD, la cuestión es que estoy haciendo el proceso median condicion If Else

INCREMENTO
      
   IF   UNI==.9
   CLRF   UNI
   CALL   MOSTRAR
   ELSE   
   INCF   UNI,1
   CALL   MOSTRAR

   ENDIF
   RETURN
MOSTRAR
   MOVF   UNI,0
   MOVWF   PORTD
   RETURN



Cada vez que sea 9, reset, de primera instancia, ya que quiero hacer primero el contador de unidades. Pero pasa que sigue contando hasta 15 y vuelta a 0 (claro que después del 9, el display 7 segmentos da errores hasta reset en 0)


Tengo duda en como establecer las variables, pq tengo a UNI EQU 0

Aunque no has indicado que microcontrolador estás usando, voy a asumir que es un PIC16, y un if sería:

Código: ASM
  1. INCREMENTO:
  2.     MOVFW UNI               ; if  (.9 == UNI)
  3.     SUBLW .9                  
  4.     BTFSC STATUS,Z
  5.     GOTO IGUAL_A_9
  6.     INCF   UNI,1             ; desde aquí equivale a else  
  7.     CALL   MOSTRAR
  8. RETURN                    ; fin de else
  9.  
  10. IGUAL_A_9:
  11.      CLRF   UNI
  12.      CALL   MOSTRAR
  13. RETURN
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado JanG

  • PIC10
  • *
  • Mensajes: 3
Re:Funcion IF
« Respuesta #3 en: 19 de Octubre de 2023, 13:36:50 »
Saludos!!!

resulta que tengo que hacer un contador de 0 a 99 con solo una BCD, la cuestión es que estoy haciendo el proceso median condicion If Else

INCREMENTO
      
   IF   UNI==.9
   CLRF   UNI
   CALL   MOSTRAR
   ELSE   
   INCF   UNI,1
   CALL   MOSTRAR

   ENDIF
   RETURN
MOSTRAR
   MOVF   UNI,0
   MOVWF   PORTD
   RETURN



Cada vez que sea 9, reset, de primera instancia, ya que quiero hacer primero el contador de unidades. Pero pasa que sigue contando hasta 15 y vuelta a 0 (claro que después del 9, el display 7 segmentos da errores hasta reset en 0)


Tengo duda en como establecer las variables, pq tengo a UNI EQU 0

Aunque no has indicado que microcontrolador estás usando, voy a asumir que es un PIC16, y un if sería:

Código: ASM
  1. INCREMENTO:
  2.     MOVFW UNI               ; if  (.9 == UNI)
  3.     SUBLW .9                  
  4.     BTFSC STATUS,Z
  5.     GOTO IGUAL_A_9
  6.     INCF   UNI,1             ; desde aquí equivale a else  
  7.     CALL   MOSTRAR
  8. RETURN                    ; fin de else
  9.  
  10. IGUAL_A_9:
  11.      CLRF   UNI
  12.      CALL   MOSTRAR
  13. RETURN






Uso el 18f452, de codigo completo es esto

Código: ASM
  1. ;============================================================================================
  2. ;       ENCABEZADO  
  3. ;============================================================================================
  4.  
  5. ;PROGRAMA: DISPLAY CONTADOR
  6. ;AUTOR: JUAN JOSÉ ANGRINO
  7. ;FECHA: 2023-09-11
  8.  
  9. ;================   Definición del microcontrolador =========================================  
  10.  
  11.         LIST    P=18F452                ;Microcontrolador seleccionado
  12.         INCLUDE <P18F452.inc>   ;Definiciones propias, en proteus debe iniciar con un #
  13.  
  14. ;================   Bits de configuración del microcontrolador ==============================
  15.  
  16. ;BITS_CONF
  17.         CONFIG  OSC=HS          ;Internal oscillator, se colocar FOSC --> PARA EL 18F4550
  18.         CONFIG  PWRT=ON         ;Power-up timer enable bit
  19.         CONFIG  BOR=OFF         ;Brown-out reset disabled in hardware and sofware
  20.         CONFIG  WDT=OFF         ;Watch Dog Timer disabled
  21. ;       CONFIG  MCLRE=ON                ;MCLR pin enabled --> PARA EL 18F4550 = ON
  22. ;       CONFIG  PBADEN=OFF      ;PORTB<4:0> pins are configured as digital I/O --> PARA EL 18F4550
  23.         CONFIG  LVP=OFF         ;Single-Supply ICSP disabled
  24.         CONFIG  DEBUG=OFF               ;Background debugger disabled
  25. ;       CONFIG  XINST=OFF               ;Extended Instruction disabled --> PARA EL 18F4550 = OFF
  26.  
  27. ;============================================================================================
  28. ;        DEFINICIÓN DE VARIABLES Y CONSTANTES  
  29. ;============================================================================================
  30.  
  31.         #DEFINE UNI     .0
  32.         #ifdef  UNI
  33.  
  34.        
  35. ;       NUEVE   SET     .2
  36. ;       UNI     SET     .0
  37.        
  38.  
  39.  
  40.  
  41.         DEC     EQU     D'0'
  42.        
  43.  
  44.  
  45.  
  46.         CONTR   EQU     D'5'    ;Contador de rotacione, ese establece ese valor ya que uno mayor a 10, genera errores en el muestreo de letras
  47.         CONT01  EQU     D'6'    ;Registro del retardo
  48.         CONT02  EQU     D'7'    ;Registro del retardo
  49.         CONT03  EQU     D'8'    ;Registro del retardo
  50.        
  51.         APAG    EQU     D'5'    ;Contador de rotacione, ese establece ese valor ya que uno mayor a 10, genera errores en el muestreo de letras
  52.         APAG01  EQU     D'6'    ;Registro del retardo
  53.         APAG02  EQU     D'7'    ;Registro del retardo
  54.         APAG03  EQU     D'8'    ;Registro del retardo
  55.                
  56.  
  57. ;       AREA    SET     H'0'
  58.        
  59. ;       VARIABLE        I=.0            ;Definición de variable
  60. ;       VARIABLE        CONT04=.10      ;Definición de variable
  61.        
  62. ;       CONSTANT        LONG_MAX=.35    ;Definición de constante
  63.  
  64. ;============================================================================================
  65. ;       DEFINICIÓN DEL ORIGEN Y VECTORES DE RESET E INTERRUPCIONES
  66. ;============================================================================================
  67. ORIGEN
  68.         ORG     0X0000          ;Origen de compilación – 00H
  69.         GOTO    CONF_PUERTOS
  70.  
  71. ;================   Vectores de resert e interrupciones =====================================
  72. RES_E_INT
  73.         ;Por ahora no hay nada a configurar
  74. ;============================================================================================
  75. ;       CÓDIGO DE PROGRAMACIÓN
  76. ;============================================================================================
  77.  
  78. ;================   Configuración de puertos ================================================
  79. ;RECOMENDACIÓN: Recordemos que en sesión de clase, les explicaba que hay puertos que tienen
  80. ;       doble función, digital y análoga. Por lo cual, es necesario configurar sus registros
  81. ;       propios. Como en el ejemplo a continuación, el puerto A, tiene el registro ADCON1
  82. ;       para configurar. Si no recuerdas debes ir a las diapositivas y al datasheet para guiarte.
  83. ;       O me preguntas la duda, sin embargo, Yo te preguntaré que consultaste.
  84.  
  85. CONF_PUERTOS
  86.  
  87.         ;lIMPIAR LOS LATCHES DE CADA PUERTO
  88.         CLRF    LATA            ;Limpieza del latch de salida del puerto A
  89.         CLRF    LATB            ;Limpieza del latch de salida del puerto B
  90.         CLRF    LATC            ;Limpieza del latch de salida del puerto C
  91.         CLRF    LATD            ;Limpieza del latch de salida del puerto D
  92.         CLRF    LATE            ;Limpieza del latch de salida del puerto E
  93. ;==================================================
  94.  
  95.  
  96. ;ENTRADAS PULSADORES D0 - D1 / D2 - D3
  97. ;CONFIGURAR LOS PINES ANÁLOGOS COMO DIGITALES O ANÁLOGOS SI ES DEL CASO
  98.         MOVLW   B'00000111'     ;PCFG<3:0> como 1
  99.         MOVWF   ADCON1          ;Pines A/D configurados como E/S digitales
  100.  
  101.         MOVLW   B'00000011'     ;En HEX, En binario -> B'00001111'
  102.         MOVWF   TRISA           ;Configuro nible alto como IN y el bajo como OUT
  103.  
  104.  
  105.  
  106. ;SALIDAS PARA EL 7447
  107.         MOVLW   B'11110000'             ;En HEX, En binario -> B'00000000'
  108.         MOVWF   TRISB           ;Configuro nible bajo como Out
  109.  
  110.         MOVLW   0x00            ;En HEX, En binario -> B'00000000'
  111.         MOVWF   TRISC           ;Configuro nible bajo como Out
  112.  
  113.         MOVLW   B'11110000'             ;En HEX, En binario -> B'00000000'
  114.         MOVWF   TRISD           ;Configuro nible bajo como Out
  115.        
  116.        
  117.  
  118. ;==================================================
  119.  
  120. ;================   Programa Principal ======================================================
  121.  
  122. ;ETIQ     |INST     | OPERANDOS  |      ;COMENTARIOS
  123. ;/////////////////////////////////////////////////////////////////////////////////////
  124.  
  125.  
  126. INICIO 
  127.  
  128.  
  129.         CALL    PUSHINC
  130. ;       CALL    DEC
  131.         GOTO    INICIO
  132.  
  133.  
  134. ;/////////////////////////////////////////////////////////////////////////////////////
  135.  
  136.  
  137. ;_______________PARTE BOTONES MANUALES_______________-
  138.  
  139.  
  140. ;/////////////PRINCIPAL LLAMADO///////////////////////////////
  141. PUSHINC
  142.  
  143.         BSF     PORTC,0
  144.         CALL    INCM
  145. ;       CALL    DECM
  146.         RETURN
  147.  
  148. ;//////////////////////////////////////////////////////////////
  149.  
  150.  
  151. INCM                    ;INCREMENTO MANUAL     
  152.         BTFSS   PORTA,0 ;¿1? SALTA 2
  153.         RETURN
  154.         CALL    PRUEBA  ;Paso a mi segundo testeo para saber cuando suelto
  155.         RETURN
  156. PRUEBA
  157.         BTFSC   PORTA,0 ;¿ES 0? SALTA 2, NO, BLUCLE EN PRUEBA
  158.         GOTO    PRUEBA
  159.         CALL    INCREMENTO;Llamo mis condiciones para incrementar o poner en 0
  160.         RETURN
  161. INCREMENTO
  162.                
  163.         IF      UNI==.9
  164.         CLRF    UNI
  165.         CALL    MOSTRAR
  166.         ELSE   
  167.         INCF    UNI,1
  168.         CALL    MOSTRAR
  169.  
  170.         ENDIF
  171.         RETURN
  172. MOSTRAR
  173.         MOVF    UNI,0
  174.         MOVWF   PORTD
  175.         RETURN
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191. ;PRUEBADEC
  192. ;       IF      PORTD==DEC
  193. ;       CRLF    PORTD
  194. ;       GOTO    INICIO
  195. ;       ELSE
  196. ;       INCF    DEC,1  
  197. ;       ENDIF
  198. ;       GOTO    PUSHINC
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207. ;if
  208.  
  209. ;elseif
  210.  
  211. ;endif
  212.  
  213. ;////////////////////////////////////////////////////////////////////////////////////
  214.  
  215.  
  216. ;================   RETARDO =================================================================
  217.  
  218. RETARDO                 ;
  219.         MOVLW   .1      ;
  220.         MOVWF   CONT03  ;
  221.  
  222. CICLO03
  223.         MOVLW   .8      ;
  224.         MOVWF   CONT02  ;
  225. CICLO02
  226.         MOVLW   .250    ;
  227.         MOVWF   CONT01  ;
  228. CICLO01
  229.         DECFSZ  CONT01,F        ;
  230.         GOTO    CICLO01 ;
  231.         DECFSZ  CONT02,F        ;
  232.         GOTO    CICLO02 ;
  233.         DECFSZ  CONT03,F        ;
  234.         GOTO    CICLO03 ;
  235.         RETURN          ;
  236.  
  237. ;================   APAGADO =================================================================
  238.  
  239. DELAY                   ;
  240.         MOVLW   .1      ;
  241.         MOVWF   APAG03  ;
  242.  
  243. CICLO3
  244.         MOVLW   .80     ;
  245.         MOVWF   APAG02  ;
  246. CICLO2
  247.         MOVLW   .250    ;
  248.         MOVWF   APAG01  ;
  249. CICLO1
  250.         DECFSZ  APAG01,F        ;
  251.         GOTO    CICLO1  ;
  252.         DECFSZ  APAG02,F        ;
  253.         GOTO    CICLO2  ;
  254.         DECFSZ  APAG03,F        ;
  255.         GOTO    CICLO3  ;
  256.         RETURN          ;
  257.  
  258. ;================   FIN =====================================================================
  259. END
  260. ;============================================================================================
Citar


un Profesor me ha dicho que para el micro pueda entender el condicional if, debe de hacer un test de bits en el puerto, me de ejmplo algo asi, que es una implementacion en CCS


if (bit_test (PORTA,0)==1) { // la funcion bit test va al puerto A y verifica si este se encuentra en un estado alto

contador++; // aumento el conteo que comienza en 0

  if (contador ==10) {
   contador =0; } // esto hace que estrictamente el contador llegue hasta 9, pues arranca en 0

PORTB = contador; // El puerto B esta sujeto al incremento es decir ese puerto esta conectado con el display 7 segmentos

While (bit_test(PORTA,0)==1) { // esto se llama recursividad garantiza que el cambio se haga si y solo si el puerto A este en alto
}



cuando me dice del testeo, solo viene a mi cabeza el btfs, que es lo unico que me han enseñado, pero de igual forma, sigue siendo posible esclarecer un testeo mediante el uso del btfs como en el ejemplo?

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Funcion IF
« Respuesta #4 en: 19 de Octubre de 2023, 15:43:06 »
un Profesor me ha dicho que para el micro pueda entender el condicional if, debe de hacer un test de bits en el puerto, me de ejmplo algo asi, que es una implementacion en CCS

if (bit_test (PORTA,0)==1) { // la funcion bit test va al puerto A y verifica si este se encuentra en un estado alto

contador++; // aumento el conteo que comienza en 0
...
El profesor te dió un ejemplo en C pero vos estás programando en assembler.   Decidí cual vas a usar (sugerencia: C)

Desconectado JanG

  • PIC10
  • *
  • Mensajes: 3
Re:Funcion IF
« Respuesta #5 en: 19 de Octubre de 2023, 17:59:52 »
un Profesor me ha dicho que para el micro pueda entender el condicional if, debe de hacer un test de bits en el puerto, me de ejmplo algo asi, que es una implementacion en CCS

if (bit_test (PORTA,0)==1) { // la funcion bit test va al puerto A y verifica si este se encuentra en un estado alto

contador++; // aumento el conteo que comienza en 0
...
El profesor te dió un ejemplo en C pero vos estás programando en assembler.   Decidí cual vas a usar (sugerencia: C)



Me encantaria usar C, pero, lamentablemente solo puedo usar asm, nada mas :c