MAX232 + PIC16f877, cable serie y codigo

Hola a todos,

Estoy probando la conexión al pic16f877 con un código que hace eco en el micro y devuelve el carácter que introduzco al hiperterminal de windows. El código es el que escribo a continuación (no es propio, es cogido de alguna web que a su vez lo han cogido de un libro)


Código:
;******************************************************************************

	processor	16f877
	include 	<p16f877.inc>
	__CONFIG	0x3F71

; ------------------------------Código modificado por aztk-------------------------------------
; inicio
          org     0x00
          goto    inicio
          org     0x04
          goto    INTER

; Se transmite via Serie el dato que esta en el registro W
TX_DATO   bcf     PIR1,TXIF      ; Restaura el flag del transmisor
          movwf   TXREG          ; Mueve el byte a transmitir al registro de transmision
          bsf     STATUS,RP0     ; Bank01
          bcf     STATUS,RP1

TX_DAT_W  btfss   TXSTA,TRMT     ; ¿Byte transmitido?
          goto    TX_DAT_W       ; No, esperar
          bcf     STATUS,RP0     ; Si, vuelta a Bank00
          return

; Tratamiento de interrupción
INTER     btfss   PIR1,RCIF      ; ¿Interrupción por recepción?
          goto    VOLVER         ; No, falsa interrupción
          bcf     PIR1,RCIF      ; Si, reponer flag
          movf    RCREG,W        ; Lectura del dato recibido
          movwf   PORTB          ; Visualización del dato
          call    TX_DATO        ; Transmisión del dato como eco
VOLVER    retfie

; Comienzo del programa principal
inicio    clrf    PORTB          ; Limpiar salidas
          clrf    PORTC
          bsf     STATUS,RP0     ; Bank01
          bcf     STATUS,RP1
          clrf    TRISB          ; PORTB como salida
          movlw   b'10111111'    ; RC7/RX entrada,
          movwf   TRISC          ; RC6/TX salida
          movlw   b'00100100'    ; Configuración USART
          movwf   TXSTA          ; y activación de transmisión
          movlw   .25            ; 9600 baudios
          movwf   SPBRG
          bsf     PIE1,RCIE      ; Habilita interrupción en recepción
          bcf     STATUS,RP0     ; Bank00
          movlw   b'10010000'    ; Configuración del USART para recepción continua
          movwf   RCSTA          ; Puesta en ON
          movlw   b'11000000'    ; Habilitación de las
          movwf   INTCON         ; interrupciones en general

BUCLE     nop
          goto    BUCLE

          end

El esquemático esta adjunto a este post, así como el cable que estoy usando para la comunicación con el PC


El problema es que no he conseguido respuesta en la ventana del hiperterminal, es decir, no me deja introducir ningún carácter. Y estoy totalmente perdido, no se si puede ser problema del esquemático, del cable, o del código..... si me ayudáis a descartar cosas os estaré agradecido
 

Adjuntos

  • cable modem.jpg
    cable modem.jpg
    32.1 KB · Visitas: 35
  • para duda foro 2.JPG
    para duda foro 2.JPG
    44.4 KB · Visitas: 53
Hay muchas posibles fuentes de error. Hacé pruebas y descartá de a módulos.
Por ejemplo, podes hacer un puente (unir) RX y TX del PIC y hacer un código que prenda un LED si le llega, por ejemplo, un caractar determinado que vos envíes.

Lo mismo con el MAX232, hacé un puente en los terminales que van al PIC de TX y RX del MAX y tendías que ver en el hipertermial que el caracter que escribiste, llegó.

No te olvides de, para ambos casos, desconectar las conexiones que van del MAX al PIC, GND lo podés dejar conectado.

Saludos!
 
El problema es que esta ya todo implementado en placa, y no puedo desconectar nada.... alguna idea en este escenario?

Por otro lado, el cable es el adecuado a la configuracion de pines TX/RX?
 
Última edición:
Bueno.. si queres encontrar realmente el problema hay que hacer un esfuerzo extra. Podrías cortar las pistas para probar lo que dije.

Otra idea es medir con un osciloscopio la senal serial que llega y la que sale (RX y TX). Otra podría ser entender bien el código (lo cual supongo es el objetivo) y modificarlo para agregar elementos que te permitan ver si funciona bien o no. Con esto me refiero a que puedas prender un LED si le llega el caracter que envias.



Sí, el cable es adecuado. Se llama cable cruzado ya que RX de un terminal está conectado al TX del otro, y viceversa.
 
Última edición:
Muchas gracias. Estoy haciendo pruebas con el osciloscopio, pero publique esto para descartar errores graves. Como el cable no adecuado, un mal conexionado. y cosas similares.

Trataré de hacer lo que me comentas haciendo el menor destrozo posible, jajajaja....

Un saludo.

Por cierto, sigo aceptando ideas y sugerencias, cuando funcione, pongo la solución al misterio.....
 
Ya he probado esto, y ambos dan buen resultado.no he tenido que romper ninguna pista ya que por suerte he instalado los integrados en zocalos y al sacarlos ya lo podía puentear sin problema.

Muchas gracias por tu ayuda Kuropatula!

Un saludo



Hay muchas posibles fuentes de error. Hacé pruebas y descartá de a módulos.
Por ejemplo, podes hacer un puente (unir) RX y TX del PIC y hacer un código que prenda un LED si le llega, por ejemplo, un caractar determinado que vos envíes.

Lo mismo con el MAX232, hacé un puente en los terminales que van al PIC de TX y RX del MAX y tendías que ver en el hipertermial que el caracter que escribiste, llegó.

No te olvides de, para ambos casos, desconectar las conexiones que van del MAX al PIC, GND lo podés dejar conectado.

Saludos!
 
Bien,
probá ahora seguir las "líneas" para ver si está todo bien. La idea de esta comunicación, es:
viene el dato por la PC, por el pin TX de la PC que es el numero 3 del conector DB9. Éste va hasta el MAX232 en donde su voltaje cambia de +12 - 12 (o cercano) a 0 y 5V para entrar en el pin RX del PIC. Fiajte bien de que así sea la conexión, y por error no sea de TX a TX.

Lo mismo debe pasar al revés, del pin TX del PIC, van 0 y 5V al MAX232 y salen +12 y -12 al pin 2 del conector DB9 del PC.

Fijate bien de que todo esto sea así y comentame,

saludos
 
Funciona correctamente.... XD

ahora me toca pelearme con labview y el interfaz para controlar las funciones del PIC.

Una vez mas, muchas gracias por tu ayuda.
 
Hola. aprovecho este foro que se inicio con la pregunta de inxanu, para consultar los siguiente.
Estoy trabajando con PROTEUS Ver 7.5 SP3 y MPLAB 8.66 estoy realizando la simulacion de un PIC 16f877 en el que reviso la comunicacion serial a traves de R7/RX.
Quisera ver la data que se encuentre en RCREG cuando hago la simulacion en el MPLAB y no encuentro la forma. He leido diferentes formas y maneras en la web pero ninguna me ha funcionado. Anexo una BMP del trabajo. Agradezco su ayuda
 

Adjuntos

  • PIC.JPG
    PIC.JPG
    150 KB · Visitas: 23
  • proteus.JPG
    proteus.JPG
    175.8 KB · Visitas: 31
Pausa la simulación y ve al menú Debug, verás un item llamado Watch Window
Selecciona Add Item By Name y agregas los registros que necesites.
También existe la posibilidad de ver los valores en otros formatos diferentes al binario.
Para ver el código fuente del programa, puedes agregar el archivo *.cof

Suerte.
 
Gracias D@rkbytes, por tu respuesta todavia no veo en contenido de RCREG, quizas debo explicar mejor lo que ocurre. Anexo parte del codigo para explicar el tema
ReceiveSerial: Bank0 ;select bank 0
btfss PIR1,RCIF ;check if data (BIT5)
return ;return if no data
En esta parte del codigo, se revisa si el USART buffer esta completo, para que eso ocurra la data recibida en el registro RCR debe ser transferida al nregistro RCREG ( si el se encuntra vacio). Al completarse la transferencia el RCIF de PIR1 se coloca en "1". Aqui tengo mi primera pregunta: Como le envio data al USART a traves de PROTEUS ??. No veo un registro RCR en donde pueda escribir un caracter, eso lo revise en el Manual de este PIC. Me dije lo mas adecuado seria escribir directamente en RCREG, entonces es cuando revise en varios sitios de internet e inicie las pruebas con el STIMULUS de varias formas: Escribi data de manera directa por ejemplo: 1FF 1FF A3 24 C4......... y no funciono al pulsar FIRE en el STIMULUS ( en programa corriendo o parando en programa, accionando el fire y nuevamente corriendo el programa), almacena data en un archivo .txt escribi los caracteres en HEX, y en columnas. Lei otros articulos que me indicaban generar la informacion en el Register Injection del STIMULUS, escribiendo el nombre del registro, el formato, el trigger, entre otros y no funciono.
Debe haber una forma de poder escribir el RCREG de manera directa para que el programa continue una vez que detecte y pode ejecutar: movf RCREG, W y simular esa data.
En el PROTEUS trabajo con el COMPIN y el terminal de windos, simulo que el terminal de windows wnvia la informacion y la veo en el terminal del COMPIN, el TX del COMPIN cambia de color rojo a verde, simulando la data, pero no puedo apreciar que el buffer de RXse llene y se active el de TX, solo cuando deja una tecla pisada por mas de 40 caracteres es que se enciende y apaga de manera inmediat el TX. Por eso queria ver la simulacion en el MPLAB.
Quizas la pregunta mejor formulada seria: Como simulo/escribo en RCREG ?? para que observar a traves del MPLAB la simulacion mas exacta de poder observar al USART Recibiendo y transmitiendo caracteres
Agradecido de tu comentario, sugerencia, recomendacion, etc. o si conces otra forma de realizar esto me dices.
 

Adjuntos

  • proteus.JPG
    proteus.JPG
    145.9 KB · Visitas: 16
Última edición:
Saludos.
Mira, así es como lo hago yo, que es cómo te decía.
MPLAB con PROTEUS VSM.jpg
En este gráfico te podrás dar cuenta que puedo enviar datos, y ver lo que hay en los registros.
Ésto es en el entorno de MPLAB con el VSM Viewer.
Para enviar datos a la simulación puedes usar cualquier programa, yo uso uno de mi autoría.
En este ejemplo se puede ver que lo que existe en el registro RCREG y TXREG contienen los mismos datos.
Ya que en el ejemplo que usé, se hace un eco de lo que se recibe.
 
Gracias por tu dedicación y tu tiempo. Voy a revisar lo que me dices y te comento, en realidad no pense que fuera tan complejo simular escribir unos datos en el RCREG desde el STIMULUS del PROTEUS. Una consulta adicional y disculpa nuevamente. Para enviar datos a la simulación que programa me recomendarias, entiendo que es para enviar datos e interactuar directamente en el PROTEUS?
 
He bajado el programa ""Interfaz VB6 v2.0"" descomprimo el .rar y al correr el SPCTRL, obtengo el siguiente resultado. Quizas sea algo que debo instalar en mi laptop adicional. Busque en Internet alugunos consejos, pero no aplican a mi caso. Agradecido por tu respuesta
P.D.: Mi laptop tiene windows XP
Consulto otra cosa: Sabes si existe algun convertidor, programa o algo que lleve el codigo de PIC de C a ASM?? Estoy trabajando con 16F870. Saludos
 

Adjuntos

  • Componente OCX.JPG
    Componente OCX.JPG
    91.7 KB · Visitas: 10
Última edición:
Ese error es porque no tienes instalados los componentes OCX de VB6.
Te falta instalar el componente ActiveX MSCOMM32.OCX
Copia el archivo que adjunto, dentro de la carpeta del programa.
No creo que sea necesario registrar el componente, en dado caso se registra con el programa REGSVR32.EXE
Ese programa se encuentra en la carpeta de sistema de Windows.

Para la otra pregunta, mira por aquí: Convertir lenguaje C a asembler

Suerte.
 

Adjuntos

  • MSCOMM32.rar
    44.8 KB · Visitas: 33
Tengo el circuito integrado MAX232 y un PIC16F877 con puerto serial desde Visual Studio.
La cosa es que muestre el mensaje que estoy enviando en el LCD pero no lo hace.
Ya probé con Tera Term y tampoco. ¿No sé si me podrían ayudar?

Este es el código del PIC:
PHP:
#include "C:\Users\khn\SkyDrive\Documents\serie-lcd.h"
#fuses HS, NOWDT, NOPROTECT


#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)   /// libreria para el manejo del
                                                                        /// puerto serie  se establece
                                                                        /// velocidad de 9600 baudios
#include <lcd.c>                   /// libreria para el manejo de la lcd
char dato_recibido[16];          /// aqui va a ir los datos recibidos por rs232


#byte porte=0x09

#int_rda                               /// interrupcion por escritura en buffer del puerto
void rda_isr()
 {
  gets(dato_recibido);         /// esta instruccion almacena en la variable los
                                       /// datos que se esten enviando hasta que llega
                                       /// la tecla enter
 }

void main()

{
   enable_interrupts(int_rda);          //// se habilita la interrupcion por
                                                  ////  escritura del puerto serial
   enable_interrupts(global);

  set_tris_d(0b00000000);

   lcd_init();
   lcd_gotoxy(1,1);
   lcd_putc("    com RS232   ");

   while(true)
   {
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%s",dato_recibido);         /// se manda a lcd lo que se  recibio

   }
}
De antemano, gracias.
 
Última edición por un moderador:
¿Y el esquema que estás usando?
Necesitas adjuntarlo para revisar las conexiones.

PD: Así como lo estás haciendo no está bien, porque aunque no se reciba algo, siempre estás enviando datos a la pantalla.
Y otra cosa. ¿La pantalla muestra el texto de inicio?
 
OK. Si por ahora sólo estás realizando una simulación, elimina el MAX232 del diseño y coloca únicamente las terminales Tx y Rx del COMPIM directamente al PIC.
Cuando pruebes el circuito físicamente, entonces sí utiliza el MAX232.

Si aún así no consigues recepción, adjunta tu proyecto completo dentro de un archivo comprimido.
 
Atrás
Arriba