TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: alperez en 01 de Noviembre de 2012, 18:01:49
-
Hola compañeros. Les hago una pregunta a ver si me pueden ayudar.
Intento realizar una comunicación rs485 con un transceiver que utiliza dos pines para enviar datos (RE/ y DE).
Lo que intento hacer es portar un programa de CCS para 18f2550 que funciona correctamente a xc16 pero me surge una duda:
Para CCS hacia
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,enable=RS485_Enable)
pero para xc16 no sé como usar este pin ¿sería posible usar el pin RTS? o debo poner en alto un pin manualmente. En este caso ¿se hace imprescindible el uso de pullup?
-
+1
-
Si como dices en el Asunto, vas a usar un PIC24, al menos el que uso yo permite manejar por hardware los pines CTS y RTS, solo debes mapearlos correctamente (son de los pines que se configuran).
No puedo ayudarte con XC, y poco mas con ese PIC, pero ya leí que los tengo disponibles...
El PIC24 que tengo es este:
PIC24HJ128GP502
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en534550 (http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en534550)
Y segun la pagina, tiene estas funciones en su UART:
UART (up to two modules):
Interrupt on address bit detect
Interrupt on UART error
Wake-up on Start bit from Sleep mode
4-character TX and RX FIFO buffers
LIN bus support
IrDA® encoding and decoding in hardware
High-Speed Baud mode
Hardware Flow Control with CTS and RTS
-
Gracias por la respuesta.
Sé que puedo usar esos pines, pero viendo esto http://ww1.microchip.com/downloads/en/DeviceDoc/en026583.pdf (http://ww1.microchip.com/downloads/en/DeviceDoc/en026583.pdf) en la pagina 30, creo entender que si se puede utilizar, pero están negadas y no me serviria.
En la página 17 del mismo documento hay una grafica en la que aparece un bit (UTXBRK) que se activa un instante antes y se desactiva un instante después de la transmisión, o eso parece, el caso es que no sé como usarlo.
Creo que tendré que activar el pin manualmente.
P.D. El pic que uso es un 24fj256gb106 http://ww1.microchip.com/downloads/en/DeviceDoc/39897c.pdf
-
Si el estado antes/después de la transmisión de ese bit te sirve a tus propósitos, simplemente copia su estado en un bit de salida, y ya tendrás tu señal de habilitación del RS485.
En CCS, como pusiste en el ejemplo, la rutina lo hace solita.
-
Si el estado antes/después de la transmisión de ese bit te sirve a tus propósitos, simplemente copia su estado en un bit de salida, y ya tendrás tu señal de habilitación del RS485.
En CCS, como pusiste en el ejemplo, la rutina lo hace solita.
Ese es el tema, que ccs lo hace solo pero necesito hacerlo en XC16 (=C30)
Trato de portar de ccs a XC16 de un 18f2550 a un 24fj256gb106.
No sé si me valdria, podria probar, pero si copio el estado ¿tendria que copiarlo cada vez que transmita?
Se me acaba de ocurrir que podria utilizar la interrupcion por transmision para activar esa pata del pic, pero desconozco si la interrupción se produce cuando transmite, por que en ese caso no me valdría, tiene que ser antes para que el max487 se "ponga en posicion", no se si me entiendes
De todas formas muchas gracias, con tus soluciones se me ocurren otras y así voy aprendiendo
-
Si la rutina de transmisión la haces por interrupción, estas un poco frito.
Pero si la comandas tu mismo, es posible que funcione Ok....
-
Si la rutina de transmisión la haces por interrupción, estas un poco frito.
Pero si la comandas tu mismo, es posible que funcione Ok....
¿un poco frito? No te entiendo . ¿Quieres decir que es complicado?
-
Si, Si, porque no podrás controlar tu pin en el momento justo que se transmita el dato...
-
Ya, eso es lo que me temo, por que supongo que la interrupción será cuando comience a transmitir, y eso es demasiado tarde
-
Por cierto, unas fotos que me siento orgulloso ((:-))
Me acabo de dar cuenta de lo sucia y arañada que está, pero como no es para un concurso... :lol:
(http://img805.imageshack.us/img805/2644/img20121030183937.jpg)
(http://img196.imageshack.us/img196/5923/img20121108213530.jpg)
-
Felicitaciones!!
Ya quisiera yo poder trabajar asi una placa!!
Estoy peleado hasta con la plancha !!! :D :D :D :D
-
Felicitaciones!!
Ya quisiera yo poder trabajar asi una placa!!
Estoy peleado hasta con la plancha !!! :D :D :D :D
Prueba, ensayo y error. Me costó unos cuantos trozos de placa encontrar "el punto", y la placa.
Lo mas importante de todo es el fotolito, utilizo impresora + transparencia inkjet. Tengo una impresora pero no me da resolución suficiente, se me corrian los pads del tgfp, pero con la otra, sin problemas. Si consigues un buen fotolito, y una buena placa, todo lo demás es pan comido
Es la primera vez que intento con algo así y la verdad que cero problemas
-
Mi ingles no es bueno, a ver si alguien me ayuda:
The Transmit Interrupt Flag (UxTXIF) is located in the corresponding Interrupt Flag Status (IFSx)
register. The UTXISEL<1:0> control bits (UxSTA<15,13>) determine when the UART will
generate a transmit interrupt.
1. UTXISEL<1:0> = 00, the UxTXIF is set when a character is transferred from the transmit
buffer to the Transmit Shift Register (UxTSR). This implies at least one location is empty in
the transmit buffer.
2. UTXISEL<1:0> = 01, the UxTXIF is set when the last character is shifted out of the Transmit
Shift Register (UxTSR). This implies that all the transmit operations are completed.
3. UTXISEL<1:0> = 10, the UxTXIF is set when the character is transferred to the Transmit
Shift Register (UxTSR) and the transmit buffer is empty.
The UxTXIF bit will be set when the module is first enabled. The user should clear the UxTXIF
bit in the ISR.
Switching between the two Interrupt modes during operation is possible.
While the UxTXIF flag bit indicates the status of the UxTXREG register, the TRMT bit
(UxSTA<8>) shows the status of the UxTSR. The TRMT status bit is a read-only bit, which is set
when the UxTSR is empty. No interrupt logic is tied to this bit, so the user has to poll this bit in
order to determine if the UxTSR is empty.
-
ya esta
http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/pic24-y-c30-un-mundo-de-diversiones!-d/msg21873/#msg21873
-
Simplemente la interrupción no me sirve.
Como nadie me dice como puedo hacerlo de forma "automatica" tendré que hacerlo de forma manual
Gracias de todas formas
-
Muy bonita placa, sí señor.
Pero ten cuidado porque los pines 34 y 35 están unidos, y la pista que llega al 19 está cortada.
Imagino que si ya lo tienes funcionando será porque lo has resuelto.
Felicidades
-
Muy bonita placa, sí señor.
Pero ten cuidado porque los pines 34 y 35 están unidos, y la pista que llega al 19 está cortada.
Imagino que si ya lo tienes funcionando será porque lo has resuelto.
Felicidades
Gracias Nocturno pero la 19 no está cortada y la 34 y 35 son Vusb y Vbus, que están a 3v3. Es así. Lo compié de un esquema que anda por algún titio :)
De todas formas la 19 es VDD del ADC que no lo uso.
Siempre es bueno este tipo de observaciones y te lo agradezco
-
Genial, pues entonces a correr con ella.
Respecto a lo del pin ENABLE, yo juraría que internamente CCS también lo hace de forma manual. Apostaría que es ese tipo de funciones que CCS incorpora y que tanto facilitan la vida del programador.
-
Pero ten cuidado porque los pines 34 y 35 están unidos, y la pista que llega al 19 está cortada.
Que vista Manolo :shock: :)
-
Es que en España tienen buena vista !! :mrgreen: :mrgreen:
-
Es que en España tienen buena vista !! :mrgreen: :mrgreen:
... y paciencia, porque vaya tela la que me esta dando el invento. Ahora la UART simplemente... no funciona
-
Paciencia, paciencia!!
Con mucha Paciencia y mucha mas saliba, el Elefante fornico a la hormiga !! :D :D :D :D
-
Se me olvido poner como lo hice, por si a alguien le interesa:
while (DataRdyUART1()){
// Esperamos a que esté libre RX
}
LATCbits.LATC14 = 1; //Este es el pin que uno como enable y lo ponemos a 1
putsUART1(printf("Bla bla bla");
while (BusyUART1()){
//Esperamos a que esté libre TX
}
LATCbits.LATC14 = 0; //Este es el pin que uno como enable