TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: amospi en 13 de Enero de 2009, 20:23:54
-
Hola muchachos de antemano les deseo un feliz año 2009
Para comensar estoy construyendo una red 485 con driver 75176 para comunicar un PC con varios microcontroladores PIC 12F629. La comunicación me funciona bien por momentos y deja de funcionar; la red que estoy implementando es full duplex, es decir, tendo un par para transmitir y otro par para recibir, cada uno con su driver 75176 y con su respectiva resistencia de 120 ohms al final de cada par, además estoy utilizando el oscilador interno del PIC, que pienso sea esta la falla de la transmisión, pues creo que el oscilador interno de este PIC es mu impreciso y puede generar errores en los tiempos de transmisión. De todas formas realizaré las pruebas colocándole un oscilador externo, pero tengo el inconveniente de cambiar todo el hardware, pues los pines del 12F629 ya no me alcanzan. Si alguien a realizado este tipo de RED (full duplex), me podría indicar como fue el harware que utilizó, porque creo que el problema también podría estar en esta parte.
Atte
Amospi
-
Hola:
Tu lo has dicho, el oscilador interno no tiene mucha precisión y para aplicaciones como ésta en donde los tiempos de bit son muy importantes no es recomendable usarlo. Tienes que usar un cristal a la frecuencia que te convenga. Por otro lado, como realizas tu comunicación entre PC y tus pics? como envias tus bytes? de cuantos pics está compuesto tu red?
Javicho.
-
Dos detalles.
Uno. El oscilador interno puede ser causa de fluctuaciones solo si estas trabajando a alto baudaje: 115200. A 9600 no debería representar ningún problema.
Dos. Las resistencias de 120 Ohms deben ir en cada final de cada par. O sea en tu caso un total de cuatro resistencias, una en cada uno de los extremos de cada uno de los pares.
El SN76176 es el que utilizo y siempre me ha ido bien.
-
Uno. El oscilador interno puede ser causa de fluctuaciones solo si estas trabajando a alto baudaje: 115200. A 9600 no debería representar ningún problema.
Para enviar 1 solo byte claro no hay problema, pero imaginate enviar tramas de 32 o 64 bytes, incluso con tramas de pocos bytes es muy probable que ocurra un error en algún momento, y es algo parecido lo que le sucede.
Se podria tal vez solucionar si el soft hiciera reintentos de tramas en caso alguna llegue en mal estado para ello los tramas deberian enviarse con un poco mas de seguridad por ejemplo usando bit de paridad y/o checksum u otras técnicas mas.
Javicho.
-
Gracias REDPic y Javicho, estoy realizando las pruebas iniciales con dos PIC a 9600 baudios, pero finalmente serán aproximadamente 20 PICs; tengo las resistencias de 120 ohm al final y al principio de cada par, pero los driver (75176) del final se me están calentando; creo que el problema esté en el hardware, pues en cuanto al software estoy transmitiendo simplemente el byte de reconocimiento, tres bytes más de datos y el PIC correspondiente me responden con dos bytes. De todas maneras apenas me estoy desarrugando de mis vacaciones, revisaré minusiosamente el hardware y publicaré cualquier resultado que tenga, gracias
amospi
-
Hola todos
Ya resoví los problemas que tenía con mi red 485. Cuando se trabaja con un PIC 12F629, utilizando el oscilador interno RC, se debe cargar el registro OSCALL con 10000000 que ajusta la frecuencia exacta a 4Mhz, y como este PIC no tiene USART, las transmisiones seriales se tienen que realizar por rutina. Así es como se debe inicializar el PIC 12F629
inicio bcf STATUS,RP0 ; Bank 0
clrf GPIO ; Init GPIO
movlw 07h ; Set GP<2:0> to
movwf CMCON ; digital IO
bsf STATUS,RP0 ; Bank 1
movlw b'10000000'
movwf osccal
movlw b'00001010' ; Set GP<3:4> as inputs
movwf TRISIO ; and set GP<5:4>;as outputs
bsf option_reg,7 ;
bcf status,RP0 ; Bank 0
y el retardo exacto para trabajar a 9600 baudios debe ser el siguiente en asembler:
delay movlw .26 ; 1 set numero de repeticion
movwf PDel0 ; 1 |
PLoop0 clrwdt ; 1 clear watchdog
decfsz PDel0,1 ; 1 + (1) es el tiempo 0 ?
goto PLoop0 ; 2 no, loop
clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
o si es en C crear un retardo de 0.104 mili seg