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 ));
}