Datum: 24.03.2008 22:06
Hallo, auch ich bin nun dabei mich in die µC-Programmierung einzuarbeiten. Nachdem ich heute meinen ersten Test mit dem myAVR-Board und dem LCD-AddOn durchführen wollte hab ich ein eher enttäuschendes Ergebnis damit erzielt. Nach dem erstellen des Hex-Files (fehlerfrei) und dem Brennen des Hexfiles wird im LCD nix angezeigt außer dem schwarzen Balken. Ein Test per myAVR-Quickprog verlief jedoch erfolgreich. Meine Frage ist jetzt natürlich, woran kann das liegen? Wo muss ich den Fehler suchen? Meine main.c
#include <avr/io.h> #include "lcd-routines.h" int main(void){ lcd_init(); lcd_clear(); lcd_home(); lcd_string("Test"); while(1){ } return 0; } |
Die lcd-routines.c
/*Testdatei aus dem AVR-Tutorial*/ //Pinbelegung über defines einstellbar #include <avr/io.h> #include <util/delay.h> #include "lcd-routines.h" //LCD-Befehle #define CLEAR_DISPLAY 0x01 #define CURSOR_HOME 0x02 //Pinbelegung für das LCD #define LCD_PORT PORTD #define LCD_DDR DDRD #define LCD_RS 4 #define LCD_EN 5 //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 Operator |= sagt: Das Ergebnis des Ausdruckes auf der // rechten Seite nach links schieben // |= ist ein Zuweisungsoperator! temp1 = temp1 >> 4; temp1 = temp1 & 0x0F; // &= AND LCD_PORT &= 0XF0; LCD_PORT |= temp1; lcd_enable(); temp2 = temp2 & 0x0F; LCD_PORT &= 0xF0; LCD_PORT |= temp2; lcd_enable(); _delay_ms(42); } //sendet einen Befehl an das LCD void lcd_command(unsigned char temp1){ unsigned char temp2 = temp1; LCD_PORT &= ~ (1 << LCD_RS); //RS 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_ms(42); } //Den enable Puls erzeugen void lcd_enable(void){ LCD_PORT |= (1<<LCD_EN); _delay_ms(10); //kurze Pause machen LCD_PORT &= ~ (1<<LCD_EN); } //Initialisierung //Die Initialisierung muss am Anfang jedes LCD-Porgramms stattfinden void lcd_init(void){ LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN); //Port auf Ausgang schalten //muss 3 mal 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(20); lcd_enable(); _delay_ms(10); lcd_enable(); //4-Bit Modus aktivieren LCD_PORT &= 0xF0; LCD_PORT |= 0x02; lcd_enable(); //Der Befehlssatz kann im Datenblatt des LCD nachgelesen werden //4-Bit / 2 Zeilen / 5x7 lcd_command(0x28); //Display ein / Cursor aus / kein Blinken lcd_command(0x0C); //inkrement / kein scrollen lcd_command(0x06); //alle bisherigen Zeichen vom LCD löschen lcd_clear(); } //Sendet den Befehl zur Löschung des Displays void lcd_clear(void){ lcd_command(CLEAR_DISPLAY); _delay_ms(20); } //Sendet den Befehl Cursor auf Homeposition void lcd_home(void){ lcd_command(CURSOR_HOME); _delay_us(20); } //Setzt den Cursor in Zeile y 1...4 Spalte 0...15 void set_cursor(uint8_t x , uint8_t y){ switch (y){ case 1: lcd_command(0x80 + 0x00 + x); //1.Zeile case 2: lcd_command(0x80 + 0x40 + x); //2.Zeile case 3: lcd_command(0x80 + 0x10 + x); //3.Zeile case 4: lcd_command(0x80 + 0x50 + x); //4.Zeile } } //Schreibt einen String aufs Display void lcd_string(char *data){ while(*data){ lcd_data(*data); data++; } } |
Und die lcd-routines.h
/*Testdatei aus dem AVR-Tutorial*/ void lcd_data(unsigned char temp1); 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); |
Datum: 24.03.2008 22:13
Diese Pause ist aber ein bischen sehr "kurz": _delay_ms(10); //kurze Pause machen Kann es sein, dass dir der Unterschied zwischen Mikro- und Millisekunden nicht geläufig ist?
Datum: 24.03.2008 22:15
>Ein Test per myAVR-Quickprog verlief jedoch erfolgreich. Da hat das Display was angezeigt ? >Meine Frage ist jetzt natürlich, woran kann das liegen? Wo muss ich den >Fehler suchen? Beim Anschluss des Displays. Vieleicht ist es nicht wie im Tutorial angeschlossen.
Datum: 24.03.2008 22:23
Andreas Kaiser wrote: > Diese Pause ist aber ein bischen sehr "kurz": > _delay_ms(10); //kurze Pause machen > > Kann es sein, dass dir der Unterschied zwischen Mikro- und Millisekunden > nicht geläufig ist? Hallo, doch sicher ist mir der Unterschied zwischen µ und m bekannt. Ich hab jedoch keinerlei Erfahrungen was die delays angeht und mich daher auf die im Tutorial angegebenen Zeiten verlassen (sie z.T. sogar um 10-15ms erhöht). Was den Anschluss des LCD angeht, daran hatte ich auch schon gedacht und daher die Pinangaben mit den Pins auf dem Board verglichen. RS geht an PD2 des Controllers (Pin4) und EN geht an PD3 des Controllers (Pin5). Mit der myAVR-Testsoftware hat das Display den Test-Text fehlerfrei angezeigt.
Datum: 24.03.2008 22:26
Patrick Leier wrote: > doch sicher ist mir der Unterschied zwischen µ und m bekannt. Sicher? Auch dann wenn der C Zeichensatz kein µ mag und daher gerne "u" verwendet wird? > die im Tutorial angegebenen Zeiten verlassen (sie z.T. sogar um 10-15ms > erhöht). Nur steht im Tutorial _delay_us(1) drin [1 Mikrosekunde], bei dir _delay_ms(10) [10 Millisekunden]. Was schon ziemlich viel mehr ist.
Datum: 24.03.2008 22:27
Die Datenleitungen am AVR sind bei deinem Display anders angeschlossen als im Tutorial. Das musst du in der Software korrigieren.
Datum: 24.03.2008 22:40
Hallo, hmm, dann steh ich da jetzt etwas auf dem Schlauch. Denn die vier Datenleitungen des LCD (Pin11-14) sind am PORTD des Controllers angeschlossen, so wie auch in der lcd-routines.c definiert, oder versteh ich da jetzt was komplett verkehrt?
Datum: 24.03.2008 22:49
Datum: 24.03.2008 23:01
Ohh, danke dir. die Details hab ich zu so später Stunde dann doch übersehen, danke nochmals.
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel