Autor Tema: Rutinas para compartir  (Leído 33784 veces)

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

Desconectado AnalexaCastillo

  • PIC10
  • *
  • Mensajes: 1
Re:Rutinas para compartir
« Respuesta #60 en: 13 de Agosto de 2016, 19:49:15 »
Hola chic@s, yo soy nueva en el grupo pero me han ayudado mucho, les dejo un aporte, conversor A/D, para pic16f887

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1861
    • www.ingeniopic.com
Re:Rutinas para compartir
« Respuesta #61 en: 02 de Septiembre de 2017, 15:14:48 »
hola.me hizo falta realizar una rutina que convirtiera un numero HEX de 4 bytes (16bit) a un numero decimal.

utilizo dos registros: DEC_H y DEC_L para el valor hexagesimal.

y recojo el resultado en DEC_U,DEC_H y DEC_L.

el valor 0000h daria 0x00,0x00,0x00   =0

y el valor FFFFh daria 0x06,0x55,0x35  =65535.

despues de esto ya es facil coger estos valores y pasarlos a ASCII.o usarlos tal cual segun nuestras necesidades.


   movlw   0Xff          ;valor hexagesimal para el byte bajo a convertir
      movwf   DEC_L          ;byte bajo del valor hexagesimal a convertir
      movlw   0Xff          ;valor hexagesimal para el byte alto a convertir
      movwf   DEC_H          ;byte alto del valor hexagesimal a convertir
      
      
      call   BIN16_TO_DEC
      NOP
      
Código: [Seleccionar]
;******************************************************* BIN16_TO_DEC ***************************************************
;conversor
BIN16_TO_DEC movff DEC_H,ADD_DEC_H
clrf CIENTOS     ;registro de las centenas
clrf ACUMULADOR
clrf DEC_U

SUB1 movlw .100     ;valor a restar
subwf DEC_L,W     ;restalo al acumulador
btfss STATUS,C
goto SUB     ;si es menor salta a SUB.pero si es mayor o igual,sigue restando
movlw .100     ;valor a restar
subwf DEC_L,F     ;restalo del byte bajo
incf CIENTOS,F     ;incrementa el registro de las centenas
call incre_cientos     ;incremento de los registros contadores
goto SUB1     ;repite
;*********************************************************** SUB ******************************************************
SUB movf DEC_L,W     ;recoge el resto
addwf ACUMULADOR,F     ;y sumalo al acumulador
movlw .100    
subwf ACUMULADOR,w     ;si no llega a 100,
btfss STATUS,C
goto acu1     ;continua calculo
movlw .100
subwf ACUMULADOR,F     ;si ACUMULADOR es igual o superior a 100. resta 100 al acumulador y
incf CIENTOS,F     ;incrementa el registro de las centenas
call incre_cientos     ;incremento de los registros contadores

acu1 clrf WREG     ;valor 0
cpfseq DEC_H     ;comprueba el valor del registro de las centenas (fin del contaje)
goto acu5     ;salta aqui si se llego al tope de descuento del registro de centenas.

acu_fin movf ADD_DEC_H,W    
addwf ACUMULADOR,f     ;ajusta el valor final
btfsc STATUS,C
call incre_doble     ;otro ajuste
movlw .100
subwf ACUMULADOR,w
btfss STATUS,C     ;comprueba si ACUMULADOR es mayor o igual a 100
goto fin2
movlw .100     ;si es asi,
subwf ACUMULADOR,F     ;resta elvalor a ACUMULADOR
incf CIENTOS,F     ;he incrementa CIENTOS
call incre_cientos
;por si el valor era 200d
movlw .100
subwf ACUMULADOR,w
btfss STATUS,C     ;comprueba si ACUMULADOR es mayor o igual a 100
goto fin2
movlw .100     ;si es asi,
subwf ACUMULADOR,F     ;resta elvalor a ACUMULADOR
incf CIENTOS,F     ;he incrementa CIENTOS
call incre_cientos     ;incremento de los registros contadores

fin2 movlw .100
subwf CIENTOS,w     ;comprueba si CIENTOS es superior a 100
btfss STATUS,C
goto fin3    
movlw .100     ;si lo es,
subwf CIENTOS,f     ;restale 100 al registro de las centenas
incf DEC_U,F     ;he incrementa el de los diezmiles

fin3 movff ACUMULADOR,DEC_L    ;intercambia registros
movff CIENTOS,DEC_H     ;intercambia registros
return     ;fin del la rutina
;******************************************************************************************************************
acu5 setf DEC_L     ;setea el registro para una nueva resta
decf DEC_H,F     ;decrementa el registro de las centenas
goto SUB1     ;vuelve al principio

;circunstancia que se da en el valor 0xB000.donde hay un desbordamiento que hay que ajustar.
incre_doble incf CIENTOS,F
incf CIENTOS,F
movlw .56
addwf ACUMULADOR,F
return

;incremento del contador de los cientos y los miles
incre_cientos movlw .100     ;valor a comparar
cpfseq CIENTOS;subwf CIENTOS,w
return     ;retorna si no lo es
incf DEC_U,F     ;incrementa el contador de los diez miles
clrf CIENTOS     ;
return     ;retorna

      
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5954
Re:Rutinas para compartir
« Respuesta #62 en: 02 de Septiembre de 2017, 15:50:21 »
Esta pagina tambien tiene algunos groundman:

http://www.piclist.com/techref/microchip/math/radix/index.htm

los unpacked es 1 registro por cada valor. Y los packed es como vos lo tenes.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1861
    • www.ingeniopic.com
Re:Rutinas para compartir
« Respuesta #63 en: 02 de Septiembre de 2017, 17:57:29 »
gracias no lo sabia.igual me hubiera ahorrado mucho tiempo.pero bueno.ya esta hecho.

ya que lo he hecho.pondre un complemento para pasar los valores a ASCII.

Código: [Seleccionar]

;*************************************************************** DEC_TO_ASCII *********************************************************

DEC_TO_ASCII movf DEC_L,w
call DEC_HEX
movwf DEC_L
movff DEC_L,TEMP_DEC_L
;call DEC_HEX
andlw 0x0F

movwf Un
movf TEMP_DEC_L,W
;call DEC_HEX
andlw 0xF0
swapf WREG
movwf Dc

movf DEC_H,W
call DEC_HEX
movwf DEC_H
movff DEC_H,TEMP_DEC_H
;movf TEMP_DEC_L,W
;call DEC_HEX
andlw 0x0F

movwf Cn
movf TEMP_DEC_H,W
;call DEC_HEX
andlw 0xF0
swapf WREG
movwf Um



movf DEC_U,W
call DEC_HEX
movwf DEC_U
movff DEC_U,TEMP_DEC_U
;movf TEMP_DEC_L,W
;call DEC_HEX
andlw 0x0F
movwf Dm

call ASCII_CONV


;xorwf TEMP_DEC_L,f
return
ASCII_CONV movlw 0x30
addwf Un,f
addwf Dc,f
addwf Cn,f
addwf Um,f
addwf Dm,f
return
;*********************************** CONVERTIR VALOR DECIMAL EN HEX ******************************************************
; Convierte valor decimal en hexgesimal
; ejemplo: 0x0f -> 0x15
DEC_HEX ;BANK7 ;selecciona el banco 7 de ram
movwf      reg1 ;carga valor a convertir contenido en W
        setf Resultado ;pon a 1 todos los bits del registro Resultado.
        movlw   .10 ;carga el valor 10d en W
div  incf    Resultado,f ;incrementa el registro Resultado
        subwf   reg1,F ;restar a reg1 el valor .10
        btfsc   STATUS,C ;comprueba si ha habido acarreo
        goto    div ;repite div
        movlw   .10 ;carga el valor 10d en W
        addwf   reg1,W ;sumalo a reg1
        movwf   Resto ;carga la suma enterior en Resto
swapf Resultado ;invierte los nibles
addwf Resultado ;suma el contenido de w a Resulatado
movf Resultado,w
return ;retorna
Montando mi primera impresora 3D (Raprep Prusa i3)