/* ----------------------------------------------- puts_vers.c Demo fuer einen vermeintlichen Bug bei der Adressierung von lokalen Arrays MCU : ATtiny1604 Takt: 20 MHz ----------------------------------------------- */ #include #include /* -------------------------------------------------- uart_init Initialisierung der seriellen Schnittstelle fuer Betrieb mit 20 MHz Protokoll: 8N1, 19200 Bd -------------------------------------------------- */ void uart_init(void) { PORTB.DIR |= 1 << 2; // PB2 als Ausgang (TxD) PORTB.DIR &= ~(1 << 3); // PB3 als Eingang (TxD) PORTB.PIN3CTRL |= 0x08; // PopUp-Widerstand an // Wert fuer USART.BAUD = F_CPU * 4 / Baudrate USART0.BAUD = 4166; // Baudrate 19200 bei 20 MHz USART0.CTRLB |= USART_TXEN_bm; // Transmitfunktion einschalten USART0.CTRLB |= USART_RXEN_bm; // dto. Receive } /* -------------------------------------------------- uart_putchar Zeichen ueber die serielle Schnittstelle senden -------------------------------------------------- */ void uart_putchar(char c) { while (!(USART0.STATUS & USART_DREIF_bm)); USART0.TXDATAL = c; } /* -------------------------------------------------- uart_getchar Zeichen von serieller Schnittstelle lesen -------------------------------------------------- */ uint8_t uart_getchar() { while (!(USART0.STATUS & USART_RXCIF_bm)); return USART0.RXDATAL; } /* ------------------------------------------------------- uart_puts_rom ------------------------------------------------------- */ #define puts_rom(str) (uart_puts_rom(PSTR(str))) void uart_puts_rom(const uint8_t *dataPtr) { uint8_t c; for (c=pgm_read_byte(dataPtr); c; ++dataPtr, c=pgm_read_byte(dataPtr)) uart_putchar(c); } /* ------------------------------------------------------- puts_ram ------------------------------------------------------- */ void puts_ram(uint8_t *c) { while (*c) { uart_putchar(*c++); } } char str1[]= "\n\r Hello World\n\n\r"; /* -------------------------------------------------------- main -------------------------------------------------------- */ int main(void) { char str2[]= "\n\r Hallo uC-Community\n\r"; CCP= 0xd8; CLKCTRL.MCLKCTRLB= 0; // Clk-Divider = 1 => F_CPU = 20 MHz uart_init(); puts_rom("\n\r Hallo Welt"); // funktioniert puts_ram(str1); // funktioniert puts_ram(str2); // funktioniert nicht ! puts_ram("\n\r Bonjour le monde"); // funktioniert nicht ! while(1); }