Autor Tema: pequeños proyectos  (Leído 55120 veces)

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

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re: pequeños proyectos
« Respuesta #30 en: 13 de Febrero de 2009, 21:50:47 »
valla! muchas gracias por tu aporte.he visto que utilizas algunas funciones que desconocia.como esta linea:
incf   AddrTabla+1,F   ;Si excede => incrementamos la parte alta. supongo que lo que realiza es el incremento de AddrTabla y luego suma 1 al resultado.

No hace eso que dices, fijate que cuando declaro variables  declaro AddrTabla:.2, esto es porque AddrTabla la uso como variable de 16 bits, y el hacer el AddrTabla+1 simplemente me permite acceder a los 8 bits altos de mi variable, por ejemplo si quisiera borrar la variable AddrTabla lo haria de la siguiente manera:

Código: ASM
  1. clrf      AddrTabla     ;borra la parte baja de la variable AddrTabla
  2. clrf      AddrTabla+1     ;borra la parte alta de la variable AddrTabla

Debes notar que guardo la parte baja de la variable en la direccion mas baja de memoria y la parte alta en la direccion alta, esto si no me equivoco es una convencion de INTEL.

Saludos.
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #31 en: 14 de Febrero de 2009, 14:54:30 »
ah! vale ya entiendo.pero abajo pongo otras lineas de tu programa y hay dos diferencias en los .2 o sin punto.



i2cEEAddr:2                 ;en esta instruccion i2cEEAddr:2   
hace lo mismo que en esta?:    OffsTabla, AddrTabla:.2   o es que esta equivocada?   
   
« Última modificación: 14 de Febrero de 2009, 15:10:17 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re: pequeños proyectos
« Respuesta #32 en: 15 de Febrero de 2009, 01:00:01 »

i2cEEAddr:2                 ;en esta instruccion i2cEEAddr:2   
hace lo mismo que en esta?:    OffsTabla, AddrTabla:.2   o es que esta equivocada?   

En este caso es lo mismo, el ASM toma el .2 como un valor decimal y el 2 como un valor en hexadecimal, aqui no habria problema , pero una vez defini un buffer de recepcion como Buffer: 40, pesando que era 40 en decimal, pero .... en realidad el buffer termino siendo de 64 bytes (40 en hexadecimal), y eso me costo un par de horas revisando un programa, je jej,  por eso los buffers en este programa estan definidos con .80

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #33 en: 23 de Agosto de 2009, 14:49:07 »
ahi otro pequeño programa:



;*****************************************
; PROGRAMA : gps_usart.asm
; Funcion : guarda la trama GPS en memoria ram 
;           Serial port config: 38400 baudios,8 bits,paridad = none
;   
;  Revision : 1.0        23/8/2009            Programa para : PIC16F876A
; CPU Clock : 3.6864 MHz                     Reloj instruccion :
;       WDT : Deshabilitado                  Tipo de reloj : XT
; Code Prot : OFF           
;******************************************
;
;NOTAS:
;        este programa almacena una trama complata de GPS en la direccion 0x20
;        la trama podemos elegirla cambiando los caracteres de C1,C2,C3,C4,C5,C6,C7.
;

      LIST   P=16F876A   ;Se indica el modo de procesador
     
      RADIX   HEX      ;Sistema de numeracion hexadecimal

      INCLUDE   "P16f876A.inc"   ;se incluye la definicion de los
     
               ;registros internos
      __CONFIG    _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF ;&_WRT_ENABLE_OFF
      ERRORLEVEL      -302

         CBLOCK   0X20         ;BLOQUE DEL COMANDO A LEER
         C1         ;'$'
         C2         ;'G'
         C3         ;'P'
            C4         ;'G'
         C5         ;'G'
         C6         ;'A'
         C7         ;'.'
         ENDC

            CBLOCK    0x75           
           W_TEMP         
         STATUS_TEMP   
         PCLATH_TEMP
         ENDC

   
PUSH         MACRO               ;macro para salvar registros antes de una llamada a interrupcion   
            movwf   W_TEMP               
            swapf   STATUS,W
            movwf   STATUS_TEMP         
            clrf    STATUS               
            movfw   PCLATH               
              movwf   PCLATH_TEMP
            clrf    PCLATH
            ENDM

POP         MACRO               ;macro para restaurar registros   despues de una llamada a interrupcion
            movfw   PCLATH_TEMP         
            movwf   PCLATH
            swapf   STATUS_TEMP,W     
            movwf   STATUS
            swapf   W_TEMP,F         
            swapf   W_TEMP,W
            ENDM

BANK0         MACRO
            BCF   STATUS,RP0
            BCF   STATUS,RP1
            ENDM

BANK1         MACRO
            BSF   STATUS,RP0
            BCF   STATUS,RP1
            ENDM
;<<<<<<<<<<<<<SELECCION DE LOS SECTORES DE LA MEMORIA DE PROGRAMA>>>>
;--------IMPORTANTE:
;ANTES DE UBICAR UNA TABLA DEL TIPO (ADDWF   PCL,F)TENEMOS QUE INDICAR EL SECTOR DONDE SE UBICA ESE SUBPROGRAMA
;EJM.SI PONEMOS EL SUBPROGRAMA EN EL SECTOR A PARTIR DE LA DIR:100 .PONDREMOS LA LINEA SECTOR_100 ANTES DE LA TABLA DE DATOS
;
SECTOR_000   MACRO
         BCF   PCLATH,0
         BCF   PCLATH,1
         ENDM
SECTOR_100   MACRO
         BSF   PCLATH,0
         BCF   PCLATH,1
         ENDM
SECTOR_200   MACRO
         BCF   PCLATH,0
         BSF   PCLATH,1
         ENDM
SECTOR_300   MACRO
         BSF   PCLATH,0
         BSF   PCLATH,1
         ENDM


;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
         ORG      0x00      ;Inicio en el Vector de Reset
         goto   INICIO      ;Va a la primera instruccion del programa
;<<<<<<--------------------VECTOR DE INTERRUPCION---------------------->>>>>>>
       ORG      0x04             
       goto     INTER      ;Va al programa de interrupcion   
               
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO      BANK1                  ;selecciona banco 1
            movlw   .5               ;(.5 =38400 baudios crystal 3.6864 MHz)
            movwf   SPBRG
          movlw   b'00000110'
            movwf   ADCON1         ;porta entradas digitales
            movlw   0xFF
            movwf   TRISA
            movlw   b'00000110'       ;Configuracion USART modo alta velocidad 38400 baud
            movwf   TXSTA     
            
            BANK0                  ;selecciona banco 0 -------------
            movlw   b'10010000'      ;Configuracion de la usart
            movwf   RCSTA            ;para recepcion continua y habilitacion de la usart
            movlw   '$'
         movwf   C1            ;registros para la cabezera NMEA
         movlw   'G'
         movwf   C2
         movlw   'P'
         movwf   C3
         movlw   'G'
         movwf   C4
         movlw   'G'
         movwf   C5
         movlw   'A'
         movwf   C6
         movlw   ','
         movwf   C7
         BANK1
         movlw   b'00100000'      ;habilita interrupcion por recepcion de usart
         movwf   PIE1
         movlw   b'11000000'      ;habilita interrupciones generales y perifericas
         movwf   INTCON
         
         
      
PRINCIPAL   GOTO   PRINCIPAL
   
;<<<<<<<<<<--------------METE EN UN BLOQUE DE RAM LOS COMANDOS RECIBIDOS------------>>>>>>>>>>>>>>>   
         
LEEDATO           BANK0               ;Cambio al banco 0
            movlw   0x1f         ;carga en w el valor 0x4F "(0X50) principio de RAM para introducir mensages recividos"
            movwf   FSR            ;cargalo en el puntero de registro de proposito general
LEEDATO2      incf   FSR,F         ;incrementa la siguiente direccion de la ram
            movfw   INDF         ;carga en W el valor direcionado en FSR
            xorwf   RCREG,W         ;comparalo con el caracter recivido de la USART
            btfss   STATUS,Z      ;si es el mismo continua con el programa
            return               ;en caso contrario retorna 
            call   ERR_USART      ;salta a ERR_USART
            
            movlw   ','            ;carga en w el caracter '.' caracter posterior de cabezera
            xorwf   RCREG,W         ;comparalo con el caracter recivido de la USART
            btfss   STATUS,Z      ;si es el mismo salta
            goto   LEEDATO2
SIGUIENTE      incf   FSR            ;incrementa FSR
            movfw   RCREG         ;carga en W el caracter recivido
            movwf   INDF         ;mete el caracter en la posicion de memoria que apunta FSR
            movlw   '$'            ;carga valor '$' en w
            xorwf   RCREG,W         ;comparalo con el valor recivido de la usart(primer caracter de siguiente trama)
            btfsc   STATUS,Z
            return               ;si es igual retorna(fin de captura de trama)
            call   ERR_USART      ;salta a ERR_USART
            goto   SIGUIENTE

;<<<<<<<<<<<<<<<<<<<<------SUBPROGRAMA PARA ESPERA DE CARACTER Y CORRECTOR DE ERRORES----->>>>>>>>>>>>>
ERR_USART      btfss   PIR1,RCIF      ;espera al proximo caracter
            goto    ERR_USART 
            btfsc   RCSTA,OERR   
            call   BORR_ERR      ;Error de Sobreescritura
            btfsc   RCSTA,FERR   
            call   BORR_ERR      ;Error de Trama
            BCF      PIR1,RCIF      ;borra el flag de interrupcion por caracter recivido            
            return
            
BORR_ERR      bcf      RCSTA,CREN   
            movf   RCREG,w   
            movf   RCREG,w   
            movf   RCREG,w            
            bsf      RCSTA,CREN   
            return            
         
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<PROGRAMA DE GESTION DE INTERRUPCIONES>>>>>>>>>>>>>>>>>>>>>>
INTER           PUSH                    ;salva el contenido de W,STATUS Y PCLATH
               BANK0
               btfsc   PIR1,RCIF      ;comprueba si el shift register(RSR)esta lleno.y si es asi salta
               call   LEEDATO   
               POP                    ;restaura el contenido de W,STATUS Y PCLATH
            bcf   PIR1,RCIF         ;borra flag de interrupcion por recepcion de usart
               retfie                 ;retorno de interrupcion

            END

     




« Última modificación: 23 de Agosto de 2009, 20:02:08 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #34 en: 21 de Septiembre de 2009, 18:02:47 »
y aqui pongo otro programa relacionado con la usart.aunque en este hay varias funcionalidades.aparte de recivir datos ,tambien tenemos un subprograma que es llamado por una interrupcion por recepcion de usart.la cual es prioritaria.
dentro de este subprograma,se espera recivir un comando NMEA.especificamente el GPGGA.del cual extraeremos la informacion que arrastra y que meteremos
a partir de la direccion 0x20 comando incluido.
aunque tambien podemos especificar otro comando diferente.seguir las instruciones de la nota del asm.
a parte de esto cuando se almacene la informacion.tenemos un programa PRINCIPAL.en el que pondremos el programa para tratar los datos de la trama NMEA.


;*****************************************
; PROGRAMA : gps_usart.asm
; Funcion : guarda la trama GPS en memoria ram  
;           Serial port config: 38400 baudios,8 bits,paridad = none
;  
;  Revision : 1.0        23/8/2009            Programa para : PIC16F876A
; CPU Clock : 3.6864 MHz                     Reloj instruccion :
;       WDT : Deshabilitado                  Tipo de reloj : XT
; Code Prot : OFF          
;******************************************
;
;NOTAS:
;        este programa almacena una trama complata de GPS en la direccion 0x20
;        la trama podemos elegirla cambiando los caracteres de C1,C2,C3,C4,C5,C6,C7.
;

      LIST   P=16F876A   ;Se indica el modo de procesador
      
      RADIX   HEX      ;Sistema de numeracion hexadecimal

      INCLUDE   "P16f876A.inc"   ;se incluye la definicion de los
      
               ;registros internos
      __CONFIG    _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF ;&_WRT_ENABLE_OFF
      ERRORLEVEL      -302


      

            CBLOCK   0X20         ;BLOQUE DEL COMANDO A LEER
            C1         ;'$'
            C2         ;'G'
            C3         ;'P'
               C4         ;'G'
            C5         ;'G'
            C6         ;'A'
            C7         ;','
            ENDC

               CBLOCK    0x70
              W_TEMP        
            STATUS_TEMP  
            PCLATH_TEMP
            TEMP_FSR
            ;PCL_REG
            ENDC
            
            
   
PUSH            MACRO               ;macro para salvar registros antes de una llamada a interrupcion  
               BANK0
            movwf   W_TEMP              
               swapf   STATUS,W
            movwf   STATUS_TEMP  
               clrf    STATUS              
               movfw   PCLATH              
                 movwf   PCLATH_TEMP
               clrf    PCLATH
            movfw   FSR
            movwf   TEMP_FSR
            ENDM

POP            MACRO               ;macro para restaurar registros   despues de una llamada a interrupcion
               BANK0
            movfw   PCLATH_TEMP        
               movwf   PCLATH
               swapf   STATUS_TEMP,W  
            movwf   STATUS
            swapf   W_TEMP,F        
               swapf   W_TEMP,W
            movfw   TEMP_FSR
            movwf   FSR
            ENDM

BANK0            MACRO                  ;seleccion del banco 0
               BCF   STATUS,RP0         
               BCF   STATUS,RP1
               ENDM

BANK1            MACRO                  ;seleccion del banco 1
               BSF   STATUS,RP0         
               BCF   STATUS,RP1
               ENDM

BANK2            MACRO                  ;seleccion del banco 2
               BCF   STATUS,RP0         
               BSF   STATUS,RP1
               ENDM

BANK3            MACRO                  ;seleccion del banco 3
               BSF   STATUS,RP0
               BSF   STATUS,RP1
               ENDM

         
;<<<<<<<<<<<<<SELECCION DE LOS SECTORES DE LA MEMORIA DE PROGRAMA>>>>
;--------IMPORTANTE:
;ANTES DE UBICAR UNA TABLA DEL TIPO (ADDWF   PCL,F)TENEMOS QUE INDICAR EL SECTOR DONDE SE UBICA ESE SUBPROGRAMA
;EJM.SI PONEMOS EL SUBPROGRAMA EN EL SECTOR A PARTIR DE LA DIR:100 .PONDREMOS LA LINEA SECTOR_100 ANTES DE LA TABLA DE DATOS
;
SECTOR_000     MACRO                  ;seleccion del sector 000
               BCF   PCLATH,0
               BCF   PCLATH,1
               ENDM
SECTOR_100     MACRO                  ;seleccion del sector 100
               BSF   PCLATH,0
               BCF   PCLATH,1
               ENDM
SECTOR_200      MACRO                  ;seleccion del sector 200
               BCF   PCLATH,0
               BSF   PCLATH,1
               ENDM
SECTOR_300      MACRO                  ;seleccion del sector 300
               BSF   PCLATH,0
               BSF   PCLATH,1
               ENDM

            #define      GIE_ON      bsf      INTCON,GIE   ;activa interrupciones
               #define      GIE_OFF      bcf      INTCON,GIE   ;desactiva interrupciones



;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
               ORG      0x00            ;Inicio en el Vector de Reset
               goto   INICIO            ;Va a la primera instruccion del programa
;<<<<<<--------------------VECTOR DE INTERRUPCION---------------------->>>>>>>
             ORG      0x04              
             goto     INTER            ;Va al programa de interrupcion  
              
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO         BANK1                  ;selecciona banco 1
               movlw   .5               ;(.5 =38400 baudios crystal 3.6864 MHz)
               movwf   SPBRG
             movlw   b'00000110'
               movwf   ADCON1         ;PORTA entradas digitales
               movlw   b'00000110'       ;Configuracion USART modo alta velocidad
               movwf   TXSTA      
               movlw   b'11000000'
            movwf   TRISC         ;configura pins TX y RX para la usart
            movlw   b'00100000'      ;habilita interrupcion por recepcion de usart
            movwf   PIE1
            movlw   b'01000000'      ;habilita interrupciones perifericas
            movwf   INTCON
               BANK0                  ;selecciona banco 0 -------------
            movlw   b'10010000'      ;Configuracion de la usart
               movwf   RCSTA            ;para recepcion continua y habilitacion de la usart
            
               movlw   '$'            ;registros para la cabezera NMEA(cambiarlos para otra cabecera)
            movwf   C1            
            movlw   'G'
            movwf   C2
            movlw   'P'
            movwf   C3
            movlw   'G'
            movwf   C4
            movlw   'G'
            movwf   C5
            movlw   'A'
            movwf   C6
            movlw   ','
            movwf   C7
            
            GIE_ON               ;habilita interrupciones generales
            
            
;<<<<<<<------------------------------------------------PROGRAMA PRINCIPAL---------------------------------------->>>>>>>>>>>>>>         
PRINCIPAL      goto   PRINCIPAL      



            
            
;<<<<<<<<<<--------------METE EN UN BLOQUE DE RAM LOS COMANDOS RECIBIDOS------------>>>>>>>>>>>>>>>   
        
LEEDATO           BANK0               ;Cambio al banco 0
            
            movlw   0x1f         ;carga en w el valor 0x1F  principio de RAM para introducir mensages recividos"
            movwf   FSR            ;cargalo en el puntero de registro de proposito general
LEEDATO2      incf   FSR,F         ;incrementa la siguiente direccion de la ram
            movfw   INDF         ;carga en W el valor direcionado en FSR
            xorwf   RCREG,W         ;comparalo con el caracter recivido de la USART
            btfss   STATUS,Z      ;si es el mismo continua con el programa
            return               ;en caso contrario empieza de nuevo
            call   ERR_USART      ;salta a ERR_USART
            movlw   ','            ;carga en w el caracter ',' caracter posterior de cabezera
            xorwf   RCREG,W         ;comparalo con el caracter recivido de la USART
            btfss   STATUS,Z      ;si es el mismo salta
            goto   LEEDATO2

SIGUIENTE      incf   FSR,F         ;incrementa FSR
            movfw   RCREG         ;carga en W el caracter recivido
            movwf   INDF         ;mete el caracter en la posicion de memoria que apunta FSR
            movlw   '*'            ;carga valor '*' en w
            xorwf   RCREG,W         ;comparalo con el valor recivido de la usart(caracter de fin trama)
            btfsc   STATUS,Z
            return               ;si es igual retorna(fin de captura de trama)
            movlw   0x6F         ;valor limite de RAM
            xorwf   FSR,W
            btfsc   STATUS,Z
            return               ;si se excede del valor anterior.retorna
            call   ERR_USART      ;salta a ERR_USART
            goto   SIGUIENTE

;<<<<<<<<<<<<<<<<<<<<------SUBPROGRAMA PARA ESPERA DE CARACTER Y CORRECTOR DE ERRORES----->>>>>>>>>>>>>
ERR_USART      btfss   PIR1,RCIF      ;espera al proximo caracter
            goto    ERR_USART  
            btfsc   RCSTA,OERR   
            call   BORR_ERR      ;Error de Sobreescritura
            btfsc   RCSTA,FERR   
            call   BORR_ERR      ;Error de Trama
            bcf      PIR1,RCIF      ;borra el flag de interrupcion por caracter recivido            
            return
            
BORR_ERR      bcf      RCSTA,CREN      ;deshabilita recepcion usart
            movf   RCREG,w         
            movf   RCREG,w   
            movf   RCREG,w            
            bsf      RCSTA,CREN      ;habilita recepcion usart
            return            
         
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<PROGRAMA DE GESTION DE INTERRUPCIONES>>>>>>>>>>>>>>>>>>>>>>
INTER           PUSH                    ;salva el contenido de W,STATUS Y PCLATH
            BANK0
            call      LEEDATO
            bcf      PIR1,RCIF         ;borra flag de interrupcion por recepcion de usart
            call   BORR_ERR
            POP                    ;restaura el contenido de W,STATUS Y PCLATH
            retfie
            
            END
« Última modificación: 21 de Septiembre de 2009, 18:12:00 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #35 en: 21 de Septiembre de 2009, 19:30:23 »
este programa de abajo es una ampliacion del anterior.
en este he agregado un subprograma que selecciona los datos de la hora y las coordenadas.y luego pasa por otro que convierte estos datos a decimales para pasarlos a los registros direccionados a partir de la direccion 0xA0.

ademas he puesto en el programa principal unas instrucciones para visualizar los datos de los segundos por el PORTB.



;*****************************************
; PROGRAMA : gps_usart.asm
; Funcion : guarda la trama GPS en memoria ram 
;           Serial port config: 38400 baudios,8 bits,paridad = none
;   
;  Revision : 1.0        23/8/2009            Programa para : PIC16F876A
; CPU Clock : 3.6864 MHz                     Reloj instruccion :
;       WDT : Deshabilitado                  Tipo de reloj : XT
; Code Prot : OFF           
;******************************************
;
;NOTAS:
;        este programa almacena una trama complata de GPS en la direccion 0x20
;        y pasa los datos de hora y coordenadas a partir de la direccion A0.
;      

      LIST   P=16F876A   ;Se indica el modo de procesador
     
      RADIX   HEX      ;Sistema de numeracion hexadecimal

      INCLUDE   "P16f876A.inc"   ;se incluye la definicion de los
     
               ;registros internos
      __CONFIG    _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF ;&_WRT_ENABLE_OFF
      ERRORLEVEL      -302


      

            CBLOCK   0X20         ;BLOQUE DEL COMANDO A LEER
            C1         ;'$'
            C2         ;'G'
            C3         ;'P'
               C4         ;'G'
            C5         ;'G'
            C6         ;'A'
            C7         ;','
            ENDC

               CBLOCK    0x70
            
              W_TEMP         
            STATUS_TEMP   
            PCLATH_TEMP
            TEMP_FSR
            TEMP_DATO_H
            TEMP_DATO_L
            TEMP_NUMERICO
            PRINCIPIO_RAM
            CARACTER
         
            ENDC
            
            

   
PUSH            MACRO               ;macro para salvar registros antes de una llamada a interrupcion   
               BANK0
            movwf   W_TEMP               
               swapf   STATUS,W
            movwf   STATUS_TEMP 
               clrf    STATUS               
               movfw   PCLATH               
                 movwf   PCLATH_TEMP
               clrf    PCLATH
            movfw   FSR
            movwf   TEMP_FSR
            ENDM

POP            MACRO               ;macro para restaurar registros   despues de una llamada a interrupcion
               BANK0
            movfw   PCLATH_TEMP         
               movwf   PCLATH
               swapf   STATUS_TEMP,W 
            movwf   STATUS
            swapf   W_TEMP,F         
               swapf   W_TEMP,W
            movfw   TEMP_FSR
            movwf   FSR
            ENDM

BANK0            MACRO                  ;seleccion del banco 0
               BCF   STATUS,RP0         
               BCF   STATUS,RP1
               ENDM

BANK1            MACRO                  ;seleccion del banco 1
               BSF   STATUS,RP0         
               BCF   STATUS,RP1
               ENDM

BANK2            MACRO                  ;seleccion del banco 2
               BCF   STATUS,RP0         
               BSF   STATUS,RP1
               ENDM

BANK3            MACRO                  ;seleccion del banco 3
               BSF   STATUS,RP0
               BSF   STATUS,RP1
               ENDM

         
;<<<<<<<<<<<<<SELECCION DE LOS SECTORES DE LA MEMORIA DE PROGRAMA>>>>
;--------IMPORTANTE:
;ANTES DE UBICAR UNA TABLA DEL TIPO (ADDWF   PCL,F)TENEMOS QUE INDICAR EL SECTOR DONDE SE UBICA ESE SUBPROGRAMA
;EJM.SI PONEMOS EL SUBPROGRAMA EN EL SECTOR A PARTIR DE LA DIR:100 .PONDREMOS LA LINEA SECTOR_100 ANTES DE LA TABLA DE DATOS
;
SECTOR_000     MACRO                  ;seleccion del sector 000
               BCF   PCLATH,0
               BCF   PCLATH,1
               ENDM
SECTOR_100     MACRO                  ;seleccion del sector 100
               BSF   PCLATH,0
               BCF   PCLATH,1
               ENDM
SECTOR_200      MACRO                  ;seleccion del sector 200
               BCF   PCLATH,0
               BSF   PCLATH,1
               ENDM
SECTOR_300      MACRO                  ;seleccion del sector 300
               BSF   PCLATH,0
               BSF   PCLATH,1
               ENDM

            #define      GIE_ON      bsf      INTCON,GIE   ;activa interrupciones
               #define      GIE_OFF      bcf      INTCON,GIE   ;desactiva interrupciones



;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
               ORG      0x00            ;Inicio en el Vector de Reset
               goto   INICIO            ;Va a la primera instruccion del programa
;<<<<<<--------------------VECTOR DE INTERRUPCION---------------------->>>>>>>
             ORG      0x04             
             goto     INTER            ;Va al programa de interrupcion   
               
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO         BANK0
            clrf   PORTB         ;borra salidas de PORTB antes de configurarlo como salida.
            BANK1                  ;selecciona banco 1
               movlw   .5               ;(.5 =38400 baudios crystal 3.6864 MHz)
               movwf   SPBRG
             movlw   b'00000110'
               movwf   ADCON1         ;PORTA entradas digitales
               movlw   b'00000110'       ;Configuracion USART modo alta velocidad
               movwf   TXSTA     
               movlw   b'11000000'
            movwf   TRISC         ;configura pins TX y RX para la usart
            movlw   b'00100000'      ;habilita interrupcion por recepcion de usart
            movwf   PIE1
            movlw   b'01000000'      ;habilita interrupciones perifericas
            movwf   INTCON
            clrf   PORTB         ;PORTB como salida
               BANK0                  ;selecciona banco 0 -------------
            movlw   b'10010000'      ;Configuracion de la usart
               movwf   RCSTA            ;para recepcion continua y habilitacion de la usart
            
               movlw   '$'            ;registros para la cabezera NMEA(cambiarlos para otra cabecera)
            movwf   C1            
            movlw   'G'
            movwf   C2
            movlw   'P'
            movwf   C3
            movlw   'G'
            movwf   C4
            movlw   'G'
            movwf   C5
            movlw   'A'
            movwf   C6
            movlw   ','
            movwf   C7
            
            GIE_ON               ;habilita interrupciones generales
            
            
;<<<<<<<------------------------------------------------PROGRAMA PRINCIPAL---------------------------------------->>>>>>>>>>>>>>         
PRINCIPAL      BANK1
            movlw   0xA2         ;direccion segundos decimales.
            movwf   FSR            ;cargala en el registro FSR
            movfw   INDF         ;recoje el dato dicha direccion
            BANK0
            movwf   PORTB         ;visualizalo en el PORTB
            goto   PRINCIPAL      



            
            
;<<<<<<<<<<--------------METE EN UN BLOQUE DE RAM LOS COMANDOS RECIBIDOS------------>>>>>>>>>>>>>>>   
         
LEEDATO           BANK0               ;Cambio al banco 0
            
            movlw   0x1f         ;carga en w el valor 0x1F  principio de RAM para introducir mensages recividos"
            movwf   FSR            ;cargalo en el puntero de registro de proposito general
LEEDATO2      incf   FSR,F         ;incrementa la siguiente direccion de la ram
            movfw   INDF         ;carga en W el valor direcionado en FSR
            xorwf   RCREG,W         ;comparalo con el caracter recivido de la USART
            btfss   STATUS,Z      ;si es el mismo continua con el programa
            return               ;en caso contrario empieza de nuevo
            call   ERR_USART      ;salta a ERR_USART
            movlw   ','            ;carga en w el caracter ',' caracter posterior de cabezera
            xorwf   RCREG,W         ;comparalo con el caracter recivido de la USART
            btfss   STATUS,Z      ;si es el mismo salta
            goto   LEEDATO2

SIGUIENTE      incf   FSR,F         ;incrementa FSR
            movfw   RCREG         ;carga en W el caracter recivido
            movwf   INDF         ;mete el caracter en la posicion de memoria que apunta FSR
            movlw   '*'            ;carga valor '*' en w
            xorwf   RCREG,W         ;comparalo con el valor recivido de la usart(caracter de fin trama)
            btfsc   STATUS,Z
            return               ;si es igual retorna(fin de captura de trama)
            movlw   0x6F         ;valor limite de RAM
            xorwf   FSR,W
            btfsc   STATUS,Z
            return               ;si se excede del valor anterior.retorna
            call   ERR_USART      ;salta a ERR_USART
            goto   SIGUIENTE

;<<<<<<<<<<<<<<<<<<<<------SUBPROGRAMA PARA ESPERA DE CARACTER Y CORRECTOR DE ERRORES----->>>>>>>>>>>>>
ERR_USART      btfss   PIR1,RCIF      ;espera al proximo caracter
            goto    ERR_USART 
            btfsc   RCSTA,OERR   
            call   BORR_ERR      ;Error de Sobreescritura
            btfsc   RCSTA,FERR   
            call   BORR_ERR      ;Error de Trama
            bcf     PIR1,RCIF      ;borra el flag de interrupcion por caracter recivido            
            return
            
BORR_ERR      bcf      RCSTA,CREN      ;deshabilita recepcion usart
            movf   RCREG,w         
            movf   RCREG,w   
            movf   RCREG,w            
            bsf      RCSTA,CREN      ;habilita recepcion usart
            return            

;<<<<<<<--------------------------PROGRAMA PARA ALMACENAR A PARTIR DE LA DIRECION 0XA0 DE LA RAM,LOS DATOS IMPORTANTES DE LA TRAMA NMEA.--------         
      
GRARAM         movlw   0xA0         ;valor del principio de los registros a leer
            movwf   PRINCIPIO_RAM   ;carga el valor en el registro puntero.
            BANK0
            movlw   0x27         ;valor del primer caracter de la ram a traducir
            movwf   TEMP_FSR      ;cargalo en el registro temporal FSR
            
REP3         movfw   TEMP_FSR
            movwf   FSR            ;carga el puntero de ram
   
            movfw   FSR            ;
            xorlw   2D            ;direccion comienzo a ignorar "direccion de comienzo de datos inservibles"
            btfsc   STATUS,Z
            call   SUMA5         ;cinco pociciones de memoria a ignorar

            movfw   FSR            ;
            xorlw   36            ;direccion comienzo a ignorar
            btfsc   STATUS,Z
            call   SUMA1         ;una pocicion de memoria a ignorar

            movfw   FSR            ;
            xorlw   3B            ;direccion centenas de coordenada ecuador
            btfsc   STATUS,Z
            call   CENTENAS

            movfw   FSR            ;
            xorlw   43            ;direccion comienzo a ignorar
            btfsc   STATUS,Z
            call   SUMA1         ;una pocicion de memoria a ignorar

            movfw   FSR            ;
            xorlw   48            ;direccion comienzo a ignorar
            btfsc   STATUS,Z
            return               ;final del subprograma

            movfw   TEMP_FSR
            movwf   FSR            ;carga el puntero de ram
            movfw   INDF         ;recoge valor
            movwf   CARACTER
            
            movfw   CARACTER
            call   TRADUCE         ;traduce el valor ascii a decimal
            movwf   TEMP_NUMERICO   ;temporal de valor traducido.
            
            movfw   PRINCIPIO_RAM
            movwf   FSR
            
            movfw   TEMP_NUMERICO
            movwf   INDF
         
            incf   PRINCIPIO_RAM,F
            BANK0
               
            incf   TEMP_FSR,F
REP4         incf   TEMP_FSR,F
            goto   REP3
            
SUMA5         movlw   0x05         ;salto de 5 direcciones FSR
            addwf   TEMP_FSR,f
            return
SUMA1         movlw   0x01         ;salto de 1 direccion FSR
            addwf   TEMP_FSR,f
            return

SUMA2         movlw   0x02         ;salto de 2 direcciones FSR
            addwf   TEMP_FSR,f
            return

CENTENAS      movlw   0x3E
            movwf   FSR
            
            clrf   TEMP_DATO_H
            movlw   '0'
            xorwf   INDF,W
            btfss   STATUS,Z
            incf   TEMP_DATO_H,F
            movlw   0x3F
            movwf   TEMP_FSR
            BANK1
            incf   PRINCIPIO_RAM,F
            BANK0
            movlw   0xA7
            movwf   FSR
            movfw   TEMP_DATO_H
            movwf   INDF   
            return

            
            
;<<<<<<<<<<<-------------CONVERTIR VALORES HEX EN DECIMALES--------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>

TRADUCE         movwf   TEMP_DATO_H      ;
            movlw   0x30
            
            subwf   TEMP_DATO_H,F
            swapf   TEMP_DATO_H,F
            incf   FSR,F
            movfw   INDF
            movwf   TEMP_DATO_L
            movlw   0x30
            subwf   TEMP_DATO_L,W
            addwf   TEMP_DATO_H,W
            return
         
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<PROGRAMA DE GESTION DE INTERRUPCIONES>>>>>>>>>>>>>>>>>>>>>>
INTER           PUSH                    ;salva el contenido de W,STATUS Y PCLATH
            BANK0
            call      LEEDATO
            call   GRARAM
            bcf      PIR1,RCIF         ;borra flag de interrupcion por recepcion de usart
            call   BORR_ERR
            POP                    ;restaura el contenido de W,STATUS Y PCLATH
            retfie
            
            END

     




Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #36 en: 22 de Noviembre de 2009, 18:54:28 »
he realizado una usart por software para el pic12f508.
el programa recive un dato por el pin GP1 y lo transmite por el GP0.lo he realizado lo mas simplificado posible y es facil de modificar para separar el programa de recepcion del de transmision.y asi utilizarlo en otros proyectos.
se podria usar un solo pin para la recepcion y la emision.solo hay que cambiar algunas lineas del codigo.pero este no queria complicarlo mas.
podemos utilizar diferentes velocidades de transmision.para 1200,2400,4800,9600 y 19200bps. trabajando con el oscilador interno de este pic a 4Mhz.
no podemos utilizar frecuencias mayores sin que por ello se produzcan errores de transmision.

que lo disfruten.que trabajito me ha costado.
            

;*****************************************
; PROGRAMA : usart_12c508
; Funcion : recepcion y emision de datos mediante comunicacion serie.
;          
;  
;  Revision : 1.0        26/10/2009            Programa para : PIC12F508
; CPU Clock : 4 MHz                     Reloj instruccion :
;       WDT : Deshabilitado                  Tipo de reloj : IntRC
; Code Prot : OFF          
;******************************************
;
;este programa recive datos por el pin GP1 y los transmite por el GP0
;podemos configurar la velocidad que deseemos.el valor es introducido en el registro BAUDRATE.
;en el subprograma de ENVIO DE DATOS he puesto una linea deshabilitada por si queremos usar solamente la emision de datos.
;habilitandola solo tendriamos que cargar un valor en W.y hacer una llamada .call ENVIO.y el dato se emitiria
;por el pin GP0 del pic12f508
      LIST   P=12F508   ;Se indica el modo de procesador
      
      RADIX   HEX      ;Sistema de numeracion hexadecimal

      INCLUDE   "P12F508.inc"  
      
               ;registros internos
      __CONFIG   _IntRC_OSC & _CP_OFF & _WDT_OFF & _MCLRE_OFF

      ERRORLEVEL      -302


            CBLOCK    0x08
            CONTADOR
            DATO
            CONFIG_GPIO
            BAUDRATE
            ENDC
         
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
               ORG      0x00            ;Inicio en el Vector de Reset
              goto   INICIO            ;Va a la primera instruccion del programa

;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO         movlw   b'11000000'      ;configura el divisor de TMR0
            option   
            clrf   CONFIG_GPIO      ;borra el registro configuracion de E/S
            movlw   d'40'
            movwf   BAUDRATE
            ;valores para el vaudrate:
            ;
            ;para divisor TMR0=000
            ;190=2400bps, 90=4800bps, 40=9600bps, 15=19200bps,
            ;
            ;para divisor TMR0=010
            ;97=1200bps,
         
;<<<<<<<------------------------------------------------PROGRAMA PRINCIPAL---------------------------------------->>>>>>>>>>>>>>         
PRINCIPAL      call   RECEPCION
            
            call   ENVIO
            goto   PRINCIPAL
;<<<<<<---------------------------------------------SUBPROGRAMA RECEPCION DE DATOS--------------------------
            
RECEPCION      bsf      CONFIG_GPIO,1   ;pin 1 de GPIO como entrada
            movfw   CONFIG_GPIO      ;carga en w la configuracion de los pines GPIO
            tris    GPIO         ;aplica la configuracion de E/S   
            bsf      GPIO,0         ;pon a 0 el pin de salida de datos
            clrf   CONTADOR      ;borra el contador de bits
            btfsc   GPIO,1         ;comprueva si hay una señal de estado bajo por pin 0 de GPIO
            goto   $-1            ;si no hay señar espera

            clrf   TMR0         ;borra TMR0
            movfw   BAUDRATE      ;carga valor del baudrate en w
            subwf   TMR0,w         ;comprueva si ha llegado al valor o se pasa
            btfss   STATUS,C      ;si es menos sigue comprovando
            goto   $-3
            
COMP1         clrf   TMR0         ;borra TMR0
COMP2         movfw   BAUDRATE      ;carga valor del baudrate en w
            subwf   TMR0,w         ;resta el contenido de TMR0 con el de w(comprovacion => )
            btfss   STATUS,C      ;comprueva si ha llegado al valor o se pasa
            goto   COMP2         ;si es menos sigue comprovando

            btfsc   GPIO,1         ;comprueva el estado del pin de entrada
            call   UNO            ;si es 1 salta a UNO
            btfss   GPIO,1         ;comprueva el estado del pin de entrada
            call   CERO         ;si es 0 salta a CERO

            bsf      GPIO,2
            BCF      GPIO,2

            incf   CONTADOR,F      ;incrementa el contador de bits
            movlw   0x08         ;valor de bit a comprovar
            xorwf   CONTADOR,W      ;hacer xor con CONTADOR
            btfss   STATUS,Z      ;comprueva si es igual
            goto   COMP1         ;si no es igual sigue las comprobaciones
            movfw   DATO         ;carga el dato recivido en w
            retlw   0x00         ;retorno de subprograma

UNO            rrf      DATO,F         ;rota a la derecha una posicion   
            bsf      DATO,7         ;pon a 1 el bit 7 del registro DATO
            retlw   0x00         ;retorna

CERO         rrf      DATO,F         ;rota a la derecha una posicion
            bcf      DATO,7         ;pon a 0 el bit 7 del registro DATO
            retlw   0x00         ;retorna
            
         
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<SUBPROGRAMA DE ENVIO DE DATOS>>>>>>>>>>>>>>>>>      

   
ENVIO         ;movwf   DATO         ;carga el contenido de w al registro DATO
            bcf      CONFIG_GPIO,0   ;pin 0 de GPIO como salida
            movfw   CONFIG_GPIO      ;carga en w la configuracion de los pines GPIO
            tris    GPIO         ;aplica la configuracion de E/S
            bsf      GPIO,0         ;establecer la salida a 1(evitar errores primer caracter)
ENVIO2         clrf   CONTADOR      ;borra el registro CONTADOR de bits
            bcf      GPIO,0         ;bit START   
            call   RETARDO   
            
ENV_1         btfsc   DATO,0         ;comprueva bit 0 del registro DATO(comprovacion de bits a enviar)
            goto   UNOS         ;salta a UNOS si el bit leido es 1
            btfss   DATO,0         ;comprueva bit 0 del registro DATO(comprovacion de bits a enviar)
            goto   CEROS         ;salta a CEROS si el bit leido es 0
ENV_2         rrf      DATO,F         ;rota a la derecha el registro DATO
            incf   CONTADOR,F      ;incrementa CONTADOR (registro contador de bits)
            movlw   0x08         ;valor de bits a leer
            xorwf   CONTADOR,W      ;comprueva si son 8
            btfss   STATUS,Z      ;si no es 8 repite la comprovacion del siguiente bit
            goto   ENV_1         ;comprueva de nuevo
            retlw   0x00         ;retorna del subprograma

UNOS         bsf      GPIO,0         ;saca valor 1 por pin 0 de GPIO
            call   RETARDO         ;tiempo de un bit
            goto   ENV_2         ;siguiente bit
CEROS         bcf      GPIO,0         ;saca valor 0 por pin 0 de GPIO
            call   RETARDO         ;tiempo de un bit
            goto   ENV_2         ;siguiente bit

;**********************************************RETARDO***************************************

RETARDO         clrf   TMR0         ;borra el temporizador
COMP         movfw   BAUDRATE      ;valor del retardo
            subwf   TMR0,w         ;comprueva si ha llegado al valor o se pasa
            btfss   STATUS,C      ;si es menos sigue comprovando
            goto   COMP
            retlw   0x00         ;si ha llegado retorna


            end                  ;fin
« Última modificación: 02 de Diciembre de 2009, 11:24:38 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: pequeños proyectos
« Respuesta #37 en: 23 de Noviembre de 2009, 08:08:00 »
Te re felicito groundman  :-/ :-/
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: pequeños proyectos
« Respuesta #38 en: 23 de Noviembre de 2009, 09:33:44 »
Muy bien Groundman! Una consulta, ese PIC tiene interrupción por flanco en alguno de sus pines? Si es si, podes utilizarlo para detectar la llegada de algún dato. Por aquí un ejemplo.

Cuando postees código hazlo entre [ code ] aquí código [ /code ] (Sin los espacios) así queda más ordenado y entendible  ;-)

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #39 en: 23 de Noviembre de 2009, 19:09:05 »
gracias por los elogios. :)

suky.este pic no lleva interrupciones.ya pense en eso.lo unico mas parecido a una interrupcion si no me equivoco.es la posibilidad de despertar del modo sleep
por cambio de estado en algunos de sus pins.
es un pic tan pequeño que solo tiene 2 stack pointer. :( con lo que me fastidia usar los goto para llamar a otros subprogramas.
pronto posteare otro codigo para usarlo en un 16f84.y esta vez si que integrare esta posibilidad.de esta forma se aprobechara mejor su velocidad de funcionamiento.

ah.y lo de
Código: [Seleccionar]
no lo sabia.lo hare en el proximo asm que posteo.

saludos.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: pequeños proyectos
« Respuesta #40 en: 23 de Noviembre de 2009, 19:26:47 »
coach, pues a mi lo que siempre me ha tirado por los suelos de estos pequeñines es que no tienen hard. para comunicarse, si le pusiesen i2c ... o usart, pero mirando esto a lo mejor me animo a hacer alguna cosilla con ellos, gracias Groundman

un saludo

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #41 en: 23 de Noviembre de 2009, 20:50:10 »
a mi lo que mas me a gustado de estos pequeñines es el precio   :D sobre los 2€
que si valiese igual que el 16f84 que vale el doble.seguro que ni los hubiera mirado.porque mira que tiene pocos recursos  :(

eso si.en estos pic es donde se nos obliga a la optimizacion del codigo.y se nos hace casi imprencindible realizar el sofware exclusivamente en asm.
y solo de esta forma apreciamos las caracteristicas que integran sus hermanos mayores.y nos damos cuenta de lo preciados que son los bytes.
aunque segun vamos usando chips mas potentes.se nos va olvidando esa optimizacion.
de ahi que no me guste usar otro lenguage que no sea asm.aunque supongo que todo depende del precio del componente y sus recursos.

seguiran los 12F508 a 2€ o por contra.y por no vajar un precio un dia se consideraran obsoletos y cesaran su fabricacion?

mi opinion es que en la gama baja. los precios se aproximaran tanto que no sera efectivo utilizar los chips que tubieran menos recursos.



Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: pequeños proyectos
« Respuesta #42 en: 23 de Noviembre de 2009, 22:15:10 »
aqui los pics enanos , ese mas enano que nada 12F508 y 509 cuestan -+ US1.00 hasta 1.5

Los pics como el 12f683/675 oscilan entre 2 y 3 dolares. Esto en Mexico Saludos!

Son de mis preferidos! ^^

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: pequeños proyectos
« Respuesta #43 en: 23 de Noviembre de 2009, 23:23:23 »
Por aquí un 12F508 sale 1.6 U$S, es de 0.5k  :shock: :shock: Si que hay que optimizar código  :?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado JOJOJORGE5

  • PIC16
  • ***
  • Mensajes: 167
Re: pequeños proyectos
« Respuesta #44 en: 24 de Noviembre de 2009, 22:11:18 »
Hola

Felicidades Groundman.

Yo aquí por Bolivia no vi ningún pic de gama baja, ni para comprar ni nadie que se trajera uno.
Si los tuviera por aquí y fueran baratos, ya los estaría exprimiendo hasta el último bit de memoria.

Por el momento lomas barato que puedo conseguir es un 16f628 aunque ya pasa tiempo de la última ves que pregunte y tal ves ya ni lo tienen.
También no esta demás decir que el 16f84 me parece muy mala inversión, pero para aprender yo creo que esta bien porque existen muchos ejemplos para este pic.

Salu2:)