TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: kafefefe en 01 de Septiembre de 2006, 08:20:38

Título: Problema comunicacion serie 18F
Publicado por: kafefefe en 01 de Septiembre de 2006, 08:20:38
Muy buenas

He realizado el siguiente programita para comprobar el funcionamiento de la comunicacion serie del pic 18F8722.

Lo he complilado sin problemas pero la simulacion no funciona, no consigo que el bit (flag de recepcion) RC1IF del registro PIR1 se active. Tambien he programado el pic y he intentado que el dato enviado por el pc al pic lo devuelva pero nada.

He seguido los pasos de la data sheet pero no consigo hacerlo funcionar. ¿Que puede faltar?


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

DATO_RECEPCION                         equ 0x10 ;Variables VARIAS



;CODIGO

   ORG   0x00                     ;inicio en el vector de reset
   goto  INICIO                   ;va a la primera instrucción de programa

INICIO
     
;recepcion dato
       
        clrf  PORTC
        movlw b'10111111'
        movwf TRISC
        movlw .15                    ;9600 baudios
        movwf SPBRG1
        movlw .0                 
        movwf SPBRGH1

        bcf   TXSTA1,BRGH         
        bcf   BAUDCON1,BRG16
       
       
        bcf   TXSTA1,SYNC   ;comunicacion asincrona
        movwf TXSTA1
        bsf   RCSTA1,SPEN   
       
        bsf   RCSTA1,CREN  ;habilitamos recepcion
       
       
ESPERAR_RECEPCION
       
       
        btfss PIR1,RC1IF
        goto  ESPERAR_RECEPCION         ;vacio = no hay dato (esperamos)
        movf  RCREG1,W
        movwf DATO_RECEPCION
        bcf   RCSTA1,CREN              ;limpiamos posibles errores
        bsf   RCSTA1,CREN              ;deshabilitando y habilitando CREN
       
       
       
       END

Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 01 de Septiembre de 2006, 08:45:59
1) ¿Qué clock estas usando? ¿Usas el PLL?  No lo veo en tu código pero no conozco ese pic en lo puntual y tal vez no tenga seteo de PLL por software sino que se haga por los FUSES.

2) ¿A qué te refieres con que no puedes simular que el flag de recepción se active? ¿Cómo estas queriendo simular esto?

Saludos
Título: Re: Problema comunicacion serie 18F
Publicado por: kafefefe en 01 de Septiembre de 2006, 09:13:50

El clock del micro es de 10 MHz (HS), no uso el pll

Lo intento simular poniendo en el registro de recepcion RCREG1 un dato y ver si se activa el flag de recepcion. Pero cuando lo hago el RC1IF nunca se activa

¿Hay alguna forma mejor de activar el flag de recepcion?

Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 01 de Septiembre de 2006, 09:16:14

El clock del micro es de 10 MHz (HS), no uso el pll

Lo intento simular poniendo en el registro de recepcion RCREG1 un dato y ver si se activa el flag de recepcion. Pero cuando lo hago el RC1IF nunca se activa

¿Hay alguna forma mejor de activar el flag de recepcion?

¿Estamos hablando que estás usando el MPLAB no?  ¿Qué versión estás usando?
Título: Re: Problema comunicacion serie 18F
Publicado por: kafefefe en 01 de Septiembre de 2006, 09:32:53
Uso MPLAB IDE v7.40

y MPLAB SIN
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 01 de Septiembre de 2006, 09:52:17
Uso MPLAB IDE v7.40

y MPLAB SIN

Bueno, en esa versión de MPLAB no puedes 'borrar' los bits de los módulos manualmente.

Le debes generar 'estímulos' de usart.

1) Haz un archivo de texto cualquiera con el contenido de caracteres que le quieras ingresar por la usart.

2) Ve a Debugger, SCL Generator, New WorkBook.

3) Selecciona la pestaña Register Injection.  Fíjate la imagen que adjunto. 

4) En browse for filename adjunta el archivo de texto

5) Clickea en Generate SCL from Workbook

6) Ve a Debugger, Stimulus Controller, New Scenario

7) Selecciona el archivo SCL que generaste en el punto 5.


De esta forma, a medida que pase el tiempo, se irán generando caracteres en el RCREG, los cuales irás leyendo con tu software.  Al leer el caracter del RCREG el bit RCIF se borrará (es así como funciona en el hardware realmente).  En este punto el simulador actualmente refleja con mucho mayor detalle lo que ocurre en la realidad.


Te paso un texto de cómo podría ser el archivo para la usart.

0x01
0x04
0x08
0xA1
0xF3



Saludos
Título: Re: Problema comunicacion serie 18F
Publicado por: kafefefe en 01 de Septiembre de 2006, 13:53:15


Gracias por tus comentarios pero el ultimo paso no lo entido muy bien, porque selecciono el archivo y cojo el registro RCREG1 de esa misma pantalla pero no se que hacer a continuacion.

He intentado simularlo y nada

Ademas he metido el programa en el pic junto con algunas instrucciones mas para comprobar que con el hyperterminal de windows me devuelve el dato introducido por teclado y no devuelve nada. Asi que creo que el problema esta en codigo y por mas vueltas que le doy no consigo saber que es.

¿Podria influir alguna de las palabras de configuracion? yo solo selecciono el tipo de reloj HS y lo demas lo deshabilito todo.

Tiempo atras programe un 18F8720 y me funciono (ese modelo tenia una USART) y este tiene una EUSART.

No se que puede estar pasando

un saludo
Título: Re: Problema comunicacion serie 18F
Publicado por: kafefefe en 01 de Septiembre de 2006, 14:39:47
LIST     P=18F8722                      ;Tipo de procesador
   INCLUDE <P18F8722.INC>          ;Definicion del archivo donde estan
                                                   ;definidos todos los registros del P18F8722
                                   
                                   
;------------------ VARIABLES

DATO_RECEPCION                         equ 0x10 ;Variables VARIAS



;CODIGO

   ORG   0x00                     ;inicio en el vector de reset
   goto  INICIO                   ;va a la primera instrucción de programa

INICIO
     
;recepcion dato
       
        clrf  PORTC
        movlw b'10111111'
        movwf TRISC
        movlw .15                    ;9600 baudios
        movwf SPBRG1
        movlw .0                 
        movwf SPBRGH1

        bcf   TXSTA1,BRGH         
        bcf   BAUDCON1,BRG16
       
       
        bcf   TXSTA1,SYNC   ;comunicacion asincrona
 
        bsf   RCSTA1,SPEN   
       
        bsf   RCSTA1,CREN  ;habilitamos recepcion
       
       
ESPERAR_RECEPCION
       
       
        btfss PIR1,RC1IF
        goto  ESPERAR_RECEPCION         ;vacio = no hay dato (esperamos)
        movf  RCREG1,W
        movwf DATO_RECEPCION
        bcf   RCSTA1,CREN              ;limpiamos posibles errores
        bsf   RCSTA1,CREN              ;deshabilitando y habilitando CREN
       
       
       
       END
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 01 de Septiembre de 2006, 18:03:32
Te propongo revisar tu código, y armarte un pequeño que subiré para recibir y responder por usart en un 18F.

Saludos
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 01 de Septiembre de 2006, 21:40:29
Te propongo revisar tu código, y armarte un pequeño que subiré para recibir y responder por usart en un 18F.

Saludos

Lo prometido es deuda así que te he subido el proyecto aquí

Ejemplo de ECO USART para PIC18F452 (http://www.todopic.com.ar/foros/index.php?topic=13698.msg80327#msg80327)

En tu código así a simple vista, veo que has configurado mal tu TRISC<6> debiera estar en uno.  De todas formas, lee el ejempo que subí , creo que podrás sacar algunas cosas de él.

Saludos
Título: Re: Problema comunicacion serie 18F
Publicado por: kafefefe en 01 de Septiembre de 2006, 21:51:44
Muchas gracias por tu ayuda.

Ya he coseguido simular el envio y transmision  por la USART gracias a los de añadir archivos de donde leer y escribir.

Ahora lo he programado y estoy intentando visualizar por el hyperterminal el envio y recepcion de datos pero no consigo visualizar nada.

He configurado el hyperterminal de windos de la siguinte manera:

9600 baudios
8bists de datos
1de stop
sin paridad
control == he probado con los tres tipos

el cable que utilizo es un null moden (solo tres hilos: masa y Tx y RX cruzados)

Podrias sugerirme algo


un saludo
Título: Re: Problema comunicacion serie 18F
Publicado por: kafefefe en 01 de Septiembre de 2006, 21:54:57
El trisc<6> esta a cero porque es el pin de TX y para configurarlo como salida debo ponerlo a "0"
Título: Re: Problema comunicacion serie 18F
Publicado por: kafefefe en 01 de Septiembre de 2006, 22:22:21
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.



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

DATO                         equ 0x13


;CODIGO

   ORG   0x00                     ;inicio en el vector de reset
   goto  INICIO                   ;va a la primera instrucción de programa

INICIO
     
;recepcion dato
       
        clrf  PORTC
        movlw b'10111111'
        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   TXSTA1,TXEN              ;habilitamos trasmision
        bcf   RCSTA1,CREN              ;deshabilitamos recepción

        movlw .0
       
        movwf DATO
ENVIAR
 
                         
                                     
        movf  DATO,W           
       
        movwf TXREG1                 ;cargamos dato y enviamos
       
ESPERAR_TRANSMISION
       

        btfss TXSTA1,TRMT              ;esperamos registro TSR vacio (flag TRMT=1)
        goto  ESPERAR_TRANSMISION                   ;no vacio, esperamos
        bcf   PIR1,TX1IF
        incf DATO
     
        goto ENVIAR
       
                 
       END
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 01 de Septiembre de 2006, 23:58:44
El trisc<6> esta a cero porque es el pin de TX y para configurarlo como salida debo ponerlo a "0"

Lee el datasheet, sección usart, por favor para que se te aclare este punto.

En el hyperterminal ponelo como sin control de flujo.

¿Has podido ver mi ejemplo?
Título: Re: Problema comunicacion serie 18F
Publicado por: kafefefe en 02 de Septiembre de 2006, 06:45:55

  lo he revisado y esta correcto
Título: Re: Problema comunicacion serie 18F
Publicado por: kafefefe 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.
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix 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:
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix 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
Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 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

????
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix 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.

Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 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

Título: Re: Problema comunicacion serie 18F
Publicado por: maunix 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
Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 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


Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 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.
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix 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
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix 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


Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 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



Título: Re: Problema comunicacion serie 18F
Publicado por: maunix 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
Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 05 de Septiembre de 2006, 17:15:29
Por si no te lo he dicho todavia, muchas gracias por tu ayuda
Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 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??
Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 05 de Septiembre de 2006, 17:28:50

  me he equivocado, no me funciona porque en el archivo del debuger .txt para ver lo que envia no aparece nada. A pesar de que pasa de la segunda recepcion a la salida no da nada.

  Ademas con el programita que me enviaste para simular a usart, tampoco me devuelve nada

  La verdad es que esto es un poco frustante.
 
  La ultima vez trabaje con un 18F7820 y se lo tragaba todo y funcionaba a la perfeccion, pero este pic (18F8722) es horrible
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 05 de Septiembre de 2006, 17:35:40

  me he equivocado, no me funciona porque en el archivo del debuger .txt para ver lo que envia no aparece nada. A pesar de que pasa de la segunda recepcion a la salida no da nada.

  Ademas con el programita que me enviaste para simular a usart, tampoco me devuelve nada

  La verdad es que esto es un poco frustante.
 
  La ultima vez trabaje con un 18F7820 y se lo tragaba todo y funcionaba a la perfeccion, pero este pic (18F8722) es horrible

¿Qué MPLAB usas?

Yo uso el 7.41 pero el proyecto que subí debiera funcionar bien con 7.4 también.

¿Solo has usado el programita o has usado todo el proyecto? Debes descomprimir el proyecto en c:\todopic\ y de ahí ejecutarlo.

¿Tampoco te recibe nada?

Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 05 de Septiembre de 2006, 18:00:59

Estoy usando la version de mplab 7.41

he probado todo el proyecto y programas que he realizado pequeñitos para implementar las funciones de recibir y transmitir.

Por ejemplo el de trasmitir un dato solo me funciona con el mplab y ejecutandolo con el run, paso a paso no funciona.

Te lo adjunto para que lo veas, porque con la aplicacion para simulacion de la usart no me funciona. Lo que realiza es que a partir de dato 0 lo va incrementado indefinidamente y lo envia. Con este programa la fichero .txt del debuguer se llena con los caracteres enviados.



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

DATO                         equ 0x13


;CODIGO

   ORG   0x00                     ;inicio en el vector de reset
   goto  INICIO                   ;va a la primera instrucción de programa

INICIO
     
;recepcion dato
       
        clrf  PORTC
        movlw b'10111111'
        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   TXSTA1,TXEN               ;habilitamos trasmision
        bcf   RCSTA1,CREN              ;deshabilitamos recepción

        movlw .0
       
        movwf DATO

ENVIAR
 
                         
                                     
        movf  DATO,W           
       
        movwf TXREG1                 ;cargamos dato y enviamos
       
ESPERAR_TRANSMISION
       
       
        btfss TXSTA1,TRMT                                   ;esperamos registro TSR vacio (flag TRMT=1)
        goto  ESPERAR_TRANSMISION                   ;no vacio, esperamos
        bcf   PIR1,TX1IF
        incf DATO
     
        goto ENVIAR
       
                 
       END
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 05 de Septiembre de 2006, 18:06:47
rocky3200 te sugiero que subas todo el proyecto así lo puedo ver, sino no puedo adivinar si estás haciendo algo mal en el proyecto , en el simulador o en el código.

Además cuando postees código, usa los marcos que para eso están

[code = asm ] 

...
...
...
 

[ / code ]


Saludos
Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 05 de Septiembre de 2006, 19:04:38
De acuerdo
no estoy familiarizado con estas cosas

Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 05 de Septiembre de 2006, 19:40:34
De acuerdo
no estoy familiarizado con estas cosas

rocky, no has subido el proyecto que es lo que te pedí.

El proyecto está compuesto por varios archivos, sobre todo el .mcp que no está incluido en lo que has subido.

PD: El punto es que si tienes problemas en la simulación y yo no los he tenido, es por eso que quiero ver si hay algo en el proyecto que esté mal configurado o que yo no haya podido reproducir la misma situación que tú estas experimentando.

Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 06 de Septiembre de 2006, 17:34:23


   Pues es que esos son todos los archivos que se me generan. Yo escribo el programa, lo compilo (no me da errores) y simulo.

   El archivo .mpc no se como generarlo
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 06 de Septiembre de 2006, 20:20:15


   Pues es que esos son todos los archivos que se me generan. Yo escribo el programa, lo compilo (no me da errores) y simulo.

   El archivo .mpc no se como generarlo

Vas al menu Project, New

Pones el nombre del proyecto, luego le agregas el .asm que quieras 'ensamblar'.

Agregas los archivos de estimulo o configuras tu proyecto o las propiedades que quierse que tenga para poderlo simular.

Luego juntas todos los archivos que se te generaron y los subes.

Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 07 de Septiembre de 2006, 19:28:24

  Espero haberlo hecho bien
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 07 de Septiembre de 2006, 21:32:50

  Espero haberlo hecho bien

Rocky, ahora si has hecho el proyecto pero no veo el archivo .scl, ¿cómo le generas estímulos de usart si no usas un archivo SCL?

¿Has seguido estos pasos? Como generar estímulos de USART (http://www.todopic.com.ar/foros/index.php?topic=13688.msg80234#msg80234)

Si no le generas estímulos, nunca se encenderá el flag de interrupción de usart.
Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 09 de Septiembre de 2006, 06:38:05

  Bueno ha vuelto el fin de semana y vuelvo a la carga con el programa. Perdona el retraso en contestarte pero es que no he podido dedicarle mucho tiempo.

  Yo creia que con activar la UART y adjuntar los archivos de texto de entrada y salida en debuger/ settings/ UART1 IO era suficiente para simularlo. De hecho con los programitas sencillos me escribia y leia de ellos. Parecia todo correcto.

  En estos momentos cuando quiero generar el archivo .scl me da un error en el ultimo de los pasos que tu me dijiste. Cuando en new scenario quiero adjuntar el archivo  .scl me da un error y no puedo adjuntarlo.

Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 09 de Septiembre de 2006, 06:50:59

  problema solucionado, no me lo cargaba porque no habia activado previamente la USART en settings del debuger.

  Ahora si te adjunto todo el programa

 

 
Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 09 de Septiembre de 2006, 07:36:39
se me olvido adjuntar alguna cosa
ahora si es el bueno
Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 09 de Septiembre de 2006, 07:42:41
Perdona con marearte con tanto archivo
pero este es el final de todos
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 09 de Septiembre de 2006, 12:17:00
Perdona con marearte con tanto archivo
pero este es el final de todos


Muy bien rocky3200 lo revisaré y te haré los comentarios.

No hace falta que te disculpes por no responder inmediatamente, de hecho yo no siempre respondo tampoco inmediatamente.

Uno tiene "vida" , y eso es muy entendible.  Así como a veces me ves dando vuelta por el foro y te responderé rápido, pudiera pasar varios días en que no lo haga por estar precisamente ocupado.

Un saludo
Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 09 de Septiembre de 2006, 17:53:52


  Yo por mas que lo simulo, el RC1IF no se activa.

  He reducido el programa a la minia exprecion de recibir dos datos y responder, pero solo coje el primer dato luego ya no carga mas datos.

Te adjunto el programita simplificado.

Podrias decirme como configuras tu los bits de configuracion. Yo lo activo el HS

Tambien estoy cargando el progrma en el pic para ver si funciona con el hyperterminal de windows pero nada

Estoy desesperado ya

Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 09 de Septiembre de 2006, 17:56:17
me he equivocado de archivo
el bueno del reducido es este otro
Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 10 de Septiembre de 2006, 08:48:17


  Tal vez esto pueda ser una pista para saber lo que falla.

  Cuando simulo en el momento que activo la interrupcion por recepcion comienza el a funcionar el archivo .scl y carga el primer dato pero una vez que recojo ese primer dato de RCREG1 no carga el siguiente y el mensaje que me aparece en la ventana OUTPUT del MPLAB es:

"UART-W0002: Read attempted from an Empty RCREG SFR, invalid data"

No vuelve a cargar ningun dato mas y por eso nunca salta el RC1IF


La cuestion es que no se porque pasa eso. Ademas ese error debe ser el que hace que funcione fisicamente tampoco, asi que llego a la conclusion de que el programa esta mal. Debo estar pasando algo por alto en la USART que hace que no cargue mas datos.

Te adjunto los pasos de la datasheet y grafica de las señales a ver si puedes echarme un cable porque estoy bloqueado. Una vez este solucionado ese problema estoy seguro que tiene que funcionar porque la transmision independientemente si me funciona.


Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 10 de Septiembre de 2006, 09:30:09
Cuando lo simulo si lo hago pulsando RUN en vez de paso a paso si me funciona la simulacion y escribe los datos en archivo .txt de salida, pero cuando lo hago paso a paso me pasa lo que he descrito anteriormente.

Tambien decir que me el mesaje de error anteriormente citado cuando lo simulo en RUN.
Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 10 de Septiembre de 2006, 10:01:02
leyendo el documento de erratas de la datasheet he visto un par de comentarios sobre la USART. Los mas releventas que he visto son estos pero no sabria decir si afectan al funcionamiento de mi programa. Estoy invetigando
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 10 de Septiembre de 2006, 16:04:21
rocky3200 algo que es importante es que el estímulo de usart no es bit a bit sino que es por registro.  Es decir, se carga el registro completo, no hay bit de start, stop ni nada por el estilo que esté siendo "simulado".

Por eso se llama "register stimulus".

Tu problema es que has hecho un estímulo para el AD!!! Si te fijas tu archivo .SCL y tu Archivo SBS es eso lo que has hecho.

Me tomé la libertad de modificartelos para que lo puedas simular.

No habrá archivo de salida aún porque tu no estas enviando nada por la USART al menos en el último ejemplo que observé.

Te adjunto la imagen de lo que ví, y de cómo debiera quedar.

Además te adjunto los archivos sbs y scl generados correctamente para que los pegues directamente y los puedas simular en tu proyecto.



Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 11 de Septiembre de 2006, 15:42:16


 Es cierto ha sido un pequeño fallo. Pero ya lo tuve en cuenta cuando lo he simulado en posteriores ocasiones.

 A parte del reducido tambien colgue el prorama completo y ambos me sucede lo mismo.

 Yo insisto, si le doy a run puedo ver en el archivo salida el dato que transmito, con lo cual puedo pensar que funciona. Pero cuando lo hago paso a paso solo carga el primer dato y a partir de ahi no carga mas datos por eso no salta el RC1IF y no continua el programa. Ya no se donde puede estar mal porque si estuviera bien funcionaria en el entrenador, y hasta el momento no funciona fisicamente.

Simulando tanto en modo run como paso a paso me da el mensaje siguiente: UART-W0002: Read attempted from an Empty RCREG SFR, invalid data.


 
 
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 11 de Septiembre de 2006, 16:03:05
rocky3200 estoy convencido que tu problema es de simulación no de código.

Es decir, vayamos por partes, quiero que puedas "simular" una cosa por vez, si no puedes simular la recepción pues bien tampoco podrás hacer eso con la transmisión.

Según leo en tu archivo SCL tu apuntas al archivo de usart en C:\REDUCIDO\ENTRADA.txt , realmente lo tienes en ese subdirectorio? o está en otra parte??

Esa puede ser la causa , como te dije antes en mi post anterior, el proyecto anterior (éste no lo probé aún) sí me funciona con los cambios que te dije anteriormente.

El error que te da, no es que no llega a la instancia del RCREG1! Sí llega pero el tema es que no puede levantar el archivo que contiene el estímulo de USART1.

Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 11 de Septiembre de 2006, 18:53:34

   El archivo entrada no es problema porque es el mismo que he utilizado para todos. Los datos que contiene son los mismos, datos aleatorios partiendo del 01.... para ver como los va cargando sucesivamente. Este archivo esta comprobado y esta correcto.

   Por mas que lo miro no se que puede tener de especial ete pic (18F8720), porque he repaso mil veces los pasos que recomiendan para realizar la comunicacion asincrona y nada.

   Yo he programado e implementado fisicamente circuitos con pic de la serie 18F y me ha funcionado la comunicacion serie sin problema, no entiendo porque con este pic en concreto no funciona. Puedo enceder luces y demas pero la comunicacion no funciona.

   Algo se me escapa

   Gracias por tu ayuda de todas formas

Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 11 de Septiembre de 2006, 20:57:14

   El archivo entrada no es problema porque es el mismo que he utilizado para todos. Los datos que contiene son los mismos, datos aleatorios partiendo del 01.... para ver como los va cargando sucesivamente. Este archivo esta comprobado y esta correcto.

   Por mas que lo miro no se que puede tener de especial ete pic (18F8720), porque he repaso mil veces los pasos que recomiendan para realizar la comunicacion asincrona y nada.

   Yo he programado e implementado fisicamente circuitos con pic de la serie 18F y me ha funcionado la comunicacion serie sin problema, no entiendo porque con este pic en concreto no funciona. Puedo enceder luces y demas pero la comunicacion no funciona.

   Algo se me escapa

   Gracias por tu ayuda de todas formas



rocky3200, lo puntual es que yo pruebo tu programa con el estimulo del SCL bien cargado y me funciona!! Recibe siempre!!

El error que te da, como te dije en el post anterior es producto que "por alguna causa" no te está leyendo el archivo de entrada!.  Por eso queda vacío el RCREG1.

Tu pic no tiene nada de raro, es que estas simulando mal y por eso no puedes depurar bien tu software y por eso no te funciona.

Ahora bien, si piensas que es otra cosa sigue intentando, cualquier cosa vuelve a preguntar.

Saludos

Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 12 de Septiembre de 2006, 09:59:32

   si te parece, cuelgo el programa final y me envias el .hex generado por ti para grabarlo en el pic.

   De esta forma veo que pasa fisicamente
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 12 de Septiembre de 2006, 11:33:04

   si te parece, cuelgo el programa final y me envias el .hex generado por ti para grabarlo en el pic.

   De esta forma veo que pasa fisicamente

No tengo inconvenientes, pero en ese caso también deberemos confiar en:

1) Que el hardware está 100% ok.

2) Que tu programador funciona 100% ok.

No tengo problemas en ayudarte con esto, te habrás dado cuenta que así es, solo quiero mostrarte que si en el simulador no funciona en tu PIC tampoco lo hará.

El punto es que yo simulo, 10, 20 ciclos de usart.  Cosas que suceden en unos pocos milisegundos.  Tal vez tu software se cuelga luego de varios segundos por 'otra' causa.

Si el software me funciona en el simulador durante un tiempo y a tí no te funciona en el hardware, entonces podríamos si quieres, hacer un simple software de eco de usart, como que el que hice para el 18F452 pero para tu PIC.  Tu te cercioras de que el MAX232 o lo que uses esté bien armado y listo.  De esa forma nos aseguramos que el 'firmware' sencillo no sea la causa.

Pero como te dije antes, comencemos por corregir tu software y si no anda en el hardware, pasamos a lo del eco.  :mrgreen:

Espero tus comentarios  :)

Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 12 de Septiembre de 2006, 18:56:29


   El hardware esta 100% ok porque la tarjeta con el PIC ha sido comprada a microchip, es decir, es un entrenador de microchip que ya viene construido para hacer pruebas. Yo le he metido programas sencillos para encender leds y funcionan. Lo unico que no funciona es la comunicacion serie.

  El programador tambien es comprado. Se tratra del programador para el programa winpic800 que lo venden en la misma pagina. Este era el unico programador universal que podia programar el pic20F8722. Ademas como te comentaba he programado programas sencillos y han funcionado.

  Por lo tanto confio pleneamente en el hardware.

  Yo te dejo aqui el archivo .asm  para que puedas generar el .hex

  Si lo simulas en el archivo de .txt de salida no aparecera nada porque he quitado el dato de prueba que se enviava en el anterior y ahora coge el dato de los puertos que al limpiarlos siempre estan a cero y lo que transmiten no se ve.

Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 12 de Septiembre de 2006, 22:12:06


   El hardware esta 100% ok porque la tarjeta con el PIC ha sido comprada a microchip, es decir, es un entrenador de microchip que ya viene construido para hacer pruebas. Yo le he metido programas sencillos para encender leds y funcionan. Lo unico que no funciona es la comunicacion serie.

  El programador tambien es comprado. Se tratra del programador para el programa winpic800 que lo venden en la misma pagina. Este era el unico programador universal que podia programar el pic20F8722. Ademas como te comentaba he programado programas sencillos y han funcionado.

  Por lo tanto confio pleneamente en el hardware.

  Yo te dejo aqui el archivo .asm  para que puedas generar el .hex

  Si lo simulas en el archivo de .txt de salida no aparecera nada porque he quitado el dato de prueba que se enviava en el anterior y ahora coge el dato de los puertos que al limpiarlos siempre estan a cero y lo que transmiten no se ve.



rocky3200 , bueno, me alegro que el hardware y el programador sean confiables, realmente para hacer estas pruebas hay que "confiar en algo", sino nunca se puede tomar un punto de partida razonable.

Ahora revisaré el archivo .asm , ahora comentame qué pretendes que haga este software, ésto te lo comento por si veo errores o algo que me parece que no funcionará., pero antes debo saber qué pretendes con este firmware para lograr tu objetivo.
 
Por ej, ¿Recibir un byte y responderlo?

Si quieres se puede hacer tambien un "blink" de un led, cada vez que recibe y responde un byte.  Para ello me debieras indicar en qué pin está el led en cuestión.

Saludos
Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 13 de Septiembre de 2006, 15:59:52

 He estado jugando con el bit WUE del registro BAUDCON1 pero no consigo nada.

 Podria influir en algo ese bit? . Por defecto siempre esta a cero
Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 13 de Septiembre de 2006, 16:08:33

  Tal vez puede influir el reloj de 10Mhz en la usart. Leyendo la datasheet encontre esto que adjunto.

  Me parece difil porque 9600 baudios no es mucho y yo he llegado ha acer palicaciones con 20 Mhz y 9600 baudios en un 18F8720

  En cuanto pueda te explico lo que quiero que haga el programa.
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 13 de Septiembre de 2006, 16:39:06

  Tal vez puede influir el reloj de 10Mhz en la usart. Leyendo la datasheet encontre esto que adjunto.

  Me parece difil porque 9600 baudios no es mucho y yo he llegado ha acer palicaciones con 20 Mhz y 9600 baudios en un 18F8720

Según comprendí, tu problema no es de framing sino que tienes problemas con que el software 'se clava' o 'no continua recibiendo'.

Llegado el caso, si estas conectado a una pc, debieras poder seguir recibiendo/transmitiendo aunque leerias caracteres 'ilegiblles'.

Un error de framing no bloquea a la usart en modo recepcion, de hecho es un error que se elimina simplemente leyendo el buffer de usart.


  En cuanto pueda te explico lo que quiero que haga el programa.

Bueno es que si no me dices que pretendes hacer al menos con las pruebas de usart, ¿cómo saber si el programita de testing está bien?

Me quedaré esperando tu nuevo post :)

Saludos
Título: Re: Problema comunicacion serie 18F
Publicado por: rocky3200 en 13 de Septiembre de 2006, 16:45:54

  Bueno aqui te mando un poco lo que hace el programa.

  Si necesitas mas info dimelo y te paso el documento que estoy redactando al correo, aunque es bastante extenso y no quiero aburrirte.
Título: Re: Problema comunicacion serie 18F
Publicado por: maunix en 15 de Septiembre de 2006, 08:39:23

  Bueno aqui te mando un poco lo que hace el programa.

  Si necesitas mas info dimelo y te paso el documento que estoy redactando al correo, aunque es bastante extenso y no quiero aburrirte.

rocky3200 me he sentado a leer la información de tu informe, pero no es lo que necesito saber ahora para hacer las pruebas.  No quiero hacerte yo el código sino ayudarte con él en algunos puntos. 

He revisado la parte de usart de tu código y como te dije una y otra vez, a mí me simula bien SIEMPRE.

No se donde estén tus problemas, porque realmente hasta donde tenía entendido querías hacer un software de "eco de usart". 

He visto también en el código que me pasaste que siguen existiendo algunas cosas que te había comentado en otros posts, que no debian estar, lo cual me hace pensar o que no me estas leyendo o que me has subido un archivo viejo.

Te propongo lo siguiente a los fines de cerrar el tema o al menos , comenzar a solucionarlo.

1) Dime en qué pin tienes un LED para que lo usemos como señal indicadora de funcionamiento de usart.
2) Dime si tienes una usart completa con RS232 con posibilidades de ser conectad a una PC.
3) Dime si sabes como hacer por ejemplo para mandar datos con el hyperterminal u otro software similar como el SIOW al pic, para que luego este te responda con el famoso eco.
4) Si tienes un esquemático del hardware que estás usando, mucho mejor.


La idea de esta prueba es disipar las dudas de que tu usart funcione bien, que estén bien configurados los baud rates, etc.

Saludos