Y que no me va el puerto serie en el PIC ...

Jul 24, 2006 6 Replies

Buenas,



He probado todo lo que hay en los grupos y webs y el puerto serie me sigue sin ir.



Primeros datos: pic: 16f876 compilador C: sdcc (2.5.0) gputils: 0.13.3-1 configuraci=F3n deseada: 9600,8,N,1 reloj: 20Mhz



C=F3digo del PIC (16f876):



En C:



#include "p16f876.h"



void main() { SPBRG =3D 129; BRGH =3D 1; SYNC =3D 0; SPEN =3D 1; TXIE =3D 0; TXEN =3D 1; RCIE =3D 1; CREN =3D 1;



GIE =3D 0; PEIE =3D 0;



TRISC =3D 0x80; /* 1000 0000 */



for(;;) { while(!TXIF); TXREG =3D 'A'; } }



En ensamblador (por si el SDCC no chuta bien; y el c=F3digo siguiente est=E1 le=EDdo del PIC y desensamblado):


000000: 0000 nop
000001: 2804 goto 0x4
000002: 3fff addlw 0xff
000003: 3fff addlw 0xff
000004: 118a bcf 0xa, 0x3
000005: 120a bcf 0xa, 0x4
000006: 2807 goto 0x7
000007: 3081 movlw 0x81
000008: 1683 bsf 0x3, 0x5
000009: 1303 bcf 0x3, 0x6
00000a: 0099 movwf 0x19
00000b: 1518 bsf 0x18, 0x2
00000c: 1218 bcf 0x18, 0x4
00000d: 1283 bcf 0x3, 0x5
00000e: 1798 bsf 0x18, 0x7
00000f: 1683 bsf 0x3, 0x5
000010: 120c bcf 0xc, 0x4
000011: 1698 bsf 0x18, 0x5
000012: 168c bsf 0xc, 0x5
000013: 1283 bcf 0x3, 0x5
000014: 1618 bsf 0x18, 0x4
000015: 138b bcf 0xb, 0x7
000016: 130b bcf 0xb, 0x6
000017: 3080 movlw 0x80
000018: 1683 bsf 0x3, 0x5
000019: 0087 movwf 0x7
00001a: 1283 bcf 0x3, 0x5
00001b: 1e0c btfss 0xc, 0x4
00001c: 281a goto 0x1a
00001d: 3041 movlw 0x41
00001e: 0099 movwf 0x19
00001f: 281a goto 0x1a
000020: 0008 return

Y si usamos alg=FAn que otro mnemot=E9cnico:



NOP GOTO init init: PAGESEL 0 GOTO main



main: MOVLW 0x81 BANKSEL 1 MOVWF SPBRG ; 0x19 BSF TXSTA, BRGH ; 0x18, 0x2 BCF TXSTA, SYNC ; 0x18, 0x4 BANKSEL 0 BSF RCSTA, RX9 ; 0x18, 0x7 BANKSEL 1 BCF PIE1, TXIE ; 0xC, 0x4 BSF TXSTA, TXEN ; 0x18, 0x5 BSF PIE1, RCIE ; 0xC, 0x5 BANKSEL 0 BSF RCSTA, CREN ; 0x18, 0x4 BCF INTCON, GIE ; 0xB, 0x7 BCF INTCON, PEIE ; 0xB, 0x6 MOVLW 0x80 BANKSEL 1 MOVWF TRISC ; 0x7 bucle: BANKSEL 0 BTFSS PIR1, TXIF ; 0xC, 0x4 GOTO bucle MOVLW 0x41 MOVWF TXREG ; 0x19 GOTO bucle RETURN



Las conexiones que tengo: Del pin 17 del 16f876 (RC6/TX/CK) al pin 10 del Max232. Del pin 18 del 16f876 (RC7/RX/DT) al pin 9 del Max232. Del pin 7 del Max232 al pin 2 del conector del RS232. Del pin 8 del Max232 al pin 3 del conector del RS232. El pin 5 del conector del RS232 a tierra y los dem=E1s al aire.



He probado con un cable cruzado (nul modem) y con uno plano (usando un conversor hembra-hembra).



Para leer del puerto serie uso GtkTerm, un clon del Hyperterminal del windows, pero para gnome. Si, funciona bien, que desde otro ordenador (y desde el otro puerto serie) va muy bien.



He probado dos pics distintos y dos max232 distintos.



=BFqu=E9 hago mal que me estoy volviendo loco?


--=20 Helio Tejedor



Has Probado a cambiar de PIC? yo tengo en estos momentos sobre la mesa 4

16F876 de los cuales solo 2 tienen la UART bien. Estuve 2 días rompiendome la cabeza para una comunicación a 4800 con un GPS, y hasta que cambié de PIC, nada. Uno no recibe absolutamente nada, pero si envía; el otro recibe lo que le da la gana con cantidad de OERR y FERR; y los otros dos funcionan perfectamente.... Y todo con el mismo programa sin recompilar ni na!!!

Fleming ha escrito:

Pues vaya, yo he probado con los dos que tengo. Tendr=E9 que comprar otro :-(

Gracias majo

¿Has pensado que quizás hay algo mal en tu diseño que jode esos puertos serie? Es que es raro, porque yo tuve que hacer unos 12 o 14 cacharros basados precisamente en el 16F876, y entre otras cosas usaban el puerto serie (para la actualización del firmware y para descargar un histórico) y no tuve el menor problema con eso.

--

Saludos de Jose Manuel Garcia snipped-for-privacy@terra.es http://213.97.130.124

"Fleming" escribió en el mensaje news: snipped-for-privacy@newsgate.x-privat.org...

Pepitof escribió:

No lo descarto, ya que soy un poco chapuzas... y tengo una dilatada experiencia en tostar micros!!! Lo único que estoy haciendo (últimamente) es utilizar una plaquita que me hice hace años con un max232 y sus 5 condensadores, con un db9 por un lado, y con un cable con 3 pines por el otro (TX,RX y GND). Lo que no me convence mucho, y consulto al grupo por si puede ser causa de mis "tuestes" es que cambio en caliente (sin quitar alimentaciones) las señales de TX y RX de los tres dispositivos que tengo: El Gps, el MAX232 conectado al PC, y el PIC, quiero decir, en ocasiones conecto el PC al GPS para ver por el terminal las cadenas, o conecto el PC al micro para mandar cadenas y depurar, o conecto el micro al GPs para provar... pero todo sin quitar la alimentación.

Buenas, en un ratillo libre he probado tu codigo, pero con el Hi-Tech (Solo cambia el include), y como lo que tengo sobre la mesa va a 4Mhz, pues el SPBRG=129 por SPBRG=25, y me funciona perfectamente la recepción y la transmición, pruebas:

formatting link

formatting link

Vas a tener que revisarlo todo o cambiar el compilador, pero me parece muy extraño que este código tan sencillo, no sea capaz compilarlo correctamente... Has una cosa, si usas el MPLab, en "View" saca el "disassembly linting", es muy útil para seguir el código en que genera el compilador, pero mirandolo un poco por encima, parece que el código en asm esta correcto ¿has comprobado que el programador funciona? quiicir, verificas la programación del micro? ya se que son chorradas, pero no todo parece estar bien y no se me ocurre otra cosa (tampoco te creas que soy yo el más adecuado para resolver grandes enigmas jajajajaja) Olvidate del cable null moden, te tienes que asegurar con un polímetro de que el pin 7 del MAX232 tiene continuidad con el pin2 del db9 que ENCHUFES en el PC (pero directa, compruebalo metiendo un clip por el pin2 del db9.

Prueba la recepción con un programita chorras del estilo:

void main() { SPBRG = 129; BRGH = 1; SYNC = 0; SPEN = 1; TXIE = 0; TXEN = 1; RCIE = 1; CREN = 1;

GIE = 0; PEIE = 0;

TRISC = 0x80; /* 1000 0000 */

for(;;) { while(!TXIF); TXREG = 'A'; if (RCIF){RC0=1;} } }

que te encienda u nled conectado al RC0 Monta otro max232 e intenta conectar 2 PC's para descartar que no esten tostados los MAX's, quiicir:

PC1--(RS232)--->MAX232---(TTL)---->MAX232--(RS232)-->PC2

Monta los PIC's solo con el oscilador y un cablecillo al MAX232, para descartar el que otras señales/patas/etc te esten chafando la comunicación... No se me ocurren muchas más pruebas.... Espero servirte de ayuda.

Hombre, normalmente, si conectas y desconectas puertos RS-232 en caliente, no debe pasar nada. Ahora, si cambias por ejemplo la conexión entre un PIC y un MAX232 (esa no es RS-232, sino compatible TTL) en caliente, es muy probable que algo casque, sobre todo si no tienes la precaudión de conectar primero GND y luego las señales.

--

Saludos de Jose Manuel Garcia snipped-for-privacy@terra.es http://213.97.130.124

"Fleming" escribió en el mensaje news:44c75495$ snipped-for-privacy@newsgate.x-privat.org...

y

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required