Autor Tema: Frecuencimetro  (Leído 1102 veces)

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

Desconectado jhordyb3xd

  • PIC10
  • *
  • Mensajes: 7
Re:Frecuencimetro
« Respuesta #15 en: 20 de Noviembre de 2019, 19:23:07 »
Lo que yo no entiendo bien es como implementar la rutina de conversión, y qué valores debo tomar de ahí para pasarás a centenas, decenas y unidades

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5208
Re:Frecuencimetro
« Respuesta #16 en: 21 de Noviembre de 2019, 11:15:17 »
Prueba con esta:

http://www.piclist.com/techref/microchip/math/radix/b2bu-24b9d-xx.htm
Código: ASM
  1. BIN2DEC:
  2.                 clrf DEC0       ; Clear decimal output buffer
  3.                 clrf DEC1
  4.                 clrf DEC2
  5.                 clrf DEC3
  6.                 clrf DEC4
  7.                 clrf DEC5
  8.                 clrf DEC6
  9.                 clrf DEC7       ; NB. BINn and FSR are trashed after this routine
  10.                 movlw 24        ; Initiate bit loop
  11.                 movwf BIT_COUNTER
  12. BITLOOP:
  13.                 rlf BIN0, F     ; Every iteration of this loop will copy the next
  14.                 rlf BIN1, F     ; bit of the bin value, starting with the MSB,
  15.                 rlf BIN2, F     ; to the carry flag
  16.                 movlw DEC0
  17.                 movwf FSR       ; Initiate DECn pointer and counter
  18.                 movlw 8
  19.                 movwf DEC_COUNTER       ; The following is executed 8 times per bit
  20. DECLOOP:
  21.                 rlf INDF, F     ; Multiply DECn by two with carry, DECn * 2 + C
  22.                 movlw -10       ; See note above - test for DECn > 9
  23.                 addwf INDF, W   ; W = DECn -10, if W = positive or zero, C = 1
  24.                 btfsc STATUS, C ; DECn has overflowed (>>9) if carry is set
  25.                 movwf INDF      ; If carry is set DECn = DECn - 10
  26.                 incf FSR, F     ; Carry is CARRIED over to next multiply
  27.                 decfsz DEC_COUNTER, F
  28.                 goto DECLOOP    ; Multiply next DECn
  29.                 decfsz BIT_COUNTER, F
  30.                 goto BITLOOP    ; Do next bit
  31.                 retlw 0         ; Could be RETURN on most PICs
  32.  

Es para 24 bits, mucho más de lo que necesitas, pero creo que te funcionará bien.
Tienes que declarar las variables.
En BIN0 ... BIN3 metes el número binario.
En DEC0 ... DEC7 obtienes el número en 8 cifras bcd
Además necesitas declarar dos contadores.

Un saludo.
« Última modificación: 21 de Noviembre de 2019, 11:26:13 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5208
Re:Frecuencimetro
« Respuesta #17 en: 21 de Noviembre de 2019, 11:19:14 »
Esta es la modificación para que la rutina convierta solo 10 bits binarios sobre 4 bytes BCD.
No está probado, así que puede tener errores:

Código: ASM
  1. BIN2DEC:
  2.                 clrf DEC0       ; Clear decimal output buffer
  3.                 clrf DEC1
  4.                 clrf DEC2
  5.                 clrf DEC3
  6.                 movlw 10        ; Initiate bit loop
  7.                 movwf BIT_COUNTER
  8. BITLOOP:
  9.                 rlf BIN0, F     ; Every iteration of this loop will copy the next
  10.                 rlf BIN1, F     ; bit of the bin value, starting with the MSB, to the carry flag
  11.                 movlw DEC0
  12.                 movwf FSR       ; Initiate DECn pointer and counter
  13.                 movlw 4
  14.                 movwf DEC_COUNTER       ; The following is executed 4 times per bit
  15. DECLOOP:
  16.                 rlf INDF, F     ; Multiply DECn by two with carry, DECn * 2 + C
  17.                 movlw -10       ; See note above - test for DECn > 9
  18.                 addwf INDF, W   ; W = DECn -10, if W = positive or zero, C = 1
  19.                 btfsc STATUS, C ; DECn has overflowed (>>9) if carry is set
  20.                 movwf INDF      ; If carry is set DECn = DECn - 10
  21.                 incf FSR, F     ; Carry is CARRIED over to next multiply
  22.                 decfsz DEC_COUNTER, F
  23.                 goto DECLOOP    ; Multiply next DECn
  24.                 decfsz BIT_COUNTER, F
  25.                 goto BITLOOP    ; Do next bit
  26.                 retlw 0         ; Could be RETURN on most PICs
  27.  

Un saludo.
« Última modificación: 21 de Noviembre de 2019, 11:23:20 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5208
Re:Frecuencimetro
« Respuesta #18 en: 28 de Noviembre de 2019, 19:05:41 »
¿Ha funcionado?

Desconectado jhordyb3xd

  • PIC10
  • *
  • Mensajes: 7
Re:Frecuencimetro
« Respuesta #19 en: 02 de Diciembre de 2019, 17:14:44 »
Si funcionó bien con el segundo, porque los que me pasaban antes no funcionaba, pero estos si