Autor Tema: Problema comunicando PIC16f877a con PC  (Leído 3899 veces)

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

Desconectado iguanapeluda

  • PIC10
  • *
  • Mensajes: 4
Problema comunicando PIC16f877a con PC
« en: 24 de Noviembre de 2008, 14:41:58 »
Hola a todos, bueno, he leido mucho en éste foro y me hubiera gustado opinar..pero como tampoco se responder a ninguna duda por ahora no he podido participar desgraciadamente.

La cosa es que estoy haciendo un PFC con un PIC 16f877a utlizandolo de tarjeta de adquision de datos de un motor, con su conversor para luego meterlo al LABVIEW...pero no hay manera, incluso meto los ejemplos que he visto por ahi y nada.

Me he comprado el EASYPIC5, lo estoy intentando hacer con Ensamblador comunicando a 9600Baud con 16f877a y reloj externo de 8MHZ y mi programa es éste...pero nose que pasa q no recibo nada, llevo mas de una semana metiendo horas y horas y no avanzo..y me gustaria una pequeña ayudita porque de verdad, me estoy muriendo y con ganas de tirar la toalla...

A ver que opinais...ademas es muy sencillo, adquirir una señal y mandar una de los 2 registros del ADRES



************************************************************************
;* Este programa realiza la conversión de una señal analógica conectada *
;* al canal AN0 y envía a través del serie los datos al ordenador
;**************************************************************************
;
Include    "p16f887.inc"
list      P=16f887

cont    EQU 0x20
dato   EQU   0x21

      org 0x0000
      CALL   initrans      ;Inicializamos el puerto serie
      BSF    STATUS,RP0       ;Banco 1
      CLRF   ADCON1          ;configura 8 canales analógicos,
      BSF      ADCON1,ADFM    ;justificación a la derecha
      BSF    TRISA,0       ;entrada el canal digital RA0
      BCF      STATUS,RP0      ;Accedemos al Banco0
      MOVLW    b'00000001'      ;AN0, reloj de conversión Fosc/2
      MOVWF    ADCON0          ;y enciende el convertidor
ciclo    CALL    pausa          ;30 µseg tiempo de adquisición
      BSF    ADCON0,GO_DONE    ;inicia conversión
espera    BTFSC    ADCON0,GO_DONE
      GOTO   espera          ;Espera a que termine la conversión
      BSF      STATUS,RP0      ;Banco 1
      MOVF   ADRESL,W       ;Carga en W el Byte alto  resultado
      MOVWF   dato         ;lo guarda en dato
      CALL   envia         ;Enviamos por el puerto serie
      GOTO    ciclo          ;Volvemos a convertir

;**************************************************************
; Subrutina de pausa de aprox. 30 µseg (con Fosc=20 MHZ)
;****************************************************************

pausa    MOVLW    0x29   ;Carga dato para 30 µseg.
      MOVWF    cont    ;inicializa contador con el dato
rep    DECFSZ    cont,1   ;Decrementa contador y escapa si cero
      GOTO    rep    ;si no es cero, repite
esc    RETURN          ;regresa de esta subrutina
         

;********************************************************************
; Subrutina para inicializar el puerto serie para el envío de datos
;*********************************************************************
initrans   BSF         STATUS,RP0      ;Banco 1
         BCF       TXSTA,BRGH      ;Pone Bit BRGH=0 (velocidad baja)
         MOVLW      b'00001100'      ;12 decimal para 9600 8Mhz vel baja
         MOVWF       SPBRG         ;Lo configura a 9600
         BCF         TXSTA,SYNC      ;Limpia Bit SYNC (Asincrono)
         BSF         TXSTA,TXEN      ;Ponemos a 1 el bit (Habilitamos)
         BCF         STATUS,RP0      ;Banco 0
         BSF         RCSTA,SPEN      ;Pone Bit a 1 (habilita serie)
         RETURN

;**********************************************************************
; Subrutina para enviar un dato por el puerto Serie
;***********************************************************************

envia      BSF         STATUS,RP0      ;Banco 1
esp         BTFSS      TXSTA,TRMT      ;Chequea el buffer de transmision
         GOTO       esp            ;si esta ocupado espera
         BCF         STATUS,RP0      ;Regresa al Banco 0
         MOVF      dato,W         ;Rescata el dato a enviar
         MOVWF      TXREG         ;lo envia
         RETURN

end
         

MUCHAS GRACIAS POR ENTRAR EN EL POST

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: Problema comunicando PIC16f877a con PC
« Respuesta #1 en: 24 de Noviembre de 2008, 15:22:38 »
Para empezar, luego de ORG 0 configura primero los puertos del pic, luego recien configura el USART y el conversor.

En tu rutina de configuración del USART te falta indicarle que vas a enviar a 8 bits sin paridad es decir:           bcf  TXSTA,TX9

Otro detalle importantisimo es que el registro "dato" está declarado en el banco 0 (EQU 0x21 en tu programa) y sin embargo mira tu programa:

     BSF      STATUS,RP0      ;Banco 1
      MOVF   ADRESL,W       ;Carga en W el Byte alto  resultado
      MOVWF   dato         ;lo guarda en dato
      CALL   envia         ;Enviamos por el puerto serie

cuando guardas lo estas haciendo en el Banco1, para ello deberias hacer esto:

     BSF      STATUS,RP0      ;Banco 1
      MOVF   ADRESL,W       ;Carga en W el Byte alto  resultado
     BCF      STATUS,RP0      ;Banco 0
      MOVWF   dato         ;lo guarda en dato
      CALL   envia         ;Enviamos por el puerto serie

Prueba estas correcciones y a ver que tal te va.

Javicho.

Desconectado iguanapeluda

  • PIC10
  • *
  • Mensajes: 4
Re: Problema comunicando PIC16f877a con PC
« Respuesta #2 en: 24 de Noviembre de 2008, 16:04:43 »
Muchas gracias Javicho...pero lo he modificado y sigue estando muerto completamente...

Aquí dejo como está ahora con las modificaciones que me has dicho, que por cierto no eran pocas...jo, me da verguenza hasta ponerlo de lo mal que lo hago!

;**************************************************************************
;* Este programa realiza la conversión de una señal analógica conectada *
;* al canal AN0 y envía a través del serie los datos al ordenador
;**************************************************************************
;
Include    "p16f887.inc"
list      P=16f887

cont    EQU 0x20
dato   EQU   0x21

      org 0x0000
      CLRF   STATUS         ;Banco 0
      CLRF   PORTA         ;inicializa puerto A
      CLRF   PORTB         ;Inicializa puerto B
      BSF      STATUS,RP0      ;Banco 1
      MOVLW   b'11111111'      ;todas patas como entrada
      MOVWF   TRISA         ;lo configuramos
      MOVLW   b'00000000'      ;todas como salida
      MOVWF   TRISB         ;Lo configuramos
      CALL   initrans      ;Inicializamos el puerto serie
      BSF    STATUS,RP0       ;Banco 1
      CLRF   ADCON1          ;configura 8 canales analógicos,
      BSF      ADCON1,ADFM    ;justificación a la derecha
      BSF    TRISA,0       ;entrada el canal digital RA0
      BCF      STATUS,RP0      ;Accedemos al Banco0
      MOVLW    b'00000001'      ;AN0, reloj de conversión Fosc/2
      MOVWF    ADCON0          ;y enciende el convertidor
ciclo    CALL    pausa          ;30 µseg tiempo de adquisición
      BSF    ADCON0,GO_DONE    ;inicia conversión
espera    BTFSC    ADCON0,GO_DONE
      GOTO   espera          ;Espera a que termine la conversión
      BSF      STATUS,RP0      ;Banco 1
      MOVF   ADRESL,W       ;Carga en W el Byte alto  resultado
      BCF     STATUS,RP0      ;Banco 0
      MOVWF   dato         ;lo guarda en dato
      CALL   envia         ;Enviamos por el puerto serie
      GOTO    ciclo          ;Volvemos a convertir

;**************************************************************
; Subrutina de pausa de aprox. 30 µseg (con Fosc=20 MHZ)
;****************************************************************

pausa    MOVLW    0x29   ;Carga dato para 30 µseg.
      MOVWF    cont    ;inicializa contador con el dato
rep    DECFSZ    cont,1   ;Decrementa contador y escapa si cero
      GOTO    rep    ;si no es cero, repite
esc    RETURN          ;regresa de esta subrutina
         

;********************************************************************
; Subrutina para inicializar el puerto serie para el envío de datos
;*********************************************************************
initrans   BSF         STATUS,RP0      ;Banco 1
         BCF       TXSTA,BRGH      ;Pone Bit BRGH=0 (velocidad baja)
         MOVLW      b'00001100'      ;12 decimal para 9600 8Mhz vel baja
         MOVWF       SPBRG         ;Lo configura a 9600
         BCF         TXSTA,SYNC      ;Limpia Bit SYNC (Asincrono)
         BSF         TXSTA,TXEN      ;Ponemos a 1 el bit (Habilitamos)
         BCF         TXSTA,TX9      ;Ponemos a 0, (8 bits tranms)
         BCF         STATUS,RP0      ;Banco 0
         BSF         RCSTA,SPEN      ;Pone Bit a 1 (habilita serie)
         RETURN

;**********************************************************************
; Subrutina para enviar un dato por el puerto Serie
;***********************************************************************

envia      BSF         STATUS,RP0      ;Banco 1
esp         BTFSS      TXSTA,TRMT      ;Chequea el buffer de transmision
         GOTO       esp            ;si esta ocupado espera
         BCF         STATUS,RP0      ;Regresa al Banco 0
         MOVF      dato,W         ;Rescata el dato a enviar
         MOVWF      TXREG         ;lo envia
         RETURN

end
         

Desconectado DOMINGO_V

  • PIC10
  • *
  • Mensajes: 14
Re: Problema comunicando PIC16f877a con PC
« Respuesta #3 en: 24 de Noviembre de 2008, 17:24:59 »
Interpreto que lo que te falla es la parte de comunicaciones. Te sugiero, por experiencia propia,  que antes de seguir dudando del programa y  si no ves nada raro en él, te asegures de que estas conectando la señal de TX y RX del RS-232 en el sentido correcto. Te lo digo porque yo también he perdido mucho tiempo con un problema similar y al final era una mala interpretación del sentido de las señales entre el conecotor que viene del PC y el MAX 232 y de este al pic . Asegurate de que es correcto antes de seguir buscando otros problemas porque es lo primero que se suele hacer mal y es muy facil equivocarse de sentido en alguno de los pasos.

Desconectado iguanapeluda

  • PIC10
  • *
  • Mensajes: 4
Re: Problema comunicando PIC16f877a con PC
« Respuesta #4 en: 24 de Noviembre de 2008, 17:33:08 »
Gracias por la respuesta, pero con esto no tengo lugar a dudas, ya que estoy uitilizando una protoboard (EASYPIC5), el cual ya tiene el conector y con un conversor Serie-USB para el PC, ademas en el conversor tengo  2 LEDS que me indican si hay actividad de un lado al otro o viceversa..

Gracias  y un saludo,

PD; Ahora estoy empezando de 0 con MIKRO_c a ver si con esto me resulta mas sencillo...

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: Problema comunicando PIC16f877a con PC
« Respuesta #5 en: 24 de Noviembre de 2008, 19:10:41 »
Hey iguanapeluda no tires la toalla con el asembler, nos estamos quedando poquitos en este lenguaje como para tener otra baja mas en nuestras filas.

Porque no pruebas solo la comunicación primero, has un programa que envie cada 1segundo por ejemplo datos, algo asi:

           clrf    dato
Bucle   call     envia
          incf      dato,f
           call     delay_1_segundo
           goto   Bucle

Una buena técnica es activar un led en un pin del pic que no estes usando para ver si el flujo del programa pasa o no por determinada linea de programa por ejemplo:

           clrf    dato
Bucle   call     envia
            bsf   PORTB,4    ;si este led no se prende hay problemas con la rutina envia
          incf      dato,f
           call     delay_1_segundo
           goto   Bucle

Lo mismo aplicalo en tu programa original por ejemplo despues de que se realizó la conversion A/D, tal vez nunca sale del bucle de espera de la conversión y le estas echando la culpa al USART.

Bueno ahi tienes varios tips para que te saques de dudas.

Javicho.

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: Problema comunicando PIC16f877a con PC
« Respuesta #6 en: 24 de Noviembre de 2008, 19:26:08 »
Olvidé decirte, veo que estas configurando asi:

Include    "p16f887.inc"
list      P=16f887

Pero dices que estas usando un PIC16F877A entonces deberia ser asi:

Include    "p16f877A.inc"
list      P=16f877A

y mas aun este pic a diferencia del PIC16F877 tiene un modulo comparador por tal razon debes desactivar este módulo de esta forma:

      org 0x0000
      CLRF   STATUS         ;Banco 0
      CLRF   PORTA         ;inicializa puerto A
      CLRF   PORTB         ;Inicializa puerto B
      BSF      STATUS,RP0      ;Banco 1
      movlw  0x07
      movwf  CMCON       ;COMPARADORES DESACTIVADOS
      MOVLW   b'11111111'      ;todas patas como entrada
      MOVWF   TRISA         ;lo configuramos
      MOVLW   b'00000000'      ;todas como salida
      MOVWF   TRISB         ;Lo configuramos

Veo que todo el puerto A lo has configurado como entrada, asegurate de usar pull-up si vas a conectar pulsadores de lo contrario estos pines no deben quedar al aire libre o si no los vas a usar todos mejor configura como salida los pines que no vas a usar.

Javicho.

Desconectado IOIO

  • PIC10
  • *
  • Mensajes: 46
Re: Problema comunicando PIC16f877a con PC
« Respuesta #7 en: 25 de Noviembre de 2008, 01:03:05 »
Una cosa más iguanapeluda, no veo que inicialices el puerto C (puerto donde se encuentran los pines TX=RC6 y RX=RC7).
Posiblemente por ello no obtienes ningún dato en la salida TX.
Debes agragar a lo que te indicó Javicho, luego de los otros TRIS:

         
         movlw        b'10xxxxxx'          ;Las x debes seleccionarlas como 1 o 0 según desees. Si no los usas mejor como salida, como te indicaron
         movwf        TRISC

saludos
Sergio
Desde Avellaneda, Buenos Aires. Argentina

Saludos,
Sergio

Desconectado iguanapeluda

  • PIC10
  • *
  • Mensajes: 4
Re: Problema comunicando PIC16f877a con PC
« Respuesta #8 en: 25 de Noviembre de 2008, 09:46:57 »
ufff, nose cómo agradeceros la ayuda que me habeis prestado ya que lo tengo funcionando ya y recibiendo en el ordenador...

Lo unico que me pasa ahora es que me salta error de "FRAMING ERROR" en el labview
-----------------------------------------------------------------------------------------
Error -1073807253 occurred at VISA Read in mio.vi

Possible reason(s):

VISA:  (Hex 0xBFFF006B) A framing error occurred during transfer.

--------------------------------------------------------------------------------------------

He ido a las ayudas de labview y he hecho lo que me ponen, que es meter un delay de 10 a 100ms despues del VISA configurator y luego un VISA Flush I/O Buffer  pero sigue dandome fallo...creo que lo tengo bien configurado de Baudios ya que con 8Mhz, y velocidad baja tengo que meterle 12 decimal...con un bit de parada, sin paridad y demas...

Pero weno, ahora éste problema lo pondre sino en el post de LABVIEW a ver que opinan.

Lo dicho, muchas gracias por todo, me habeis dado animo para continuar con ensamblador

PD; Estoy transmitiendo el bucle que me has dicho javicho para evitar problemas con el ADC