Hallo zusammen. Ich beginne gerade mich in die Welt der Mikrocontroller hineinzuwagen. Ich arbeite gerade das Tutorial durch und hänge gerade bei der LCD Steuerung. Vielleicht eine kleine Info: Da ich noch beim Beginn bin, übernimmt das Überschreiben der Programme auf den Mirkocontroller mein Asuro. Danach stecke ich immer um. Bisher funktioniert das auch alles. Beim Versuch die ".hex-Datei" zu erzeugen aus dem Beispiel erhalte ich immer die Fehlermeldung: lcd-routines.c:60: undefined reference to `_delay_us', obwohl ich die "Delay.h"-Datei im gleichen Ordner habe. Kann mir vielleicht jemand helfen? Wäre für Hilfe dankbar
Bitte immer den Quellcode mitposten. Sonst kann man nur raten...
Oh... Sorry... // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial // // Die Pinbelegung ist über defines in lcd-routines.h einstellbar #include <io.h> #include "lcd-routines.h" #include "delay.h" // sendet ein Datenbyte an das LCD void lcd_data(unsigned char temp1) { unsigned char temp2 = temp1; LCD_PORT |= (1<<LCD_RS); // RS auf 1 setzen temp1 = temp1 >> 4; temp1 = temp1 & 0x0F; LCD_PORT &= 0xF0; LCD_PORT |= temp1; // setzen lcd_enable(); temp2 = temp2 & 0x0F; LCD_PORT &= 0xF0; LCD_PORT |= temp2; // setzen lcd_enable(); _delay_us(42); } // sendet einen Befehl an das LCD void lcd_command(unsigned char temp1) { unsigned char temp2 = temp1; LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 setzen temp1 = temp1 >> 4; // oberes Nibble holen temp1 = temp1 & 0x0F; // maskieren LCD_PORT &= 0xF0; LCD_PORT |= temp1; // setzen lcd_enable(); temp2 = temp2 & 0x0F; // unteres Nibble holen und maskieren LCD_PORT &= 0xF0; LCD_PORT |= temp2; // setzen lcd_enable(); _delay_us(42); } // erzeugt den Enable-Puls void lcd_enable(void) { // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers einfügen // Beitrag "Re: Bitte helft mir. Schon wieder AtMega16" LCD_PORT |= (1<<LCD_EN); _delay_us(1); // kurze Pause // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers verlängern // Beitrag "LCD -> Probleme mit Optimierungsgrad" LCD_PORT &= ~(1<<LCD_EN); } // Initialisierung: // Muss ganz am Anfang des Programms aufgerufen werden. void lcd_init(void) { LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN); // Port auf Ausgang schalten // muss 3mal hintereinander gesendet werden zur Initialisierung _delay_ms(15); LCD_PORT &= 0xF0; LCD_PORT |= 0x03; LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 lcd_enable(); _delay_ms(5); lcd_enable(); _delay_ms(1); lcd_enable(); _delay_ms(1); // 4 Bit Modus aktivieren LCD_PORT &= 0xF0; LCD_PORT |= 0x02; lcd_enable(); _delay_ms(1); // 4Bit 2 Zeilen 5x7 lcd_command(0x28); // Display ein Cursor aus kein Blinken lcd_command(0x0C); // inkrement / kein Scrollen lcd_command(0x06); lcd_clear(); } // Sendet den Befehl zur Löschung des Displays void lcd_clear(void) { lcd_command(CLEAR_DISPLAY); _delay_ms(5); } // Sendet den Befehl: Cursor Home void lcd_home(void) { lcd_command(CURSOR_HOME); _delay_ms(5); } // setzt den Cursor in Zeile y (1..4) Spalte x (0..15) void set_cursor(uint8_t x, uint8_t y) { uint8_t tmp; switch (y) { case 1: tmp=0x80+0x00+x; break; // 1. Zeile case 2: tmp=0x80+0x40+x; break; // 2. Zeile case 3: tmp=0x80+0x10+x; break; // 3. Zeile case 4: tmp=0x80+0x50+x; break; // 4. Zeile default: return; // für den Fall einer falschen Zeile } lcd_command(tmp); } // Schreibt einen String auf das LCD void lcd_string(char *data) { while(*data) { lcd_data(*data); data++; } } ------------------------------------------------------------------- // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial // void lcd_data(unsigned char temp1); void lcd_string(char *data); void lcd_command(unsigned char temp1); void lcd_enable(void); void lcd_init(void); void lcd_home(void); void lcd_clear(void); void set_cursor(uint8_t x, uint8_t y); // Hier die verwendete Taktfrequenz in Hz eintragen, wichtig! #define F_CPU 8000000 // LCD Befehle #define CLEAR_DISPLAY 0x01 #define CURSOR_HOME 0x02 // Pinbelegung für das LCD, an verwendete Pins anpassen #define LCD_PORT PORTD #define LCD_DDR DDRD #define LCD_RS PD4 #define LCD_EN PD5 ------------------------------------------------------------ #include "asuro.h" #include "io.h" #include "iom8.h" #include <stdlib.h> #include <avr/io.h> #include "lcd-routines.h" #include "lcd-routines.c" #include "delay.h" // // Anpassungen im makefile: // ATMega8 => MCU=atmega8 im makefile einstellen // lcd-routines.c in SRC = ... Zeile anhängen // int main(void) { //lcd_init(); // lcd_data('T'); //lcd_data('e'); //lcd_data('s'); //lcd_data('t'); lcd_string("Hello World!"); while(1) { } return 0; }
hab ich gerade getestet. ist leider immernoch das gleiche Problem :/ sollte ich vielleicht übergehen und erstmal einen richtigen "Programmer" bauen? Kann es daran liegen?
Olli Polli schrieb: > hab ich gerade getestet. ist leider immernoch das gleiche Problem :/ Ist WinAVR auch wirklich korrekt installiert? > sollte ich vielleicht übergehen und erstmal einen richtigen "Programmer" > bauen? Kann es daran liegen? Nö, es scheitert ja am Kompilieren, nicht am Programmieren.
weder noch, es scheitert am Linken - "undefined reference" kommt doch vom Linker, oder?
Hallo, Ja ich denke WinAVR ist richtig installiert. Hab die Version 20090313 heruntergeladen und installiert! Wie bekomm ich denn den fehlerhaften Link behoben?
Hallo, ich habe jetzt nicht alles gelesen, aber: welcher Controller eigentlich? Häng Deinen Projekt-Ordner mal als Archiv hier rein, so daß man es überhaupt compilieren könnte. Die Code-Fragmente hier im Text tue ich mir jedenfalls nicht an, die fehlenden passenden Teile (lcd-routines.h als Beispiel) suche ich mir auch nicht zusammen... So auf Anhieb: #include <io.h> Der Standardpfad ist <avr/io.h> Bei _delay ähnlich: #include <io.h> ist #include <util/delay.h> was macht der Inhalt von lcd-routines.c oben in Deinem Posting? Das ist eine eigene .c Datei Gruß aus Berlin Michael
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.