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
Ok, danke für die Tips, aber wie wende ich das jetzt konkret an?
In lcd-routines.h sind folgende Definitionen:
1
#define LCD_PORT PORT
2
#define LCD_DDR DDRD
3
#define LCD_RS PD4
4
#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
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-Tutorial#LCD-Ansteuerung
@ Peter Danneger: Dein Beispiel ist mir ehrlich gesagt zu schwierig.
Gruß, Steffen
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
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...
1
#define LCD_PORT PORT
2
#define LCD_DDR DDRD
3
#define LCD_RS PD6
4
#define LCD_EN PD7
5
#define D0_PORT PD2
6
#define MASK (0x0F<<D0_PORT)
7
...
8
// sendet ein Datenbyte an das LCD
9
10
voidlcd_data(unsignedchartemp1)
11
{
12
unsignedchartemp2=temp1;
13
14
LCD_PORT|=(1<<LCD_RS);// RS auf 1 setzen
15
16
temp1=temp1>>D0_PORT;
17
temp1=temp1&MASK;
18
LCD_PORT&=~MASK;
19
LCD_PORT|=temp1;// setzen
20
lcd_enable();
21
22
temp2=temp2<<D0_PORT;
23
temp2=temp2&MASK;
24
LCD_PORT&=~MASK;
25
LCD_PORT|=temp2;// setzen
26
lcd_enable();
27
28
_delay_us(42);
29
}
30
31
// sendet einen Befehl an das LCD
32
33
voidlcd_command(unsignedchartemp1)
34
{
35
unsignedchartemp2=temp1;
36
37
LCD_PORT&=~(1<<LCD_RS);// RS auf 0 setzen
38
39
temp1=temp1>>D0_PORT;// oberes Nibble holen
40
temp1=temp1&MASK;// maskieren
41
LCD_PORT&=~MASK;
42
LCD_PORT|=temp1;// setzen
43
lcd_enable();
44
45
temp2=temp2<<D0_PORT;
46
temp2=temp2&MASK;// unteres Nibble holen und maskieren
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
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&file=viewtopic&t=67368
Man muß es ja mit der Schifterei nicht übertreiben, wenns anders viel
leserlicher geht.
Peter
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
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
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