Estoy intentando implementar un enlace entre Arduino y un PIC18F25K22. Puedo transmitir desde el PIC y leer los datos en el Arduino, pero tengo problemas para ir en la otra dirección. Creo que el problema es con mi rutina de servicio de interrupción, pero podría ser cualquier cosa, por supuesto. Estoy usando MPLAB X 1.60 con XC8 1.12. En la guía del usuario del compilador, he encontrado este ejemplo.
Aquí se muestra un ejemplo de una función de interrupción.
int tick_count; void interrupt tc_int(void) { if (TMR0IE && TMR0IF) { TMR0IF=0; ++tick_count; return; } // process other interrupt sources here, if required }
El código generado por el compilador se colocará en el vector de interrupción Dirección que ejecutará esta función después de cualquier cambio de contexto. que se requiere.
mi propio código se modela después de eso, básicamente exactamente. Main solo está configurado, luego un rato (1).
void usart_setup()
{
TX1_PIN = OUTPUT;
RX1_PIN = INPUT;
TXSTA1 = 0; // page 277, 8bits tx, async mode, low baud
TXSTAbits.TXEN1 = 1; //tx enabled
RCSTA1 = 0; // page 278, 8bit rx,
RCSTA1bits.SPEN1 = 1; //serial enable bit
RCSTA1bits.CREN1 = 1; //continuous receive enable bit
BAUDCON1 = 0; // page 279
BAUDCON1bits.DTRXP1 = 0; //Non inverted polarity
BAUDCON1bits.CKTXP = 0; //idle state is high?
// page 280, set to 9600 baud (actual 9615)
SPBRG1 = 12; // baud rate low byte
SPBRGH1 = 0; // buad rate high bit
rx_pos = 0;
}
void setup(void)
{
OSCCON = 0b11100110; // setup internal oscillatior to 8MHz, TCY is 0.5 microsecond
RCONbits.IPEN = 0; //no interrupt priority
INTCONbits.GIE = 1; // enable interrupts
INTCONbits.PEIE = 1; // enable peripheral interrupts
PIE1bits.RC1IE = 1; // enable USART receive interrupt
}
void interrupt ISR()
{
if (PIE1bits.RC1IE && PIR1bits.RCIF) // if the USART receive interrupt flag has been set
{
PIR1bits.RCIF = 0;
usart_tx_byte(RCREG1);
//dealt with interrupt
}
}
Por ahora, solo debería repetir todo lo recibido, pero en lugar de eso no hace nada. He comprobado dos veces las conexiones y sé que la transmisión funciona, por lo que estoy perdido.
Editar
Así que hablar con el pato y algo más de búsqueda aquí parece haberlo resuelto. Al encender y reiniciar, los puertos se configuran para ser analógicos. Ahora deshabilito esto en mi configuración. Fue un problema entre este y mi pin RX1.