www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bei lcd-lib nur PD2-PD7 verwenden


Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich würde gerne die lcd-lib hier aus dem wiki verwenden, benötige jedoch 
PD0 und PD1 noch für das Kommunizieren über den UART. Wie kann man die 
lib so umschreiben, dass nur PD2-PD7 verwendet werden?

Wenn man in lcd-routines.h schaut, kann man da nur den Port an sich 
ändern, und die Pinbelegung von LCD_RS und LCD_EN, jedoch nicht so, dass 
die beiden UART- Pins freibleiben.

Gruß, Bastler

Autor: Michael H* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
4 bit modus und einen shift-operator beim LCD-PORT define.

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine schnelle Antwort!!!
Das LCD verwende ich im 4-BIT-Modus, aber was ist ein shift operator, 
und wie verwendet man den?

Gruß, Bastler

Autor: Michael H* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/articles/Bitmanipul...
0b00010010 << 2 = 0b01001000
jeder shift nach links entspricht dabei einer verdoppelung. jeder shift 
nach rechts...usw.

den rest an denksport überlass ich dir ^^

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke für die Tips, aber wie wende ich das jetzt konkret an?
In lcd-routines.h sind folgende Definitionen:
#define LCD_PORT      PORT
#define LCD_DDR       DDRD
#define LCD_RS        PD4
#define LCD_EN        PD5
Wo soll ich da jetzt shiften? Ich weiß ja noch nicht, welche Bits später 
gesetzt sind, also kann ich dich nicht wie in deinem Beispiel vorgehen, 
oder?

Gruß, Steffen

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: F1-Circus-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm...
#define LCD_PORT      PORT
#define LCD_DDR       DDRD
#define LCD_RS        PD6
#define LCD_EN        PD7

Ohne den Code genauer zu kennen (finde den gerade nicht), nehme ich mal 
an, daß dort irgendwo sowas in der Art steht.
LCD_PORT|=(data>>4)&0x0F;
...
LCD_PORT|=data&0x0F;
Die Ausgabe um 2 Bytes nach links verschoben würde ich so lösen.
LCD_PORT|=(data>>2)&0x3C;
...
LCD_PORT|=(data<<2)&0x3C;

Autor: F1-Circus-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry für's gespamme, mußte aber raus.
Besser krieg' ich es nimmer hin...
#define LCD_PORT      PORT
#define LCD_DDR       DDRD
#define LCD_RS        PD6
#define LCD_EN        PD7
#define D0_PORT       PD2
#define MASK          (0x0F<<D0_PORT)

LCD_PORT|=(data>>D0_PORT)&MASK;
...
LCD_PORT|=(data<<D0_PORT)&MASK;
Auf die Tour darf man wild auf dem Port umher"shiften".

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmmm, so was (LCD_PORT|=(data>>D0_PORT)&MASK;) hab ich jetzt im Code 
nicht gefunden. Vieileicht findest du im Code etwas entsprechendes...
Den Code findest du überigends hier: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

@ Peter Danneger: Dein Beispiel ist mir ehrlich gesagt zu schwierig.

Gruß, Steffen

Autor: F1-Circus-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich schon...
...
LCD_PORT |= temp1;               // setzen
...
LCD_PORT |= temp2;               // setzen
mfg ;)

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entschuldigung, wenn ich jetzt so blöd frag, aber was muss ich da 
ändern, dass es dem entspricht, was du oben gepostet hast?

Vielen Dank schonmal für deine Hilfe!!

Gruß, Steffen

Autor: F1-Circus-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:
Die Variablen "temp1" und "temp2" werden vor der Portzuweisung 
entsprechend bearbeitet, eben Schritt für Schritt statt 'nem flotten 
Einzeiler. Ist wohl dem Wiki-Charakter geschuldet.
Habe mal den Code entsprechend umgeeselt...
#define LCD_PORT      PORT
#define LCD_DDR       DDRD
#define LCD_RS        PD6
#define LCD_EN        PD7
#define D0_PORT       PD2
#define MASK          (0x0F<<D0_PORT)
...
// 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 >> D0_PORT;
   temp1 = temp1 & MASK;
   LCD_PORT &= ~MASK;
   LCD_PORT |= temp1;               // setzen
   lcd_enable();
 
   temp2 = temp2 << D0_PORT;
   temp2 = temp2 & MASK;
   LCD_PORT &= ~MASK;
   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 >> D0_PORT;              // oberes Nibble holen
   temp1 = temp1 & MASK;            // maskieren
   LCD_PORT &= ~MASK;
   LCD_PORT |= temp1;               // setzen
   lcd_enable();
 
   temp2 = temp2 << D0_PORT;
   temp2 = temp2 & MASK;            // unteres Nibble holen und maskieren
   LCD_PORT &= ~MASK;
   LCD_PORT |= temp2;               // setzen
   lcd_enable();
   
   _delay_us(42);
}

Autor: F1-Circus-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, Sch...ande, die ganze Init-Routine muß ja auch noch umgeeselt 
werden, mag nimmer...

Autor: F1-Circus-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...nagut...
// Initialisierung: 
// Muss ganz am Anfang des Programms aufgerufen werden.
 
void lcd_init(void)
{
   LCD_DDR = LCD_DDR | MASK | (1<<LCD_RS) | (1<<LCD_EN);   // Port auf Ausgang schalten
 
   // muss 3mal hintereinander gesendet werden zur Initialisierung
 
   _delay_ms(15);
   LCD_PORT &= ~MASK;
   LCD_PORT |= (0x03<<D0_PORT);            
   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 &= ~MASK;
   LCD_PORT |= (0x02<<D0_PORT);
   lcd_enable();
   _delay_ms(1);
...

Habe ich noch was übersehen?

Autor: F1-Circus-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...nicht wirklich.
// sendet ein Datenbyte an das LCD
 
void lcd_data(unsigned char temp1)
{
   LCD_PORT |= (1<<LCD_RS);        // RS auf 1 setzen
 
   LCD_PORT &= ~MASK;
   LCD_PORT |= (temp1 >> D0_PORT) & MASK;               // setzen
   lcd_enable();
 
   LCD_PORT &= ~MASK;
   LCD_PORT |= (temp1 << D0_PORT) & MASK;               // setzen
   lcd_enable();
   
   _delay_us(42);
}
 
// sendet einen Befehl an das LCD
 
void lcd_command(unsigned char temp1)
{
   LCD_PORT &= ~(1<<LCD_RS);        // RS auf 0 setzen
 
   LCD_PORT &= ~MASK;
   LCD_PORT |= (temp1 >> D0_PORT) & MASK;               // setzen
   lcd_enable();
 
   LCD_PORT &= ~MASK;
   LCD_PORT |= (temp1 << D0_PORT) & MASK;               // setzen
   lcd_enable();
   
   _delay_us(42);
}

SCNR

Autor: Michael H* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder vielleicht einfach eine zusätzliche variable definiern, die dann 
geshiftet wird, anstatt wild im funktionierenden code zumrukramen.

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, vielen Dank für deine Mühe F1-Circus-Fan!!!!!
Muss ich also die von dir genannten Veränderungen nur in den Funktionen 
lcd_data, lcd_command, und lcd_init vornehmen?

Gruß, Steffen

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bastler wrote:

> @ Peter Danneger: Dein Beispiel ist mir ehrlich gesagt zu schwierig.


Komisch, die meisten finden es gerade besonders einfach und 
übersichtlich, z.B. roboter (Gast), 2 Beiträge darunter.

Es ist streng modular, d.h. gleiche Sachen werden nicht mit copy&paste, 
sondern mit Unterfunktionen gemacht.

Alle Pindefinitionen sind im main.h, d.h. nie wieder am Code 
rumeditieren, wenn sich was ändert.
Ich bin ja auch so einer, der die Pins erstmal fürs beste Layout 
definiert und dann die Software daran anpaßt.


Falls Dein Problem die besonders schicken Bitvariablen sind, hier wird 
das ausführlich erklärt:

http://www.avrfreaks.net/index.php?name=PNphpBB2&f...

Man muß es ja mit der Schifterei nicht übertreiben, wenns anders viel 
leserlicher geht.


Peter

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, aber dein Code ist ja eine ganz neue UART lib, wenn ich das richtig 
verstanden habe, oder?
Ich würde eigentlich nur gerne die alte anpassen, weil ich die auch 
schon in einigen anderen Projekten verwendet habe, und eigentlich immer 
notgedrungen auf die UART-Pins verzichtet habe. Wenn ich nun also nur in 
der lib etwas ändern müsste, müsste ich in den Projekten an sich nichts 
ändern.
Wenn ich jedoch eine ganz neue lib verwende, muss ich ja alles mit dem 
LCD  überarbeiten, weil in deinem Code die Funktionen anders heißen.

Also am liebsten wäre mir einfach die lib anzuändern.

Gruß, Steffen

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steffen O. wrote:
> Ja, aber dein Code ist ja eine ganz neue UART lib, wenn ich das richtig
> verstanden habe, oder?

Was hat denn das LCD mit der UART zu tun?
In dem Code ist doch keine UART drin.

Ich sehe auch keinerlei Grund, warum Du meine LCD-Lib nicht mit 
irgeneiner UART-Lib kombinieren können solltest.


> Wenn ich jedoch eine ganz neue lib verwende, muss ich ja alles mit dem
> LCD  überarbeiten, weil in deinem Code die Funktionen anders heißen.

Was hindert Dich daran, Deine Namen zu verwenden?
Man muß es aber nicht überall im Quelltext tun.
Es reicht, im lcd.h-File ein paar #defines zu machen, die die 
Textersetzung für Dich durchführen.

Die lcd.c ist auch kein monolithischer Block und kein Hexenwerk.
Du kannst also beliebig drin rumeditieren oder fehlende Funktionen aus 
Deiner Lib mit einfügen.

Wichtig sind ja nur die 3 Grundfunktionen: Nibble senden, Datenbyte 
senden und Kommandobyte senden.
Sämtliche anderen Funktionen bauen dann ja darauf auf (sollten sie 
jedenfalls).


Peter

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger wrote:
> Steffen O. wrote:
>> Ja, aber dein Code ist ja eine ganz neue UART lib, wenn ich das richtig
>> verstanden habe, oder?
>
> Was hat denn das LCD mit der UART zu tun?
> In dem Code ist doch keine UART drin.
>
> Ich sehe auch keinerlei Grund, warum Du meine LCD-Lib nicht mit
> irgeneiner UART-Lib kombinieren können solltest.
>
Sorry, da meinte ich natürlich LCD-lib. Ich hab schon irgendwie über 
meine UART-Verbindung nachgedacht, und war dann nicht richtig bei der 
Sache.


>> Wenn ich jedoch eine ganz neue lib verwende, muss ich ja alles mit dem
>> LCD  überarbeiten, weil in deinem Code die Funktionen anders heißen.
>
> Was hindert Dich daran, Deine Namen zu verwenden?
> Man muß es aber nicht überall im Quelltext tun.
> Es reicht, im lcd.h-File ein paar #defines zu machen, die die
> Textersetzung für Dich durchführen.

Ja, ich werds mir nochmal anschauen, vielleicht nehm ich ja auch deine 
lib.

> Die lcd.c ist auch kein monolithischer Block und kein Hexenwerk.
> Du kannst also beliebig drin rumeditieren oder fehlende Funktionen aus
> Deiner Lib mit einfügen.
>
> Wichtig sind ja nur die 3 Grundfunktionen: Nibble senden, Datenbyte
> senden und Kommandobyte senden.
> Sämtliche anderen Funktionen bauen dann ja darauf auf (sollten sie
> jedenfalls).

Ok.


Gut, ich werd dann erstmal die Veränderungen von F1-Circus-Fan in meiner 
lib durchführen, und wenns klappt, ists gut, und wenn nicht, dann werd 
ich mir deine Lösung nochmals anschauen.

Gruß, Steffen

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, nochmal Vielen Dank an F1-Circus-Fan!!!!
Mit deinen Veränderungen klappt die Ansteuerung des LCDs!!!

Gruß, Steffen

Autor: nixversteh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Obacht, da stimmt was nicht. Besser so bei den High-Nibbles.
LCD_PORT |= (temp1 >> (4-D0_PORT)) & MASK;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.