// PA4 ist Uart RxD #define MASK4 ( 1 << 4 ) #define uartrx_input_init() { PAC &= ~MASK4; PADIER_TMP |= MASK4; PADIER= PADIER_TMP; PAPH |= MASK4; } #define is_uartrx() ( ((PA & MASK4) >> 4) ) /* --------------------------------------------------------------------------- Baudratentabelle Die Implementierung der seriellen Schnittstelle auf dem PFS154 wird mittels Bitbanging realisiert. Anstelle eine sehr grosse Macro-Kette im Quellcode zu haben gibt es hier eine Tabelle fuer die Konstante uart_delfak, die die Baudrate der Schnittstelle fuer unterschiedliche Coretakte einstellt (Werte wurden impirisch mittels Logicanalyzer er- mitteln): Werte fuer uart_delfak F_CPU | 2400 Bd | 4800 Bd | 9600 Bd | 19200 Bd | 38400 Bd | 57600 Bd | 115200 Bd | ------------------------------------------------------------------------------------- 8 | 182 | 88 | 44 | 22 | 10 | 6 | 16 | | 182 | 88 | 44 | 22 | 14 | 6 */ #define uart_delfak 44 // 9600 Bd [F_CPU== 8 MHz] /* -------------------------------------------------- uart_delay Warteschleife zum Einstellen der Baudraten -------------------------------------------------- */ void uart_delay(uint16_t cnt) { volatile int i; // Volatile, damit der Compiler die Warteschleife // nicht "wegoptimiert" for (i= 0; i< cnt; i++); } /* -------------------------------------------------- uart_getchar Zeichen von serieller Schnittstelle lesen -------------------------------------------------- */ char uart_getchar() { char ch= 0; uint8_t mask= 1; if (!(is_uartrx()) { while (!(is_uartrx()); uart_delay(uart_delfak); } while (is_uartrx()); // auf Startbit warten uart_delay(uart_delfak+(uart_delfak/2)); for (char i= 0; i< 8; i++) { if (is_uartrx()) ch |= mask; else ch &= ~(mask); uart_delay(uart_delfak); mask <<= 1; } return ch; }