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

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

Desconectado MAXI

  • PIC10
  • *
  • Mensajes: 34
Re: Rutinas para compartir
« Respuesta #45 en: 04 de Noviembre de 2009, 10:10:13 »
Hola muchachos:
Soy bastante nuevo en el foro y me gustaria hacer un aporte de rutina en la conversión bin a bcd. Esta rutina me a servido mucho en varios de mis proyectos. Se llama conversión bin a bcd por ajustes sucesivos. No soy muy frecuente en el foro por razones de tiempo. Pero quiero ayudar. Saludos y espero que les sirva.

;**************************************************************************
; Binary to BCD conversion
;   Bin (Bin_H Bin_l)   --->      BCD_H BCD_L (0000 - 9999)
;      Hexa            BCD (abcde)
;   Usa: Contador        Contador.
;   Usa: FSR   File Select Register.
;   Usa: Temporal        Temporal.
;**************************************************************************
Bin2BCD
      bcf   STATUS,C
      movlw   .16
      movwf   Contador
      clrf   BCD_L
      clrf   BCD_H
loop16
      rlf   Bin_L,f
      rlf   Bin_H,f
      rlf   BCD_L,f
      rlf   BCD_H,f
      decfsz   Contador,f
      goto   adjDEC
      return
adjDEC
      movlw   BCD_L
      movwf   FSR
      call   adjBCD

      movlw   BCD_H
      movwf   FSR
      call   adjBCD

      goto   loop16
adjBCD
      movlw   3
      addwf   INDF,w
      movwf   Temporal
      btfsc   Temporal,3
      movwf   INDF
      movlw   0x30
      addwf   INDF,w
      movwf   Temporal
      btfsc   Temporal,7
      movwf   INDF
      return
;*********************************************************************************************
;---------------------------------------------------------------------------------------------
;*********************************************************************************************
;* Nombre: Convierte.asm
;* Descripción: Rutina de conversión y carga de buffers de display
Convierte
      movf   CNT_H,w      ;carga parametros para conversion   
      movwf   Bin_H      
      movf   CNT_L,w
      movwf   Bin_L

      call   Bin2BCD      ;convierte binario a BCD

      swapf   BCD_H,w      ;guarda millares
      andlw   0x0F
      movwf   BCD_1
      movf   BCD_H,w      ;guarda centenas
      andlw   0x0F
      movwf   BCD_2
      swapf   BCD_L,w      ;guarda decenas
      andlw   0x0F
      movwf   BCD_3
      movf   BCD_L,w      ;guarda unidades
      andlw   0x0F
      movwf   BCD_4
      return
;***************************************************************************

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: Rutinas para compartir
« Respuesta #46 en: 04 de Noviembre de 2009, 14:00:55 »
oisss, que buena. con millares  :mrgreen: :mrgreen: gracias, a la carpeta que va

un saludo

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3561
    • Impresiones en 3D
Re: Rutinas para compartir
« Respuesta #47 en: 04 de Noviembre de 2009, 17:10:42 »
Muchas gracias MAXI  :-/
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado canival35

  • PIC10
  • *
  • Mensajes: 36
Re: Rutinas para compartir
« Respuesta #48 en: 20 de Noviembre de 2009, 07:07:14 »
Hola comparto una rutina hecha por mi para prender y apagar el bit D0   en un segundo del PIC18F4550 con los calculos hechos para un cristal de 20MHz, solo hace un toogle y genera retardos que segun mis calculos y el osciloscopio es 1 segundo y algunos cuandos nanosegundos de sobra, espero sea de ayuda

Código: [Seleccionar]

#INCLUDE <p18F4550.inc>
LECTURA EQU 0x0050 ;Variable de estado
LECTURA_PRUEBA EQU 0x0055 ;Variable de estado
temp EQU 0x0054
temp_retraso EQU 0x0051
temp2_retraso EQU 0x0052
temp3_retraso EQU 0x0053
Ind_Buf EQU 0x00 ; Contador de número de datos copiados
Buf_Dat EQU 0x20 ; Bufer de recepción/transmisión
ORG 0x00 ;Vectorizacion 
; GOTO inicio

;------------------------------------------

BCF INTCON,7 ;DESACTIVAR INTERRUPCIONES
BCF WDTCON,0 ;dESACTIVAR WDT
MOVLW b'10001000' ;timer 0 ON-16bits-TImer0 prescaler off
MOVWF T0CON ;
;registros de interrupciones
BCF   INTCON,7 ;deshabilitar interrupciones
; configurar puertos
CLRF PORTD
CLRF LATD
MOVLW 0x00 ;d SALIDA DE MATRIZ DE LEDS
MOVWF TRISD



;=========================
;=====inicio del progama==
;=========================

MOVLW d'248'
MOVWF temp_retraso
MOVLW d'255'
MOVWF temp2_retraso
MOVLW d'24'
MOVWF temp3_retraso



BTG LATD,0 ;INVIERTE D0
CLRF TMR0L
CALL retraso_
BRA 0X1E  ;te manda a BTG LATD






;==========rutina de retrasos=============
retraso_:
movlw 0x18 ;1
movwf temp3_retraso ;1
decfsz temp_retraso,1,0  ;1 --- 3 ciclos cuando es cero  ;FF-- salta si file es cero
goto    retraso1        ;2  = [(20332*(248-2)]+7=5001679---> 5001679*200nSeg=1 seg aprox ^
movlw 0xF8 ;1 ni maiz 246+2=248=F8    /|\
movwf temp_retraso      ;1       / | \
  ;   1 segundo sera={[246(254(80)+12)]+7}200x10^-9=1.000335 segundos / |  \
  ; / |   \
return ;2 +  3 del decfsz cuando es cero     Tercer ciclo [246*ans]+7
retraso1: |
decfsz temp2_retraso,1,0 ;1 --- 3 ciclos cuando es cero ;FF-- salta si file es cero |
goto    retraso2 ;2    (255-1)(80)+12=20332 |
movlw 0xFF ;54h=84d ;1 |
movwf temp2_retraso ;1 Segundo ciclo [254*80]+12
goto retraso_ ;2 |
|
retraso2: ;El ciclo debe de ser igual a 77 para que 255*255*77*200ns= 1.00925 segundo |
decfsz temp3_retraso,1,0 ;1 --- 3 ciclos cuando es cero |
goto    retraso2 ;2    Secuencia ascendente para
movlw 0x18 ;18h=24d ;+1 77+3=80 obtener los tiempos
movwf temp3_retraso ;+1    3 del ciclo anterior en retraso1 de retardo totales
nop ;+1 |
goto retraso1 ;+2 Primer ciclo 80
;+3 del ciclo anterior en retraso1 |


;------------------------------------------
Fin_intT0:
RETFIE
END
;------------------------------------------


Desconectado willie_rosario_salsa

  • PIC12
  • **
  • Mensajes: 75
Re: Rutinas para compartir
« Respuesta #49 en: 26 de Diciembre de 2009, 18:45:46 »
  • Suma 16bits + 16bits
  • Resta 16bis – 16 bits
  • División 8bits/8bits
  • División 24bits/16bits
  • Multiplicación 16bitsx16bits=32bits
  • Conversión binario de 8 bits a BCD
  • Conversión binario de 16 bits a BCD


Estimado Suky,

Buscando los temas acerca de los mensajes en LCD (tenía un pequeño problemita por eso acudí al foro) encontré esta rutina que me parece muy util y a la vez sencilla para poder enviar los bytes que se deseen a una LCD. Una vez más, gracias compadre, espero me puedan ayudar cuando se complique el proyecto que estoy realizando, ya que de hecho así será porque es un producto que debo considerar algunas variables y hay cosas que desearía me asesoren un poco más.

Con SaLsa,
Julio
"Es chévere ser grande, pero... Más grande es ser chévere." --- Héctor Lavoe.

Desconectado carlostex

  • PIC10
  • *
  • Mensajes: 3
Re: Rutinas para compartir
« Respuesta #50 en: 31 de Diciembre de 2010, 05:28:51 »
Hola a todos, pues soy nuevo en este foro, y un poco en la programación de microcontroladores pic de 8 bits, en estas vacaciones me dediqué a estudiarlo por mi cuenta y ya hice algunas cosas con los pic's, y pues quiero empezar aportando unas bibliotecas que uso.
Una es para hacer retardos la cual lo único que hice fue recopilar en un solo archivo los retardos producidos con http://www.piclist.com/cgi-bin/delay.exe, puse los mas usados para no ocupar mucha memoria.

otra es para realizar sumas, restas y multiplicaciones con números de 16 bits, esta no la hice yo, la tome de un post pero no recuerdo de cual, no es mi intención hacerme créditos de algo que no hice yo,  asi que no le puse nombre de autor al archivo fuente y tampoco lo tenía, le hice unas modificaciones al original por que tenia para dividir y unifiqué los registros que utilizan las 3 operaciones para no ocupar mucha ram.

La ultima es algo que considero muy útil, cuando se trabajan con LCD o Displays es común mostrar un número, para lo que se utiliza algunas de las muchas rutinas expuestas en este foro, pero cuando queremos leer de un teclado matricial se necesita ir a la inversa lo cual es un proceso muy simple. así que sirve para eso, para convertir BCD a BIN. Trabaja con números de 16 bits, por lo que uso la biblioteca de operaciones de 16 bits. Vi posteado en este foro aquí una rutina para hacer lo mismo pero como es bajada de microchip creo que tiene derechos y no se puede copiar sin el permiso del autor,
así que me hice una intentado usar poca memoria ram, se usa bastante memoria rom, pero se puede crear una rutina para multiplicar y acumular, le agregaré la rutina pero lo dejare para otro día.

Y pues publicaré los trabajos que haga con los pic's que no estén en el foro, porai tengo una rutina para trabajar con el protocolo 1 wire y el sensor ds18b20 la cual alguien la modificó para soportar ese dispositivo pues el que trae el libro es otro, y yo la modifiqué para acceder a varios dispositivos conectados al mismo puerto usando el comando match_rom, pues lo quiero para controlar varios de esos sensores pero busqué mucho por la red y no encontré una biblioteca o ejemplo que lo haga, asi que investigue en el data sheet y el protocolo 1 wire y logré hacer una implementación de uso sencillo, pero lastima que no se pueden publicar contenidos de ese libro, veré si tengo tiempo y hago una implementación propia para manejar el protocolo y el sensor.

Saludos
« Última modificación: 31 de Diciembre de 2010, 05:40:24 por carlostex »

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3561
    • Impresiones en 3D
Re: Rutinas para compartir
« Respuesta #51 en: 02 de Enero de 2011, 11:59:41 »
Muchas gracias Carlos  :-/ :-/
Y bienvenido al foro de Todopic  :-/ :-/
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado c@Lic_0

  • PIC10
  • *
  • Mensajes: 36
    • Una tasita de cafe
Re: Rutinas para compartir
« Respuesta #52 en: 08 de Febrero de 2011, 19:58:26 »
Estas rutinas tambien se las puede usar en los pic18? :mrgreen:  o tendre problemas al usarlas con estos pics

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3561
    • Impresiones en 3D
Re: Rutinas para compartir
« Respuesta #53 en: 08 de Febrero de 2011, 21:09:39 »
No c@Lic_0 No funcionan en los pic de 18F
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado emiro99

  • PIC10
  • *
  • Mensajes: 18
Re: Rutinas para compartir
« Respuesta #54 en: 15 de Marzo de 2012, 14:44:42 »
  • Suma 16bits + 16bits
  • Resta 16bis – 16 bits
  • División 8bits/8bits
  • División 24bits/16bits
  • Multiplicación 16bitsx16bits=32bits
  • Conversión binario de 8 bits a BCD
  • Conversión binario de 16 bits a BCD


Muchísimas gracias, por esas rutinas  :-/ :-/ :-/ :-/ :-/

Desconectado Arkantox

  • PIC10
  • *
  • Mensajes: 1
    • Ralex
Re: Rutinas para compartir
« Respuesta #55 en: 08 de Agosto de 2012, 13:04:18 »
Un saludo a todos;

Soy nuevo en el foro y pues no tan nuevo en esto del PIC este a año termino casi la carrera de Ingenieria electronico, digo casi porque me falta hacer la tesis  :? , no se si alguno le ha pasado cuando empezaron a querer usar el lcd y por razones economicas compraron un lcd barato y usaron la libreria del foro y nos le funciono, bueno pues a mi me paso algo parecido y fue toda una odicea pues no conocia este foro, pues les adjunto una libreria para esos lcd que son de bajo costos y por ende muy lentos en su inicializacion, la rutina es un hibrido pues agarre una parte del codigo de una libreria qe tenia, hoy en dia esta es la que uso para cualquier LCD ya sea de alto costo o barato igual te va a funcionar. Es para LCD-4bit

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Rutinas para compartir
« Respuesta #56 en: 15 de Agosto de 2012, 15:14:34 »
pues a compartir se ha dicho. :)

Código: [Seleccionar]
;*********************************** CONVERTIR VALOR BCD A HEX ******************************************************
; Convierte valor bcd a hexagesimal .
; ejemplo: 0x15(15 segundos del RTC) a 0x0F (valor 15 en decimal)BCD_HEX
BANK7                     ;selecciona banco 7 de ram
movwf       ByteL      ;carga valor a convertir contenido en W
movwf       ByteH     ;carga valor a convertir contenido en W
movlw       0x0f        ;selecciona el nibble bajo de W
andwf        ByteL,f    ;introducelo en el registro ByteL
movlw       0xf0        ;selecciona el nibble alto de W
andwf        ByteH,f    ;introducelo en el registro ByteH
swapf        ByteH,w   ;invierte los nibles de ByteH e introduce el resultado en W
mullw        .10          ;multiplica el contenido de W por 10d
movf         PRODL,w  ;caga el resultado en W
addwf        ByteL,w    ;suma el contenido de ByteL a W
return

esta rutina es muy util para utilizar los valores horarios que entrega un RTC.ya que este ultimo entrega los datos en formato BCD y para gestionarlos en el pic
los pasa a hexagesimales.

se carga en W el valor a convertir.y la conversion se establece de nuevo en W

PD: alguien sabe como eliminar los espacios del tabulador? es un rollo tener que eliminarlos a mano.y sin eliminarlos el texto es inteligible. :x
« Última modificación: 15 de Agosto de 2012, 16:58:06 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Rutinas para compartir
« Respuesta #57 en: 06 de Enero de 2014, 14:24:11 »
aqui pongo una rutina para usar un teclado por resistencias.hay que configurar ADCON0 correctamente antes de su llamada.es para un 18f2550



Código: [Seleccionar]
;ESTE PROGRAMA DEVUELVE EN W,EL VALOR ANALOGICO INTRODUCIDO EN AN0,AN1,AN2 O A43 aunque esta modificado para funcionar solo con AN3
;si introducimos un valor inferior a TOPE_TECLA,y metemos un valor de voltage en uno de las cuatro entradas analogicas,
;ese valor se introduce en TEMP_ANALOG.el programa solo lee un pin a la vez,es decir si introducimos voltage en los dos
;pin,solo se tendra encuenta el primer voltage que se halla aplicado.
;
;la peculariedad de que este programa sea tan grande,es que tiene un sistema de comprovacion de errores,que al pulsar
;una tecla.se almazenan en memoria 10 valores de esa tecla y se coje el valor mas repetido.de esa forma se evita el que al
;pulsar un boton resistivo,no cojamos el valor mas aproximado al real de ese boton.y que nos falle la identificacion de esa tecla.

;el programa tarda en ejecutarse 118ms a 48Mhz

CBLOCK BOTON_PULS_VAR
TEMP_ANALOG ;registro de tecla pulsada
COMPARADOR
PREVALECE
CONT_REG
CONT_COINC
  ENDC

#define VALOR_TOPE .240 ;valor tope de tecla sin pulsar
#define INI_RAM 0XF6 ;zona donde se ubicaran los datos analogicos de tecla pulsada
#define INI_TABLA 0XEC


BOTON_PULS movlw INI_RAM
movwf FSR0L
movlw BANCO_GENERAL
movwf FSR0H

REPE call DAT_AN ;lee dato analogico
movlw VALOR_TOPE
cpfslt TEMP_ANALOG
return ;si el valor analogico de la tecla es superior a TOPE_TECLA repite busqueda analogica(sin pulsar)
movff TEMP_ANALOG,INDF0
incf FSR0L,F ;incrementa FSR
clrf WREG
cpfseq FSR0L
goto REPE ;si no se ha llegado al tope de la ram repite

;********************************************************BUSCA_REP**********************************************************************;
; ;
;//////////////////////////////////////aqui leemos la ram y buscamos el dato mas repetido///////////////////////////////////////////////;
;//en este subprograma se cogen los valores almacenados entre las direcciones seleccionadas y se coge valor que tenga mas numeros repetidos.

BUSCA_REP movlw BANCO_GENERAL ;banco donde trabajaremos con los registros generales
movwf FSR2H ;selecciona bancos de direccionamiento indirecto
movwf FSR1H
movwf FSR0H

movlw INI_TABLA ;inicio de tabla ram donde estan los valores a comparar
movwf FSR0L ;selecciona indice de tabla
decf FSR0L,F ;decrementa una direccion para luego incrementarla

movlw INI_RAM ;inicio de tabla ram donde se introduciran cantidad de coincidencias
movwf FSR2L ;selecciona indice de tabla
decf FSR2L,F ;decrementa una direccion para luego incrementarla

movlw .11 ;bytes a comparar menos 1
movwf CONT_COINC ;contador de comparaciones
regsig2 dcfsnz CONT_COINC,F ;decrementa el contador de comparaciones
goto discrim ;si se ha terminado de comprobar las coincidencias salta a esta direccion


movlw INI_RAM ;inicio de tabla ram donde se introduciran cantidad de coincidencias
movwf FSR1L ;selecciona indice de tabla
incf FSR2L,F ;incrementa indice de tabla
decf FSR1L,F

movff INDF2,COMPARADOR ;introduce valor de la tabla en registro comparador
movlw .11 ;registros a comparar
movwf CONT_REG ;contador de registros a comparar
incf FSR0L,F ;incrementa  indice de registros

regsig1 incf FSR1L,F ;incrementa indice de comparaciones
movf INDF1,W ;lee el registro indexado
dcfsnz CONT_REG,F ;decrementa contador de registros
goto regsig2 ;si se ha llegado al limite salta a lectura de siguiente registro
cpfseq COMPARADOR ;comprueba si w es igual a COMPARADOR
goto regsig1 ;siguiente comparacion
incf INDF0,F ;incrementa direccion seleccionada si hay coincidencia
goto regsig1 ;siguiente comparacion


;busca el valor mas alto
discrim movlw .9 ;cantidad de registros a comparar
movwf CONT_REG ;registro contador
movlw INI_TABLA ;inicio de tabla
movwf FSR0L ;direcciona tabla ram
movff INDF0,PREVALECE ;introduce el valor contenido en ram al registro prevalescente
dis1 incf FSR0L,F ;siguiente direccion
movf INDF0,W ;carga valor direccionado en W
cpfsgt PREVALECE ;comprueba si es mayor
movff INDF0,PREVALECE ;si es mayor introduce el valor en el registro prevalescente
decfsz CONT_REG,F ;decrementa contador de comprobaciones
goto dis1 ;siguiente comprovacion

;busca el valor mas alto de las coincidencias
movlw INI_TABLA ;carga inicio de tabla
movwf FSR0L
pre1 movf INDF0,W ;carga el valor direccionado en W
xorwf PREVALECE,W ;comparalo con el valor mas alto
btfsc STATUS,Z ;si se ha encontrado,
goto pre2 ;salta a pre2
incf FSR0L,F ;incrementa direccion
goto pre1 ;repite comparacion
pre2 movlw .10 ;valor de salto a tabla de valores
addwf FSR0L ;salta al valor
movf INDF0,w ;introduce valor en W
return ;retorna


;//////////////////////////////////(conversor A/D)////////////////////////////////////////////////////////////////////////////////////////////////
;///////////////busca el dato analogico introducido por el pin seleccionado/////////////////////////////////////////////////////////////////////
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Si queremos que funcionen todas las entradas analogicas.hay que habilitar las lineas deshabilitadas

DAT_AN ;BANK0 ;selecciona banco 0
;GIE_OFF ;GIE0 ;deshabilita las interrupciones
;btfsc INTCON,GIE
;goto GIE_OFF
bsf ADCON0,GO_DONE ;inicia la conversion
AD_GOIN btfsc ADCON0,GO_DONE ;comprueva si la conversion ha finalizado
goto AD_GOIN ;si la conversion ha finalizado continua
movf ADRESH,w ;carga dato analogico en el acumulador
movwf TEMP_ANALOG ;carga el dato de w en TEMP_ANALOG
;movf ADCON0,W
;movwf CANAL ;mete el contenido de ADCON0 en CANAL
;movf CONT_AD,W ;dato que se suma a ADCON0 para que a la siguiente lectura sea en el proximo canal de AD
;addwf ADCON0,F ;incrementa el canal analogico(AN0->AN4)
;movlw b'00100001';valor para usar AN5 -> b'00101001' ;valor del ultimo registro del conversor analogico
;xorwf ADCON0,w
;btfss STATUS,Z ;si llega a este valor
;return
;movlw 0x01 ;selecciona de nuevo el conversor AN0
;movwf ADCON0
return

Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado sam_20

  • PIC10
  • *
  • Mensajes: 1
Re: Rutinas para compartir
« Respuesta #58 en: 14 de Abril de 2014, 15:09:24 »
Hola a todos

Soy nueva en el foro y me pareció muy buena idea lo de aportar las rutinas "básicas" para los pic. Concuerdo con que ahorrar tiempo, y ayudan a resolver dudas; aunque no siempre hay que estar atenidos de que nos hagan todo :)

Bueno dejo me aporte al tema, ya que a mi me sirvió mucho y espero a muchos otros también les ayude. Mi programa no es gran cosa, pero puede que beneficie a alguien.

Es un convertidor de hexadecimal a binario y a decimal, que despliega el resultado de la conversión en la terminal de la computadora, el despliegue es en formato ASCII. Esta todo comentado. Puede optimizarse, yo ya no lo hice debido al tiempo y a que me dio un poco de flojera XD, pero pueden modificarlo si gustan.

Adjunto el archivo. Muchas gracias por su atención y espero les sirva

Desconectado Argonaut

  • PIC10
  • *
  • Mensajes: 5
Re:Rutinas para compartir
« Respuesta #59 en: 17 de Febrero de 2016, 12:53:57 »
Ole... :-)   Gracias a todos... estoy intentando aprender ASM por libre, y estas rutinas me van de perlas para ir aprendiendo los comandos. Saludos.


 

anything