Autor Tema: Problema comunicacion serie 18F  (Leído 20924 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado kafefefe

  • PIC10
  • *
  • Mensajes: 15
Re: Problema comunicacion serie 18F
« Respuesta #15 en: 02 de Septiembre de 2006, 07:47:35 »
He revisado tu programa. y la configuración del pin RX y TX las pones las dos a uno. Cuando deberia ser "1" y "0", para que esos pines trabajaran como entrada y salida respectivamente.

También he visto que realizas un control de errores. Por lo demas me parece muy interesante,

Un saludo, gracias por tu programa.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema comunicacion serie 18F
« Respuesta #16 en: 02 de Septiembre de 2006, 10:34:55 »
He revisado tu programa. y la configuración del pin RX y TX las pones las dos a uno. Cuando deberia ser "1" y "0", para que esos pines trabajaran como entrada y salida respectivamente.

También he visto que realizas un control de errores. Por lo demas me parece muy interesante,

Un saludo, gracias por tu programa.


Tenés razón, fue un desliz de la costumbre de usar los 16F  :-) , en los 16F por más que sean salidas los tense que poner en 1, para que sean pines de USART.

Era tarde más el apuro por enviarte algo que funcione, se me pasó por alto  8) 8).  Una parte era copia de un código que tenía para los 16F  :mrgreen: :mrgreen:
« Última modificación: 02 de Septiembre de 2006, 10:49:24 por maunix »
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema comunicacion serie 18F
« Respuesta #17 en: 02 de Septiembre de 2006, 12:29:11 »
con este programita consigo recorrer todos los caracteres ASCII y enviarlos. Lo he simulado y funciona porque consigo generar el archivo .txt de salida con esos datos. El problema es que no consigo visualizarlo por el hyperterminal.

Prueba con el modo sin control de flujo, de todas formas es probable que estés haciendo algo que no concuerde con la configuración del baudeaje.

Si me mandas un mensaje privado con tu mail te puedo pasar un programita para que puedas debuggear la usart.  Es simple pero te permitirá ver si realmente "recibes algo" o no.

Si recibes algo lo verás, sino, no.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado rocky3200

  • PIC10
  • *
  • Mensajes: 28
Re: Problema comunicacion serie 18F
« Respuesta #18 en: 04 de Septiembre de 2006, 16:22:03 »


  Supongo con el programita que nos has pasado puedo simular el programa sin necesidad de conectar el pic al ordenador fisicamente

????

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema comunicacion serie 18F
« Respuesta #19 en: 04 de Septiembre de 2006, 16:56:46 »


  Supongo con el programita que nos has pasado puedo simular el programa sin necesidad de conectar el pic al ordenador fisicamente

????

Así es, está hecho para simularse con MPSIM pero el HEX generado lo podrías simular con cualquier otro simulador como Proteus por ejemplo.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado rocky3200

  • PIC10
  • *
  • Mensajes: 28
Re: Problema comunicacion serie 18F
« Respuesta #20 en: 04 de Septiembre de 2006, 19:08:23 »

  Encontre un error bien gordo en mi programa. Resulta que al activar la interrupcion por recepcion del puerto serie antes de configurar la UART pues salta la interrupcion sin entrar en la configuracion de la UART.

Ahora el problema que tengo es que estoy viendo que solo coge el primer dato de recpcion y despues no salta mas el RC1IF porque no entran mas datos a pesar de tener en el archivo para leer mas datos.

los he puesto de la siguienta forma:

0x11
0x12
0x13
.
.
.

 y lo que veo es que solo coge el 0x11 y no carga mas datos por eso no vuelve a saltar el RC1IF y por lo tanto se queda bloqueado esperando a leer este flag.

¿No se que impide que cargue mas datos?

 
 



   LIST     P=18F8722              ;Tipo de procesador
   INCLUDE <P18F8722.INC>          ;Definicion del archivo donde estan
                                   ;definidos todos los registros del P18F8722
                                  
                                  
;------------------ VARIABLES

TXDATO                         equ 0x10 ;Variables VARIAS
RXDATO                         equ 0x11
CONTADOR                       equ 0x12
GUARDA                         equ 0x13


CABECERA_PAQUETE               equ 0x14 ;Variables TELECOMANDO
FIN_PAQUETE                    equ 0x15

TELEMETRIA_COMIENZO            equ 0x16 ;Variables TELEMETRIA
TEMP_PRIMARIA                  equ 0x17
TEMP_AMBIENTE                  equ 0x18
TIMESTAMP_H_MSB                equ 0x19
TIMESTAMP_L_MSB                equ 0x1A
TIMESTAMP_H_LSB                equ 0x1B
TIMESTAMP_L_LSB                equ 0x1C
TELEMETRIA_FIN                 equ 0x1D


;CODIGO

   ORG   0x00                     ;inicio en el vector de reset
   goto  INICIO                   ;va a la primera instrucción de programa
   
   ORG   0x08                     ;vector de interrupción de alta prioridad   
   goto  TIMESTAMP                ;subrrutina de atención a interrupción de alta prioridad
   
   ORG   0x18                     ;vector de interrupción de baja prioridad
   goto  TELECOMANDO              ;subrrutina de atención a interrupción de baja prioridad



       
;*************************************************************************       
;-------------------------------------------------------------------------
;********** RUTINA DE ATENCION A INTERRUPCION DE BAJA PRIORIDAD **********
;-------------------------------------------------------------------------
;*************************************************************************
       
       
TELECOMANDO             
       
 

        bcf   PIE1,RC1IE               ;deshabilitamos interrupción de recepción EUSART_1
        movf  RCREG1,W
        movwf CABECERA_PAQUETE
        bcf   RCSTA1,CREN              ;limpiamos posibles errores
        bsf   RCSTA1,CREN              ;deshabilitando y habilitando CREN
       
FIN_TELECOMANDO

       
        btfss PIR1,RC1IF               ;testeamos si el buffer de RX lleno(flag RC1IF=1)
        goto  FIN_TELECOMANDO          ;vacio = no hay dato (esperamos)
        movf  RCREG1,W
        movwf FIN_PAQUETE
        bcf   RCSTA1,CREN              ;limpiamos posibles errores
        bsf   RCSTA1,CREN              ;deshabilitando y habilitando CREN
       
                                       
                               
                   
;------------------- SURUTINAS DEL PROGRAMA PRINCIPAL -------------------- 
;*************************************************************************


;*************************************************************************   
;                   SUBRUTINA Inicialización Puertos
;*************************************************************************
 
INICIALIZAR_PUERTOS

        clrf  PORTA                    ;limpiamos puerto A
        movlw B'00000000'              ;Puerto A de SALIDA
        movwf TRISA
       
        clrf  PORTB                    ;limpiamos puerto B
        movlw B'00000000'              ;Puerto B de SALIDA
        movwf TRISB
       
        clrf  PORTC                    ;limpiamos puerto C
        movlw B'10000000'              ;Puerto C de SALIDA (configurar TX1=1 y RX1=0)
        movwf TRISC
       
        clrf  PORTD                    ;limpiamos puerto D
        movlw B'00000000'              ;Puerto D de SALIDA (prueba led´s)
        movwf TRISD
       
        clrf  PORTE                    ;limpiamos puerto E
        movlw B'00000000'              ;Puerto E de SALIDA
        movwf TRISE
               
        clrf  PORTF                    ;limpiamos puerto F
        movlw B'00000000'              ;puerto F de SALIDA
        movwf TRISF
       
        clrf  PORTG                    ;limpiamos puerto G
        movlw B'11100100'              ;RG0,RG1,RG3 y RG4 como SALIDAS y RG2 como ENTRADA
        movwf TRISG
         
        clrf  PORTH                    ;limpiamos puerto H
        movlw B'11111111'              ;Puerto H de ENTRADA (sensor temperatura primaria)
        movwf TRISH
       
        clrf  PORTJ                    ;limpiamos puerto J
        movlw B'11111111'              ;Puerto J de ENTRADA (sensor temperatura ambiente)
        movwf TRISJ
       
        return

;*************************************************************************   
;                   SUBRUTINA Inicialización Registros
;*************************************************************************

INICIALIZAR_REGISTROS

        movlw D'5'     
        movwf CONTADOR                 ;inicializamos contador de variables de telemetría
       
        movlw TELEMETRIA_COMIENZO
        movwf FSR0L                    ;inicializamos puntero de tabla
       
BUCLE_INICIACION
       
        clrf  INDF0                    ;limpiamos la variable
        incf  FSR0L,1                  ;incrementamos puntero de tabla
        decfsz CONTADOR,1
        goto  BUCLE_INICIACION
       
        return
   
;*************************************************************************   
;                   SUBRUTINA Inicialización Interrupciones
;*************************************************************************       
       
INICIALIZAR_INTERRUPCIONES     
           
        bsf   RCON,IPEN                 ;habilitamos prioridades de interrupción
        bsf   INTCON,GIEH               ;habilitamos interrupción de alta prioridad
        bsf   INTCON,GIEL               ;habilitamos interrupción de baja prioridad
        bcf   IPR1,RC1IP                ;baja prioridad para interrupcion de recepción
        bsf   IPR1,TMR1IP               ;alta prioridad para interrupción timrer_1
       
       
        return       
       
;*************************************************************************   
;                   SUBRUTINA Inicialización EUSART_1
;*************************************************************************         
       
INICIALIZAR_EUSART_1

        clrf  PORTC
        movlw b'10000000'
        movwf TRISC
        movlw .15                    ;9600 baudios
        movwf SPBRG1
        movlw .0                 
        movwf SPBRGH1

        bcf   TXSTA1,BRGH         
        bcf   BAUDCON1,BRG16
       
       
        bcf   TXSTA1,SYNC
        bsf   RCSTA1,SPEN
        bsf   RCSTA1,CREN
        bsf   PIE1,RC1IE                ;habilitamos interrupción de recepción EUSART_1
       
        return       
     
       
;*************************************************************************
;-------------------------------------------------------------------------     
;------------------ oooOOO PROGRAMA PRINCIPAL OOOooo ---------------------
;-------------------------------------------------------------------------
;*************************************************************************


INICIO 

;------------------ INICIALIZAMOS LOS PUERTOS

        call  INICIALIZAR_PUERTOS
             
;------------------ INICIALIZAMOS PRIORIDAD PARA LAS INTERRUPCIONES

        call  INICIALIZAR_INTERRUPCIONES

;------------------ INICIALIZAMOS REGISTROS TELEMETRIA
       
        call  INICIALIZAR_REGISTROS    ;limpiamos los registros de telemetría
       
;------------------ INICIALIZAMOS LA USART_2

        call  INICIALIZAR_EUSART_1
       
;------------------ BUCLE DE ESPERA

BUCLE_DE_ESPERA     

       nop
       nop
       nop
       goto   BUCLE_DE_ESPERA
             
       END


Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema comunicacion serie 18F
« Respuesta #21 en: 04 de Septiembre de 2006, 23:10:08 »

  Encontre un error bien gordo en mi programa. Resulta que al activar la interrupcion por recepcion del puerto serie antes de configurar la UART pues salta la interrupcion sin entrar en la configuracion de la UART.

Ahora el problema que tengo es que estoy viendo que solo coge el primer dato de recpcion y despues no salta mas el RC1IF porque no entran mas datos a pesar de tener en el archivo para leer mas datos.

El flag se debiera habilitar, lo que no se habilita es la interrupción porque no estas "volviendo" de la rutina de interrupción.

Fíjate en lo siguiente:
Código: ASM
  1. TELECOMANDO              
  2.         bcf   PIE1,RC1IE               ;deshabilitamos interrupción de recepción EUSART_1
  3.         movf  RCREG1,W
  4.         movwf CABECERA_PAQUETE
  5.         bcf   RCSTA1,CREN              ;limpiamos posibles errores
  6.         bsf   RCSTA1,CREN              ;deshabilitando y habilitando CREN
  7.        
  8. FIN_TELECOMANDO
  9.         btfss PIR1,RC1IF               ;testeamos si el buffer de RX lleno(flag RC1IF=1)
  10.         goto  FIN_TELECOMANDO          ;vacio = no hay dato (esperamos)
  11.         movf  RCREG1,W
  12.         movwf FIN_PAQUETE
  13.         bcf   RCSTA1,CREN              ;limpiamos posibles errores
  14.         bsf   RCSTA1,CREN              ;deshabilitando y habilitando CREN
  15.        
  16. ;------------------- SURUTINAS DEL PROGRAMA PRINCIPAL --------------------  
  17. ;*************************************************************************

Agrega al final de esa línea un retfie, eso hace que el código retorne a donde estaba antes de ocurrir la interrupción y rehabilita el GIE.



Además, no es buena idea usar rutinas de interrupción sin hacer lo que se llama "guardar el contexto" es decir, guardar los registros STATUS, WREG, FSR.  Ten cuidado con eso.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado rocky3200

  • PIC10
  • *
  • Mensajes: 28
Re: Problema comunicacion serie 18F
« Respuesta #22 en: 05 de Septiembre de 2006, 15:04:50 »


    Voy a aplicar los cambios que me has comentado, pero antes comentarte que lo he simulado y viendo los registros el RC1IF no se activa, como te comento no coge mas datos por eso supongo que no saltara.

  En cuanto a la rutina de interrupcion por recepcion no quiero salirme de ella por eso la deshabilito. Me salgo cuando termine de recibir los dos datos y transmitir la informacion que necesito.

Para que te puedas hacer una idea de mi intencion es hacer que el programa tengo dos interrupciones, la de alta y baja prioridad.

El programa se quedara a la espera de recibir un dato, es en ese momento cuando se ejecuta la subrrutina de interrupcion  que no volvera a activar hasta que termine toda la interrupcion.

Al activarse esa interrupcion, activo tambien la de alta prioridad que es la del timer para llevar una cuenta del tiempo. Este tiempo es para facilitarle al ordenador el instante en que se tomaron las muestaras que le envio y que las pueda representar. Es de alta prioridad para que pueda interrumpir a la de baja y poder llevar la cuenta del tiempo.

Ahora mismo mi mayor preocupacion es hacer que lea el segundo dato recibido, ya que solo coje el primero y en el registro RCREG1 se queda permanente ese primer dato a pesar de que lo guardo. No vuelve a entrar en RCREG1 ningun dato



Desconectado rocky3200

  • PIC10
  • *
  • Mensajes: 28
Re: Problema comunicacion serie 18F
« Respuesta #23 en: 05 de Septiembre de 2006, 15:06:40 »
En cuanto al retfile lo tengo puesto mas abajo para salir de la interrupcion de recepcion. Como te comentaba la subrrutina de esa interrupcion hace mas cosas que solo cojer dos datos.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema comunicacion serie 18F
« Respuesta #24 en: 05 de Septiembre de 2006, 15:16:19 »
rocky3200, sin entrar en detalles de cómo organizas tu softwarea, ya que no es motivo de este post, te cuento lo siguiente:

He simulado tu código y me funciona bien, por supuesto que le falta la parte de TIMESTAMP pero comentando esa línea he podido probar la parte de usart.

Se recibe el primer dato, el PIC va a 0x0018.  De ahí saltas a TELECOMANDO.

En TELECOMANDO, lee un dato, lo guarda, reseteas el módulo de usart y luego sigue a FIN_TELECOMANDO.

Ahí mismo recibe el segundo dato, lo guarda y luego el código continua hasta INICIALIZAR_PUERTOS porque "no hay nada" que le indique que haga lo contrario.  Entonces, inicializa todos los puertos y luego al ejecutar el "return", retorna de la interrupción (en definitiva una llamada de interrupción es como un call automático) y se queda en el bucle de espera.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema comunicacion serie 18F
« Respuesta #25 en: 05 de Septiembre de 2006, 15:18:23 »
En cuanto al retfile lo tengo puesto mas abajo para salir de la interrupcion de recepcion. Como te comentaba la subrrutina de esa interrupcion hace mas cosas que solo cojer dos datos.

El punto es que si solo subes una parte del código, no esperes que adivinemos que hace el resto del software!

Por favor, si pretendes que veamos el problema, no acotes el código a lo que tú crees que es el problema, tal vez sea otra cosa.

Por otra parte, no es buena idea eso de "apagar y encender" el módulo de usart todo el tiempo.  Hazlo solo si hay error, sino puedes llegar a perder un dato que esté "en trámite".

Saludos


- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado rocky3200

  • PIC10
  • *
  • Mensajes: 28
Re: Problema comunicacion serie 18F
« Respuesta #26 en: 05 de Septiembre de 2006, 16:06:07 »

   Este es el programa completo. Cuandolo simulo con MPLAB se me queda en bucle de recepcion del segundo dato porque el RC1IF nunca se pone a uno.

   Es raro, porque lo que tu me cuentas en tu simulacion a mi no me pasa.




;****************************   Tarjeta PIC    ***************************
;
;                         INTETRFACE PC - HARWARE
;
; Descripción: el programa principal espera a recibir un telecomando del PC.
;              La recepción proboca una interrupción de baja prioridad que
;              guarda los datos de los sensores, los interpreta y actua en
;              en cosnsecuencia.
;
;              Paralelamente se iran enviando los datos al PC para su
;              monitorización.
;
;           
; Tipo Reloj: HS
; Velocidad Reloj: 10MHz
; Reloj Instruccion: 2MHz = 0,5us
; Perro Guardian: deshabilitado
; Proteccion de codigo: OFF
;
;*************************************************************************


;DATOS

   LIST     P=18F8722              ;Tipo de procesador
   INCLUDE <P18F8722.INC>          ;Definicion del archivo donde estan
                                   ;definidos todos los registros del P18F8722
                                  
                                  
;------------------ VARIABLES

TXDATO                         equ 0x10 ;Variables VARIAS
RXDATO                         equ 0x11
CONTADOR                       equ 0x12
GUARDA                         equ 0x13


CABECERA_PAQUETE               equ 0x14 ;Variables TELECOMANDO
FIN_PAQUETE                    equ 0x15

TELEMETRIA_COMIENZO            equ 0x16 ;Variables TELEMETRIA
TEMP_PRIMARIA                  equ 0x17
TEMP_AMBIENTE                  equ 0x18
TIMESTAMP_H_MSB                equ 0x19
TIMESTAMP_L_MSB                equ 0x1A
TIMESTAMP_H_LSB                equ 0x1B
TIMESTAMP_L_LSB                equ 0x1C
TELEMETRIA_FIN                 equ 0x1D


;CODIGO

   ORG   0x00                     ;inicio en el vector de reset
   goto  INICIO                   ;va a la primera instrucción de programa
   
   ORG   0x08                     ;vector de interrupción de alta prioridad   
   goto  TIMESTAMP                ;subrrutina de atención a interrupción de alta prioridad
   
   ORG   0x18                     ;vector de interrupción de baja prioridad
   goto  TELECOMANDO              ;subrrutina de atención a interrupción de baja prioridad


;*************************************************************************
;-------------------------------------------------------------------------
;********** RUTINA DE ATENCION A INTERRUPCION DE ALTA PRIORIDAD **********
;-------------------------------------------------------------------------   
;*************************************************************************

      
TIMESTAMP   
         
        bcf   T1CON,TMR1ON             ;paramos TIMER_1
        bcf   PIR1,TMR1IF              ;limpiamos flag overflow
       
        movwf GUARDA                   ;guardamos el valor del registro W para no perderlo
                                     
        incf  TIMESTAMP_L_LSB          ;incrementamos TIMESTAMP (contador 32 bits a 10us)
        btfss STATUS,C                 ;desbordamiento TIMESTAMP_L_LSB
        goto  SEGUIR
        incf  TIMESTAMP_H_LSB       
        btfss STATUS,C                 ;desbordamiento TIMESTAMP_H_LSB
        goto  SEGUIR                         
        incf  TIMESTAMP_L_MSB
        btfss STATUS,C                 ;desbordamiento TIMESTAMP_L_MSB
        goto  SEGUIR
        incf  TIMESTAMP_H_MSB       
       
SEGUIR       
        movlw B'01101011'              ;comparamos el TIMESTAMP para saber
        cpfseq TIMESTAMP_H_MSB         ;si ha llegado a 5 HORAS
        goto SEGUIR2                   
        movlw B'01001001'                 
        cpfseq TIMESTAMP_L_MSB
        goto SEGUIR2 
        movlw B'11010010'                 
        cpfseq TIMESTAMP_H_LSB
        goto SEGUIR2
        movlw B'00000000'                 
        cpfseq TIMESTAMP_L_LSB
        goto SEGUIR2
        clrf TIMESTAMP_H_MSB
        clrf TIMESTAMP_L_MSB
        clrf TIMESTAMP_H_LSB
        clrf TIMESTAMP_L_LSB   
               
SEGUIR2
             
        movlw H'FF'                    ;precarga 5,8us + (4,2us en istrucciones)=10us
        movwf TMR1H
        movlw H'E3'
        movwf TMR1L
       
        bsf   T1CON,TMR1ON             ;habilitamos TIMER_1
       
        movf GUARDA,W                  ;recuperamos el valor inicial de W
       
        retfie       
       
       
;*************************************************************************       
;-------------------------------------------------------------------------
;********** RUTINA DE ATENCION A INTERRUPCION DE BAJA PRIORIDAD **********
;-------------------------------------------------------------------------
;*************************************************************************
       
       
TELECOMANDO             
       
 

        bcf   PIE1,RC1IE               ;deshabilitamos interrupción de recepción EUSART_1

        movf  RCREG1,W
        movwf CABECERA_PAQUETE
        bcf   RCSTA1,CREN              ;limpiamos posibles errores
        bsf   RCSTA1,CREN              ;deshabilitando y habilitando CREN
       
FIN_TELECOMANDO

       
        btfss PIR1,RC1IF               ;testeamos si el buffer de RX lleno(flag RC1IF=1)
        goto  FIN_TELECOMANDO          ;vacio = no hay dato (esperamos)
        movf  RCREG1,W
        movwf FIN_PAQUETE
        bcf   RCSTA1,CREN              ;limpiamos posibles errores
        bsf   RCSTA1,CREN              ;deshabilitando y habilitando CREN
       
                                       
;------------------ INTERPRETACION

INTERPRETAR_TELECOMANDO                ;interpretamos la cabecera de telecomando obtenida

TELECOMANDO_1                          ;Comienzo de Conexión

        movlw H'00'                 
        cpfseq CABECERA_PAQUETE        ;comparamos y si no es igual, pasamos al siguiente
        goto  SOLICITUD_TELEMETRIA     
        goto  COMIENZO_CONEXION       
           

TELECOMANDO_2                          ;Solicitud de Telemetría

        movlw H'11'                 
        cpfseq CABECERA_PAQUETE        ;comparamos y si no es igual saltamos siguiente telecomando
        goto  SOLICITUD_TELEMETRIA
        goto  FINAL_CONEXION
       
TELECOMANDO_3                          ;2º Final de Conexión
       
        movlw H'FF'                 
        cpfseq CABECERA_PAQUETE        ;comparamos y si no es igual ERROR
        goto  FINAL_CONEXION
        goto  SOLICITUD_TELEMETRIA     ;en caso de ERROR enviamos Telemetria
 
 
 ;------------------ EJECUCION DE TELECOMANDOS
                     
COMIENZO_CONEXION                      ; 1º
                       
        call  TEMPO                    ;primera cuenta de 10 us
        call  TOMAR_DATOS              ;recogemos datos de los sensores
        call  TELEMETRIA               ;enviamos datos de los sensores
        goto  FIN_INTERRUPCION_BAJA_PRIORIDAD
             
;------------------

SOLICITUD_TELEMETRIA                   ; 2º
     
        call  TOMAR_DATOS
        call  TELEMETRIA
        goto  FIN_INTERRUPCION_BAJA_PRIORIDAD

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

FINAL_CONEXION                         ; 3º
     
        reset                          ;reset por software, se inicializará de nuevo
     
FIN_INTERRUPCION_BAJA_PRIORIDAD

        bsf   PIE1,RC1IE               ;habilitamos interrupción de recepción EUSART_1
        bcf   TXSTA1,TXEN              ;deshabilitamos transmisión
        bsf   RCSTA1,CREN              ;habilitamos recepción
       
        retfie                         ;salimos al programa principal   
       
       
;*************************************************************************   
;                    SUBRUTINA Tomar Datos sensores / Alarma
;*************************************************************************

TOMAR_DATOS     
 
        movf  PORTH,W                  ;cogemos el dato del puerto H
        movwf TEMP_PRIMARIA            ;escribimos dato variable
        movf  PORTJ,W                  ;cogemos dato del puerto J
        movwf TEMP_AMBIENTE            ;escribimos dato variable
       
PRIMARIA_BAJA                          ;interpretacion de la temperatura PEIMARIA (0-90ºC)   
       
        movlw  D'0'     
        cpfslt TEMP_PRIMARIA           ;comparamos si es menor a 0ºC
   goto   PRIMARIA_ALTA           ;si es mayor comaparamos con mayor
        goto   ALARMA_PRIMARIA_BAJA    ;si es menor ALARMA_BAJA
       
PRIMARIA_ALTA
       
        movlw  D'90'
        cpfsgt TEMP_PRIMARIA           ;cpmparamos si es mayor a 90ºC
        goto   AMBIENTE_BAJA           ;si es menor pasamos a temperatura ambiente 
        goto   ALARMA_PRIMARIA_ALTA    ;si es mayor ALARMA_ALTA
       
AMBIENTE_BAJA                          ;interpretacion de las temperaturas para ALARMA_AMBIENTE
         
        movlw  D'0'     
        cpfslt TEMP_AMBIENTE           ;comparamos si es menor a 0ºC
   goto   AMBIENTE_ALTA           ;si es mayor comparamos con mayor
        goto   ALARMA_PRIMARIA_BAJA    ;si es menor ALARMA_BAJA
       
AMBIENTE_ALTA
       
        movlw  D'60'
        cpfsgt TEMP_AMBIENTE           ;comparamos si es mayor a 90ºC
        goto   SEGUIR_ALARMA           ;si es menor salimos de las comparaciones   
        goto   ALARMA_AMBIENTE_ALTA    ;si es mayor ALARMA_ALTA   
       
SEGUIR_ALARMA
       
        return     
             
ALARMA_PRIMARIA_BAJA

        movlw  B'00000001'   
        movwf  PORTD                  ;encendemos led RD 0
        goto AMBIENTE_BAJA

ALARMA_PRIMARIA_ALTA

        movlw  B'00000010'
        movwf  PORTD                  ;encendemos led RD 1
        goto   AMBIENTE_BAJA

ALARMA_AMBIENTE_BAJA

        movlw  B'00000100'
        movwf  PORTD                  ;encendemos led RD 2
        goto   SEGUIR_ALARMA

ALARMA_AMBIENTE_ALTA

        movlw  B'00001000'
        movwf  PORTD                  ;encendemos led RD 3
        goto   SEGUIR_ALARMA
       
       
;*************************************************************************   
;                     SUBRUTINA Enviar Telemetría
;*************************************************************************

TELEMETRIA

        ;recorrer una tabla en RAM para enviarla
       
        movlw H'00'                    ;inicializamos cabecera y final de paquete
        movwf TELEMETRIA_COMIENZO
        movlw H'FF'
        movwf TELEMETRIA_FIN
       
        movlw D'7'       
        movwf CONTADOR                 ;inicializamos contador de variables de telemetría
       
        movlw TELEMETRIA_COMIENZO      ;inicializamos puntero de tabla
        movwf FSR0L
       
BUCLE_ADQUISICION
       
        call  LEER_TABLA
        decfsz CONTADOR,1
        goto  BUCLE_ADQUISICION
       
        return

;*************************************************************************   
;                   SUBRUTINA Leer Tabla Telemetría y enviarlo
;*************************************************************************

LEER_TABLA

        movf  INDF0,W                  ;leemos dato de tabla
        movwf TXDATO
     
;enviamos dato por puerto serie
       
        bsf   RCSTA1,SPEN               ;habilitamos comunicacion serie
        bsf   TXSTA1,TXEN              ;habilitamos transmisión
        bcf   RCSTA1,CREN              ;deshabilitamos recepción
       
        movf  TXDATO,W                 ;en el momento en que se pone el dato en TXREG1
        movwf TXREG1                   ;este es enviado

BUCLE

        btfss TXSTA1,TRMT              ;esperamos registro TSR vacio (flag TRMT=1) 
        goto  BUCLE                    ;no vacio, esperamos
        bcf   PIR1,TX1IF
        incf  FSR0L,1                  ;incrementamos puntero de tabla
       
        return
     
;*************************************************************************   
;                  SUBRUTINA Primera Cuenta 10us (TIMER_1)
;*************************************************************************
 
TEMPO

        movlw B'10001000'              ;timer 16 bits y oscilador habilitado
        movwf T1CON               
       
        bsf   PIE1,TMR1IE              ;habilitamos interrupción TIMER_1 (overflow)
        bcf   PIR1,TMR1IF              ;limpiamos flag de interrupción TIMER_1 (flag de overflow)
       
        movlw H'FF'                    ;precarga de 16 bits (2 bytes)
        movwf TMR1H                    ;precarga byte alto
        movlw H'DB'                    ;precarga byte bajo
        movwf TMR1L                    ;precarga 7,4us + (2,6us en istrucciones)=10us
       
        bsf   T1CON,TMR1ON             ;habilitamos TIMER_1
       
        return
                               
                   
;------------------- SURUTINAS DEL PROGRAMA PRINCIPAL -------------------- 
;*************************************************************************


;*************************************************************************   
;                   SUBRUTINA Inicialización Puertos
;*************************************************************************
 
INICIALIZAR_PUERTOS

        clrf  PORTA                    ;limpiamos puerto A
        movlw B'00000000'              ;Puerto A de SALIDA
        movwf TRISA
       
        clrf  PORTB                    ;limpiamos puerto B
        movlw B'00000000'              ;Puerto B de SALIDA
        movwf TRISB
       
        clrf  PORTC                    ;limpiamos puerto C
        movlw B'10000000'              ;Puerto C de SALIDA (configurar TX1=1 y RX1=0)
        movwf TRISC
       
        clrf  PORTD                    ;limpiamos puerto D
        movlw B'00000000'              ;Puerto D de SALIDA (prueba led´s)
        movwf TRISD
       
        clrf  PORTE                    ;limpiamos puerto E
        movlw B'00000000'              ;Puerto E de SALIDA
        movwf TRISE
               
        clrf  PORTF                    ;limpiamos puerto F
        movlw B'00000000'              ;puerto F de SALIDA
        movwf TRISF
       
        clrf  PORTG                    ;limpiamos puerto G
        movlw B'11100100'              ;RG0,RG1,RG3 y RG4 como SALIDAS y RG2 como ENTRADA
        movwf TRISG
         
        clrf  PORTH                    ;limpiamos puerto H
        movlw B'11111111'              ;Puerto H de ENTRADA (sensor temperatura primaria)
        movwf TRISH
       
        clrf  PORTJ                    ;limpiamos puerto J
        movlw B'11111111'              ;Puerto J de ENTRADA (sensor temperatura ambiente)
        movwf TRISJ
       
        return

;*************************************************************************   
;                   SUBRUTINA Inicialización Registros
;*************************************************************************

INICIALIZAR_REGISTROS

        movlw D'5'     
        movwf CONTADOR                 ;inicializamos contador de variables de telemetría
       
        movlw TELEMETRIA_COMIENZO
        movwf FSR0L                    ;inicializamos puntero de tabla
       
BUCLE_INICIACION
       
        clrf  INDF0                    ;limpiamos la variable
        incf  FSR0L,1                  ;incrementamos puntero de tabla
        decfsz CONTADOR,1
        goto  BUCLE_INICIACION
       
        return
   
;*************************************************************************   
;                   SUBRUTINA Inicialización Interrupciones
;*************************************************************************       
       
INICIALIZAR_INTERRUPCIONES     
           
        bsf   RCON,IPEN                 ;habilitamos prioridades de interrupción
        bsf   INTCON,GIEH               ;habilitamos interrupción de alta prioridad
        bsf   INTCON,GIEL               ;habilitamos interrupción de baja prioridad
        bcf   IPR1,RC1IP                ;baja prioridad para interrupcion de recepción
        bsf   IPR1,TMR1IP               ;alta prioridad para interrupción timrer_1
       
       
        return       
       
;*************************************************************************   
;                   SUBRUTINA Inicialización EUSART_1
;*************************************************************************         
       
INICIALIZAR_EUSART_1

        clrf  PORTC
        movlw b'10000000'
        movwf TRISC
        movlw .64                    ;9600 baudios
        movwf SPBRG1
        movlw .0                 
        movwf SPBRGH1

        bsf   TXSTA1,BRGH         
        bcf   BAUDCON1,BRG16
       
       
        bcf   TXSTA1,SYNC
        bsf   RCSTA1,SPEN
        bsf   RCSTA1,CREN
        bsf   PIE1,RC1IE                ;habilitamos interrupción de recepción EUSART_1
       
        return       
     
       
;*************************************************************************
;-------------------------------------------------------------------------     
;------------------ oooOOO PROGRAMA PRINCIPAL OOOooo ---------------------
;-------------------------------------------------------------------------
;*************************************************************************


INICIO 

;------------------ INICIALIZAMOS LOS PUERTOS

        call  INICIALIZAR_PUERTOS
             
;------------------ INICIALIZAMOS PRIORIDAD PARA LAS INTERRUPCIONES

        call  INICIALIZAR_INTERRUPCIONES

;------------------ INICIALIZAMOS REGISTROS TELEMETRIA
       
        call  INICIALIZAR_REGISTROS    ;limpiamos los registros de telemetría
       
;------------------ INICIALIZAMOS LA USART_2

        call  INICIALIZAR_EUSART_1
       
;------------------ BUCLE DE ESPERA

BUCLE_DE_ESPERA     

       nop
       nop
       nop
       goto   BUCLE_DE_ESPERA
             
       END




Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema comunicacion serie 18F
« Respuesta #27 en: 05 de Septiembre de 2006, 17:12:37 »
A mí me sigue funcionando bien tu código.

Es muy probable que estés inyectando mal los estímulos en el simulador.

Te he subido un proyecto armado, el cual funcionará de primer intento si lo descomprimes en c:\todopic

Además, un pequeño comentario.  No hace falta que deshabiliten la interrupción RCIE , la interrupción no volverá a ocurrir porque el GIEL está desactivado cuando entra en el vector de interrupción.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado rocky3200

  • PIC10
  • *
  • Mensajes: 28
Re: Problema comunicacion serie 18F
« Respuesta #28 en: 05 de Septiembre de 2006, 17:15:29 »
Por si no te lo he dicho todavia, muchas gracias por tu ayuda

Desconectado rocky3200

  • PIC10
  • *
  • Mensajes: 28
Re: Problema comunicacion serie 18F
« Respuesta #29 en: 05 de Septiembre de 2006, 17:22:16 »


   Lo he probado y funciona si le doy a run, pero si le doy a simular paso a paso se queda en el bulce que te comentaba anteriormente.
   Lo simulo paso a paso pare ver como cambian los falgs y los bits de los registros. De la otra forma no veo nada

   Eso tiene explicacion??