#include #include #include #include #include #include //#include "lcd.h" //#include "Uart.h" /* Compilieren und Linken mit folgenden Parametern * make all Building file: ../test_lcd.c Invoking: AVR Compiler avr-gcc -Waddr-space-convert -Wall -g2 -gstabs -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega162 -DF_CPU=4000000UL -MMD -MP -MF"test_lcd.d" -MT"test_lcd.o" -c -o "test_lcd.o" "../test_lcd.c" Finished building: ../test_lcd.c Building target: Strings_im_Flash.elf Invoking: AVR C Linker avr-gcc -Wl,-Map,Strings_im_Flash.map -Wl,--gc-sections -mrelax -Wl,-Tdata=0x800500 -Wl,--defsym,__DATA_REGION_ORIGIN__=0x800500 -Wl,--defsym=__DATA_REGION_LENGTH__=32k -mmcu=atmega162 -o "Strings_im_Flash.elf" ./test_lcd.o Finished building target: Strings_im_Flash.elf Invoking: AVR Create Extended Listing avr-objdump -h -S Strings_im_Flash.elf >"Strings_im_Flash.lss" Finished building: Strings_im_Flash.lss Create Flash image (ihex format) avr-objcopy -R .eeprom -R .fuse -R .lock -R .signature -O ihex Strings_im_Flash.elf "Strings_im_Flash.hex" Finished building: Strings_im_Flash.hex Invoking: Print Size avr-size --format=avr --mcu=atmega162 Strings_im_Flash.elf AVR Memory Usage ---------------- Device: atmega162 Program: 516 bytes (3.1% Full) (.text + .data + .bootloader) Data: 0 bytes (0.0% Full) (.data + .bss + .noinit) Finished building: sizedummy 09:52:20 Build Finished. 0 errors, 2 warnings. (took 396ms) * */ #define UART_BAUD_RATE 9600 // 9600 baud #define NEXT_STATE 1 #define PREVIOUS_STATE 0 #define LCD_LINES 4 #define LCD_DISP_LENGTH 20 #define LCD_IO_DATA 0xC000 // A15=1, A14=0 ==> Instruction Register #define LCD_IO_FUNCTION 0x8000 int8_t anzeige_version(void) { _delay_ms(2000); return(NEXT_STATE); } int8_t eingabe_betrieb(void) { _delay_ms(2000); return(NEXT_STATE); } typedef struct display { const char __flash *text_zeile[LCD_DISP_LENGTH]; } t_display; typedef struct menu { const t_display text; const int8_t previous; const int8_t next; int8_t ( *fp )( void ); } t_menu; #define FSTR(X) ((const __flash char[]) { X } ) const t_menu main_menu[] __attribute__((progmem)) = { {{FSTR(" 0 Testzeile 1"), FSTR(" 0 Testzeile 2"), FSTR(" 0 Testzeile 3"), FSTR(" 0 Testzeile 4")} ,0 ,1 ,anzeige_version}, {{FSTR(" 1 Testzeile 3"), FSTR(" 1 Testzeile 3"), FSTR(" 1 Testzeile 3"), FSTR(" 1 Testzeile 4")} ,1 ,1 ,eingabe_betrieb}, }; #define lcd_write(d,rs) if (rs) *(volatile uint8_t*)(LCD_IO_DATA) = d; else *(volatile uint8_t*)(LCD_IO_FUNCTION) = d; void lcd_putc(char c) { lcd_write(c, 1); } void lcd_puts_p(const char *progmem_s) // print string from program memory on lcd (no auto linefeed) { register char c; while ( (c = pgm_read_byte(progmem_s++)) ) { lcd_putc(c); } } // Bei diesem Aufruf macht das Programm immer einen Reset // Es wird zwar der erste Text angezeigt, aber nicht der nächste. // Eigentlich sollte das Programm automatisch den nächsten Text anzeigen, // aufgrund _delay_ms(2000); in der Funktion "anzeige" // Es wird aber immer wieder printf("gestartet\n\r"); aufgerufen // Warnungen beim Compilieren: //../test_lcd.c:199:10: warning: conversion from address space 'generic' to address space '__flash' [-Waddr-space-convert] // show_display_lines(main_menu[index].text.text_zeile); // ^~~~~~~~~~~~~~~~~~ //void show_display_lines(const __flash char * const __flash *lcd) { // lcd_clrscr(); // for(int i = 0; i < LCD_LINES; i++) { // lcd_gotoxy(0,i); // lcd_puts_p((PGM_P)pgm_read_word(lcd++)); // } //} // Hier auch Reset. Erklärung siehe oben // Warnungen beim Compilieren keine //void show_display_lines(const __flash char * const* lcd) { // lcd_clrscr(); // for(int i = 0; i < LCD_LINES; i++) { // lcd_gotoxy(0,i); // lcd_puts_p((PGM_P)pgm_read_word(lcd++)); // } //} // Hier bekomme ich Hieroglyphen angezeigt // Warnungen beim Compilieren keine //void show_display_lines(const __flash char * const* lcd) { // lcd_clrscr(); // for(int i = 0; i < LCD_LINES; i++) { // lcd_gotoxy(0,i); // lcd_puts_p((PGM_P)lcd++); // } //} // Hier bekomme ich auch Hieroglyphen angezeigt // Beim Compilieren bekomme ich folgende Warnungen // ../test_lcd.c: In function 'show_display_lines': // ../test_lcd.c:115:2: warning: conversion from address space '__flash' to address space 'generic' [-Waddr-space-convert] // lcd_puts_p((PGM_P)lcd++); // ^~~~~~~~~~ // ../test_lcd.c: In function 'main': // ../test_lcd.c:147:10: warning: conversion from address space 'generic' to address space '__flash' [-Waddr-space-convert] // show_display_lines(main_menu[index].text.text_zeile); // ^~~~~~~~~~~~~~~~~~ void show_display_lines(const __flash char * const __flash *lcd) { //lcd_clrscr(); for(int i = 0; i < LCD_LINES; i++) { //lcd_gotoxy(0,i); lcd_puts_p((PGM_P)lcd++); } } //static int putchar__(char c, FILE *stream) { // uart_putc(c); // return 0; //} //static FILE mystdout = FDEV_SETUP_STREAM(putchar__, 0, _FDEV_SETUP_WRITE); int main(void) { int index, new_index; DDRB |= (1 << PB3) | (1 << PB2) | (1 << PB1) | (1 << PB0); PORTB = (1 << PB3) | (1 << PB2) | (1 << PB1) | (1 << PB0); PORTB ^= (1 << PB0); PORTB ^= (1 << PB1); //uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU)); //stdout = &mystdout; //sei(); //printf("gestartet\n\r"); // initialize display, cursor off //lcd_init(LCD_DISP_ON); index = 0; for (;;) { for (;;) { show_display_lines(main_menu[index].text.text_zeile); new_index = main_menu[index].fp(); if(new_index == 0) index = main_menu[index].previous; else index = main_menu[index].next; } } }