Neues Projekt mit RS-485 Interface: 29 Module mit je 37 LEDs, die über einen Raspberry Pi gesteuert werden sollen.
Problem: der PIC16F1708 ist nicht in der Lage festzustellen, ob noch eine Übertragung via EUSART Modul aktiv ist (Quote: “The TSR register is not mapped in data memory, so it is not available to the user.”). Die Transmitter-Enable Leitung (DE) kann also nicht mit dem letzten gesendeten Bit wieder deaktiviert werden.
Lösung: Beim Senden von jedem Zeichen die DE Leitung auf High setzen (und so den 75176 in Sendemodus bringen), den TMR0 (re-)starten und im Interrupt-Handler von TMR0 dann die DE Leitung wieder auf Low setzen:
void TMR0_CallBack(void) { IO_DE_SetLow(); } void RS485_Put(uint8_t c) { IO_DE_SetHigh(); TMR0_Reload(); EUSART_Write(c); } void RS485_Print(const unsigned char* message) { char c; while (c = *message++) { RS485_Put(c); } } char to_hex(uint8_t v) { v = v & 0xf; if (v<10) { return '0'+v; } return 'A'-10+v; } void RS485_PrintHex8(uint8_t val) { RS485_Put(to_hex(val>>4)); RS485_Put(to_hex(val)); } void RS485_PrintHex16(uint16_t val) { RS485_Put(to_hex(val>>12)); RS485_Put(to_hex(val>>8)); RS485_Put(to_hex(val>>4)); RS485_Put(to_hex(val)); } void RS485_PrintDecimal(uint16_t val) { RS485_Put('0'+ ((val/10000) % 10 )); RS485_Put('0'+ ((val/1000) % 10 )); RS485_Put('0'+ ((val/100) % 10 )); RS485_Put('0'+ ((val/10) % 10 )); RS485_Put('0'+ ((val/1) % 10 )); }