uControl
Abril 26, 2017, 12:33:56 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1] 2   Ir Abajo
  Imprimir  
Autor Tema: Rutinas para compartir.  (Leído 22695 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Leon Pic
Moderator
dsPIC
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5694


Cumulonimbus


WWW
« : Noviembre 16, 2008, 01:16:34 »

He empezado a organizar mis cosas y por eso, subo la librería para manejar un LCD de 16 x 2 coompatibles con los chips Hitachi.

Esta librería, es una mejora del que se encuentra en x-robotics.

Nota: No permite el envío de caracteres especiales, solo código ASCII. Cuando la modifique, lo subo aquí.

Fe de ERRATA: En donde dice la segunda línea comienza desde la posición H'0C' debe decir H'C0'. Esta rutina ya la actualicé y no aparece este error.
Rectifico, la segunda línea comienza desde la posición H'C0' hasta H'CF' lo que nos da una 16 posiciones visibles en el LCD en forma simultánea. Cabe recordar que las líneas son más de 16 posiciones pero para ser visibles, hay que desplazar el texto.

* RutinaLCD.rar (2.71 KB - descargado 1355 veces.)
« Última modificación: Julio 29, 2010, 02:50:09 por Leon Pic » En línea

Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.
Leon Pic
Moderator
dsPIC
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5694


Cumulonimbus


WWW
« Respuesta #1 : Noviembre 19, 2008, 10:07:24 »

Subo una rutina para hacer una resta de dos números de 8 bits. No es nada del otro mundo pero puede ahorrarnos tiempo.

* Resta 8 bits.rar (0.77 KB - descargado 947 veces.)
« Última modificación: Noviembre 20, 2008, 07:54:33 por Leon Pic » En línea

Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.
Leon Pic
Moderator
dsPIC
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5694


Cumulonimbus


WWW
« Respuesta #2 : Enero 07, 2009, 06:55:38 »

Siguiendo con la colección, he creado una nueva rutina para multiplicar (la razón por la que lo tube que hacer yo, es que una rutina de multiplicación de MICROCHIP, no funciona. Para más detalle ver aquí.

En este caso, multiplica un número de 16 bit por otro número de 8 bit. La particularidad de esta rutina, que si se utiliza para dos números de 8 bit, es conmutativa.

Una de las ventajas que tiene esta pequeña rutina, es que no ocupa casi nada de memoria, y una contra muy importante, que su ejecución es lenta.

La forma con que se hiso esta multiplicación, no es nada profecional, de echo es muy básico pero cumple muy bien su función. Si necesitan una rutina de poca instrucciones y no tienen problemas de tiempo, esta rutina, les viene muy bien.

* mul16x8bit.inc (2.44 KB - descargado 686 veces.)
« Última modificación: Diciembre 19, 2011, 10:38:57 por Leon Pic » En línea

Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.
Leon Pic
Moderator
dsPIC
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5694


Cumulonimbus


WWW
« Respuesta #3 : Enero 07, 2009, 07:15:00 »

Subo una rutina que puede ser mucha utilidad. Se trata de restar dos números de 32 bit. Esta rutina, es con signo, por lo que hay que chequear el bit c del registro status.

Esta rutina, no es creada por mi, si no por el usuario CHARLY del foro de todopic. Para más detalle, ver aquí.

De todas maneras, está adjuntado.

* resta32bit carly.inc (1.16 KB - descargado 909 veces.)
En línea

Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.
Leon Pic
Moderator
dsPIC
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5694


Cumulonimbus


WWW
« Respuesta #4 : Enero 07, 2009, 07:21:28 »

Una rutina más. Se trata de sumar dos número de 16 bit que dá como resultado otro número de 16 bits. Esta rutina está diseñada por Microchip.







NOTA AL MARGEN: Eh subido estos tres últimas rutinas en tres mensajes diferentes porque me está fallando la conección y se me corta. Ya perdí mucho tiempo y los voy subiendo de a uno para no tener que empezar desde el principio.

* SUMA_RESTA.inc (2.06 KB - descargado 993 veces.)
En línea

Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.
marqueses
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 142


Marqueses


WWW
« Respuesta #5 : Enero 10, 2009, 08:53:35 »

Buen aporte y buena idea de tema! Gracias LeonPic!
En línea

Leon Pic
Moderator
dsPIC
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5694


Cumulonimbus


WWW
« Respuesta #6 : Abril 18, 2009, 03:25:43 »

Continuando con las operaciones matemáticas, subo la que faltaba para completar las 4 operaciones básicas de las matemáticas, se trata de la división.

Esta rutina es para dividir 32 bit con otro valor de 32 bit y como resultato puede llegar a dar otro valor de 32 bit. La ventaja de esta rutina es que además se puede dividir en dividendo de 32 bit por un divisor de 32 bit o menos.

Esta rutina tiende 2 grandes desventajas, la primera no es nada eficiente, consume muchos ciclos de máquina y como una segunda desventajas, consume 21 posiciones de la RAM (pero cuando no se usa la división ni la resta, se pueden usar para otra cosa, la ventaja es que comparten la RAM con la resta).
Como ventaja principal, no consume casi nada de memoria de programa, por lo que si andamos justo de memoria y no necesitamos rapidez, esta rutina es la indicada.

* Dividir 32 bit por 32 bit.inc (4.13 KB - descargado 949 veces.)
En línea

Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.
Suky
**----- ^^ ------**
Moderator
dsPIC
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5442


Con Qt...


WWW
« Respuesta #7 : Abril 25, 2009, 02:52:06 »

Bueno, aquí les dejo tres rutinas que tenias guardas y puede servirles a alguien. (Probadas)  Wink
  • Rutina de multiplicación de 16 bits x 16 bits, resultado de 32 bits.
  • Rutina de división de 24 bits / 16 bits, resultado de 24 bits.
  • Rutina de conversión Binario 16 bits a BCD.

* Multiplicacion16x16_32.asm (1.71 KB - descargado 1048 veces.)
* Binario_BCD_16bits.asm (1.16 KB - descargado 1197 veces.)
* Division24_16_24.asm (0.85 KB - descargado 1069 veces.)
« Última modificación: Abril 25, 2009, 01:41:33 por Suky » En línea

Leon Pic
Moderator
dsPIC
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5694


Cumulonimbus


WWW
« Respuesta #8 : Abril 25, 2009, 03:29:10 »

Que buenas rutinas Suky. Voy a estudiar la rutina de división para que divida 32 bit / 16 bit. Lo que si, parece haber un error en una línea, la que dice tempo0div_1
En línea

Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.
Suky
**----- ^^ ------**
Moderator
dsPIC
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5442


Con Qt...


WWW
« Respuesta #9 : Abril 25, 2009, 01:43:15 »

Citar
Lo que si, parece haber un error en una línea, la que dice tempo0div_1
Si, ya lo modifique, faltaba un enter...
Saludos!
En línea

Leon Pic
Moderator
dsPIC
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5694


Cumulonimbus


WWW
« Respuesta #10 : Octubre 20, 2009, 07:55:23 »

Comunicación USART entre dos pic en forma unidireccional (una sola dirección).
9 bit paridad par.


Tx. Ejemplo de utilización.

Código:
LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF & _BODEN_OFF & _LVP_OFF & _WRT_OFF
;
;---------------------------------------------------------------
;VARIABLES.
;---------------------------------------------------------------
;
CBLOCK H'20'
dato_enviar
dato_enviar_temp
contador
cont_bit
ENDC
;
RESET ORG H'00'
GOTO INICIO
ORG H'04' ;VECTOR INTERRUPCIÓN
;
#INCLUDE USART_TX.INC
INICIO
;
BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
BSF STATUS,RP0 ;BANCO 1
CLRF TRISA
MOVLW H'FF'
MOVWF TRISB
CLRF TRISC
CLRF TRISD
CLRF TRISE
MOVLW 0x06
MOVWF ADCON1
;
;EJEMPLO DE UTILIZACIÓN
;----------------------
;
;ENVÍA EL ESTADO DEL PORTB POR MEDIO DE LA USART.
;
BCF STATUS,RP0
CALL INI_USART
MOVFW PORTB
CALL DETERMINAR_PARIDAD
BCF contador,0 ;RETORNA CON LA FINALIZACIÓN DE LA TRANSMISIÓN
CALL TRANSMITIR
GOTO $-4
;
END

Rx Ejemplo de utilización.

Código:
LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF & _BODEN_OFF & _LVP_OFF & _WRT_OFF
;
;---------------------------------------------------------------
;VARIABLES.
;---------------------------------------------------------------
;
CBLOCK H'20'
bit_recepcion
bit_cont
bit_cont_temp
dato_recibido
dato_recibido_temp
                        RCSTA_temp
SALVAR_W
SALVAR_STATUS
SALVAR_FSR
SALVAR_PCLATH
SALVAR_OPTION_REG
ENDC
;
RESET ORG H'00'
GOTO INICIO
ORG H'04' ;VECTOR INTERRUPCIÓN
INTERRUP
                        MOVWF SALVAR_W ;SALVA EL CONTENIDO DE W
SWAPF STATUS,W ;PASAMOS A W STATUS (ES CON SWAPF PARA NO AFECTAR EL BIT Z)
MOVWF SALVAR_STATUS ;SALVA EL CONTENIDO DE STATUS
SWAPF FSR,W ;PASAMOS A W FSR
MOVWF SALVAR_FSR ;SALVA FSR
SWAPF PCLATH,W ;PASAMOS A W PCLATH (Pagina de programa)
MOVWF SALVAR_PCLATH ;SALVA EL CONTENIDO DE PCLATH
BCF STATUS,RP1
BSF STATUS,RP0 ;BANCO 1
SWAPF OPTION_REG,W ;PASAMOS A W OPTION_REG (Bancos)
MOVWF SALVAR_OPTION_REG ;SALVA EL CONTENIDO DE OPTION_REG
BCF STATUS,RP0 ;BANCO 0
                        BTFSS PIR1,RCIF ;¿SE ACTIVÓ RECEPCIÓN USART?
GOTO        SALIR ;FALSA INTERRUPCIÓN
BCF PIR1,RCIF ;SI, REESTABLECEMOS EL BIT DE RCIF
;
#INCLUDE RX_USART_INTERRUPCION.INC
;
SALIR BSF STATUS,RP0 ;BANCO 1
SWAPF SALVAR_OPTION_REG,W ;RESTAURA EL VALOR A OPTIO_REG
MOVWF OPTION_REG
SWAPF SALVAR_PCLATH,W ;RESTAURA EL VALOR A PCLATH
MOVWF PCLATH
SWAPF SALVAR_FSR,W ;RESTAURA EL VALOR A FSR
MOVWF FSR
SWAPF SALVAR_STATUS,W ;RESTAURA EL VALOR A STATUS
MOVWF STATUS
SWAPF SALVAR_W,W ;RESTAURA EL VALOR A W
RETFIE
;
#INCLUDE RX_USART.INC

;
INICIO BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
BSF STATUS,RP0 ;BANCO 1
CLRF TRISA
CLRF TRISB
CLRF TRISC
CLRF TRISD
CLRF TRISE
MOVLW 0x06 ;PORTA TODAS DIGITALES.
MOVWF ADCON1
;
;EJEMPLO DE UTILIZACIÓN.
;
;RECIBE EL ESTADO DEL PORTB DE TX POR MEDIO DE LA USART Y LO MUESTRA EN EL PORTB.
;
CALL INI_USART_RX
CALL ACTIVAR_USART
BTFSS bit_recepcion,0
GOTO $-1
BCF bit_recepcion,0
MOVFW dato_recibido
MOVWF PORTB
GOTO $-5

END

* tx_usart.inc (4.38 KB - descargado 746 veces.)
* rx_usart.inc (3.59 KB - descargado 693 veces.)
* rx_usart_interrupcion.inc (2.38 KB - descargado 723 veces.)
« Última modificación: Octubre 21, 2009, 10:05:52 por Leon Pic » En línea

Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.
Ivan
Amigo de uControl
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 553



« Respuesta #11 : Marzo 12, 2010, 03:23:20 »

Rutina para manejo de encoder:

Esta rutina es para el manejo de un encoder rotativo, lo saque de la fuente de valdorre y lo modifique para mi proyecto. La salida es a travez de la variable "encoder".Los pines del encoder estan conectados a los pines RD4 y RD5.

Los bits de la variable son:

encoder.7 = giro a la derecha
encoder.6 = giro a la izquierda
encoder.5 = error (error en secuencia de giro, puede ser por lentitud del programa o falsos contactos)
encoder.4 = cero (el encoder esta en reposo)



   movf portd,f            ;Movemos al reg. F el valor del portd
   andlw 48                ;Filtramos los bits 4 y 5 del reg. w
                               ;Antes (XXTTXXXX) despues (00TT0000)
   movwf _temp           ;Movemos al reg. temp el valor del reg. w
   rrf _temp,1              ;Rotamos el reg. temp a la izquierda (000TT000)
   rrf _temp,1              ;Rotamos el reg. temp a la izquierda (0000TT00)
   rrf _temp,1              ;Rotamos el reg. temp a la izquierda (00000TT0)
   rrf _temp,1              ;Rotamos el reg. temp a la izquierda (000000TT)

   BCF   STATUS,C       ;Ponemos a 0 al bit CARRY del registro STATUS

;La x en el reg. encoder son los bits del resultado de la ejecucion previa de
;esta rutina; se modifican en cada ejecucion.

   rlf _encoder,1           ;Rotamos el reg. encoder a la derecha (XXXXEE0)
   rlf _encoder,1           ;Rotamos el reg. encoder a la derecha (XXXXEE00)

   movf _temp,w           ;Movemos el reg. temp a w
   iorwf _encoder,w       ;Hacemos la operacion OR entre los reg. encoder y w y
                                 ;lo guarda en este ultimo.
                                 ;     encoder     (XXXXEE00)
                                 ;          w         (000000TT)
                                 ;resultado en w (XXXXEETT)
                        
   andlw 15                  ;Filtramos con la operacion AND los bits que queremos borrar
                                 ;del registro w, en este caso, los primeros 4 bits
                                 ;      w      (xxxxEETT)
                                 ; valor 15   (00001111) <-15 en binario
                                 ;resultado  (0000EETT)

   movwf _encoder        ;Movemos el resultado al reg. encoder

   ;En este momento, el reg. encoder tiene un valor que esta formado por el
   ;valor antiguo y el valor nuevo de los pines del encoder. De esta manera se
   ;forma un numero que oscila entre 0000 (0 en decimal) y 1111(15 en decimal)

   MOVF    _encoder,W    ; Pasamos a w el valor del reg. encoder
   ADDWF   PCL,F           ; Sumamos al contador de programa el valor de w
   GOTO    CERO             ; (0000=00) pasa de 00 -> 00 = igual
   GOTO    DEC_COUNT    ; (0001=01) pasa de 00 -> 01 = -1
   GOTO    INC_COUNT     ; (0001=02) pasa de 00 -> 10 = +1
   GOTO    ERR_COUNT     ; (0011=03) pasa de 00 -> 11 = error
   GOTO    INC_COUNT     ; (0100=04) pasa de 01 -> 00 = +1
   GOTO    FIN                ; (0101=05) pasa de 01 -> 01 = igual
   GOTO    ERR_COUNT     ; (0110=06) pasa de 01 -> 10 = error
   GOTO    DEC_COUNT    ; (0111=07) pasa de 01 -> 11 = -1
   GOTO    DEC_COUNT    ; (1000=08) pasa de 10 -> 00 = -1
   GOTO    ERR_COUNT     ; (1001=09) pasa de 10 -> 01 = error
   GOTO    FIN                ; (1010=10) pasa de 10 -> 10 = igual
   GOTO    INC_COUNT     ; (1011=11) pasa de 10 -> 11 = +1
   GOTO    ERR_COUNT     ; (1100=12) pasa de 11 -> 00 = error
   GOTO    INC_COUNT     ; (1101=13) pasa de 11 -> 01 = +1
   GOTO    DEC_COUNT    ; (1110=14) pasa de 11 -> 10 = -1
   GOTO    FIN                ; (1111=15) pasa de 11 -> 11 = igual

INC_COUNT:    ;Viene a esta etiqueta si se detecto la secuencia +1
    bsf   _encoder,7    ;Ponemos a 1 el bit 7 del reg. encoder
    goto fin                ;Vamos a la etiqueta fin

DEC_COUNT:    ;Viene a esta etiqueta si se detecto la secuencia -1
    bsf   _encoder,6     ;Ponemos a 1 el bit 6 del reg. encoder
    goto fin                ;Vamos a la etiqueta fin

ERR_COUNT:    ;Viene a esta etiqueta si se detecto la secuencia error
    bsf   _encoder,5    ;Ponemos a 1 el bit 5 del reg. encoder
    goto fin                ;Vamos a la etiqueta fin

CERO:             ;Viene a esta etiqueta si se detecto la secuencia 00->00
    bsf   _encoder,4     ;Ponemos a 1 el bit 4 del reg. encoder
    goto fin                 ;Vamos a la etiqueta fin

fin:
« Última modificación: Agosto 27, 2010, 11:36:10 por Ivan » En línea

¿Qué es un circuito?
Es un lugar donde hay elefantuitos, caballuitos, payasuitos...
fitomasterman
PIC10F
*
Desconectado Desconectado

Mensajes: 16



« Respuesta #12 : Agosto 26, 2010, 11:02:24 »

muy bueno Leon Pic GRACIAS! rolleyes rolleyes rolleyes
En línea
Leon Pic
Moderator
dsPIC
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5694


Cumulonimbus


WWW
« Respuesta #13 : Agosto 27, 2010, 08:56:10 »

También hay que agradecer a los que aportan a este hilo.

La rutina de Ivan me viene como anillo al dedo ya que voy a utilizar un encoder también.
En línea

Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.
Pardillete
PIC10F
*
Desconectado Desconectado

Mensajes: 3


« Respuesta #14 : Septiembre 14, 2010, 06:23:51 »

Saludos al foro!

Os pongo una pequeña aportación. A veces tenemos que intercambiar el valor de dos variables. Aparentemente habría que utilizar una variable intermedia, algo así como:

Código:
movf    Var_1,w             ; Carga el valor de la primera variable
movwf   Var_Aux             ; Lo copia en el auxiliar
movf    Var_2,w             ; Carga el valor de la segunda variable
movwf   Var_1               ; Lo copia en la primera
movf    Var_Aux,w           ; Recupera el valor de la primera almacenado en la variable auxiliar
movwf   Var_2               ; Lo copia en la segunda

Bueno pues hay una manera más sencilla y elegante que no requiere variable auxiliar y ocupa menos código.

Código:
movf     Var_1,w            ; Carga el valor de la primera variable
xorwf    Var_2,w            ; Hace un XOR sobre el acumulador con la segunda
xorwf    Var_1,f            ; Hace un XOR sobre la primera
xorwf    Var_2,f            ; Hace un XOR sobre la segunda y ¡¡ Ya está !!

No os parece elegante?
« Última modificación: Septiembre 14, 2010, 06:29:12 por Pardillete » En línea
Páginas: [1] 2   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2011, Simple Machines
SMFAds for Free Forums
XHTML 1.0 válido! CSS válido!
Página creada en 0.628 segundos con 26 consultas. (Pretty URLs adds 0.016s, 2q)