/* -------------------------------------------------------------------- softwareuart.h Header zu Sourcedatei fuer das Einbinden eines softwarebasierenden UART. Fuer das Timing des UART wird Timer 2 im Interruptbetrieb verwendet. Da der PFS154 nur einen einzigen Interruptvektor fuer alle Quellen hat, ist die ISR in eine Funktion uart_sample ausgelagert worden. Diese Funktion muss innhalb des main-Programms im Interruptvektor eingetragen werden. Usage: void interrupt(void) __interrupt(0) { // Timer2 Interrupt if (INTRQ & INTRQ_TM2) { uart_sample(); INTRQ &= ~INTRQ_TM2; } // hier koennen andere Interruptquellen eingehaengt werden } Dieses Vorgehen ermoeglicht, auch andere Interruptquellen zu bedienen MCU : PFS1xx Compiler : SDCC 4.01 oder neuer 10.06.2026 R. Seelig -------------------------------------------------------------------- */ /* Pinout PFS154 +----------------+ PB4 | 1 |___| 16 | PB3 PB5 | 2 15 | PB2 PB6 | 3 14 | PB1 PB7 | 4 PFS154 13 | PB0 ---------------- VDD | 5 (1) (8) 12 | GND PA7 | 6 (2) (7) 11 | PA0 ICPDA / PA6 | 7 (3) (6) 10 | PA4 Vpp / PA5 | 8 (4) (5) 9 | PA3 / ICPCK +----------------+ */ #ifndef in_softwareuart #define in_softwareuart #include #include "pfs1xx_gpio3.h" // -------------------------------------------------------- // Receiverpin Anschluss // -------------------------------------------------------- #define rxpin_init() PB7_input_init() #define is_rxpin() is_PB7() // -------------------------------------------------------- // Transmitterpin Anschluss // -------------------------------------------------------- #define txpin_init() PA7_output_init() #define txpin_set() PA7_set() #define txpin_clr() PA7_clr() // -------------------------------------------------------- // Baudrate // -------------------------------------------------------- #define baudrate 4800 #if ((baudrate != 4800) && (baudrate != 2400) && (baudrate != 1200)) #error Zulaessige Baudraten sind: 4800 / 2400 / 1200 #endif // -------------------------------------------------------- // fuer Sampling innerhalb des ISR // -------------------------------------------------------- extern volatile uint8_t uart_rx_byte; extern volatile uint8_t uart_rx_ready; extern volatile uint8_t uart_clktick; extern volatile uint8_t rx_shift; // -------------------------------------------------------- // Ringbuffer fuer den UART // -------------------------------------------------------- #define UART_BUF_SIZE 4 // mit Bedacht waehlen: PFS154 hat nur 128 Byte RAM !!! extern uint8_t uart_buf[]; extern uint8_t uart_head; extern uint8_t uart_tail; // -------------------------------------------------------- // Prototypen // -------------------------------------------------------- void tim2_init(uint8_t mode); void uart_bufferadd(uint8_t c); uint8_t uart_bufferget(uint8_t *c); void uart_sample(void); uint8_t uart_ischar(void); uint8_t uart_getchar(void); void uart_putchar(uint8_t ch); void uart_puts(char *p); void uart_init(void); #endif