Autor Tema: Ayuda con la comunicacion serial de un 16F877  (Leído 4447 veces)

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

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Ayuda con la comunicacion serial de un 16F877
« en: 28 de Agosto de 2007, 01:45:26 »
     Amigo necesito un programa en asm para enviar datos a una PC, serialmente, pues es lo que mehe leido falta de un proyecto, he leido manuales, he encontrado programas en internet que usan el modulo USART del pic  no logro hacerlo funcionar.

     Uso el MPLAB Ver 5.7 y el el PIC SIMULATOR 5.02 un programa que probe es este.....y no me funciono, muy apesar que lo encontre en muchas paginas, esta hecho para 16F628 pero igual no me funciono es adaptable al 16F877..........que hago mal para que no funcine???, de ante mano gracias

;*******************************************************************
;   INTERFAZ SERIE RS232 - ECO Y DISPLAY EN LEDS
;    CONVERTIDOR SERIE RS232 - PARALELO 8 BITS
;*******************************************************************

        LIST P=16F628, R=DEC   ; Usar el PIC16F628 y sistema decimal

        #include "P16F628.INC"   ; Incluye datos de PIC16F628A

   __CONFIG   _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF

;*******************************************************************
;   CONFIGURACION
;*******************************************************************

; El PIC es configurado para usar todas las entradas y salidas
; posibles = 16. Por eso no se usa el oscilador con cristal externo,
; lo que deja libres las patas 15 y 16 para usar como bits de puerto.
; Se define el clock interno a 4 MHz. No se usa el master reset
; (pata 4), que queda convertida en el puerto A, bit 5 (entrada).

;*******************************************************************
;    VARIABLES
;*******************************************************************

contador   EQU   0x28   ; variable
dato_serie   EQU   0x29   ; dato serie desde la PC

;*******************************************************************

        ORG       0x000           ; El programa empieza en 0x000

;*******************************************************************
;    Inhibe comparadores
;*******************************************************************

   movlw    7
   movwf    CMCON      ; CMCON=7 inhibir los comparadores
 
;*******************************************************************
;    Inicializar Ports
;*******************************************************************
 
   movlw    b'00000000'     ; valor inicial portA
        movwf    PORTA      
        movlw    b'00000000'     ; valor inicial portB
        movwf    PORTB      

        bsf    STATUS,   RP0     ; Pág 1 RAM

        movlw    b'00000000'
        movwf    TRISA      ; salidas (para mostrar el dato en LEDS)
            ; de estas salidas, no usaremos
            ; PORTA 4, que tiene salida open drain, y
            ; PORTA 5, que sólo puede ser entrada

        movlw    b'11001011'   ; RB0 entrada
            ; RB1 (RX) = entrada
            ; RB2 (TX) = salida
            ; RB3 = entrada
            ; RB2 = salida del bit 4 del dato a LEDS
            ; RB5 = salida del bit 5 del dato a LEDS
            ; RB6 y RB7 = entradas
        movwf    TRISB

;*******************************************************************
;    BAUD RATE para la comunicación RS232
;    y otras definiciones para USART
;*******************************************************************
;    Baud Rate = 9600, Sin Paridad, 1 Bit parada

;
        movlw    0x19            ; 0x19=9600 bps (0x0C=19200 bps)
        movwf    SPBRG
        movlw    b'00100100'     ;
        movwf    TXSTA           ; habilita la transmisión Async

        bcf    STATUS,   RP0     ; RAM PAGE 0

        movlw    b'10010000'     ; habilita de recepción Async
        movwf    RCSTA

;*******************************************************************
;    TIEMPO DE ESTABILIZACION
;*******************************************************************

        clrf    contador
estab   decfsz    contador,F
        goto    estab

        movf    RCREG,   W
        movf    RCREG,   W
        movf    RCREG,   W       ; vacía el buffer de recepción

   call    Bienvenida      ; envía mensaje de bienvenida

;*******************************************************************
;    LAZO PRINCIPAL
;*******************************************************************

loop   
   clrw
   btfss    PIR1,   RCIF    ; (5) se fija si hay dato RS232
   goto    loop      ; no, no llegó
   call    recibeRS232   ; sí, hay
   movwf    dato_serie   ; guarda dato (para uso de cualquier rutina)
   call    enviaRS232   ; envía el eco a la PC
   call    muestra      ; muestra el caracter recibido en LEDS
   goto    loop

;***********************************************************************************
;    RECIBE CARACTER SERIE - RS232 - DESDE LA PC
;***********************************************************************************

recibeRS232   
        movf    RCREG,   W       ; guarda dato recibido en acumulador
        return

;***********************************************************************************
;    ENVIA CARACTER SERIE - RS232 - A LA PC Y ESPERA A QUE HAYA SALIDO
;***********************************************************************************

enviaRS232   
   movwf    TXREG           ; envío el dato en acunulador w
   bsf    STATUS,   RP0   ; Pág 1 RAM
Espere    btfss    TXSTA,   TRMT    ; transmision completa si es alto
          goto    Espere
          bcf    STATUS,   RP0     ; Pág 0 RAM
          return

;***********************************************************************************
;    MUESTRA DATO
;***********************************************************************************

muestra
   movf    dato_serie,w   ; recupera el dato guardado   
   movwf    PORTA      ; exhibe el dato en LEDS en PORTA
   btfss    dato_serie,4   ; pero, como el PORTA tiene el bit 4 que es
   bcf    PORTB,   4   ; open drain, nos conviene poner
   btfsc    dato_serie,4   ; el bit 4 del dato en otra salida;
   bsf    PORTB,   4   ; lo hacemos en el bit 4 del PORTB.
   btfss    dato_serie,5   ; y , como el PORTA tiene el bit 5 que es
   bcf    PORTB,   5   ; sólo usable como entrada, tenemos que poner
   btfsc    dato_serie,5   ; el bit 5 del dato en alguna salida;
   bsf    PORTB,   5   ; lo hacemos en el bit 5 del PORTB.
   return

;***********************************************************************************
;    MENSAJES
;***********************************************************************************

Bienvenida
            ; los primeros caracteres 0x00 son
            ; para estabilización del circuito
   movlw    0x00
   call   enviaRS232
   movlw    0x00
   call   enviaRS232
   movlw    0x00
   call   enviaRS232
   movlw    0x00
   call   enviaRS232
   movlw    0x00
   call   enviaRS232
   call   msgCR
   movlw    'H'
   call   enviaRS232
   movlw    'o'
   call   enviaRS232
   movlw    'l'
   call   enviaRS232
   movlw    'a'
   call   enviaRS232
   movlw    ' '
   call   enviaRS232
   movlw    'a'
   call   enviaRS232
   movlw    'm'
   call   enviaRS232
   movlw    'i'
   call   enviaRS232
   movlw    'g'
   call   enviaRS232
   movlw    'o'
   call   enviaRS232
msgCR
   movlw    0x0D
   call   enviaRS232
   movlw    0x0A
   goto   enviaRS232

        END
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Ayuda con la comunicacion serial de un 16F877
« Respuesta #1 en: 28 de Agosto de 2007, 17:00:15 »
Cuando tengas comunicaciones mayores a 2400 BPS, obligadamente deberas usar un oscilador externo, ya que el interno varia demasiado como para utilizarlo en comunicaciones seriales serias... 8) 8)
Coincido con JC40 en que no necesitas estabilizar nada para comunicarte, lo que estas intentando es corregir los defectos del reloj interno, que es un circuito R/C con los desvíos propios en cuanto a frecuencia de oscilacion, entonces eso es lo que desincroniza en algun momento tu comunicacion.

Ponle el bendito cristal externo y veras como se solucionan tus problemas!!
Ademas este micro tiene USART, si la usas escribiras mucho menos codigo para hacer lo mismo.
Perdon no habia leido bien... :lol: :lol:

En cuanto al codigo, al menos esta bien comentado, el tema de la organizacion es practica pura. :mrgreen: :mrgreen:
« Última modificación: 28 de Agosto de 2007, 17:07:02 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re: Ayuda con la comunicacion serial de un 16F877
« Respuesta #2 en: 28 de Agosto de 2007, 17:20:24 »
   Amigos como les dije anteriormente................ese programa lo tome de internet......y mi diseño tiene cristal de 4Mhz pienso subirlo a 10 pues quiero agregarles mas funciones al diseño....este programa lo descargar para aprender........
   Si por favor pueden facilitarme uno que simplemente envie datos se los agradecera, solo necesito eso para hacer las primeras pruevas, no he avanzado mucho, le agradeceria es que dieran.....uno que en realidad funcione gracias....pues he leido el manual y no logro hacerlo funcionar,  no pido mucho o si?????
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado LEONARDO_59

  • PIC10
  • *
  • Mensajes: 9
Re: Ayuda con la comunicacion serial de un 16F877
« Respuesta #3 en: 29 de Agosto de 2007, 11:30:27 »
Hola arika_ve

mira he revisado tu programa y debe funcionar sin problemas, la situación es que no he podido establecer contacto con el MAX232 y mi PC con el Hypertérminal, tengo un pequeño programa que lo hicimos funcionar en un laboratorio de programación de PICs, pero lo quiero hacer por mis propios medios y no lo he logrado aun, te adjunto el programa para que verifiques los parámetros de tu programa y verás que el tuyo debe funcionar

; PRUEBA DE TRANSMISION
   LIST P=16F877
   INCLUDE <P16F877.INC>

   ORG      0000H

   bsf      STATUS,RP0   ; Banco-1
   movlw   .25
   movwf   SPBRG      ; Vtx = 9600bps
   movlw   B'00100100'
   movwf   TXSTA      ; Tx = 8 bits / TX-ON / BRGH=1
   bcf      STATUS,RP0   ; Banco-0
   bsf      RCSTA,SPEN   ; SPEN=1
;-----------------------------------------------
REPITE
   movlw    'P'
   call   TX_DATO
   movlw   'E'
   call   TX_DATO
   movlw   'R'
   call   TX_DATO
   movlw   'U'
   call   TX_DATO
   goto   REPITE
;-----------------------------------------------
TX_DATO
   bcf      STATUS,RP0   ; Banco-0
   movwf   TXREG      ; Inicia Tx
   return
   END

Espero que te sirva de algo, caso contrario si pudieras darme una manito con un circuito que hayas probado de MAX232 para copmunicarte entre el 877 y la PC para verificarlo con el mio y asi darnos la mano con estos programas???

LEONARDO_59
LEONARDO_59

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re: Ayuda con la comunicacion serial de un 16F877
« Respuesta #4 en: 29 de Agosto de 2007, 15:15:26 »
Amigo gracias por tu respues.....probe el programa pero nada pasa, yo uso el MPLAB 5.4, intale el 6.4 y cuando doy a generar el archovo .HEX el programa me da esto......

Citar
Deleting intermediary files... done.
Executing: "C:\Archivos de programa\MPLAB IDE\MCHIP_Tools\mpasmwin.exe" /q /p16F877A "Ptose.asm" /l"Ptose.lst" /e"Ptose.err"
Message[302] C:\DOCUMENTS AND SETTINGS\USUARIO\MIS DOCUMENTOS\DISEñOS\PTOSE.ASM 9 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\USUARIO\MIS DOCUMENTOS\DISEñOS\PTOSE.ASM 11 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Error[173]   C:\DOCUMENTS AND SETTINGS\USUARIO\MIS DOCUMENTOS\DISEñOS\PTOSE.ASM 31 : source file path exceeds 62 characters (C:\DOCUMENTS AND SETTINGS\USUARIO\MIS DOCUMENTOS\DISEñOS\PTOSE.ASM)
Halting build on first failure as requested.
BUILD FAILED: Wed Aug 29 13:57:55 2007
no entiendo muy bien mensaje ademas le agregue una linea de comando para eliminar una advertensia..........que es

ERRORLEVEL -302
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda con la comunicacion serial de un 16F877
« Respuesta #5 en: 29 de Agosto de 2007, 15:19:52 »
Hola akira.

Cambia de directorio el archivo .asm a ensamblar. El error surge porque la ruta al archivo excede los 62 caracteres.

Ejemplo: Corta el archivo C:\DOCUMENTS AND SETTINGS\USUARIO\MIS DOCUMENTOS\DISEñOS\PTOSE.ASM
y pegalo en C:\
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re: Ayuda con la comunicacion serial de un 16F877
« Respuesta #6 en: 29 de Agosto de 2007, 16:57:41 »
Ok resolvi eso amigo................mil gracias, pero y disculpame.....no se usar muy bien este MPLAB, como se yo que el programa envia los datos serialmente???
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re: Ayuda con la comunicacion serial de un 16F877
« Respuesta #7 en: 29 de Agosto de 2007, 17:01:52 »
el programa quedo asi ahora pero no se donde ver ...para corroborar que se envia serialmente......

; PRUEBA DE TRANSMISION
      LIST    P=16F877A
     INCLUDE    <P16F877A.INC>
   ERRORLEVEL -302

   ORG      0000H

   bsf      STATUS,   RP0      ; Banco-1
   movlw      .25
   movwf      SPBRG           ; Vtx = 9600bps
   movlw      B'00100100'
   movwf      TXSTA            ; Tx = 8 bits / TX-ON / BRGH=1
   bcf      STATUS,   RP0      ; Banco-0
   bsf      RCSTA,   SPEN      ; SPEN=1
;-----------------------------------------------
REPITE
   movlw   'P'
   call   TX_DATO
   movlw   'E'
   call   TX_DATO
   movlw   'R'
   call   TX_DATO
   movlw   'U'
   call   TX_DATO
   goto   REPITE
;-----------------------------------------------
TX_DATO
   bsf     STATUS,RP0      ; Banco-0
   movwf   TXREG            ; Inicia Tx
   return
   END
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re: Ayuda con la comunicacion serial de un 16F877
« Respuesta #8 en: 01 de Septiembre de 2007, 03:50:07 »
con que programa pruevo los programas de comunicacion serial para el pic 16F877????
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda con la comunicacion serial de un 16F877
« Respuesta #9 en: 01 de Septiembre de 2007, 06:06:21 »
Podrias utilizar Proteus.

Saludos
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ayuda con la comunicacion serial de un 16F877
« Respuesta #10 en: 01 de Septiembre de 2007, 11:50:40 »
con que programa pruevo los programas de comunicacion serial para el pic 16F877????

Si usas el MPSIM del MPLAB, podes habilitar la salida de usart a pantalla o a un archivo.

Vas al menú DEBUGGER; SETTINGS, y se abrirá la ventana de configuración.

Seleccionas el tab USART1 IO, y configuras la salida a pantalla o a archivo.

Salida a Pantalla


Salida a Archivo

- 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 akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re: Ayuda con la comunicacion serial de un 16F877
« Respuesta #11 en: 09 de Septiembre de 2007, 23:36:25 »
Bueno, en definitiva encontre simularlo con el Proteus, no logre con el PIC Simulator IDE, pues tiene herramientas para trabajar con el Puerto USART, termine el diseño, estoy probandolo, gracias por la ayuda para mas efectividad del programa, le agregue una linea de codigo al programa, que se encarga de monitorear que el dato este totalmente enviado

btfss    TXSTA,   TRMT    ;checa si el buffer de transmision
   goto    esp_e          ;si esta ocupado espera
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ayuda con la comunicacion serial de un 16F877
« Respuesta #12 en: 10 de Septiembre de 2007, 08:42:07 »
btfss    TXSTA,   TRMT    ;checa si el buffer de transmision
goto    esp_e          ;si esta ocupado espera

Mira, no creo que esta sea la forma más óptima.  Chequear el bit TMRT te garantiza que el dato se vació del buffer de salida, pero has desperdiciado el otro byte que puedes usar en el buffer.

Por eso te conviene siempre verificar el TXIF y de esa forma te aseguras siempre tener un byte esperando para ocupar la salida cuando el otro se vacíe y esto lo hará el pic en forma automática y una vez que sabes que es el último byte verificas el bit TMRT (solo si hace falta) .  El chequeo del bit TMRT es muy útil si vas a usar ese pin para otras funciones o bien para verificar en forma fehaciente que has terminado de transmisitir el dato (por ejemplo en comunicaciónes half-duplex).

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 akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re: Ayuda con la comunicacion serial de un 16F877
« Respuesta #13 en: 11 de Septiembre de 2007, 01:52:30 »
Ok amigo, y para eso implica el uso de una interrupcion, disculpame soy un poco grafico, si colocas unas lineas...........pues lee algo rapido el manual ( en ingles por supuesto ) y no me quedo muy claro, pues tenia curiosidad de tu explicacion, pero no logre entender muy bien tu idea, disculpame pero soy nuevo con el 877, y disculpa la molestia.
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela