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

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

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #15 en: 17 de Enero de 2009, 12:15:48 »
y aqui pongo un programa para la recepcion y emision por usart.es una mezcla de los programas de arriva usart_rx.asm y usart_tx.
el dato que entra por el puerto A sale por tx.para visualizarlo por ejem.en el hiperterminal de windows.
y la tecla que se pulsa en el hiperterminal de windows.mete el dato por rx del pic para bisualizarlo por el puerto B.

el programa en si,contiene un bucle para la emision continua de caracteres ascii hacia el hiperterminal.los datos que se emiten son los que introducamos en el
puerto A del pic.
y la visualizacion de los datos recividos se realizara por el purto B.despues de que salte la interrupcion por transferencia completa RCIF.
pero para que esto suceda,no puede haber ningun cable conectado en el pin TX.de lo contrario no se visualizaran los datos en el puerto B.
no se si es culpa del hiperterminal.pero si lo aberiguo ya lo pondre por aqui.





;****************************************** http://www.ingeniopic.com *******
; PROGRAMA : usart_rx_tx.asm
; Funcion : visualizar datos recividos de la usart por el puerto B y transmitir el valor del puerto A.por la usart interna del pic. .
;           (hay que desconectar cualquier cable conectado en TX,para poder recivir por RX)
;           Serial port config: 9600 baudios,8 bits,paridad = none
;   
;  Revision : 1.0        6/1/2009            Programa para : PIC16F876
; CPU Clock : 4 MHz                      Reloj instruccion : 4 MHz = 0.25 us
;       WDT : Deshabilitado                  Tipo de reloj : XT 
; Code Prot : OFF                        velocidad usart: 9.600 Kbps
;****************************************** http://www.ingeniopic.com *******

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

            INCLUDE   <P16f876.inc>  ;se incluye la definicion de los registros
               ;registros internos
            __CONFIG    _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF &_WRT_ENABLE_OFF
            ERRORLEVEL      -302     ;para que no se notifiquen los errires por los registros fuera del banco de ram.

CounterA      EQU  20h            ;registros para retardo
CounterB      EQU  21h
CounterC      EQU  22h
W_TEMP         EQU    23h
STATUS_TEMP   EQU    24h
PCLATH_TEMP   EQU    25h   

         #define      GIE_ON   bsf      INTCON,GIE
         #define      GIE_OFF   bcf      INTCON,GIE
   
                 
BANK0       MACRO                  ;macro para la seleccion del banco 0
            BCF   STATUS,RP0
            BCF   STATUS,RP1
            ENDM

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

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

;<<<<<<---------------------- 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               ;Vector de interrupcion

           goto   INTER            ;salta a la linea INTER

;<<<<<<----------------- CONFIGURACION DE LOS REGISTROS GENERALES ------------------->>>>>>>
INICIO                     
         BANK0                  ;Cambio al banco 0
         clrf   PORTA         ;borra puerto A
           movlw   b'10010000'     ;Configuracion de la usart
            movwf   RCSTA           ;para recepcion continua y habilitacion de la usart
           
         BANK1
         movlw   0x06            
           movwf   ADCON1         ;configura PORTA como entradas digitales
         movlw   0xff
            movwf   TRISA            ;PORTA como entrada de datos
            clrf   TRISB            ;Puerto B como salida de datos
            bsf      TRISC,7         ;RC7/Rx como entrada
         ;bcf      TRISC,6         ;RC6/Tx como salida     
            movlw   .25               ;valor para seleccionar 9600 baudios
            movwf   SPBRG         ;mete el valor en el registro baud rate generator
            movlw   b'00100100'     ;Configuracion USART modo alta velocidad 9600 baud y activacion de transmision
            movwf   TXSTA           ;carga valor anterior en registro asociado al generador del baud rate
            bsf     PIE1,RCIE       ;Habilitacion interrupcion RX

         BANK0
         clrf      PORTB         ;borra las salidas del puerto b
         movlw   b'11000000'     ;Habilitacion para las
            movwf   INTCON            ;interrupciones generales y perifericas.
   
           
;<<<<<<<<-----------------------------PROGRAMA PRINCIPAL--------------------------->>>>>>>>>>>>>>>>>>>>>>>>     
            nop                  ;aqui se pondra el programa principal y cuando queramos mandar un dato,
         nop                  ;solo tendremos que hacer un salto al programa de envio de datos "ESCRIBEDATO"
PRINCIPAL   call   ESCRIBEDATO      
         GOTO   PRINCIPAL
;<<<<<<<<-------------------------------ENVIO DE DATOS--------------------------->>>>>>>>>>>>>>
ESCRIBEDATO   GIE_OFF               ;deshabilita interrupciones.para que cuando este enviando un dato,no haya errores
         BANK0               ;selecciona banco 0
         movfw   PORTA         ;caraga en w el contenido del puerto A
         movwf   TXREG         ;escribe los datos en el registro de envio de datos
         BANK1               ;selecciona banco1
COMP_TX     btfsc   TXSTA,TRMT      ;comprueba si el shift register(TSR)esta lleno.y si es asi salta.
            goto      COMP_TX         ;en caso contrario bucle infinito.
         BANK0               ;selecciona banco 0
         GIE_ON               ;habilita interrupciones
         call    RETARDO         ;pausa para el envio de datos
         return               ;retorna a PRINCIPAL

;<<<<<<<<-------------------COMPROVACION DE TIPO DE INTERRUPCION------------>>>>>>>>>>>>>>
   
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
         goto   LEEDATO         
         POP                  ;restaura el contenido de W,STATUS Y PCLATH
            retfie                  ;retorno de interrupcion si no se ha dado la circunstancia anterior
           
;<<<<<<<<-------------------------VISUALIZACION DE DATO RECIVIDO------------>>>>>>>>>>>>>>
         
LEEDATO     BANK0
         movf    RCREG,W         ;Lectura dato recibido
              movwf   PORTB           ;Visualiza dato recibido en el puerto B
         POP                  ;restaura el contenido de W,STATUS Y PCLATH
            retfie                  ;retorna de la interrupcion.
         
         
;<<<<<<----------------------- RUTINAS DE RETARDO ------------------------->>>>>>>

RETARDO                        ;sub programa para realizar una pausa en el envio de datos
            movlw   D'1'
            movwf   CounterC
            movlw   D'20'
            movwf   CounterB
            movlw   D'50'
            movwf   CounterA
loop         decfsz   CounterA,1
            goto   loop
            decfsz   CounterB,1
            goto   loop
            decfsz   CounterC,1
            goto   loop
            return         
     
           END 
« Última modificación: 17 de Enero de 2009, 17:32:54 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #16 en: 17 de Enero de 2009, 17:31:47 »
este programa transmite un mensage en ascii al iperterminal de windows.la velocidad de transmision de caracteres
podemos graduarla modificando los valores de la rutina de retardo.



;****************************************** http://www.ingeniopic.com *******
; PROGRAMA : usart_mensage.asm
; Funcion : transmitir un mensage por la usart interna del pic hacia el hiperterminal de windows.
;           Serial port config: 9600 baudios,8 bits,paridad = none
;   
;  Revision : 1.0       11/1/2009            Programa para : PIC16F876
; CPU Clock : 4 MHz                      Reloj instruccion : 4 MHz = 0.25 us
;       WDT : Deshabilitado                  Tipo de reloj : XT 
; Code Prot : OFF                        velocidad usart: 9.600 Kbps
;****************************************** http://www.ingeniopic.com *******

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

            INCLUDE   <P16f876.inc> ;se incluye la definicion de los registros
                                 ;registros internos
            __CONFIG    _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF &_WRT_ENABLE_OFF
            ERRORLEVEL      -302     ;para que no se notifiquen los errires por los registros fuera del banco de ram.

CounterA      EQU      20h            ;registros para retardo
CounterB      EQU      21h
CounterC      EQU      22h
KEY_1      EQU    23h            ;registro de puntero de tabla
TEMP_DATOS   EQU      24h            ;registro temporal de datos
                 
BANK0         MACRO               ;macro para la seleccion del banco 0
            BCF   STATUS,RP0
            BCF   STATUS,RP1
            ENDM

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

;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
            ORG   0x00            ;Inicio en el Vector de Reset
     
            goto   INICIO            ;Va a la primera instruccion del programa
               

;<<<<<<----------------- CONFIGURACION DE LOS REGISTROS GENERALES ------------------->>>>>>>
INICIO      BANK0               ;Cambio al banco 0
         movlw   b'10010000'      ;Configuracion de la usart
            movwf   RCSTA            ;para recepcion continua y habilitacion de la usart
         BANK1
         movlw   0x06         ;configura PORTA como entradas digitales
         movwf   ADCON1
         bcf      TRISC,6         ;RC6/Tx como salida
         clrf   PORTB         ;puerto B como salida
            movlw   .25            ;valor para seleccionar 9600 baudios
            movwf   SPBRG
            movlw   b'00100100'      ;Configuracion USART modo alta velocidad 9600 baud y activacion de transmision
            movwf   TXSTA            ;carga valor anterior en registro asociado al generador del baud rate
            
;<<<<<<<<-----------------------------PROGRAMA PRINCIPAL--------------------------->>>>>>>>>>>>>>>>>>>>>>>>     
PRINCIPAL   BANK0               ;selecciona banco 0
         clrf   KEY_1         ;borra el puntero de tabla
         call   ESCRIBEDATO    ;salta al programa para escribir datos
         goto   PRINCIPAL           

;<<<<<<<<-------------------------------ENVIO DE DATOS--------------------------->>>>>>>>>>>>>>
ESCRIBEDATO   BANK0
         
         call   DATOS         ;busca caracter ascii en la tabla de datos
         movwf   TEMP_DATOS      ;mete el resultado de la busqueda en el registro temporal de datos
         xorlw   0xff         ;valor de fin de tabla
         btfsc   STATUS,Z      ;comprueva si ha leido el valor indicado
         return               ;retorna si ha a llegado al final de la tabla
         movfw   TEMP_DATOS      ;carga en W el valos guardado anteriormante en el registro temporal de datos
         movwf   TXREG         ;mete el valor en el registro de transmision de datos
         movwf   PORTB         ;saca el valor por el puerto B
         incf   KEY_1,F         ;incrementa el puntero de tabla
         BANK1
COMP_TX     btfsc   TXSTA,TRMT      ;comprueba si el shift register(TSR)esta lleno.y si es asi salta.
            goto      COMP_TX         ;si no,espera
         call    RETARDO         ;pausa para el envio de datos
         GOTO   ESCRIBEDATO      ;buelve a escribir el siguiente dato
;<<<<<<--------------------------------DATOS A EMITIR---------------------------->>>>>>>>>>>

DATOS      
         movf      KEY_1,W
            addwf   PCL,F
            ;addwf   PCL,1
         retlw   '"'
         retlw   'W'
            retlw   'W'
            retlw   'W'
            retlw   '.'
            retlw   'I'
            retlw   'N'
            retlw   'G'
            retlw   'E'
            retlw   'N'
            retlw   'I'
            retlw   'O'
            retlw   'P'
         retlw   'I'
            retlw   'C'
         retlw   '.'
         retlw   'C'
            retlw   'O'
            retlw   'M'
         retlw   '"'   
         retlw   ' '
         retlw    0xff

         
;<<<<<<---------------------------- RUTINAS DE RETARDO ------------------------->>>>>>>

RETARDO     
            movlw   D'2'
            movwf   CounterC
            movlw   D'1'
            movwf   CounterB
            movlw   D'1'
            movwf   CounterA
loop         decfsz   CounterA,1
            goto   loop
            decfsz   CounterB,1
            goto   loop
            decfsz   CounterC,1
            goto   loop
            return         
         
     
           END 
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1697
Re: pequeños proyectos
« Respuesta #17 en: 31 de Enero de 2009, 23:51:11 »
muchas gracias por este aporte..justo lo q necesitaba, tengo una inquietudes con respecto al usart_rx_tx.asm
1- estuve simulando(en proteus) y encuentro q el TX siempre esta enviando el dato, a la hora de hacer comunicacion con el pc, seria conflictivo que simpre hayan datos en la linea.?
2- Tambien en la simulacion tan solo se permiten enviar datos de 4 bits, y los datos que presenta el virtual terminal solo corresponden cuando el bit 6 y 7 estan en 1
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1697
Re: pequeños proyectos
« Respuesta #18 en: 01 de Febrero de 2009, 00:09:54 »
creo q estaba algo desinformado, lo de los 4 bit corresponde al codigo baudot?...pero igual para baudot son 5 bits y en simulacion solo se pueden usar 4 bits...adjunto unas capturas de pantalla para ver la simulacion...observa q la primera imagen es correcto el dato que se envia..es el "1"...pero en la segunda imagen..si cambiamos el estado de RA4 a "0" cambia el dato por un "!"....
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado PACMER

  • PIC10
  • *
  • Mensajes: 18
Re: pequeños proyectos
« Respuesta #19 en: 03 de Febrero de 2009, 09:13:28 »
codigo ASCII es la respuesta a tu duda

lo que esta leyendo el pic del puerto A es un valor binario
y al transmitirlo se convierte en codigo ascii

DIP         1   2   3   4   5   6   7   8
VALOR    1   2   4   8   16 32 64 128

en la pantalla uno tu dip esta:

|          binario             |dec |ascii |
|0  0    1   1   0   0   0 1|      |       |
|0+0+32+16+0+0+0+1| 49 |   1  |

pantalla 2:
|0  0    1   0  0  0  0  1  |      |      |
|0+0+32+0+0+0+0+1  | 33 |   !  |


esa es la razon :mrgreen:

descarga el adjunto

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1697
Re: pequeños proyectos
« Respuesta #20 en: 03 de Febrero de 2009, 16:22:19 »
hola,,,gracias PACMER por la respuesta, tu programas en assembler? lo q pasa es q he estado tratanto de modificar el programa que esta mas arriba en este post llamado usart_rx_tx.asm,,,quisieras saber si me puedes colaborar...el programa asi como esta en el post siempre se encuentra enviando un dato por el TX y yo lo cambie a que solo se envie el dato cuando reciba "1" por el RX,,,pero el programa simulando presenta  unos errores.
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #21 en: 03 de Febrero de 2009, 20:48:26 »
hola jhozate.te he modificado el programa rapidamente.asi que puede que sobren algunas lineas para que estubiera mas depurado.pero a mi me funciona.
solo tienes que pulsar la tecla '1' y reciviras en el hiperterminal el dato introducido en el puerto A.en formato ascii.


;****************************************** http://www.ingeniopic.com *******
; PROGRAMA : usart_rx_tx_v2.asm
; Funcion : visualizar datos ascii entregados por el puerto A.cuando se pulse la tecla '1' mediante el hiperterminal.
;           
;           Serial port config: 9600 baudios,8 bits,paridad = none
;   
;  Revision : 1.0        6/1/2009            Programa para : PIC16F876
; CPU Clock : 4 MHz                      Reloj instruccion : 4 MHz = 0.25 us
;       WDT : Deshabilitado                  Tipo de reloj : XT 
; Code Prot : OFF                        velocidad usart: 9.600 Kbps
;****************************************** http://www.ingeniopic.com *******

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

            INCLUDE   <P16f876.inc>  ;se incluye la definicion de los registros
               ;registros internos
            __CONFIG    _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF &_WRT_ENABLE_OFF
            ERRORLEVEL      -302     ;para que no se notifiquen los errires por los registros fuera del banco de ram.

CounterA      EQU  20h            ;registros para retardo
CounterB      EQU  21h
CounterC      EQU  22h
W_TEMP         EQU    23h
STATUS_TEMP   EQU    24h
PCLATH_TEMP   EQU    25h   

         #define      GIE_ON   bsf      INTCON,GIE
         #define      GIE_OFF   bcf      INTCON,GIE
   
                 
BANK0       MACRO                  ;macro para la seleccion del banco 0
            BCF   STATUS,RP0
            BCF   STATUS,RP1
            ENDM

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

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

;<<<<<<---------------------- 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               ;Vector de interrupcion

           goto   INTER            ;salta a la linea INTER

;<<<<<<----------------- CONFIGURACION DE LOS REGISTROS GENERALES ------------------->>>>>>>
INICIO                     
         BANK0                  ;Cambio al banco 0
         clrf   PORTA         ;borra puerto A
           movlw   b'10010000'     ;Configuracion de la usart
            movwf   RCSTA           ;para recepcion continua y habilitacion de la usart
           
         BANK1
         movlw   0x06            
           movwf   ADCON1         ;configura PORTA como entradas digitales
         movlw   0xff
            movwf   TRISA            ;PORTA como entrada de datos
            clrf   TRISB            ;Puerto B como salida de datos
            bsf      TRISC,7         ;RC7/Rx como entrada
         ;bcf      TRISC,6         ;RC6/Tx como salida     
            movlw   .25               ;valor para seleccionar 9600 baudios
            movwf   SPBRG         ;mete el valor en el registro baud rate generator
            movlw   b'00100100'     ;Configuracion USART modo alta velocidad 9600 baud y activacion de transmision
            movwf   TXSTA           ;carga valor anterior en registro asociado al generador del baud rate
            bsf     PIE1,RCIE       ;Habilitacion interrupcion RX

         BANK0
         clrf      PORTB         ;borra las salidas del puerto b
         movlw   b'11000000'     ;Habilitacion para las
            movwf   INTCON            ;interrupciones generales y perifericas.
   
           
;<<<<<<<<-----------------------------PROGRAMA PRINCIPAL--------------------------->>>>>>>>>>>>>>>>>>>>>>>>     
            nop                  ;aqui se pondra el programa principal y cuando queramos mandar un dato,
         nop                  ;solo tendremos que hacer un salto al programa de envio de datos "ESCRIBEDATO"
PRINCIPAL   call   PRINCIPAL;ESCRIBEDATO      
         GOTO   PRINCIPAL
;<<<<<<<<-------------------------------ENVIO DE DATOS--------------------------->>>>>>>>>>>>>>
ESCRIBEDATO   GIE_OFF               ;deshabilita interrupciones.para que cuando este enviando un dato,no haya errores
         BANK0               ;selecciona banco 0
         movfw   PORTA         ;caraga en w el contenido del puerto A
         movwf   TXREG         ;escribe los datos en el registro de envio de datos
         BANK1               ;selecciona banco1
COMP_TX     btfsc   TXSTA,TRMT      ;comprueba si el shift register(TSR)esta lleno.y si es asi salta.
            goto      COMP_TX         ;en caso contrario bucle infinito.
         BANK0               ;selecciona banco 0
         GIE_ON               ;habilita interrupciones
         call    RETARDO         ;pausa para el envio de datos
         return               ;retorna a PRINCIPAL

;<<<<<<<<-------------------COMPROVACION DE TIPO DE INTERRUPCION------------>>>>>>>>>>>>>>
   
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
         goto   LEEDATO         
         POP                  ;restaura el contenido de W,STATUS Y PCLATH
            retfie                  ;retorno de interrupcion si no se ha dado la circunstancia anterior
           
;<<<<<<<<-------------------------VISUALIZACION DE DATO RECIVIDO------------>>>>>>>>>>>>>>
         
LEEDATO     BANK0
         ;movf    RCREG,W         ;Lectura dato recibido
              ;movwf   PORTB           ;Visualiza dato recibido en el puerto B
         movlw   '1'
         xorwf   RCREG,W
         btfsc   STATUS,Z
         call   ESCRIBEDATO
         POP                  ;restaura el contenido de W,STATUS Y PCLATH
            retfie                  ;retorna de la interrupcion.
         
         
;<<<<<<----------------------- RUTINAS DE RETARDO ------------------------->>>>>>>

RETARDO                        ;sub programa para realizar una pausa en el envio de datos
            movlw   D'1'
            movwf   CounterC
            movlw   D'20'
            movwf   CounterB
            movlw   D'50'
            movwf   CounterA
loop         decfsz   CounterA,1
            goto   loop
            decfsz   CounterB,1
            goto   loop
            decfsz   CounterC,1
            goto   loop
            return         
     
           END 
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1697
Re: pequeños proyectos
« Respuesta #22 en: 03 de Febrero de 2009, 22:41:55 »
cordial saludo groundman...fijate que yo simulo este ultimo codigo en el proteus y desde el inicio de la simulacion me lanza muchos mensajes de advertencia, aunque el programa si realiza la tarea de solo enviar el dato cuando llegue un 1 por RX, te adjunto una captura de pantalla....
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1697
Re: pequeños proyectos
« Respuesta #23 en: 03 de Febrero de 2009, 23:12:35 »
editando el codigo pude minimizar tantos avisos de advertencias,, igual me sigue el mismo error "stack overflow executing CALL instruction" pero este solo pasa cada que presiono 4 veces la tecla 1 en virtual terminal de proteus..adjunté la captura de pantalla
Código: [Seleccionar]
****************************************** HTTP://WWW.INGENIOPIC.COM *******
; PROGRAMA : USART_RX_TX.ASM
; FUNCION : VISUALIZAR DATOS RECIVIDOS DE LA USART POR EL PUERTO B Y TRANSMITIR EL VALOR DEL PUERTO A.POR LA USART INTERNA DEL PIC. .
;           (HAY QUE DESCONECTAR CUALQUIER CABLE CONECTADO EN TX,PARA PODER RECIVIR POR RX)
;           SERIAL PORT CONFIG: 9600 BAUDIOS,8 BITS,PARIDAD = NONE
;   
;  REVISION : 1.0        6/1/2009            PROGRAMA PARA : PIC16F876
; CPU CLOCK : 4 MHZ                      RELOJ INSTRUCCION : 4 MHZ = 0.25 US
;       WDT : DESHABILITADO                  TIPO DE RELOJ : XT
; CODE PROT : OFF                        VELOCIDAD USART: 9.600 KBPS
;****************************************** HTTP://WWW.INGENIOPIC.COM *******

            LIST   P=16F877         ;SE INDICA EL MODO DE PROCESADOR
     
            RADIX   HEX            ;SISTEMA DE NUMERACION HEXADECIMAL

            INCLUDE   <P16F877.INC>  ;SE INCLUYE LA DEFINICION DE LOS REGISTROS
               ;REGISTROS INTERNOS
            __CONFIG    _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF &_WRT_ENABLE_OFF
            ERRORLEVEL      -302     ;PARA QUE NO SE NOTIFIQUEN LOS ERRIRES POR LOS REGISTROS FUERA DEL BANCO DE RAM.

COUNTERA      EQU  20H            ;REGISTROS PARA RETARDO
COUNTERB      EQU  21H
COUNTERC      EQU  22H
W_TEMP          EQU    23H
STATUS_TEMP    EQU    24H
PCLATH_TEMP    EQU    25H   

        #DEFINE      GIE_ON   BSF      INTCON,GIE
          #DEFINE      GIE_OFF   BCF      INTCON,GIE
   
                 
BANK0       MACRO                  ;MACRO PARA LA SELECCION DEL BANCO 0
            BCF    STATUS,RP0
            BCF    STATUS,RP1
            ENDM

BANK1       MACRO                  ;MACRO PARA LA SELECCION DEL BANCO 1
            BSF    STATUS,RP0
            BCF    STATUS,RP1
            ENDM

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

;<<<<<<---------------------- 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               ;VECTOR DE INTERRUPCION

           GOTO    INTER            ;SALTA A LA LINEA INTER

;<<<<<<----------------- CONFIGURACION DE LOS REGISTROS GENERALES ------------------->>>>>>>
INICIO                     
          BANK0                  ;CAMBIO AL BANCO 0
          CLRF    PORTA         ;BORRA PUERTO A
          MOVLW   B'10010000'     ;CONFIGURACION DE LA USART
            MOVWF   RCSTA           ;PARA RECEPCION CONTINUA Y HABILITACION DE LA USART
           
          BANK1
          MOVLW   0X06           
            MOVWF   ADCON1         ;CONFIGURA PORTA COMO ENTRADAS DIGITALES
          MOVLW   0XFF
            MOVWF   TRISA            ;PORTA COMO ENTRADA DE DATOS
            CLRF    TRISB            ;PUERTO B COMO SALIDA DE DATOS
            BSF     TRISC,7         ;RC7/RX COMO ENTRADA
          BCF     TRISC,6         ;RC6/TX COMO SALIDA     
            MOVLW   .25               ;VALOR PARA SELECCIONAR 9600 BAUDIOS
            MOVWF   SPBRG         ;METE EL VALOR EN EL REGISTRO BAUD RATE GENERATOR
            MOVLW   B'00100100'     ;CONFIGURACION USART MODO ALTA VELOCIDAD 9600 BAUD Y ACTIVACION DE TRANSMISION
            MOVWF   TXSTA           ;CARGA VALOR ANTERIOR EN REGISTRO ASOCIADO AL GENERADOR DEL BAUD RATE
            BSF     PIE1,RCIE       ;HABILITACION INTERRUPCION RX

          BANK0
          CLRF    PORTB         ;BORRA LAS SALIDAS DEL PUERTO B
          MOVLW   B'11000000'     ;HABILITACION PARA LAS
            MOVWF   INTCON            ;INTERRUPCIONES GENERALES Y PERIFERICAS.
   
           
;<<<<<<<<-----------------------------PROGRAMA PRINCIPAL--------------------------->>>>>>>>>>>>>>>>>>>>>>>>     
            NOP                  ;AQUI SE PONDRA EL PROGRAMA PRINCIPAL Y CUANDO QUERAMOS MANDAR UN DATO,
          NOP                  ;SOLO TENDREMOS QUE HACER UN SALTO AL PROGRAMA DE ENVIO DE DATOS "ESCRIBEDATO"
PRINCIPAL   GOTO   INTER     
          ;CALL   ESCRIBEDATO
;<<<<<<<<-------------------------------ENVIO DE DATOS--------------------------->>>>>>>>>>>>>>
ESCRIBEDATO GIE_OFF               ;DESHABILITA INTERRUPCIONES.PARA QUE CUANDO ESTE ENVIANDO UN DATO,NO HAYA ERRORES
          BANK0               ;SELECCIONA BANCO 0
BCF PIR1,TXIF
          MOVFW   PORTA         ;CARAGA EN W EL CONTENIDO DEL PUERTO A
          MOVWF   TXREG         ;ESCRIBE LOS DATOS EN EL REGISTRO DE ENVIO DE DATOS
          BANK1               ;SELECCIONA BANCO1
COMP_TX     BTFSS   TXSTA,TRMT      ;COMPRUEBA SI EL SHIFT REGISTER(TSR)ESTA LLENO.Y SI ES ASI SALTA.
            GOTO      COMP_TX         ;EN CASO CONTRARIO BUCLE INFINITO.
          BANK0               ;SELECCIONA BANCO 0
BCF PIR1,TXIF

          GIE_ON 
             ;HABILITA INTERRUPCIONES
          CALL    RETARDO         ;PAUSA PARA EL ENVIO DE DATOS
          ;RETURN               ;RETORNA A PRINCIPAL

;<<<<<<<<-------------------COMPROVACION DE TIPO DE INTERRUPCION------------>>>>>>>>>>>>>>
   
INTER       PUSH                 ;SALVA EL CONTENIDO DE W,STATUS Y PCLATH
          BANK0
VOLVER      BTFSS   PIR1,RCIF         ;COMPRUEBA SI EL SHIFT REGISTER(RSR)ESTA LLENO.Y SI ES ASI SALTA
GOTO VOLVER
BCF  PIR1,RCIF ;REPONER EL FLAG DE INTERRUPCION
;BSF INTCON,PEIE
GOTO    LEEDATO
                 
          POP                  ;RESTAURA EL CONTENIDO DE W,STATUS Y PCLATH
            RETFIE                  ;RETORNO DE INTERRUPCION SI NO SE HA DADO LA CIRCUNSTANCIA ANTERIOR
           
;<<<<<<<<-------------------------VISUALIZACION DE DATO RECIVIDO------------>>>>>>>>>>>>>>
         
LEEDATO     BANK0
          MOVF    RCREG,W         ;LECTURA DATO RECIBIDO
MOVWF   PORTB           ;VISUALIZA DATO RECIBIDO EN EL PUERTO B
XORLW 0X31
BTFSC STATUS,Z
CALL ESCRIBEDATO
POP 
RETFIE   
          GOTO LEEDATO  ;RESTAURA EL CONTENIDO DE W,STATUS Y PCLATH
                      ;RETORNA DE LA INTERRUPCION.           
           
         
         
;<<<<<<----------------------- RUTINAS DE RETARDO ------------------------->>>>>>>

RETARDO                        ;SUB PROGRAMA PARA REALIZAR UNA PAUSA EN EL ENVIO DE DATOS
            MOVLW   D'1'
            MOVWF   COUNTERC
            MOVLW   D'20'
            MOVWF   COUNTERB
            MOVLW   D'50'
            MOVWF   COUNTERA
LOOP        DECFSZ   COUNTERA,1
            GOTO   LOOP
            DECFSZ   COUNTERB,1
            GOTO   LOOP
            DECFSZ   COUNTERC,1
            GOTO   LOOP
            RETURN         
     
            END 
« Última modificación: 03 de Febrero de 2009, 23:17:43 por jhozate »
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #24 en: 04 de Febrero de 2009, 19:59:17 »
siento no poder ayudarte en la parte del simulador.ya que nunca he usado este.me gustaria mucho aprender y parece que esta chulo.

en cuanto al programa.quizas se te quiten estos fallos.si no se utilizaran las interrupciones para la ejecucion del asm.solo tienes que deshabilitar las interrupciones.y ejecutar directamente la direccion INTER.y eliminar algunas lineas.

yo he usado interrupciones porque de esta forma.puedo estar ejecutando un programa hasta que se utilize la usart.prueva a ver que tal
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1697
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18271
    • MicroPIC
Re: pequeños proyectos
« Respuesta #26 en: 05 de Febrero de 2009, 03:10:56 »
¡Ojo!, que aquí no permitimos software ilegal.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #27 en: 05 de Febrero de 2009, 12:34:38 »
muchisimas gracias jhozate.le he hechado un vistazo por encima.a los manuales y perece que me va a gustar.

en cuanto al programa.no te preocupes seguro que tiene que haber algun shareware o demo.para empezar es suficiente.
ya si me gusta.mirare si el precio es atractivo.y si no ,a seguir como lo hago ahora fisicamente.no hay problema.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: pequeños proyectos
« Respuesta #28 en: 13 de Febrero de 2009, 12:31:48 »
Bueno este me parece el mejor lugar para colgar pequeño proyecto.

Bueno el proyecto es para la lectura de una memoria i2c usando un micro sin MSSP, en este caso uso el PIC16F690 que tiene el SSP, pero el SSP es bastante limitado para implementar un i2c maestro, asi que hice las rutinas para la comunicacion i2c y estan en el archivo i2cCom.inc y en el archivo I2Cmacro.inc, tambien hice unas rutinas para manejar la memoria estas estan en el archivo EE24AA64.inc.

El programa es:

Código: ASM
  1. ;**********************************************************************
  2. ;                              |¯¯\/¯¯|
  3. ;                                         VDD  --->|1   20|<--- VSS
  4. ;        RA5/T1CKL/OSC1/CLKIN <--->|2   19|<---> RA0/AN0/C1IN+/ICSPDAT/ULPWU
  5. ;RA4/AN3/_T1G/OSC2/CLKOUT <--->|3   18|<---> RA1/AN1/C12IN-/VREF/ICSPCLK
  6. ;                        RA3/_MCLR/VPP --->|4   17|<---> RA2/AN2/T0CLK/INT/C1OUT
  7. ;                        RC5/CPP1/P1A <--->|5   16|<---> RC0/AN4/C2IN+
  8. ;                        RC4/C2OUT/P1B<--->|6   15|<---> RC1/AN5/C2IN-
  9. ;                        RC3/AN7/P1C  <--->|7   14|<---> RC2/AN6/P1D                
  10. ;                    RC6/AN8/_SS  <--->|8   13|<---> RB4/AN10/SD1/SDA
  11. ;                    RC7/AN9/SDO  <--->|9   12|<---> RB5/AN11/RX/DT
  12. ;                        RB7/TX/CK        <--->|10  11|<---> RB6/SCK/SCL
  13. ;                                                      |______|
  14. ;                                                         PIC 16F690
  15. ;                                                                     *
  16. ;**********************************************************************
  17. ;                                                                     *
  18. ;       Nombre:         Test2.asm
  19. ;       Fecha:          28-01-2009
  20. ;       Version:        v1.00
  21. ;                                                                     *
  22. ;       Autor:          Sander
  23. ;       Empresa:
  24. ;                                                                     *
  25. ;                                                                     *
  26. ;**********************************************************************
  27. ;                                                                     *
  28. ;       Archivos Requeridos:
  29. ;
  30. ;       I2Cmacro.inc
  31. ;       i2cCom.inc
  32. ;       EE24AA64.inc
  33. ;**********************************************************************
  34. ;                                                                     *
  35. ;       Notas:
  36. ;       Despues de #include     <P16F690.inc>, debemos incluir las macros para
  37. ;       la comunicacion I2C (I2Cmacro.inc), y despues (al final del programa)
  38. ;       debemos incluir las     rutinas para manejar el bus i2c (i2cCom.inc) y
  39. ;       para manejar la memoria (EE24AA64.inc)
  40. ;
  41. ;       Este programa muestra el uso de una memoria i2c que pueda direccionar
  42. ;       maximo 16 bits, para este ejemplo se usara la AT24C64, que puede
  43. ;       direccionar hasta 8192 bytes.
  44. ;       -------------------------------------------------------------------------
  45. ;       Notas de versiones
  46. ;       v1.00   C-11-02-2009
  47. ;       El programa permite :
  48. ;               1       Escribir un byte en cualquier direccion
  49. ;               2       Leer un byte de cualquier direccion
  50. ;               3       Escribir varios bytes (maximo 32) a partir de cualquier direccion      
  51. ;               4       Leer hasta 80 bytes a partir de cualquier byte.
  52. ;       ------------------------------------------------------------------------
  53. ;**********************************************************************
  54.  
  55.  
  56.         list            p=16f690                ;directiva list para definir procesador
  57.         #include        <P16F690.inc>   ;definicion de variables especificas (SFRs)
  58.         #include        <I2Cmacro.inc>
  59.         __CONFIG    _CP_OFF & _CPD_OFF & _BOR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _FCMEN_OFF & _IESO_OFF
  60.  
  61.  
  62. ;La directiva '__CONFIG' se usa para colocar datos de configuracion
  63. ;dentro del archivo .asm.
  64. ; Las etiquetas que siguen a la directiva se encuentran en el archivo .inc respectivo
  65. ; Buscar en la hoja de datos respectiva para informacion adicional de la
  66. ;palabra de configuracion
  67.  
  68.  
  69. ;***** Definicion de Variables
  70. w_temp          EQU     0x71                    ; variable usada para salvar contexto
  71. status_temp     EQU     0x72                    ; variable usada para salvar contexto
  72. pclath_temp     EQU     0x73                    ; variable usada para salvar contexto
  73.  
  74.         CBLOCK  0x20
  75.         i2cDato
  76.         i2cCont
  77.         i2cFlags                                        ;para la comunicacion i2c
  78.         i2cEEAddr:2,i2cEEDato           ;
  79.         EECont                                          ;para manejar la EEPROM externa
  80.         OffsTabla, AddrTabla:.2         ;para manejar tablas
  81.  
  82.         DatoRx, DatoTx                          ;para guardar datos del EUSART
  83.         I,J                                                     ;puntero para buffers en memoria
  84.         ContBytes                                       ;para controlar cantidad de bytes
  85.  
  86.         DatoAux                                         ;para usar en subrutinas
  87.         ENDC
  88.  
  89.         CBLOCK  0xA0
  90.         BufferRx:.80                            ;buffer para la recepcion
  91.         ENDC
  92.  
  93.         CBLOCK  0x120
  94.         Buffer2:.80                                     ;bufer de proposito general
  95.         ENDC
  96.  
  97.         _9600           EQU             .103    ;0x67 para BRGH=1, BRG16=1, y Fosc=4MHz
  98.  
  99.         EEDir1          EQU             0xA0    ;direccion de la EEPROM externa
  100.  
  101.         #DEFINE         ACK_F           i2cFlags,.0
  102.         #DEFINE         S_NACK_F        i2cFlags,.1
  103. ;**********************************************************************
  104.         ORG             0x000                           ; Vector de Reset
  105.         goto            main                    ; ir al inicio del progra
  106.  
  107.  
  108.         ORG             0x004                           ;posicion del vector de interrupcion
  109.         movwf           w_temp                  ; salvar el contenido actual de W
  110.         movf            STATUS,w                ;
  111.         movwf           status_temp             ; salvar el contenido actual de STATUS
  112.         movf            PCLATH,w                ;
  113.         movwf           pclath_temp             ; salvar el contenido actual de PCLATH
  114.  
  115.  
  116. ;La rutina de interrupcio puede ir a continuacion o se puede realizar una
  117. ;llamada a la rutina usando call
  118.  
  119.         movf            pclath_temp,w   ; recuperar el valor de PCLATH
  120.         movwf           PCLATH                  ; antes de la interrupcion
  121.         movf            status_temp,w   ; recuperar el valor de STATUS
  122.         movwf           STATUS                  ; antes de la interrupcion
  123.         swapf           w_temp,f
  124.         swapf           w_temp,w                ; recuperar el valor de W
  125.         retfie                                          ;retornar de la interrupcion
  126.  
  127.  
  128.  
  129. main
  130. ;el programa principal va a continuacion
  131.  
  132. ;***************        Inicializacion de puertos       *******************
  133.         banksel         ANSEL                   ;banco 2
  134.         clrf            ANSEL
  135.         clrf            ANSELH                  ;todos los pines como I/O digitales
  136.         banksel         PORTA                   ;banco 0
  137. ;******************************************************************
  138.  
  139. ;***************        Inicializacion del EUSART       *******************
  140.  
  141.         banksel         TRISB                   ;banco 1
  142.         movlw           B'11110000'             ;RB5 y RB7 para usar el EUSART
  143.         movwf           TRISB                   ;RB4 y RB6 para hacer i2c
  144.         banksel         BAUDCTL                 ;banco 1
  145.         movlw           B'01001000'             ;Bit 3(BRG16) en 1 para usar generador
  146.         movwf           BAUDCTL                 ;de bauds de 16 bit.
  147.         movlw           B'00000100'             ;Bit 2(BRGH) en 1 para High Baud rate
  148.         movwf           TXSTA                   ;Bit 4(SYNC) = 0 modo asincrono
  149.         movlw           HIGH _9600
  150.         movwf           SPBRGH
  151.         movlw           LOW _9600
  152.         movwf           SPBRG                   ;Ajustamos la velocidad
  153.         banksel         RCSTA                   ;Banco 0
  154.         movlw           B'10010000'             ;Bit 7(SPEN) = 1 Habilita puerto serial
  155.         movwf           RCSTA                   ;Bit 4(CREN) = 1 Habilita recepcion.
  156. ;******************************************************************
  157.  
  158. ;***************        Inicializacion de variables     *******************
  159.         clrf            i2cFlags
  160.         clrf            i2cEEAddr+1
  161.         clrf            i2cEEAddr
  162. ;******************************************************************
  163.         banksel         TXSTA
  164.         bsf                     TXSTA,TXEN              ;Habilitamos el transmisor
  165.         banksel         PORTB
  166.  
  167. mainP0
  168.         clrw           
  169.         call            EnvMsg
  170.         movlw           .1
  171.         call            EnvMsg                  ;Enviamos mensaje de opciones
  172.  
  173.         call            RxEusart                ;recibimos la opcion del menu(solo un byte)
  174.         movf            ContBytes,W             ;
  175.         xorlw           .1                              ;verificamos que solo se reciba un byte
  176.         btfss           STATUS,Z                ;Se recibio solo un byte?
  177.         goto            MainEr1                 ;No => vamos a error
  178.         movlw           BufferRx                ;Si => vemos que opcion se recibio
  179.         movwf           FSR                             ;
  180.         movf            INDF,W                  ;Leemos el byte recibido
  181.         andlw           0x0F                    ;solo tomamos los bits menos significativos
  182.         movwf           INDF           
  183.         sublw           .4
  184.         btfss           STATUS,C                ;El valor recibido es <= 4?
  185.         goto            MainEr1                 ;No => vamos a error
  186.         movlw           HIGH mainP0_0   ;Si => nos preparamos para ir a la rutina de
  187.         movwf           PCLATH                  ;la opcion seleccionada
  188.         movlw           LOW mainP0_0    ;
  189.         addwf           INDF,W
  190.         btfsc           STATUS,C
  191.         incf            PCLATH,F
  192.         movf            INDF,W
  193.         addwf           PCL
  194. mainP0_0
  195.         goto            MainEr1
  196.         goto            MainOpc1
  197.         goto            MainOpc2
  198.         goto            MainOpc3
  199.         goto            MainOpc4
  200. MainEr1
  201.         movlw           .8
  202.         call            EnvMsg                  ;enviamos mensaje de dato erroneo
  203.         goto            mainP0                  ;volvemos a empezar con la rutina
  204.  
  205. ;**************************
  206.  
  207. ;***********************        MainOpc1        *******************************
  208. ;       MainOpc1        Atiende la opcion 1 del menu, permite recibir una
  209. ;                               direccion y un dato a escribir, controla si existen
  210. ;       errores al momento de introducir la direccion o el dato.
  211. ;       Si el dato se ecribio en la memoria envia un mensaje.
  212. ;**********************************************************************
  213. MainOpc1
  214.         movlw           .3
  215.         call            EnvMsg                  ;Enviamos mensaje para la opcion 1
  216.         call            RxEusart                ;para recibir los datos
  217.         call            IntDir                  ;Para procesar la direccion
  218.         xorlw           .0
  219.         btfsc           STATUS,Z                ;IntDir devolvio 0x00
  220.         goto            MainOpc1Er              ;Si => no se recibio una direccion valida
  221. MainOpc1P0
  222.         movlw           .4
  223.         call            EnvMsg                  ;Mensaje para introducir dato
  224.         call            RxEusart               
  225.         call            IntDato                 ;para recibir el dato
  226.         xorlw           .0
  227.         btfsc           STATUS,Z                ;IntDato devolvio 0x00
  228.         goto            MainOpc1Er2             ;Si => no se recibio un dato valido
  229.         call            EEWrByte                ;No => Escribimos el dato en la EEPROM
  230.         movlw           .5
  231.         call            EnvMsg                  ;Mensaje que indica que se escribio correctamente
  232.         movlw           .14
  233.         call            EnvMsg                  ;Para marcar que se termino de leer
  234.         goto            mainP0                  ;Volvemos a las opciones iniciales
  235. MainOpc1Er
  236.         movlw           .8
  237.         call            EnvMsg                  ;enviamos mensaje de dir erronea
  238.         goto            MainOpc1                ;volvemos a empezar con la rutina
  239. MainOpc1Er2
  240.         movlw           .8
  241.         call            EnvMsg                  ;enviamos mensaje de dato erroneo
  242.         goto            MainOpc1P0              ;volvemos a pedir dato
  243. ;**********************************************************************
  244.  
  245. ;***********************        MainOpc2        *******************************
  246. ;       MainOpc2        Atiende la opcion 2 del menu, permite recibir una
  247. ;                               direccion, controla si existen  errores al momento de
  248. ;       introducir la direccion.
  249. ;       Envia el dato leido en forma hexadecimal
  250. ;**********************************************************************
  251. MainOpc2
  252.         movlw           .6
  253.         call            EnvMsg                  ;enviamos mensaje para la opcion 2
  254.         call            RxEusart               
  255.         call            IntDir                  ;recibimos bytes de direccion
  256.         xorlw           .0
  257.         btfsc           STATUS,Z                ;IntDir devolvio 0x00?
  258.         goto            MainOpc2Er              ;Si => no se recibio una direccion valida
  259.         call            EERdByte                ;No => Leemos el byte.
  260.         movlw           .7
  261.         call            EnvMsg                  ;mensaje para mostrar el valor leido
  262.         movf            i2cEEDato,W
  263.         call            EnvEEDato               ;Enviamos el dato leido de la EEPROM en hex
  264.         movlw           .14
  265.         call            EnvMsg                  ;Para marcar que se termino de leer
  266.         goto            mainP0                  ;;Volvemos a las opciones iniciales
  267. MainOpc2Er
  268.         movlw           .8
  269.         call            EnvMsg                  ;enviamos mensaje de dato erroneo
  270.         goto            MainOpc2                ;volvemos a empezar con la rutina
  271. ;**********************************************************************
  272.  
  273. ;***********************        MainOpc3        *******************************
  274. ;       MainOpc3        Atiende la opcion 3 del menu, permite recibir una
  275. ;                               direccion y un dato a escribir, controla si se recibio
  276. ;       una direccion erronea, luego de recibir la direccion permite que se
  277. ;       vayan recibiendo hasta 32 datos y los va guardando en BufferRx tal
  278. ;       cual los va recibiendo (generalmente ASCII).
  279. ;       Cuando los datos se terminaron de escribir en la memoria envia un mensaje.
  280. ;**********************************************************************
  281. MainOpc3
  282.         movlw           .9
  283.         call            EnvMsg                  ;mensaje de inicio para este modo
  284.         call            RxEusart                ;recibimos la direccion donde
  285.         call            IntDir                  ;grabaremos
  286.         xorlw           .0
  287.         btfsc           STATUS,Z                ;IntDir retorno error?
  288.         goto            MainOpc3Er              ;Si => vamos a atender el error
  289.         movlw           .10                            
  290.         call            EnvMsg                  ;mensaje para introducir los datos
  291.         call            RxEusart                ;introducimos datos, en este modo
  292.         movf            ContBytes,W
  293.         movwf           EECont                  ;En EECont se pasa la cantidad de bytes escribir
  294.         call            EEWrPage                ;se guardan los datos en ascii(como se reciben)
  295.         movlw           .5
  296.         call            EnvMsg                  ;mensaje de caracteres grabados
  297.         movlw           .14
  298.         call            EnvMsg                  ;Para marcar que se termino de leer
  299.         goto            mainP0                  ;volvemos al menu principal
  300. MainOpc3Er
  301.         movlw           .8
  302.         call            EnvMsg                  ;enviamos mensaje de dato erroneo
  303.         goto            MainOpc3                ;volvemos a empezar con la rutina
  304. ;**********************************************************************
  305.  
  306. ;***********************        MainOpc4        *******************************
  307. ;       MainOpc4        Atiende la opcion 4 del menu, permite recibir una
  308. ;                               direccion y una cantidad de datos a leer, controla si existen
  309. ;       errores al momento de introducir la direccion y la cantidad de datos.
  310. ;       Envia los datos leidos en forma hexadecimal separados por espacios en
  311. ;       blanco.
  312. ;**********************************************************************
  313. MainOpc4
  314.         movlw           .11
  315.         call            EnvMsg                  ;mensaje de inicio para este modo
  316.         call            RxEusart                ;recibimos la direccion desde donde
  317.         call            IntDir                  ;leeremos
  318.         xorlw           .0
  319.         btfsc           STATUS,Z                ;IntDir retorno error?
  320.         goto            MainOpc4Er              ;Si => vamos a atender el error
  321. MainOpc4P0
  322.         movlw           .12
  323.         call            EnvMsg                  ;mensaje para introducir cantidad de bytes
  324.         call            RxEusart                ;recibimos la cantidad de datos
  325.         movf            ContBytes,W             ;
  326.         xorlw           .2
  327.         btfss           STATUS,Z                ;Se recibio 2 datos(para cantdad datos)?
  328.         goto            MainOpc4Er2             ;No => atendemos error
  329.  
  330.         movlw           BufferRx                ;convertimos los dos datos recibidos en binario
  331.         movwf           FSR                             ;
  332.         movf            INDF,W                  ;Leemos el 1er dato    
  333.         movwf           DatoAux                 ;revisamos que sea numero
  334.         sublw           0x29
  335.         btfsc           STATUS,C                ;DatoAux >= '0'?
  336.         goto            MainOpc4Er2             ;No => atendemos error
  337.         movf            DatoAux,W
  338.         sublw           '9'
  339.         btfss           STATUS,C                ;DatoAux <= '9'?
  340.         goto            MainOpc4Er2             ;No => atendemos error
  341.         movlw           0x0F
  342.         andwf           DatoAux,F               ;aqui tenemos las decenas
  343.         clrf            EECont
  344. MainOpc4P0_0
  345.         movlw           .10
  346.         addwf           EECont,F                ;EECont = EECont + 10
  347.         decfsz          DatoAux,F               ;decenas == 0?
  348.         goto            MainOpc4P0_0    ;No => seguimos sumando
  349.        
  350.         incf            FSR,F                   ;Si => revisamos el otro byte
  351.         movf            INDF,W                  ;Leemos el 2do dato    
  352.         movwf           DatoAux                 ;revisamos que sea numero
  353.         sublw           0x29
  354.         btfsc           STATUS,C                ;DatoAux >= '0'?
  355.         goto            MainOpc4Er2             ;No => atendemos error
  356.         movf            DatoAux,W
  357.         sublw           '9'
  358.         btfss           STATUS,C                ;DatoAux <= '9'?
  359.         goto            MainOpc4Er2             ;No => atendemos error
  360.         movlw           0x0F
  361.         andwf           DatoAux,F               ;aqui tenemos las unidades
  362. MainOpc4P0_1
  363.         movlw           .1
  364.         addwf           EECont,F                ;EECont = EECont + 10
  365.         decfsz          DatoAux,F               ;decenas == 0?
  366.         goto            MainOpc4P0_1    ;No => seguimos sumando
  367.                
  368.         movf            EECont,W                ;Si => revisamos si EECont <= 80
  369.         sublw           .80
  370.         btfss           STATUS,C                ;DatoAux <= 80?
  371.         goto            MainOpc4Er2             ;No => atendemos error
  372.        
  373.         movf            EECont,W
  374.         movwf           ContBytes
  375.         call            EERdPage                ;leemos los datos
  376.  
  377.         movlw           .13
  378.         call            EnvMsg                  ;mensaje para mostrar los datos leidos
  379.  
  380. MainOpc4P1
  381.         movlw           Buffer2
  382.         movwf           FSR
  383.         bsf                     STATUS,IRP              ;para apuntar al banco 2       
  384. MainOpc4P1_0
  385.         movf            INDF,W                  ;leemos el dato que queremos enviar
  386.         movwf           i2cEEDato               ;para enviar el dato en formato hexadecimal
  387.         call            EnvEEDato               ;es decir, como esta escrito en la memoria
  388.         movlw           ' '
  389.         btfss           PIR1,TXIF
  390.         goto            $-1
  391.         movwf           TXREG                   ;Enviamos espacio en blanco
  392.  
  393.         incf            FSR,F                   ;para tomar el siguiente dato
  394.         decfsz          ContBytes,F             ;;Se transmitieron todos los datos?
  395.         goto            MainOpc4P1_0    ;No => seguimos transmitiendo
  396.         bcf                     STATUS,IRP              ;FSR para apuntar al banco 0 o 1
  397.         movlw           .14
  398.         call            EnvMsg                  ;Para marcar que se termino de leer
  399.         goto            mainP0
  400. MainOpc4Er
  401.         movlw           .8
  402.         call            EnvMsg                  ;enviamos mensaje de dir erroneo
  403.         goto            MainOpc4                ;volvemos a empezar con la rutina
  404. MainOpc4Er2
  405.         movlw           .8
  406.         call            EnvMsg                  ;enviamos mensaje de cantidad erroneo
  407.         goto            MainOpc4P0              ;volvemos a recibir cantidad bytes
  408. ;**********************************************************************
  409.  
  410. ;***************************    IntDir  *******************************
  411. ;       IntDir  Lleva  4 bytes recibidos en ASCII mediante la rutina
  412. ;                       RxEusart a i2cEEAddr, para tener asi la direccion con la
  413. ;       que se quiere trabajar en la EEPROM. por ejemplo si se recibe
  414. ;       '0','1','a','B' => i2cEEAddr = 01AB. la rutina retorna error si
  415. ;       se recibieron mas de 4 bytes o si el caracter recibido no
  416. ;       es un numero o una letra de la 'a' a la 'f'.
  417. ;**********************************************************************
  418. IntDir
  419.         movf            ContBytes,W
  420.         xorlw           .4
  421.         btfss           STATUS,Z                ;Se recibio 4 datos(para direccion)?
  422.         retlw           0x00                    ;No => retornamos error
  423.         movlw           BufferRx
  424.         movwf           FSR                             ;
  425.         movf            INDF,W                  ;Leemos el 1er dato
  426.         call            Ascii2Hex               ;Convertimos el dato a hex
  427.         xorlw           .0                             
  428.         btfsc           STATUS,Z                ;Ascii2Hex retorno 0?
  429.         retlw           0x00                    ;No => retornamos error
  430.         swapf           DatoAux,W
  431.         movwf           i2cEEAddr+1             ;nible alto de i2cEEAddr+1
  432.        
  433.         incf            FSR,F                   ;siguiente dato
  434.         movf            INDF,W                  ;Leemos el 2do dato
  435.         call            Ascii2Hex               ;Convertimos el dato a hex
  436.         xorlw           .0                             
  437.         btfsc           STATUS,Z                ;Ascii2Hex retorno 0?
  438.         retlw           0x00                    ;No => retornamos error
  439.         movf            DatoAux,W
  440.         iorwf           i2cEEAddr+1,F   ;nible bajo de i2cEEAddr+1
  441.  
  442.         incf            FSR,F                   ;siguiente dato
  443.         movf            INDF,W                  ;Leemos el 3er dato
  444.         call            Ascii2Hex               ;Convertimos el dato a hex
  445.         xorlw           .0                             
  446.         btfsc           STATUS,Z                ;Ascii2Hex retorno 0?
  447.         retlw           0x00                    ;No => retornamos error
  448.         swapf           DatoAux,W
  449.         movwf           i2cEEAddr               ;nible alto de i2cEEAddr
  450.  
  451.         incf            FSR,F                   ;siguiente dato
  452.         movf            INDF,W                  ;Leemos el 4to dato
  453.         call            Ascii2Hex               ;Convertimos el dato a hex
  454.         xorlw           .0                             
  455.         btfsc           STATUS,Z                ;Ascii2Hex retorno 0?
  456.         retlw           0x00                    ;No => retornamos error
  457.         movf            DatoAux,W
  458.         iorwf           i2cEEAddr,F             ;nible bajo de i2cEEAddr
  459.         retlw           0x01
  460. ;*******************************************************************
  461.  
  462. ;***************************    IntDato *******************************
  463. ;       IntDato         Similar a IntDir pero solo trabaja con dos datos, por
  464. ;                               ejemplo si se recibio 'F','e' => i2cEEDato = FE
  465. ;       Retorna error si se recibieron mas de 2 bytes o si el caracter recibido
  466. ;       no es un numero o una letra de la 'a' a la 'f'.
  467. ;**********************************************************************
  468. IntDato
  469.         movf            ContBytes,W
  470.         xorlw           .2
  471.         btfss           STATUS,Z                ;Se recibio 2 datos(para dato)?
  472.         retlw           0x00                    ;No => retornamos error
  473.         movlw           BufferRx
  474.         movwf           FSR                             ;
  475.         movf            INDF,W                  ;Leemos el 1er dato
  476.         call            Ascii2Hex               ;Convertimos el dato a hex
  477.         xorlw           .0                             
  478.         btfsc           STATUS,Z                ;Ascii2Hex retorno 0?
  479.         retlw           0x00                    ;Si => retornamos error
  480.         swapf           DatoAux,W
  481.         movwf           i2cEEDato               ;nible alto de i2cEEDato
  482.        
  483.         incf            FSR,F                   ;siguiente dato
  484.         movf            INDF,W                  ;Leemos el 2do dato
  485.         call            Ascii2Hex               ;Convertimos el dato a hex
  486.         xorlw           .0                             
  487.         btfsc           STATUS,Z                ;Ascii2Hex retorno 0?
  488.         retlw           0x00                    ;Si => retornamos error
  489.         movf            DatoAux,W
  490.         iorwf           i2cEEDato,F             ;nible bajo de i2cEEDato
  491.         retlw           0x01
  492. ;**********************************************************************
  493.  
  494. ;***************************    EnvEEDato       ***************************
  495. ;       EnvEEDato       Recibe un dato leido de la EEPROM en i2cEEDato y lo
  496. ;                               transmite por el EUSART en ASCII para que pueda
  497. ;       visualizarse correctamente en el terminal , por ejemlo, si
  498. ;       i2cEEDato = 6F, se transmitira '6'y'F'.
  499. ;**********************************************************************
  500. EnvEEDato
  501.         swapf           i2cEEDato,W
  502.         andlw           0x0F                    ;primero trabajamos con el nible alto
  503.         call            Hex2Ascii               ;convertimos el hexadecimal a ASCII
  504.         movf            DatoAux,W
  505.         btfss           PIR1,TXIF
  506.         goto            $-1
  507.         movwf           TXREG                   ;cargamos TXREG si esta vacio
  508.         movf            i2cEEDato,W
  509.         andlw           0x0F                    ;trabajamos con el nible bajo
  510.         call            Hex2Ascii               ;convertimos el hexadecimal a ASCII
  511.         movf            DatoAux,W
  512.         btfss           PIR1,TXIF
  513.         goto            $-1
  514.         movwf           TXREG                   ;cargamos TXREG si esta vacio
  515.         return
  516. ;**********************************************************************
  517.  
  518. ;***************************    Ascii2Hex       ***************************
  519. ;       Ascii2Hex       La rutina recibe en W un  numero o letra de la 'a' a la 'f'
  520. ;                               y devuelve mediante DatoAux un numero en hexadecimal
  521. ;       equivalente, por ejemplo :
  522. ;
  523. ;       si WREG = '5' => DatoAux = 0x05
  524. ;          WREG = 'F' => DatoAux = 0x0F
  525. ;
  526. ;       retorna Error si no se recibio un numero o una letra de la 'a' a 'f'
  527. ;**********************************************************************
  528. Ascii2Hex
  529.         movwf           DatoAux
  530.         sublw           ' '
  531.         btfsc           STATUS,C                ;DatoAux >= '0'?
  532.         retlw           0x00                    ;No => error
  533.         movf            DatoAux,W
  534.         sublw           '9'
  535.         btfss           STATUS,C                ;DatoAux <= '9'?
  536.         goto            Ascii2HexP1             ;No => revisamos si es letra mayuscula
  537.         movlw           0x0F
  538.         andwf           DatoAux,F
  539.         retlw           0x01
  540. Ascii2HexP1
  541.         movf            DatoAux,W
  542.         sublw           '@'
  543.         btfsc           STATUS,C                ;DatoAux >= '@'?
  544.         retlw           0x00                    ;No => error
  545.         movf            DatoAux,W
  546.         sublw           'F'
  547.         btfss           STATUS,C                ;DatoAux <= 'F'?
  548.         goto            Ascii2HexP2             ;No => revisamos si es letra minuscula
  549.         movlw           0x0F
  550.         andwf           DatoAux,F               ;Aqui tenemos un numero del 1 al 6
  551.         movlw           .9
  552.         addwf           DatoAux,F               ;al sumarle 9 tenemos un valor de 0x0A a 0x0F
  553.         retlw           0x01
  554. Ascii2HexP2
  555.         movf            DatoAux,W
  556.         sublw           0x60
  557.         btfsc           STATUS,C                ;DatoAux >= 0x60?
  558.         retlw           0x00                    ;No => error
  559.         movf            DatoAux,W
  560.         sublw           'f'
  561.         btfss           STATUS,C                ;DatoAux <= 'f'?
  562.         retlw           0x00                    ;No => error
  563.         movlw           0x0F
  564.         andwf           DatoAux,F               ;Aqui tenemos un numero del 1 al 6
  565.         movlw           .9
  566.         addwf           DatoAux,F               ;al sumarle 9 tenemos un valor de 0x0A a 0x0F
  567.         retlw           0x01
  568.  
  569. ;***************************    Hex2Ascii       ***************************
  570. ;       Hex2Ascii       Recibe en W un numero de 0x00 a 0x0F y retorna mediante
  571. ;                               DatoAux el equivalente ASCII del numero recibido
  572. ;       Por ejemplo : Si W = 0x05 => DatoAux = '5'(0x35)
  573. ;                                 Si W = 0x0A => DatoAux = 'A'(0x41)
  574. ;**********************************************************************
  575. Hex2Ascii
  576.         movwf           DatoAux
  577.         sublw           0x09
  578.         btfss           STATUS,C                ;DatoAux <= '9'?
  579.         goto            Hex2AsciiP1             ;No => sera letra
  580.         movlw           0x30                    ;Si => lo convertimos a ASCII
  581.         iorwf           DatoAux,F               ;(0x30 a 0x39)
  582.         return
  583. Hex2AsciiP1
  584.         movlw           0x09                    ;al restarle 9 tenemos 1 si era 0x0A
  585.         subwf           DatoAux,F               ;hasta 6 si era 0x0F
  586.         movlw           0x40
  587.         iorwf           DatoAux,F               ;convertimos a ASCII (si 0x0C => 'C')
  588.         return
  589. ;**********************************************************************
  590.  
  591. ;***************************    RxEusart        ***************************
  592. ;       RxEusart        Recibe caracteres y los almacena en BufferRx, sale
  593. ;                               cuando se recibe un enter(0x0D) o cuando se recibieron
  594. ;       32 caracteres. La cuenta de los caracteres recibidos se realiza
  595. ;       mediante ContBytes.
  596. ;**********************************************************************
  597. RxEusart
  598.         clrf            ContBytes
  599.         movlw           BufferRx
  600.         movwf           I
  601. RxEusartP0
  602.         movf            I,W
  603.         movwf           FSR
  604.         btfss           PIR1,RCIF               ;Se recibio un caracter?
  605.         goto            $-1                             ;No => Esperamos
  606.         btfss           RCSTA,OERR              ;Hubo un dsborde?
  607.         goto            RxEusartP1              ;No => vamos a leer el caracter
  608.         bcf                     RCSTA,CREN              ;Si => reiniciamos la recepcion
  609.         bsf                     RCSTA,CREN
  610.         goto            RxEusart
  611. RxEusartP1
  612.         movf            RCREG,W                
  613.         movwf           DatoRx                  ;guardamos el caracter recibido en DatoRx
  614.         xorlw           0x0D                   
  615.         btfsc           STATUS,Z                ;Se recibio enter?
  616.         return                                          ;Si => salimos
  617.         movf            DatoRx,W                ;No => guardamos el dato y hacemos eco
  618.         movwf           INDF                    ;BufferRx[I] = DatoRx
  619.         btfss           PIR1,TXIF               ;TXREG vacio?
  620.         goto            $-1
  621.         movwf           TXREG                   ;Si => hacemos eco
  622.         incf            I,F                             ;I++
  623.         incf            ContBytes,F             ;ContBytes ++
  624.         movf            ContBytes,W
  625.         xorlw           .32
  626.         btfss           STATUS,Z                ;Se recibieron 32 bytes?
  627.         goto            RxEusartP0              ;No => seguimos recibiendo
  628.         movlw           .2                             
  629.         call            EnvMsg                  ;Si => mensaje de buffer lleno
  630.         btfss           PIR1,RCIF               ;Esperamos a que no haya ningun byte mas
  631.         return                                          ;No hay bytes => Salimos
  632.         movf            RCREG,W                 ;si se recibio algun caracter mas
  633.         bcf                     RCSTA,CREN
  634.         bsf                     RCSTA,CREN              ;Reiniciamos el Receptor
  635.         return
  636. ;**********************************************************************
  637.        
  638.  
  639. ;***************************    EnvMsg  *******************************
  640. ;       EnvMsg  Envia un mensaje por el EUSART, recibe el mensaje que se
  641. ;                       quiere enviar en W
  642. ;**********************************************************************
  643.  
  644. EnvMsg
  645.         movwf           OffsTabla               ;guardamos el mensaje que queremos desplegar   
  646.         movlw           HIGH EnvMsgP0   ;Actualizamos PCLATH para hacer un computed
  647.         movwf           PCLATH                  ;goto en EnvMsgP0
  648.         movlw           LOW EnvMsgP0    ;revisamos de no excedernos de la direccion
  649.         addwf           OffsTabla,W             ;en PCLARH
  650.         btfsc           STATUS,C                ;Nos excedemos?
  651.         incf            PCLATH                  ;Si => incrementamos PCLATH
  652.         movf            OffsTabla,W             ;No =>realizamos el salto
  653.         addwf           PCL,F
  654. EnvMsgP0
  655.         goto            EnvMsg_0                ;Vamos a enviar mensaje 0
  656.         goto            EnvMsg_1                ;Vamos a enviar mensaje 1
  657.         goto            EnvMsg_2                ;Vamos a enviar mensaje 2
  658.         goto            EnvMsg_3                ;Vamos a enviar mensaje 3
  659.         goto            EnvMsg_4                ;Vamos a enviar mensaje 4
  660.         goto            EnvMsg_5                ;Vamos a enviar mensaje 5
  661.         goto            EnvMsg_6                ;Vamos a enviar mensaje 6
  662.         goto            EnvMsg_7                ;Vamos a enviar mensaje 7
  663.         goto            EnvMsg_8                ;Vamos a enviar mensaje 8
  664.         goto            EnvMsg_9                ;Vamos a enviar mensaje 9
  665.         goto            EnvMsg_10               ;Vamos a enviar mensaje 10
  666.         goto            EnvMsg_11               ;Vamos a enviar mensaje 11
  667.         goto            EnvMsg_12               ;Vamos a enviar mensaje 12
  668.         goto            EnvMsg_13               ;Vamos a enviar mensaje 13
  669.         goto            EnvMsg_14               ;Vamos a enviar mensaje 14
  670. EnvMsg_0
  671.         clrf            OffsTabla               ;Para comenzar desde el primer caracter
  672. EnvMsg_0P0
  673.         movlw           HIGH Msg_0
  674.         movwf           AddrTabla+1             ;Con AddrTabla direccionamos el
  675.         movlw           LOW Msg_0               ;mensaje que queremos desplegar
  676.         movwf           AddrTabla
  677.         call            Mensajes                ;recojemos el carcater que toca
  678.         movwf           DatoTx                  ;y lo guardamos en DatoTx
  679.         xorlw           0x00
  680.         btfsc           STATUS,Z                ;Se tiene 0x00?
  681.         return                                          ;si => se termino el mensaje
  682.                                                                 ;no => continuamos
  683.         call            EUSART_Tx               ;llamamos a la rutina que envia caracteres
  684.         incf            OffsTabla,F             ;Para transmitir el siguiente caracter
  685.         goto            EnvMsg_0P0
  686.  
  687. EnvMsg_1
  688.         clrf            OffsTabla               ;Para comenzar desde el primer caracter
  689. EnvMsg_1P0
  690.         movlw           HIGH Msg_1
  691.         movwf           AddrTabla+1             ;Con AddrTabla direccionamos el
  692.         movlw           LOW Msg_1               ;mensaje que queremos desplegar
  693.         movwf           AddrTabla
  694.         call            Mensajes                ;recojemos el carcater que toca
  695.         movwf           DatoTx                  ;y lo guardamos en DatoTx
  696.         xorlw           0x00
  697.         btfsc           STATUS,Z                ;Se tiene 0x00?
  698.         return                                          ;si => se termino el mensaje
  699.                                                                 ;no => continuamos
  700.         call            EUSART_Tx               ;llamamos a la rutina que envia caracteres
  701.         incf            OffsTabla,F             ;Para transmitir el siguiente caracter
  702.         goto            EnvMsg_1P0
  703.  
  704. EnvMsg_2
  705.         clrf            OffsTabla               ;Para comenzar desde el primer caracter
  706. EnvMsg_2P0
  707.         movlw           HIGH Msg_2
  708.         movwf           AddrTabla+1             ;Con AddrTabla direccionamos el
  709.         movlw           LOW Msg_2               ;mensaje que queremos desplegar
  710.         movwf           AddrTabla
  711.         call            Mensajes                ;recojemos el carcater que toca
  712.         movwf           DatoTx                  ;y lo guardamos en DatoTx
  713.         xorlw           0x00
  714.         btfsc           STATUS,Z                ;Se tiene 0x00?
  715.         return                                          ;si => se termino el mensaje
  716.                                                                 ;no => continuamos
  717.         call            EUSART_Tx               ;llamamos a la rutina que envia caracteres
  718.         incf            OffsTabla,F             ;Para transmitir el siguiente caracter
  719.         goto            EnvMsg_2P0
  720.  
  721. EnvMsg_3
  722.         clrf            OffsTabla               ;Para comenzar desde el primer caracter
  723. EnvMsg_3P0
  724.         movlw           HIGH Msg_3
  725.         movwf           AddrTabla+1             ;Con AddrTabla direccionamos el
  726.         movlw           LOW Msg_3               ;mensaje que queremos desplegar
  727.         movwf           AddrTabla
  728.         call            Mensajes                ;recojemos el carcater que toca
  729.         movwf           DatoTx                  ;y lo guardamos en DatoTx
  730.         xorlw           0x00
  731.         btfsc           STATUS,Z                ;Se tiene 0x00?
  732.         return                                          ;si => se termino el mensaje
  733.                                                                 ;no => continuamos
  734.         call            EUSART_Tx               ;llamamos a la rutina que envia caracteres
  735.         incf            OffsTabla,F             ;Para transmitir el siguiente caracter
  736.         goto            EnvMsg_3P0
  737.  
  738. EnvMsg_4
  739.         clrf            OffsTabla               ;Para comenzar desde el primer caracter
  740. EnvMsg_4P0
  741.         movlw           HIGH Msg_4
  742.         movwf           AddrTabla+1             ;Con AddrTabla direccionamos el
  743.         movlw           LOW Msg_4               ;mensaje que queremos desplegar
  744.         movwf           AddrTabla
  745.         call            Mensajes                ;recojemos el carcater que toca
  746.         movwf           DatoTx                  ;y lo guardamos en DatoTx
  747.         xorlw           0x00
  748.         btfsc           STATUS,Z                ;Se tiene 0x00?
  749.         return                                          ;si => se termino el mensaje
  750.                                                                 ;no => continuamos
  751.         call            EUSART_Tx               ;llamamos a la rutina que envia caracteres
  752.         incf            OffsTabla,F             ;Para transmitir el siguiente caracter
  753.         goto            EnvMsg_4P0
  754.  
  755. EnvMsg_5
  756.         clrf            OffsTabla               ;Para comenzar desde el primer caracter
  757. EnvMsg_5P0
  758.         movlw           HIGH Msg_5
  759.         movwf           AddrTabla+1             ;Con AddrTabla direccionamos el
  760.         movlw           LOW Msg_5               ;mensaje que queremos desplegar
  761.         movwf           AddrTabla
  762.         call            Mensajes                ;recojemos el carcater que toca
  763.         movwf           DatoTx                  ;y lo guardamos en DatoTx
  764.         xorlw           0x00
  765.         btfsc           STATUS,Z                ;Se tiene 0x00?
  766.         return                                          ;si => se termino el mensaje
  767.                                                                 ;no => continuamos
  768.         call            EUSART_Tx               ;llamamos a la rutina que envia caracteres
  769.         incf            OffsTabla,F             ;Para transmitir el siguiente caracter
  770.         goto            EnvMsg_5P0
  771.  
  772. EnvMsg_6
  773.         clrf            OffsTabla               ;Para comenzar desde el primer caracter
  774. EnvMsg_6P0
  775.         movlw           HIGH Msg_6
  776.         movwf           AddrTabla+1             ;Con AddrTabla direccionamos el
  777.         movlw           LOW Msg_6               ;mensaje que queremos desplegar
  778.         movwf           AddrTabla
  779.         call            Mensajes                ;recojemos el carcater que toca
  780.         movwf           DatoTx                  ;y lo guardamos en DatoTx
  781.         xorlw           0x00
  782.         btfsc           STATUS,Z                ;Se tiene 0x00?
  783.         return                                          ;si => se termino el mensaje
  784.                                                                 ;no => continuamos
  785.         call            EUSART_Tx               ;llamamos a la rutina que envia caracteres
  786.         incf            OffsTabla,F             ;Para transmitir el siguiente caracter
  787.         goto            EnvMsg_6P0
  788.  
  789. EnvMsg_7
  790.         clrf            OffsTabla               ;Para comenzar desde el primer caracter
  791. EnvMsg_7P0
  792.         movlw           HIGH Msg_7
  793.         movwf           AddrTabla+1             ;Con AddrTabla direccionamos el
  794.         movlw           LOW Msg_7               ;mensaje que queremos desplegar
  795.         movwf           AddrTabla
  796.         call            Mensajes                ;recojemos el carcater que toca
  797.         movwf           DatoTx                  ;y lo guardamos en DatoTx
  798.         xorlw           0x00
  799.         btfsc           STATUS,Z                ;Se tiene 0x00?
  800.         return                                          ;si => se termino el mensaje
  801.                                                                 ;no => continuamos
  802.         call            EUSART_Tx               ;llamamos a la rutina que envia caracteres
  803.         incf            OffsTabla,F             ;Para transmitir el siguiente caracter
  804.         goto            EnvMsg_7P0
  805.  
  806. EnvMsg_8
  807.         clrf            OffsTabla               ;Para comenzar desde el primer caracter
  808. EnvMsg_8P0
  809.         movlw           HIGH Msg_8
  810.         movwf           AddrTabla+1             ;Con AddrTabla direccionamos el
  811.         movlw           LOW Msg_8               ;mensaje que queremos desplegar
  812.         movwf           AddrTabla
  813.         call            Mensajes                ;recojemos el carcater que toca
  814.         movwf           DatoTx                  ;y lo guardamos en DatoTx
  815.         xorlw           0x00
  816.         btfsc           STATUS,Z                ;Se tiene 0x00?
  817.         return                                          ;si => se termino el mensaje
  818.                                                                 ;no => continuamos
  819.         call            EUSART_Tx               ;llamamos a la rutina que envia caracteres
  820.         incf            OffsTabla,F             ;Para transmitir el siguiente caracter
  821.         goto            EnvMsg_8P0
  822.  
  823. EnvMsg_9
  824.         clrf            OffsTabla               ;Para comenzar desde el primer caracter
  825. EnvMsg_9P0
  826.         movlw           HIGH Msg_9
  827.         movwf           AddrTabla+1             ;Con AddrTabla direccionamos el
  828.         movlw           LOW Msg_9               ;mensaje que queremos desplegar
  829.         movwf           AddrTabla
  830.         call            Mensajes                ;recojemos el carcater que toca
  831.         movwf           DatoTx                  ;y lo guardamos en DatoTx
  832.         xorlw           0x00
  833.         btfsc           STATUS,Z                ;Se tiene 0x00?
  834.         return                                          ;si => se termino el mensaje
  835.                                                                 ;no => continuamos
  836.         call            EUSART_Tx               ;llamamos a la rutina que envia caracteres
  837.         incf            OffsTabla,F             ;Para transmitir el siguiente caracter
  838.         goto            EnvMsg_9P0
  839.  
  840. EnvMsg_10
  841.         clrf            OffsTabla               ;Para comenzar desde el primer caracter
  842. EnvMsg_10P0
  843.         movlw           HIGH Msg_10
  844.         movwf           AddrTabla+1             ;Con AddrTabla direccionamos el
  845.         movlw           LOW Msg_10              ;mensaje que queremos desplegar
  846.         movwf           AddrTabla
  847.         call            Mensajes                ;recojemos el carcater que toca
  848.         movwf           DatoTx                  ;y lo guardamos en DatoTx
  849.         xorlw           0x00
  850.         btfsc           STATUS,Z                ;Se tiene 0x00?
  851.         return                                          ;si => se termino el mensaje
  852.                                                                 ;no => continuamos
  853.         call            EUSART_Tx               ;llamamos a la rutina que envia caracteres
  854.         incf            OffsTabla,F             ;Para transmitir el siguiente caracter
  855.         goto            EnvMsg_10P0
  856.  
  857. EnvMsg_11
  858.         clrf            OffsTabla               ;Para comenzar desde el primer caracter
  859. EnvMsg_11P0
  860.         movlw           HIGH Msg_11
  861.         movwf           AddrTabla+1             ;Con AddrTabla direccionamos el
  862.         movlw           LOW Msg_11              ;mensaje que queremos desplegar
  863.         movwf           AddrTabla
  864.         call            Mensajes                ;recojemos el carcater que toca
  865.         movwf           DatoTx                  ;y lo guardamos en DatoTx
  866.         xorlw           0x00
  867.         btfsc           STATUS,Z                ;Se tiene 0x00?
  868.         return                                          ;si => se termino el mensaje
  869.                                                                 ;no => continuamos
  870.         call            EUSART_Tx               ;llamamos a la rutina que envia caracteres
  871.         incf            OffsTabla,F             ;Para transmitir el siguiente caracter
  872.         goto            EnvMsg_11P0
  873.  
  874. EnvMsg_12
  875.         clrf            OffsTabla               ;Para comenzar desde el primer caracter
  876. EnvMsg_12P0
  877.         movlw           HIGH Msg_12
  878.         movwf           AddrTabla+1             ;Con AddrTabla direccionamos el
  879.         movlw           LOW Msg_12              ;mensaje que queremos desplegar
  880.         movwf           AddrTabla
  881.         call            Mensajes                ;recojemos el carcater que toca
  882.         movwf           DatoTx                  ;y lo guardamos en DatoTx
  883.         xorlw           0x00
  884.         btfsc           STATUS,Z                ;Se tiene 0x00?
  885.         return                                          ;si => se termino el mensaje
  886.                                                                 ;no => continuamos
  887.         call            EUSART_Tx               ;llamamos a la rutina que envia caracteres
  888.         incf            OffsTabla,F             ;Para transmitir el siguiente caracter
  889.         goto            EnvMsg_12P0
  890.  
  891. EnvMsg_13
  892.         clrf            OffsTabla               ;Para comenzar desde el primer caracter
  893. EnvMsg_13P0
  894.         movlw           HIGH Msg_13
  895.         movwf           AddrTabla+1             ;Con AddrTabla direccionamos el
  896.         movlw           LOW Msg_13              ;mensaje que queremos desplegar
  897.         movwf           AddrTabla
  898.         call            Mensajes                ;recojemos el carcater que toca
  899.         movwf           DatoTx                  ;y lo guardamos en DatoTx
  900.         xorlw           0x00
  901.         btfsc           STATUS,Z                ;Se tiene 0x00?
  902.         return                                          ;si => se termino el mensaje
  903.                                                                 ;no => continuamos
  904.         call            EUSART_Tx               ;llamamos a la rutina que envia caracteres
  905.         incf            OffsTabla,F             ;Para transmitir el siguiente caracter
  906.         goto            EnvMsg_13P0
  907.  
  908. EnvMsg_14
  909.         clrf            OffsTabla               ;Para comenzar desde el primer caracter
  910. EnvMsg_14P0
  911.         movlw           HIGH Msg_14
  912.         movwf           AddrTabla+1             ;Con AddrTabla direccionamos el
  913.         movlw           LOW Msg_14              ;mensaje que queremos desplegar
  914.         movwf           AddrTabla
  915.         call            Mensajes                ;recojemos el carcater que toca
  916.         movwf           DatoTx                  ;y lo guardamos en DatoTx
  917.         xorlw           0x00
  918.         btfsc           STATUS,Z                ;Se tiene 0x00?
  919.         return                                          ;si => se termino el mensaje
  920.                                                                 ;no => continuamos
  921.         call            EUSART_Tx               ;llamamos a la rutina que envia caracteres
  922.         incf            OffsTabla,F             ;Para transmitir el siguiente caracter
  923.         goto            EnvMsg_14P0
  924.        
  925. EUSART_Tx
  926.         btfss           PIR1,TXIF               ;TXREG esta vacio?
  927.         goto            $-1                             ;No  => esperamos
  928.         movf            DatoTx,W
  929.         movwf           TXREG                   ;cargamos TXREG
  930.         return
  931.  
  932.  
  933. Mensajes
  934.         movf            OffsTabla,W
  935.         addwf           AddrTabla,W             ;determinamos si el sato no excede 0xFF
  936.         btfsc           STATUS,C
  937.         incf            AddrTabla+1,F   ;Si excede => incrementamos la parte alta
  938.         movf            AddrTabla+1,W
  939.         movwf           PCLATH                  ;actualizamos PCLATH(parte alta)
  940.         movf            OffsTabla,W
  941.         addwf           AddrTabla,W             ;volvemos a calcular el salto
  942.         movwf           PCL                             ;actualizamos PCL para realizar el salto.
  943.  
  944. Msg_0
  945.         DT      "\n\rEjemplo de lectura y escritura de una memoria i2c\n\r",0
  946. Msg_1
  947.         DT      "\n\rIntroduzca el numero de una de las opciones :\n\r\n\r"
  948.         DT      "1 Escribir un byte\n\r"
  949.         DT      "2 Leer un byte\n\r"
  950.         DT      "3 Escribir varios bytes (maximo 32)\n\r"
  951.         DT      "4 Leer varios bytes (maximo 80)\n\r\n\r",0
  952. Msg_2
  953.         DT      "\n\rBuffer lleno\n\r",0
  954. Msg_3
  955.         DT      "\n\r***** Escribir un byte *****\n\r"
  956.         DT      "Introduzca direccion en hexadecimal (2 bytes): ",0
  957.        
  958. Msg_4
  959.         DT      "\n\rIntroduzca dato en hexadecimal (1 byte): ",0
  960. Msg_5
  961.         DT      "\n\rValor(es) escrito(s)",0
  962. Msg_6
  963.         DT      "\n\r***** Leer un byte *****\n\r"
  964.         DT      "Introduzca direccion en hexadecimal (2 bytes): ",0
  965. Msg_7
  966.         DT      "\n\rEl valor leido es: ",0
  967. Msg_8
  968.         DT      "\n\rValor no valido\n\r",0
  969. Msg_9
  970.         DT      "\n\r***** Escribir varios bytes *****\n\r"
  971.         DT      "Introduzca direccion en hexadecimal (2 bytes): ",0
  972. Msg_10
  973.         DT      "\n\rIntroduzca los datos (maximo 32 caracteres):\n\r",0
  974. Msg_11
  975.         DT      "\n\r***** Leer varios bytes *****\n\r"
  976.         DT      "Introduzca direccion en hexadecimal (2 bytes): ",0
  977. Msg_12
  978.         DT      "\n\rIntroduzca la cantidad de bytes a leer (max 80): ",0
  979. Msg_13
  980.         DT      "\n\rLos valores leidos son:\n\r",0
  981. Msg_14
  982.         DT      "\n\r**********************************************\n\r ",0
  983.  
  984.         #include        <i2cCom.inc>
  985.         #include        <EE24AA64.inc>
  986.  
  987.         ORG     0x2100                          ; Pocision de la EEPROM interna
  988.         DE      1,2,3,4                         ; define las primeras cuatro posiciones de la
  989.                                                         ; EEPROM como 1,2,3 y 4
  990.  
  991.         END                       ; directiva 'fin del programa'

Aqui le dejo unas imagenes de cuando probe el programa.





tambien les dejo todos los archivos del proyecto en MPLAB 8.14 y un archivo para simulacion en proteus 7.2

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 #29 en: 13 de Febrero de 2009, 20:15:55 »
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.

y luego veo que has utilizado el hiperterminal para la comunicacion con el pic.nunca se me ocurrio su uso con este fin.
creo que voy a aprender muchas cosas con tu programa. :-)
Montando mi primera impresora 3D (Raprep Prusa i3)


 

anything