hi leute,
ich möchte ein LCD steuern, nur sie sache ist das ich mit einem 8 Bit
controller (ATtiny45) arbeite, deswegen wurden dem LCD zwei
Schieberegister
und ein D-FlipFlop integriert, um die parallele Ansteuerung zu
simulieren.
Durch diese Zusammenschaltung ist es möglich, neun Bit parallel an das
Display anzulegen, dabei handelt es sich um die Datenleitungen D0-D7
sowie die
Steuerleitung RS.
Die Steuerleitung E direkt vom Mikrocontroller angesprochen.
Meine Frage ist ob es sich schonmal jemand mit diesem Thema befasst hat,
und ob schon eine .c und .h Datei dafür liegt.
hab leider die Definition nur für ein Atmega16
bedanke mich im voraus für ihre Hilfe und Ratschläge
Hi,
ich bin zu den folgenden Coden gekommen, und versuche jetzt nur ein I im
LCD einzugeben. Aber trotzdem tut dem LCD nix.
kann mir bitte jemand helfen
Danke
Hallo,
schaumal hier, ich habe so etwas ähnliches für den 74HC595 programmiert.
Das ganze besteht aus zwei Teilen, einmal die Ansteuerung für den
74HC595 und darauf aufbauent, die Kommunikation mit dem LCD.
http://www.mikrocontroller.net/articles/Porterweiterungen
Ich denke die notwendigen Anpassungen sollten gering sein.
Gruß
Frank
Hi Leute,
die angehängten Quellcodes wurden von einem Kommilitonen schon
programiert, und die sind füe ein serielles Senden der Bits zum LCD.
Habe ich die ausprobiert, trotzdem nix passiert.
kann jemand mir sagen warum.ist da am Programm falsch oder eher soll ich
an meinem Hardware den Fehler suche.
Controller ATtiny 45, arbeite mit einem JTAG MK2
die Seite von Frank konnte ich einbischen verstehen, mir wurde gesagt
dass es da mehr um ein paralleles Senden als um ein serielles Senden
geht.
ich wäre ihnen sehr dankbar
Hallo Henry,
die Daten werden von mir seriell an das 74HC595 übergeben also genau
das, was Du mit Deine Schaltung eigentlich bezwecken willst.
Anpassungen sind aus meiner Sicht lediglich in der Header-Datei
com74hc595.h notwendig, in dem Du Deine anderen Ports angibts und
eventuell an den Stellen, an denen Deine Compiler mit dem Syntax nicht
klar kommt.
Eine weitere Anpassung sind in den Routinen com74hc595_lcd_nibble,
com74hc595_lcd_Byte und com74hc595_lcd_data notwendig, da ich das LCD im
4 Bit Modus betreibe.
Um das LCD im 8 Bit-Modus zu betreiben musst Du lediglich die
zusätzlichen Ports in der Headerdatei com74hc595_lcd.h definieren und
die Routine com74hc595_lcd_nibble anpassen.
1
#define LCD_PORT 0
2
#define LCD_B0 0
3
#define LCD_B1 1
4
#define LCD_B2 2
5
#define LCD_B3 3
6
#define LCD_B4 4
7
#define LCD_B5 5
8
#define LCD_B6 6
9
#define LCD_B7 7
1
voidcom74hc595_lcd_nibble(unsignedchard)
2
{
3
com74hc595_unsetBit(LCD_B0);
4
com74hc595_unsetBit(LCD_B1);
5
com74hc595_unsetBit(LCD_B2);
6
com74hc595_unsetBit(LCD_B3);
7
com74hc595_unsetBit(LCD_B4);
8
com74hc595_unsetBit(LCD_B5);
9
com74hc595_unsetBit(LCD_B6);
10
com74hc595_unsetBit(LCD_B7);
11
12
if(d&1<<0)com74hc595_setBit(LCD_B0);
13
if(d&1<<1)com74hc595_setBit(LCD_B1);
14
if(d&1<<2)com74hc595_setBit(LCD_B2);
15
if(d&1<<3)com74hc595_setBit(LCD_B3);
16
if(d&1<<4)com74hc595_setBit(LCD_B4);
17
if(d&1<<5)com74hc595_setBit(LCD_B5);
18
if(d&1<<6)com74hc595_setBit(LCD_B6);
19
if(d&1<<7)com74hc595_setBit(LCD_B7);
20
21
com74hc595_out();
22
23
com74hc595_lcd_enable();
24
}
1
voidcom74hc595_lcd_Byte(unsignedchard)
2
{
3
com74hc595_lcd_nibble(d);
4
_delay_us(45);
5
}
1
voidcom74hc595_lcd_data(unsignedchard)
2
{
3
// An diese Stelle tritt Deine Ansteuerung von RS
4
// com74hc595_setBit( LCD_RS );
5
com74hc595_lcd_Byte(d);
6
}
1
voidcom74hc595_lcd_command(unsignedchard)
2
{
3
// An diese Stelle tritt Deine Ansteuerung von RS
4
// com74hc595_unsetBit( LCD_RS );
5
com74hc595_lcd_Byte(d);
6
switch(d)
7
{
8
case1:
9
case2:
10
case3:_delay_ms(2);
11
}
12
}
Ansonsten, sollten alle anderen Funktionen aus meiner Sicht direkt
funktionieren.
Falls ich nichts übersehen haben sollte.
Gruß
Frank
Hi Frank,
besten Dank für deine Hilfe
habe jetzt versucht die codes zu schreiben, wie du es sagtest
weiss nicht aber ob hier alles richtig ist oder nicht.
eine Frage habe ich noch für die Funktionen die im (com74hc595.c)
definiert sind
wie setBit, unsetBit, out, init
soll ich die dann auch in einem c.datei definieren
hier sind meine Codes, und nochmal besten Dank.
henry
Hallo Henry,
soweit ich das auf den ersten Blick überschauen kann, sollte es so
klappen, Du musst aber in jedem Fall, noch die Funktion
Seriellsenden_lcd_enable anpassen, da Du das Signale EN (E am LCD)
direkt über Deinen Kontroller ansprichst.
1
voidSeriellsenden_lcd_enable(void)
2
{
3
// Deine Anpassung zur Ansteurung von E
4
// SeriellSenden_setBit( LCD_EN );
5
SeriellSenden_out();
6
_delay_us(20);
7
// Deine Anpassung zur Ansteurung von E
8
// SeriellSenden_unsetBit( LCD_EN );
9
SeriellSenden_out();
10
}
Meine Idee bei der Bibliothek basierte darauf, dass ich mit drei maximal
4 Ports eines Mikrokontrollers eine ganze Serie von Ausgängen ansteuern
kann. Deshalb werden alle Steuerleitungen eines LCDs ebenfalls über die
Porterweiterung angesteuert. Dies entfällt ja in Deinem Fall.
Grundsätzlich ist es so, dass ich innerhalb der Bibliothek für die
Ansteuerung des 74HC595 für jeden 74HC595 eine Position in einem Array
definiert habe. Mit SetBit bzw. unsetBit kann ich innerhalb der Arrays
ein einzelnes Bit setzten bzw. löschen. Die Funktion out sendet die
Daten des Array anschließend an den 74HC595. Sie ist somit die
wichtigste Funktion.
Ich würde an Deiner Stelle zu ersteinmal prüfen, ob die Kommunikation
zwischen Kontroller und den 4015 saubert funktioniert. In meinem
Beispiel ist ein einfaches Lauflicht implementiert. Wenn das
funktioniert, solltest Du den entsprechenden Wechsel an den Ausgängen
der 4015 messen können.
Anschließend ist das Aufsetzen der LCD-Funktionen nur noch ein Klacks.
Da die Kommunikation zum LCD dann nur noch vom richtigen
Timing-Verhalten abhängt. Was die von mir eingebauten Wartezeiten
angeht, bin ich sehr pessimistisch an die Sache herangegangen. Es kann
also sein, dass Du die Zeiten an einigen Stellen verkürzen kannst.
Was mir in Deiner Schaltung etwas mehr sorgen macht, ist die Beschaltung
von RS, wenn ich es richtig deute, wird RS am LCD mit jedem Bit
geschaltet, dass Du an die 4015 sendest. RS muss High sein wenn ein
Datenwort an das LCD und LOW wenn ein Commando gesendet wird. Ich weiss
nicht, wie das LCD mit einem ständigen Wechsel von RS umgeht.
Besser wäre es, Du würdest RS auf den SUB-D9 Stecker legen oder einen
weiteren 4015 dazu verwenden die Signale für E und RS zu steuern.
Gruß
Frank
Hi frank,
danke für deine wertvolle Ratschläge und Hinweise.
Die Funktion habe ich umgeändert weil ich schon den LCD_EN definiert
habe
sie sieht dann so aus:
void Seriellsenden_lcd_enable(void)
{
//SeriellSenden_setBit( LCD_EN );
PORTB |= (1<<PB1); //PB1 an PORTB auf High
SeriellSenden_out();
_delay_us(20);
//SeriellSenden_unsetBit( LCD_EN );
PORTB &= ~(1<<PB1); //PB1 an PORTB auf Low
SeriellSenden_out();
}
die andren Funktionen habe ich so umgeändert, aber weisse ich nicht ob
das umhaut weil ich noch dieses kleines Problem mit dem RS, das Befehl
und Position definiert habe.
Trotzdem vielen Dank, es war echt sehr Hilfreich.
Gruss Henry
Hallo Henry,
aus meiner Sicht, wird Dir nichts anderes übrig bleiben, als RS entweder
über einen zusätzliche 4015 anzusteuern oder ihn auf den Sub-D Stecker
zu legen, so wie er jetzt angeschlossen ist, wird es nicht
funktionieren.
Aber vielleicht kann ja nochmal ein anderer seine Ansicht zur Schaltung
äußern. Ich kann mich ja auch vollständig vertun.
Alternativ, hast Du natürlich auch die Möglichkeit das LCD im 4-Bit
Modus zu betreiben, die dann frei werdenen Ports des einen 4015
verwendest Du dann für die Ansteuerung von E und RS.
Was würde eigentlich gegen einen 4-Bitmodus sprechen?
Eine zusätzliche Frage die auf der Hand liegt, warum schmeisst Du die
ganzen 40xx nicht raus und nimmst einen einzigen 74HC595?
Dann kannst Du die Bibliothek fast ohne Änderungen übernehmen.
Gruß
Frank
Hey Leute
Ich hoff ihr könnt mir helfen:
Ich habe ein LCD Modul 1*16 das mit 4Bit angesteuert wird.
Aber ich hab ausversehen im Code (Bascom) das Signal RS 2 mal
niedergeschrieben, Aber es funktioniert auch nur wenn ich
"Rs = Portd.0 , Db4 = Portd.3 , Rs = Portd.0" schreib
Die Belegung seht ihr im beigefügten Schaltplan.
Sobald der Fehler Rs = Portd.3 weg lass dann lässt sich das Lcd nicht
mehr beschreiben.
(Schaltplan)
Hab es versucht an einem anderem Port. (Portc) mit und ohne Fehler da
ging es überhaupt nicht.
Ausserdem wenn es sich beschreiben lässt dann sieht man im Hintergrund
des Lcd's noch die 16 schwarzen Blöcke (pixel oder so) dunkel leuchten.
Hab ihr schon sowas gehört und hat jemand eine Lösung ???
Bedanke mich schon mal im Voraus
Danke Mike.C
Mike C. schrieb:> Ich habe ein LCD Modul 1*16 das mit 4Bit angesteuert wird.> Aber ich hab ausversehen im Code (Bascom)
Ooch nöö.
Du buddelst nen über 2 Jahre alten Thread aus und dann hijackst Du ihn.
Was hat Deine Frage mit Schieberegistern zu tun?
Und seit wann ist Bascom ein C-Compiler?
Ich geh ja auch nicht irgendwo rein und verlange Staubsaugerfilter.
Ich gucke erstmal und wenn da Fleischerei drüber steht, sollte man
besser nicht nach Staubsaugerfiltern fragen.
Sonst kommen noch die beiden Herren in den weißen Kitteln mit nem
hübschen Jäckchen für mich.
Peter
JO lol
das hoffe ich doch nicht.
Allerdings hab ich nichts passsendes gefunden und immerhin geht es hier
ja um LCD ansteuerung.
Da ich auch noch nicht lange bei mikrocontroller.net angemeldet, weiss
auch auch noch nicht wo man einen neuen Thread anlegt.
Also sorry aber hast du dennoch vielleicht ne Antwort auf meine Frage
???
Danke
Mike C. schrieb:> JO lol>> das hoffe ich doch nicht.> Allerdings hab ich nichts passsendes gefunden und immerhin geht es hier> ja um LCD ansteuerung.
Psst.
Hier im Forum gibt es 4 grosse Themen:
allgemeines Entwicklungsboard aufbauen!
Hilfe, mein Programmer versteht mich nicht!
Hilfe, mein PC versteht den Kleinen nicht!
Warum geht mein LCD nicht?
Einen älteren Thread hijackst du nur dann, wenn das Thema wie die Faust
aufs Auge zu deinem Problem passt. Und selbst dann überlegst du es dir 5
mal, wenn es ssich schon um einen älteren Thread handelt. Denn die
Details sind meistens eben doch ganz anders.
> Da ich auch noch nicht lange bei mikrocontroller.net angemeldet, weiss> auch auch noch nicht wo man einen neuen Thread anlegt.
Gaaanz nach oben scrollen in der Threadübersicht
Da steht:
1
Forum: GCC
2
Fragen zu den GNU-Toolchains für AVR-, ARM- und MSP430-Mikrocontroller, AVR-GCC, MSPGCC, WinAVR, WinARM, ...
3
Forenliste | Neuer Beitrag | ....
Was könnte wohl "Neuer Beitrag" heißen?
Un dann überlegst du als erstes mal, ob das Forum GCC für dich
zutreffend ist. Verwendest du den GCC?
Und am Port C schaltest du jetzt erst mal die JTAGEN Fuse ab.
Oh Ok
Ich hab den Text "Neuer Beitrag" auch gesehen alllerdings hab ich unter
neuer Beitrag, das erstellen einer neuen Antwort im diesem
Forum,verstanden.
Und mit GCC konnte ich nichts anfangen ???
Aber das sind gute Info's für neue Leute im Forum, was man alles darf
und nicht tun sollte.
Danke
Mike C. schrieb:> Oh Ok> Ich hab den Text "Neuer Beitrag" auch gesehen alllerdings hab ich unter> neuer Beitrag, das erstellen einer neuen Antwort im diesem> Forum,verstanden.
Das wär aber unpraktisch, wenn man immer nach oben scrollen müsste.
> Und mit GCC konnte ich nichts anfangen ???
Dann stehen die Chancen gut, dass du nicht ins GCC Forum willst.
GCC ist der Wald und Wiesen C Compiler