Forum: Mikrocontroller und Digitale Elektronik Zwei displays mit Atmega 16


von Tom (Gast)


Lesenswert?

Hallo an alle,

hätte da ein Problem mit dem Ansteuern eines zweiten Displays an einen 
Atmega 16. Es sind zwei gleiche LCD-Displays mit Standardcontroller 
(Reichelt: LCD 081 DIP) die ich versuche mit einem Atmega 16 
anzusteuern. Will mir zwei unterschiedliche Sensorwerte ausgeben lassen. 
Ein Display läuft bereits. Das zweite Display ist auch schon 
angeschlossen.

Jetzt weiß ich allerdings nicht wie ich das zweite Display 
Softwaretechnisch mit einbinden kann, da ich in meinem Hauptprogramm auf 
LCD.C verweise und von dort aus auf LCD.H, und mir der Ansatz für einen 
zweiten LCD-Pfad fehlt.

Habe deshalb alles als C-File angehängt.

Bin für jede Hilfestellung und Anregung dankbar!!

von Jadeclaw D. (jadeclaw)


Lesenswert?

Anhang fehlt.

Gruss
Jadeclaw

von Tom (Gast)


Angehängte Dateien:

Lesenswert?

Noch ein Veruch

Sorry !!

von CCC MCP (Gast)


Lesenswert?

Beide Displays parallel schalten, bis auf die Enable Pins.
Die beiden getrennt ansteuern und schon funktioniert es.

von Johannes M. (johnny-m)


Lesenswert?

...und nicht iom16.h includen! Es wird grundsätzlich nur io.h 
eingebunden. Die Information über den verwendeten Controller gehört ins 
Makefile. Dann wird auch automatisch die richtige Device-spezifische 
ioXXX.h eingebunden.

> #include "LCD.C"
> #include "A2D.C"
Und das macht man auch nicht. .c-Dateien werden im Makefile dem Compiler 
als Sourcen bekanntgegeben. Zu jeder .c-Datei wird eine .h-Datei 
angelegt, die die Variablen- und Funktionsdeklarationen enthält (als 
extern-Deklarationen). Diese .h-Dateien werden dann mit #include in die 
.c-Dateien eingebunden, in denen sie benötigt werden.

Außerdem solltest Du sicherstellen, dass die Dateinamen auch tatsächlich 
in Großbuchstaben geschrieben werden (das gilt auch für die 
Dateierweiterung, die ist nämlich bei C-Sourcen üblicherweise ein 
kleines c).

von Tom (Gast)


Lesenswert?

Vielen Dank für die Infos !!

Werde das parallel schalten der Displays gleich morgen ausprobieren da 
ich gerade für jedes Display einen separaten Port spendiere. Kann den 
übrigen Port gut gebrauchen.

Im Bezug auf das separate Ansteuern der Enabel Pins kann ich da einfach 
an der  unten aufgeführten stelle in der Header Datei einen zusätzlichen 
Enabel Pin definieren und an dem noch übrigen Pin des Pots A anschließen 
oder wie könnte ich das in der Software umsetzen ?

/**
 *  @name Definitions for 4-bit IO mode
 *  Change LCD_PORT if you want to use a different port, but all LCD 
pins must be
 *  on the SAME port in the same order
 */
#define LCD_PORT         PORTA     /**< all lcd pins must be on SAME 
port */
#define LCD_DATA_PORT    LCD_PORT  /**< port for 4bit data (Pin 0..3) */
#define LCD_RS_PORT      LCD_PORT  /**< port for RS line */
#define LCD_RS_PIN       4         /**< pin  for RS line */
#define LCD_RW_PORT      LCD_PORT  /**< port for RW line */
#define LCD_RW_PIN       5         /**< pin  for RW line */
#define LCD_E_PORT       LCD_PORT  /**< port for Enable line */
#define LCD_E_PIN        6         /**< pin  for Enable line */

von Karl H. (kbuchegg)


Lesenswert?

Du wirst um eine Modifikation der LCD Software nicht umhinkommen.
Woher soll denn beispielsweise ein Aufruf von lcd_putc sonst
wissen auf welches Display er die Ausgabe machen soll?

Ergo wirst du wohl sinnvollerweise den Initialisierungs
und Ausgabefunktionen einen zusätzlichen Parameter
spendieren müssen, der genau das angibt. zb.

  lcd_putc( 0, 'a' );

"Gib das Zeichen a am Display 0 aus"

  lcd_putc( 1, 'a' );

"Gib das Zeichen a am Display 1 aus"

Innerhalb der Funktionen, musst du dann zusätzliche Logik
unterbringen, die je nach erstem Argument, entweder die
eine Enable Leitung oder die andere Enable Leitung bedient.

Und ja, sinnvollerweise wirst du dir dann die #define etwas
abändern:
1
#define LCD_E0_PORT       LCD_PORT  /**< port for Enable line for display 0 */
2
#define LCD_E0_PIN        6         /**< pin  for Enable line for display 0 */
3
#define LCD_E1_PORT       LCD_PORT  /**< port for Enable line for display 1 */
4
#define LCD_E1_PIN        7         /**< pin  for Enable line for display 1 */

Wenn du das so machst, sagt dir dann auch der Compiler mittels
Fehlermeldungen, wo du in den LCD Funktionen modifizieren musst
und eine Auswertung der Displaynummer einführen musst :-)

von Hannes L. (hannes)


Lesenswert?

Was spricht eigentlich dagegen, beide Displays als ein Display mit zwei 
Controllern anzusteuern? So wie ein 4x27 oder 4x40? Man muss ja die 
nicht vorhandenen Ausgabepositionen nicht unbedingt ansprechen. Obwohl 
das auch kein Beinbruch wäre, denn der zugehörige DD-RAM ist ja im 
Controller vorhanden.

...

von Tom (Gast)


Lesenswert?

Werde es mal versuchen so wie oben aufgeführt umzusetzen.
Obwohl es sicher ein paar tiefer gehende eingriffe in die Software bzw. 
die LCD Ansteuerung werden.

Danke !!

von Karl H. (kbuchegg)


Lesenswert?

Hannes Lux wrote:
> Was spricht eigentlich dagegen, beide Displays als ein Display mit zwei
> Controllern anzusteuern? So wie ein 4x27 oder 4x40? Man muss ja die
> nicht vorhandenen Ausgabepositionen nicht unbedingt ansprechen. Obwohl
> das auch kein Beinbruch wäre, denn der zugehörige DD-RAM ist ja im
> Controller vorhanden.
>
> ...

Viele Wege führen nach Rom :-)
Klar, ist auch eine Möglichkeit.
Persönlich finde ich die Variante mit expliziter Display-Angabe
klarer, da man dann beim Aufrufer weniger aufpassen muss, wo
denn nun der gedachte Cursor steht.
Ist einfach nur eine Frage dessen was mir lieber ist: Habe
ich beim Aufruf eine explizit angeführte Information (welches
Display ist gemeint) oder ergibt sich das implizit durch die
Vorgeschichte im Programm (wohin habe ich den Cursor gesetzt).

von Uwe .. (uwegw)


Lesenswert?

Du müsstest an den Makros lcd_e_high(), lcd_e_low() und lcd_e_toggle() 
ansetzen. Diese werden von sämtlichen andere Funktionen aufgerufen. Du 
ersetzt die Makros durch eine Funktion, die anhand einer globalen 
Variable dann die entsprechende Enable-Leitung steuert. Dürfte sich 
ziemlich schnell machen lassen...

von Karl H. (kbuchegg)


Lesenswert?

Uwe ... wrote:
> Du müsstest an den Makros lcd_e_high(), lcd_e_low() und lcd_e_toggle()
> ansetzen. Diese werden von sämtlichen andere Funktionen aufgerufen. Du
> ersetzt die Makros durch eine Funktion, die anhand einer globalen
> Variable dann die entsprechende Enable-Leitung steuert. Dürfte sich
> ziemlich schnell machen lassen...

Seh ich auch so.
Allerdings würde ich keine globalen Variablen dafür hernehmen,
sondern sauber den Funktionen ein Display Argument verpassen.
Alle anderen Modifikationen folgen dann automatisch daraus
und der Compiler überwacht die Modifikationen auch, weil ja
irgendwo die Parameter für den jeweiligen Aufruf herkommen müssen.
Das ist dann ziemlich narrensicher und es gibt kaum eine Möglichkeit,
dass sich bei der Modifikation ein Fehler einschleicht.

von Tom (Gast)


Lesenswert?

Habs jetzt hin gekriegt und funktioniert einwandfrei.
Danke noch mal für alle Beiträge !!

Grüße Tom

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.