#include #include #include #define F_CPU 8e6 #include #define BAUD 9600 #define STOP_BITS 2 #define MARK true // direct connection //#define MARK false // with Transceiver #define STXD SBIT( PORTB, 0 ) #define STXD_oe SBIT( DDRB, 0 ) enum {TX_SRAM, TX_FLASH }; struct bits { uint8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1; } __attribute__((__packed__)); #define SBIT_(port,pin) ((*(volatile struct bits*)&port).b##pin) #define SBIT(x,y) SBIT_(x,y) void sputchar(unsigned char c) { c = ~c; // complement to send 0 = stop bit(s) STXD_oe = 1; // output STXD = MARK; // start bit for (uint8_t i = 9 + STOP_BITS; i; i--) // start + data + stop bits { _delay_us(1e6 / BAUD); // bit duration if (c & 1) STXD = MARK; else STXD = !MARK; // = Space c >>= 1; // next bits or stop bit(s) } } void sputs(char *pt, uint8_t flag) { uint8_t val; for (;;) { if (flag == TX_FLASH) val = pgm_read_byte(pt); else val = *pt; if (val == 0) return; sputchar(val); pt++; } } prog_char ftext[] = { "Text im Flash\n" }; int main(void) { for (;;) { sputs(ftext, TX_FLASH); sputs("Text im SRAM\n", TX_SRAM); _delay_ms(1000); } }