Bueno estuve jugando un toque con el tema del rs485 y como que la logre transmitir datos por rs485 hacia la compu. Todo esto parti desde el ejemplo de redpic de un rele a la lejania.
Les muestro lo poco que hice. En si el programa adquiere datos analogicos y los envia al puerto serie. En la parte del main probe utilizar una sola entrada analoga para adquirir 8 lecturas diferentes con un 4051, pero x el momento lo deje como texto. pero si funciona.
Ahora el tema es de que como adquirir ese dato cuando el maestro le pregunte al esclavo. :S
#include <16F873A.h>
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT,NOCPD,NOWRT,NODEBUG
#device adc=8
#use delay(clock=4000000) // 4 Mhz PIC
#use rs232 (baud=9600, xmit=pin_b2, rcv=pin_b1)
#define TX_485_ENABLE PIN_B5
void USART_activa_tx(void);
void USART_activa_rx(void);
///////////////////////////////////////////////////////////
// Funciones
///////////////////////////////////////////////////////////
/** \brief Abre el canal RS485 para transmitir.
* \return void
*/
void USART_activa_tx(void)
{
output_high(TX_485_ENABLE);
delay_ms(5);
}
/** \brief Abre el canal RS485 para recibir.
* \return void
*/
void USART_activa_rx(void)
{
delay_ms(5);
output_low(TX_485_ENABLE);
delay_ms(1);
}
///////////////////////////////////////////////////////////
// M A I N
///////////////////////////////////////////////////////////
void main ()
{
int8 i;
float dato[8];
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
set_adc_channel(0);
delay_us(20);
set_tris_b(0b00000010);
while(1)
{
for(i=0;i<1;i++) // 8
{
switch(i)
{
case 0:
output_c(0x00);
break;
/*case 1:
output_c(0x01);
break;
case 2:
output_c(0x02);
break;
case 3:
output_c(0x03);
break;
case 4:
output_c(0x04);
break;
case 5:
output_c(0x05);
break;
case 6:
output_c(0x06);
break;
case 7:
output_c(0x07);
break;
*/
}
dato =100.0*(float)read_adc()/255;
}
USART_activa_tx();
printf("\n%f\n\r\n",dato[0]); //dato[1]
USART_activa_rx();
delay_ms(200);
}
}