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

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

Reply to
heltena
Loading thread data ...

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!!!
Reply to
Fleming

Fleming ha escrito:

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

Gracias majo

Reply to
heltena
¿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...

Reply to
Pepitof

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.

Reply to
Fleming

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.

Reply to
Fleming

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
Reply to
Pepitof

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.