Hallo,
ich hab mal ne doofe Frage ^^
bin gerade an einem Projekt und wollte mal wissen ob es möglich ist 3
Lcd´s gleichzeitig mit dem Atmega32 anzusteuern, d.h. auf jedem Display
etwas anderes anzeigen zu lassen. Programmiere mit CodeVision.
Danke schon mal im Vorraus für die Antworten =)
So ein paar hundert Displays sind problemlos möglich, der Aufwand liegt
nur in der Adressdekodierung für die einzelnen Displays.
3 Displays sind also problemlos möglich. Der Trick ist, die Datenbusse
parallel zu schalten und die Enable-Leitungen getrennt anzusteuern.
Patrick Lehners schrieb:> ob es möglich ist 3 Lcd´s gleichzeitig mit dem Atmega32 anzusteuern
Was für LCDs?
So "normale" DOT-Matrix-Anzeigen oder passive/aktive STN/TFT...
Gut soweit alles gecheckt, aber reicht es nicht wenn ich jetzt mit dem
Wizard arbeite und halt für zum beispiel port b/c/d jedesmal ein lcd
initialisiere ? sollte das dann nicht funktionieren ?
Da mußt Du mal in die Doku Deines Wizzard nachschauen.
Ein Wizzard hat ein großes Problem, dessen Entwickler muß immer schlauer
als der Benutzer sein. Er muß alle möglichen Funktionen vorhersehen und
verfügbar machen.
Aber keiner ist Supermann und daher wird in der Regel auf Wizzards
verzichtet, sobald Programme über Anfängerniveau hinaus wachsen.
Ein Wizzardentwickler sollte deshalb alle Funktionen auch als Sourcetext
verfügbar machen, damit der Anwender sie modifizieren kann, wenn er
nicht vorhergesehene Funktionen benötigt.
Oftmals erzeugt ein Wizzard aber völlig unlesbaren Assembler, sodaß man
dann doch die ganze Funktion selber schreiben muß.
Für LCDs gibt es aber reichlich Beispielcode, den man modifizieren kann,
z.B.:
http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip
Peter
wenn du auf den Wizzard angewisen bist lass es bleiben, das wird nix
der richtige weg ist: nimm dir ein LCD und schreib ein
Programm das es initialisiert und Daten darauf ausgibt
dann hast du das ganze verstanden und kannst auch mehrere
LCD's ansteuern
vlG
Charly
Patrick Lehners schrieb:> gerade meine Ausbildung abgeschlossen und muss nochmal ne dumme Frage> stellen ^^ was muss an die Enable-leitung ran ?Beitrag "DDS 24 Bit in C?"
Da hast du u.a. ein realisiertes reichlich kommentiertes Beispiel zur
Displayansteuerung.
LG Rudi
Hardwaremässig hab ich alles hinbekommen, aber ich weiss echt nicht
weiter wie ich die lcds unterscheiden kann also unabhängig von einander
was auf den ausgeben kann ... ich mein wenn ich jetzt lcd_gotoxy oder so
benutze weiss der atmega doch gar nicht welches lcd gemeint ist ...
bitte helft mir ^^
Patrick Lehners schrieb:> Hardwaremässig hab ich alles hinbekommen, aber ich weiss echt nicht> weiter wie ich die lcds unterscheiden kann also unabhängig von einander> was auf den ausgeben kann ... ich mein wenn ich jetzt lcd_gotoxy oder so> benutze weiss der atmega doch gar nicht welches lcd gemeint ist ...
Das wurde bereits im ersten Posting erwähnt: die ENABLE-Leitung - das
ist bei deinem Display Pin 6. Die sind i.d.R. Low-active, d.h. du musst
dieses Pin auf GND ziehen (mit deinem µC), dann kannst du mit dem
LC-Display reden. Wenn du mehrere ansteuern willst, brauchst du eben
mehr ENABLE-Pins am µC.
Achja, verabschiede dich von dem Gedanken mehrere Displays gleichzeitig
anzusteuern. Du kannst jeweils nur eines bedienen, die anderen müssen
warten. Da das ein µC recht schnell kann, sieht es so aus, als würden
alle gleichzeitig angesprochen.
Gruss Uwe
also mir ist klar dass ich sie nicht genau zur selben Zeit ansteuern
kann das ist mir eigentlich auch egal ^^ reicht wenns 100 mikrosekunden
später kommt.
Ich sitze an einem Projekt für die FOS welches das Thema Verkehrkonzepte
hat, wir wollen den LKW-Verkehr vom Individualverkehr trennen.
Auf den LCD´s soll dann PKW oder LKW angezeigt werden
Mein Plan war :
LCD 1 :
RS =PA0
R/W =PA2
E =PA1
DB4 =PA4
DB5 =PA5
DB6 =PA6
DB7 =PA7
LCD 2 :
RS =PB0
R/W =PB2
E =PB1
DB4 =PB4
DB5 =PB5
DB6 =PB6
DB7 =PB7
LCD 3 :
RS =PC0
R/W =PC2
E =PC1
DB4 =PC4
DB5 =PC5
DB6 =PC6
DB7 =PC7
Alle offenen Eingänge über Pull-Down-Widerstände(10k)auf Masse
Patrick Lehners schrieb:> LCD 1 :> ...> LCD 2 :> ...> LCD 3 :> ...
Du verschwendest viel zu viele Pins.
Du kannst alle Pins aller LCD parallel schalten. Nur jeweils die E
Leitung jedes LCD muss ihren eigenen Pin haben.
Es reagiert immer nur jenes LCD, über dessen E Pin der Übernahme-Puls
kommt.
Dein Plan ist suboptimal ;-)
Du kannst alle Datenleitungen (DB4-DB7) mit einem Port bedienen
(parallel schalten), sowie RS und R/W - dann benötigst du insgesamt nur
einen Port.
Dazu einen anderen Port für die "ENABLE" Leitungen und fertig.
Patrick Lehners schrieb:> Hardwaremässig hab ich alles hinbekommen, aber ich weiss echt nicht> weiter wie ich die lcds unterscheiden kann also unabhängig von einander> was auf den ausgeben kann ...> ich mein wenn ich jetzt lcd_gotoxy oder so
Du musst deinen Displays eine Adresse geben und deine LCD Funktionen
erweitern.
Aus lcd_gotoxy(intx, int y) wird dann lcd_n_gotoxy(intx, int y, int
LCD_num)
> benutze weiss der atmega doch gar nicht welches lcd gemeint ist ...> bitte helft mir ^^
Und bitte Codemässig nicht so vorgehen, wie man es in solchen Fällen
häufig sieht: Einfach alle Funktionen duplizieren (bei dir dann
triplizieren) und dann gibt es ein
lcd_init1
lcd_init2
lcd_init3
ein
lcd_putchar1
lcd_putchar2
lcd_putchar2
ein
lcd_gotoxy1
lcd_gotoxy2
lcd_gotoxy3
etc. etc.
Man kann ruhig die Funktionen so aufbohren, dass man ihnen zusätzlich zu
den normalen Parametern auch noch die LCD Nummer mitgibt. Eine lcd_init
kann ruhig alle 3 LCD hintereinander initialisieren, etc. etc.
Ein bischen mit Verstand an die Sache rangehen und nicht mit der
Brechstange
du willst ja nur daten anzeigen und nicht lesen, also kannst du r/w auf
0V und nur E muss auf ver. Leitungen sein, alle unproblematisch so lange
die Displays passiv sind.
LCD 1 :
RS =PA0
R/W =0V
E =PB0
DB4 =PA4
DB5 =PA5
DB6 =PA6
DB7 =PA7
LCD 2 :
RS =PA0
R/W =0V
E =PB1
DB4 =PA4
DB5 =PA5
DB6 =PA6
DB7 =PA7
LCD 3 :
RS =PA0
R/W =0V
E =PB2
DB4 =PA4
DB5 =PA5
DB6 =PA6
DB7 =PA7
Uwe N. schrieb:> Dein Plan ist suboptimal ;-)>> Du kannst alle Datenleitungen (DB4-DB7) mit einem Port bedienen> (parallel schalten), sowie RS und R/W - dann benötigst du insgesamt nur> einen Port.> Dazu einen anderen Port für die "ENABLE" Leitungen und fertig.
Beim parallelschalten der Datenleitungen beachten, das immer nur 1
Display enabled ist, sonst gibts beim Lesen Mist und Kurzschluss.
david schrieb:> du willst ja nur daten anzeigen und nicht lesen, ....
Vorsicht bei kopierten Quellcodes ... es gibt genügend
Initialisierungsroutinen für LCD, welche die Statusbits zurücklesen.
Das klingt ja schonmal besser = ) Dankeschön ^^
Jetzt hoffe ich mal dass ich das mit der LCD initialisierung ohne CV
Wizard hinbekomme ^^ Wenn nicht meld ich mich nochmal = P
Winfried schrieb:> 10K Pullup ist gängig, aber 10K Pull-Down? Warum legst du die nicht> direkt auf Masse?
BRING DEM JUNGEN DOCH KEIN SO QUATSCH BEI !!!!
dann schaltet er so ein pin als ausgang und gibt H Pegel
aus, wass dann ????
( immer zuerst Hirn einschalten ( falls vorhanden :P ) )
vlG
Charly
Hallo,
er redet doch vermutlich von den Displays bei seinen PullUps.
Normalerweise haben die interne PullUp oder PullDown und D0...D3 bleiben
im 4Bit-Mode einfach offen.
Gruß aus Berlin
Michael
spess53 schrieb:> Das ist trotzdem Blödsinn,
das allerdings.
Denn wenn man die falsche Variante wählt, könnte es schwer werden, das
LCD erst mal in den 4-Bit Mode zu bekommen.
es war von offenen Eingaengen die rede, es wurde nicht spezifiziert
das es nur die vom LCD sind; genaugenommen hat er doch keine offene
Eingaenge mit der beschaltung, sind alles I/O pins und sowas gehoert
definitiv nicht auf Masse noch auf VCC oder sonst wohin wo der
Strom unkontrollierbar ist (und jetzt nicht sagen er ist ja ueber
das Ri der Netzteils begrenzt ;) )
vlG
Charly
Ehhhm...^^
kann mir einer sagen wo dem atmega gesagt wird auf welchem port der
atmega ist und welcher pin wofür zuständig ?
Hab im Wizard ein Port angeklickt und dann kamen nur die beiden
Textzeilen dabei raus die für das Display zuständig waren :
#include <alcd.h>
(...)
lcd_init(16);
dann dachte ich mir natürlich das wird irgendwo in der header festgelegt
aber da hab ich nix brauchbares gefunden = /
so einfach geht das nicht.
Schreib erst mal ein Programm in dem nur ein LCD vorkommt und bring das
ans Laufen.
Da such in dem Programm wo überall auf die E Leitung zugegriffen wird
und schalte dann Displayabhängig auf die verschiedenen Ausgänge um.
Patrick Lehners schrieb:> zugreifen kann =/ hier mal mein quellcode den ich bis jetzt geschrieben> habe:
Das Problem ist, dass du die in deinem Fall wirklich wichtigen Teile,
nämlich die LCD-Funktionen eben NICHT selber geschrieben hast, sondern
dass du das einem Wizard überlassen hast.
Und der ist nicht darauf ausgelegt, dass man mit ihm 2 LCD ansteuert.
Der kann das einfach nicht. Das musst du selber händisch machen, wobei
du dich natürlich an dem was der Wizard generiert hat orientieren
kannst. Aber du kannst das NICHT einfach 1:1 übernehmen.
Ja, aber für mich ist die Frage wie ^^ ich hab das in der Ausbildung nie
gelernt ein Display selbst zu initialisieren, ich hab mir schon das Tut
hier angeguckt aber werde da auch nicht richtig schlau draus was ich
jetzt von den ganzen funktionen da brauche und wie ich festlege wo die
enableleitungen angesteuert werden -.- mein kopf qualmt hier schon wie
bekloppt = D
Wenn ich den quellcode oben benutze ohne die funktion lcd2 dann
funktioniert alles auch einwandfrei -.- aber sobald ein zweites dazu
kommt, geht gar nix mehr xD
Patrick Lehners schrieb:> Ja, aber für mich ist die Frage wie ^^ ich hab das in der Ausbildung nie> gelernt ein Display selbst zu initialisieren, ich hab mir schon das Tut> hier angeguckt aber werde da auch nicht richtig schlau draus was ich> jetzt von den ganzen funktionen da brauche und wie ich festlege wo die> enableleitungen angesteuert werden -.- mein kopf qualmt hier schon wie> bekloppt = D
Willkommen im Club.
Dann wirst du dir die Init-Funktionen, die der Wizard generiert hat, mal
zu Gemüte führen müssen und analysieren müssen.
Aus dem Tut weißt du ja, was zu passieren hat. Jetzt musst du es nur
noch im vom Wizard generierten Code wiederfinden.
Sorry.
Aber da musst du durch.
Fremden Code analysieren zu können, ist eine der Grundfähigkeiten, die
man als Programmierer lernen muss. Wobei du es sogar insofern leicht
hast, weil du
a) weißt, dass die Funktion funktioniert. und du
b) sogar relativ detailierte Beschreibungen hast, was da konzeptionell
passieren muss.
Aber aus einem Code rauslesen, welcher Pin an welchem Port wo im Code
angesteuert wird, das musst du alleine schaffen. Denn sonst brauchst du
dich da gar nicht weiter in die Programmierung vertiefen sondern lieber
jemanden anheuern, der seine Hausaufgaben gemacht hat und nicht von
einem Wizard abhängig ist.
> aber sobald ein zweites dazu> kommt, geht gar nix mehr xD
Wie schon gesagt:
du KANNST nicht einfach die vom Wizard generierten Funktionen benutzen.
Du musst in diese Funktionen hinein und die abändern!
Du kannst jetzt lcd_init aufrufen wie du lustig bist. Solange du die
lcd_init selber nicht an deine spezifische Situation anpasst, wird das
nie was.
Ja! Da muss man sich die Hände schmutzig machen.
Ja das hab ich ja versucht, aber wo steht denn geschrieben was lcd_init
beinhaltet ? ich hab die header-datei alcd.h geöffnet aber da war nur
eine kurze deklaration von lcd_init -.-
Tja.
Dann musst du suchen.
Irgendwo muss die Funktion sein.
In einer fertigen Lib kann sie nicht sein, denn dann würde man die
Pinbelegung nicht mehr reinbringen. D.h. man könnte schon, aber dann
würden deine Aufrufe nicht beide male
lcd_init(16)
bei abweichender Pinbelegung lauten.
junge, wie wärs mit nachdenken!
du kannst dich noch so dumm stellen, dir wird hier niemand dein Zeug
programmieren, nur helfen.
Niemand hier hat gelernt, wie man ein ldc initialisiert.
Das verrät einem das Datenblatt oder Referenzimplementierungen.
Du hast das Glück, dass du beides hast.
1) du solltest wissen, dass es zu einer h-Datei meist auch eine c-Datei
gibt.
2) du solltest wissen, dass dem Compiler auch die Implementierung (oder
dem Linker ein entsprechendes Objekt) bekannt sein muss, damit eine
ausführbare Datei erzeugen werden kann.
wenn du das nicht weißt, solltest du die Mikrokontroller erst mal zu
Seite legen und dich mit C und einer zugehörigen Toolchain auf dem PC
beschäftigen, sonst hat das alles nämlich keinen Sinn.
wenn du das weißt, dann sollte es kein Problem sein, das zugehörige
Codefile zu finden. (vorausgesetzt, es wird nicht als fertig compilierte
Bibliothek mitgeliefert)
@Vlad Tepesch : Danke für diese netten Kommentare von dir ; )
Tut mir leid dass ich mich mit C-Programmierung nicht allzu gut auskenne
und den MC für ein Schulprojekt programmieren soll...
Vlad Tepesch schrieb:> wenn du das weißt, dann sollte es kein Problem sein, das zugehörige> Codefile zu finden. (vorausgesetzt, es wird nicht als fertig compilierte> Bibliothek mitgeliefert)
Fertige Bib, denke wirds nicht sein. Hier hat er das Glück, dass man in
sowas die Pinbelegung nur sehr umständlich reinbringt.
Allerdings: Wenn ich nach einer gewissen Zeit die Funktionen nicht finde
(was mit einem Debugger nicht allzuschwer sein sollte. Einfach im
Single-Step hineinsteppen und der Debugger sucht mir das File), dann geh
ich über zu Plan B:
Scheiss auf den Wizard mit seinen LCD-Funktionen. Nehm ich halt frei
verfügbare und bring die erst mal mit 1 LCD zum laufen. Dann hab ich die
Funktionen und kann sie entsprechend ändern.
Aber die Attitüde "Da hab ich einen Wizard und ansonsten will ich mir
die Hände nicht schmutzig machen", die bringt einen nicht weiter.
CodeVisionAVR?
bei den alten Versionen (bis v2.04) erfolgte die Portdefinition per
Assembler. Wie im Headerfile auch nachzulesen war.
1
BEFORE #include -ING THIS FILE YOU
2
MUST DECLARE THE I/O ADDRESS OF THE
3
DATA REGISTER OF THE PORT AT WHICH
4
THE LCD IS CONNECTED!
5
6
EXAMPLE FOR PORTB:
7
8
#asm
9
.equ __lcd_port=0x18
10
.equ __lcd_cntr=0x18
11
#endasm
12
#include <lcd.h>
13
[...]
14
#pragma used-
15
#pragma library lcd.lib
Den Rest findet man wie zu erwarten in der lcd.lib. Ist schöner ASM-Code
und einfach zu erweitern oder anzupassen.
Bei der v2.05 dürfte der fragliche Inhalt vermutlich in alcd.lib zu
finden sein. Diese Version kenne ich zwar nicht, aber so große Schritte
hat HPInfoTech zwischen den Versionen eigentlich nie gemacht.
Patrick Lehners schrieb:> @Vlad Tepesch : Danke für diese netten Kommentare von dir ; )> Tut mir leid dass ich mich mit C-Programmierung nicht allzu gut auskenne> und den MC für ein Schulprojekt programmieren soll...
Und warum nimmst du dir dann ein Schulprojekt, von dem du im Vorfeld
nicht schon weißt, dass du es stemmen kannst?
Ehe ich einem Projekt zusage, klär ich doch erst mal ab (zb durch
Vorversuche) ob ich das überhaupt hinkriegen werde und was es da alles
zu tun gibt! Was denkst du, wie wir Auftragsangebote machen? Sicher
nicht, indem wir dem Kunden in die hohle Hand hinein irgendwelche Dinge
zusagen.
Haben wir zugeteilt bekommen .... ist ja jetzt auch egal, ich versuch
das jetzt irgendwie hinzubekommen und dann ist gut, danke für die ganzen
hilfreichen tipps =)
Patrick Lehners schrieb:> @Vlad Tepesch : Danke für diese netten Kommentare von dir ; )
man tut was man kann ;-P
> Tut mir leid dass ich mich mit C-Programmierung nicht allzu gut auskenne> und den MC für ein Schulprojekt programmieren soll...
wenn du mit Ski einen Rodelhügel im Park (der PC) noch nicht mal sicher
runterfahren kannst, würdest du dann zum Skifahren in die Alpen (µC)
fahren?
Woher willst du denn im Fehlerfall wissen, ob der Fehler in der
Programmlogik, der Ansteuerung der Peripherie oder in der Schaltung
liegt.
Im Prinzip kann man sich mal Code für ein 4*40 LCD anschauen, das
besteht nämlich aus 2 Stück 2*40 LCDs, d.h. es hat 2 E-Pins.
Beitrag "LCD Treiber Routine 4*40"
Eine Erweiterung auf 3 LCDs sollte dann einfach sein.
Peter
Hey, ich bins nochmal, ich saß jetzt zwei Tage an dem Quellcode der
angehängt ist, könnte sich den vllt mal jemand anschauen ?
Und mir sagen ob ich auf dem richtigen Weg bin ? Weil iwie zeigt mir
kein LCD was an -.- ausser die schwarzen Balken -.-
IMHO bist du schon viel zu weit gegangen.
Ehe du dich auf 2 LCD stürzt, sieh zu, dass du mit dem Code (wo immer du
den auch her hast) erst mal 1 LCD ansteuern kannst. Eines ganz alleine.
Solange das nicht klappt, brauchst du gar nicht erst versuchen ein 2tes
dazuzuhängen. Ein 2.tes LCD verkompliziert die Sache höchstens, macht
sie aber nicht einfacher. Wenn es daher mit 1 LCD schon nicht klappt,
wird es auch mit 2en nicht klappen.
Und wenn du dann Code hast, der mit 1 LCD klar kommt, dann machst du
kleine Änderungen am Code! zb erst mal nur die Initialisierung der
beiden LCD. Keine Rundumschlagaktionen ala "Ich schreib jetzt erst mal
alles um". Denn das kann nur ins Auge gehen!
Hi
>Und mir sagen ob ich auf dem richtigen Weg bin ?
Nicht so richtig. Was hast du an dem nicht verstanden:
Beitrag "Re: Wie viel LCD´s kann man gleichzeitig mit dem Atmega32 ansteuern ?">Weil iwie zeigt mir kein LCD was an -.- ausser die schwarzen Balken -.-
Hast du überhaupt schon ein Display erfolgreich angesteuert?
MfG Spess
Also, ein Display anzusteuern ist überhaupt kein Problem...
Mein Problem ist dass ich auf 3 Displays verschiedene Sachen anzeigen
will und dann kommt der Enable 2 und 3 mit ins Spiel und ich check gar
nix mehr xD ich hab den Quellcode hier aus dem TuT und hab den dann 4
Stunden lang versucht umzuschreiben, ich glaub das ist auch gar nicht so
falsch wasi hc gemacht hab ^^
Hi
>ich glaub das ist auch gar nicht so>falsch wasi hc gemacht hab ^^
Z.B.
>// Cursor in die 1. Zeile, 0-te Spalte>void lcd_home_1( void );>void lcd_home_2( void );>void lcd_home_3( void );
Drei Routinen! Mach eine draus:
void lcd_home(... disp_nr ); (fehlt noch was. Kann kein C)
Und das machst allen anderen Routinen auch. Wie willst du denn deine
Routinen sonst vernünftig anwenden. Riesen case-Orgie?
MfG Spess