Forum: Mikrocontroller und Digitale Elektronik LCD Display Ansteuerung mit Atmega169P


von Kurbel (kurbel)


Lesenswert?

Hallo,

ich wollte zum Anfang ein Segment eines statischen LCD-Displays 
ansteuern. Den folgenden Code habe ich via ISP auf den MCU hochgeladen, 
leider tut sich nichts. Hat jemand eine Idee, was ausgebessert gehört.

Zuerst habe ich ähnlich wie im Datenblatt das Display initialsiert.

Ich dachte, dass Register LCDDR0 = 0x02; beschreiben um das Segment 
anzusteuern reicht.

Vielen Dank für eure Hilfe.

1
/*
2
 * Atmega169_Display_Ansteuerung.c
3
 *
4
 * Created: 13.01.2023 15:34:51
5
 * Author : 
6
 */ 
7
8
#include <avr/io.h>
9
#include "avr/io.h"
10
#include "avr/interrupt.h"
11
#include "avr/wdt.h"
12
#include <string.h>
13
#include <math.h>
14
#include <stdlib.h>
15
16
void LCD_Init(void)
17
{
18
  
19
  
20
  /*
21
  DDRA = (1<<DDA0) | (1<<DDA4) | (1<<DDA5) | (1<<DDA6) | (1<<DDA7);  
22
  DDRF = (1<<DDF3);
23
  PORTF &= ~(1<<PF3);
24
  DDRE |= (1<<DDE3);
25
  PORTE &= ~(1<<PE3);
26
  */
27
  
28
  // Es wird der System Clock am Anfang verwendet
29
  
30
  // static Bias and static duty, SEG0:SEG23 werden von LCD Treiber verwendet
31
  
32
  LCDCRB &= ~(1<<LCDCS);
33
  LCDCRB |= (1<<LCDPM1) | (1<<LCDPM2);
34
  
35
  
36
  // Prescaler von 4096
37
  // clock divide von 8
38
  
39
  LCDFRR |= (1<<LCDPS2) | (1<<LCDPS1) | (1<<LCDPS0) | (1<<LCDCD2) | (1<<LCDCD1)  | (1<<LCDCD0);
40
  
41
  // Set segment drive time auf die Hälfte der eingestellten Frame Rate  and output voltage to 3.0 V
42
  
43
  LCDCCR |= (1<<LCDCC3);                        // 3.0 V
44
  LCDCCR |= (1<<LCDDC2) | (1<<LCDDC1) | (1<<LCDDC0) | (1<<LCDMDT);  // Maximum Drive Time
45
  
46
  // Enable LCD, default waveform and no interrupt enabled
47
  LCDCRA |= (1<<LCDEN);
48
}
49
50
void LCD_update(void)
51
{
52
  /* LCD Blanking and Low power waveform are unchanged. */
53
  /* Update Display memory. */
54
  LCDDR0 = 0x02;
55
  LCDDR1 = 0x00;
56
  LCDDR2 = 0x00;
57
}
58
59
int main(void)
60
{
61
62
MCUSR=0;          // den Watchdog abschalten
63
wdt_disable();
64
65
MCUCR=0xFF;          // JTAG abschalten
66
MCUCR=0xFF;
67
68
69
PRR&=~((1<<PRLCD));     // Power Reduction für gewisse Bereiche des MCUs -- für LCD deaktivieren
70
71
  
72
void LCD_Init();
73
void LCD_update();
74
void LCD_update();
75
void LCD_update();
76
77
 while (1)
78
 {
79
   
80
   
81
 }
82
 
83
 
84
}

von Crazy Harry (crazy_h)


Lesenswert?

Was ist ein LCD-Display? Ahhhh ein Liquid Cristal Display Display :-D 
SCNR

von Kurbel (kurbel)


Lesenswert?

Ups, das war wohl ein D zuviel :D

Beitrag #7324272 wurde von einem Moderator gelöscht.
von logiker (Gast)


Lesenswert?

Kurbel schrieb:
> Den folgenden Code habe ich via ISP auf den MCU hochgeladen,
> leider tut sich nichts. Hat jemand eine Idee, was ausgebessert gehört.

Ich würde mal versuchen statt des abgebildeten Codes eine
kompilierte Version in den Controller hineinzuladen.

von Silophoph (Gast)


Lesenswert?

Hast du schon mal ins GCC Tutorial geschaut? 
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Vor allem: 
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

Da steht alles gut erklärt drin.

Komm, Peiler, komm schrieb im Beitrag #7324272:
> Außer, daß sich die üblichen Idioten an einem Buchstaben aufgeilen, wird
> wohl nichts Sinnvolles mehr kommen. Hier kann man dann offenbar das Buch
> zuklappen.

Da dein Post ebenso nichts Sinnvolles enthält, schließt du dich bei 
"Idioten" mit ein?

von Edi R. (edi_r)


Lesenswert?

Silophoph schrieb:
> Hast du schon mal ins GCC Tutorial geschaut?
> https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
>
> Vor allem:
> https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

Obwohl das offenbar der bisher einzige sinnvolle Beitrag zur Frage des 
TO war, wird meiner Ansicht nach im verlinkten Tutorial keine brauchbare 
Antwort gegeben. Das Tutorial bezieht sich nämlich auf LCD-Module, der 
TO interessiert sich aber anscheinend für die Ansteuerung "nackter" 
LCD-Segmente. Der ATmega169P hat nämlich als Sonderausstattung einen 
4x25 Segment LCD Driver.

Leider kann ich aber nichts weiter dazu beitragen, weil ich damit selber 
noch keine Erfahrung habe.

von Michael U. (amiga)


Lesenswert?

Hallo,

mir fällt bei Atmega169P und LCD eigentlich erstmal das 
AVR-Butterfly-Modul ein, da sollten die Sourcen bei github zu finden 
sein.

Gruß aus Berlin
Michael

von Kurbel (kurbel)


Lesenswert?

Ja, es geht um direkte Ansteuerung eines LC Glasses. Um die Sache so 
einfach wie möglich zu halten, habe ich eine statische Ansteuerung 
gewählt, bei der jedes Liquid Cristal Element eine eigene 
Segementleitung hat.

Das Kapitel im Datenblatt über den LC Driver ist recht übersichtlich. 
Das Kapitel habe ich Schritt für Schritt durchgegangen und die Register 
gesetzt. Leider tut sich nichts.

Ich habe mir den Code des Evalboards AVR Butterfly heruntergeladen. Dort 
ist jedoch sehr viel drum herum in mehreren Dateien programmiert, sodass 
es für einen Anfänger recht unübersichtlich ist. Auch wenn ich in dem 
Codebeispiel z. B.: das  Schlüsselwort LCDDR0 suche, werde ich nicht 
wirklich fündig, da viel mit Pointern, Flash Zugriffen und Macros etc 
gearbeitet wird.

von c-hater (Gast)


Lesenswert?

Kurbel schrieb:

> Ja, es geht um direkte Ansteuerung eines LC Glasses. Um die Sache so
> einfach wie möglich zu halten, habe ich eine statische Ansteuerung
> gewählt, bei der jedes Liquid Cristal Element eine eigene
> Segementleitung hat.

Das ist ja witzig. Alle anderen müssen LCDs so nehmen, wie sie sind und 
ihren Code an die dadurch gegeben physikalischen Gegebenheiten anpassen.

Du hingegen kannst scheinbar vom Code aus die physische Konstruktion der 
LCDs ändern. Respekt...

von W.S. (Gast)


Lesenswert?

Michael U. schrieb:
> mir fällt bei Atmega169P und LCD eigentlich erstmal das
> AVR-Butterfly-Modul ein, da sollten die Sourcen bei github zu finden
> sein.

Ja, das hatte ich von so etwa 10 Jahren meiner kleinen Schwester 
geschenkt.

Aber mal im Ernst: Wozu taucht hier ständig "LDC mit Controller XYZ" bei 
den Hilferufen auf? Das Problem besteht doch aus 2 Teilen:
1. keine Kenntnisse über das vorhandene Display
2. keine (oder höchst mangelhafte) Kenntnisse darüber, wie man bei 
seinem auserkorenen µC ein Portpin auf Hi oder Lo setzt.

Dazu kommt noch, daß es den Anfragern offenbar zu mühsam ist, selbst 
etwas über beide 1. und 2. zu erlernen. Nein, da schließt man lieber das 
Dispay irgendwie an und wenn sich dann nix tut, wird hier gerufen "es 
tut sich nix! wo gibt's die passende Lib?"

Also, dem TO sei geraten, zu allererst die in 2. angesprochenen 
Kenntnisse zu erwerben (durch Lernen) und dann zu lernen, wie man (mit 
beliebigem Zeug) das vorliegende Display ansteuert. Datenblätter (so 
vorhanden) helfen dabei ungemein, wenn man sie liest und versteht.

Aber bei blanken LC-Gläsern kann man sich auch ohne behelfen:
Mit einer guten Lupe gucken, ob und wieviele kleine schwarze Punkte man 
am Rand entdecken kann. Das sind Metallkugeln, die als Quasi-Vias 
dienen, also um das Signal von dem Glas mit den Anschlüssen auf da 
gegenüberliegende Glas zu übertragen.
Wenn 1 Kügelchen zu entdecken war, dann ist das LCD wohl eines mir einer 
BP (Backplane).
Bei 2 Kügelchen liegt nahe, daß es sich um 2 BP handelt.
Bei 3 Kügelchen wird es vermutlich auch 2 BP haben, aber eine davon ist 
nicht durchgängig auf dem Glas, weswegen diese 2 Anschlüsse hat.
Bei 4 Kügelchen kann es sein, daß es 4 BP hat, aber es ist auch denkbar, 
daß es mehrere Anschlüsse pro BP hat.

Am einfachsten ist das LCD-Glas mit nur 1 BP anzusteuern. Sowas kriegt 
man auch mit popligen Portpins hin. Bei mehreren BP sieht das 
Pegelschema komplizierter aus, weil auch mehrere Amplitudenstufen 
benötigt werden. Das wäre dann ein Fall für einen speziellen 
Ansteuerschaltkreis oder einen µC, der wie der auf dem o.g. 
Butterfly-Board sowas eingebaut hat.

W.S.

von Kurbel (kurbel)


Lesenswert?

Das Display hat nur eine Backplane, die an besagtem Controller an Pin 51 
(COM0) anliegt.
Als ersten Test habe ich eine LED mit GPIO mit dem Atmega169 zum Test 
auf HIGH gesetzt und sie hat geleuchtet.

Des weiteren besitze ich Erfahrugen mit GPIO, Interrupts, Timern, ADC 
und RS232. Die Themen haben bisher gut geklappt.

Ich hoffe es kommt vielleicht der zündende Tipp von jemandem, der mit 
dem Atmega169 gearbeitet hat.

von Hugo H. (hugo_hu)


Lesenswert?

Hast Du Dir die AVR064.pdf (App-Note) bzw. das passende Code-Beispiel 
dazu mal angeschaut?

Falls Du den Code suchst:

https://community.element14.com/products/devtools/technicallibrary/w/documents/13134/atmel-avr064-stk502---a-temperature-monitoring-system-with-lcd-output

: Bearbeitet durch User
von Michael B. (laberkopp)


Lesenswert?

c-hater schrieb:
> Das ist ja witzig. Alle anderen müssen LCDs so nehmen, wie sie sind und
> ihren Code an die dadurch gegeben physikalischen Gegebenheiten anpassen.
> Du hingegen kannst scheinbar vom Code aus die physische Konstruktion der
> LCDs ändern. Respekt...

Ich befürchte eher, du hast aus Hass mal wieder Nichts verstanden, und 
paulst hier rum wie ein Walross.

Beitrag #7324449 wurde von einem Moderator gelöscht.
von Hugo H. (hugo_hu)


Lesenswert?


von Edi R. (edi_r)


Lesenswert?

Kurbel schrieb:
> Als ersten Test habe ich eine LED mit GPIO mit dem Atmega169 zum Test
> auf HIGH gesetzt und sie hat geleuchtet.

Eine LED leuchten zu lassen, ist was anderes. Ist dir eigentlich klar, 
dass LCD-Segmente nicht längere Zeit mit Gleichspannung betrieben werden 
dürfen?

von c-hater (Gast)


Lesenswert?

Kurbel schrieb:

> Das Display hat nur eine Backplane, die an besagtem Controller an Pin 51
> (COM0) anliegt.

Wenn das wirklich so ist, dann vereinfacht es die Sache. Aber eine 
"statische" Ansteuerung bleibt natürlich weiterhin völlig unmöglich. Das 
killt zuverlässig das LCD..

von c-hater (Gast)


Lesenswert?

Viehzeug-Erkennung schrieb im Beitrag #7324449:

> Eines Tages schlägt Dir mal jemand so in die Fresse, daß Lippen und Nase
> vollkommen plan sind. Den Tag feiere ich!

Naja, Leute mit geringen intellektuellen Fähigkeiten sind halt relativ 
leicht zu bespaßen...

von W.S. (Gast)


Lesenswert?

Kurbel schrieb:
> Ich hoffe es kommt vielleicht der zündende Tipp von jemandem, der mit
> dem Atmega169 gearbeitet hat.

Ich hatte vor vielen Jahren mit diesem µC gearbeitet und auch dessen 
LCD-Ansteuerung benutzt. Und der zündende Tip sollte von dir selbst 
kommen - beim Lesen der Dokumentation zum Chip. Es geht eigentlich 
leicht, man muß es nur lesen wollen.

W.S.

von Kurbel (kurbel)


Lesenswert?

Edi R. schrieb:
> Eine LED leuchten zu lassen, ist was anderes. Ist dir eigentlich klar,
> dass LCD-Segmente nicht längere Zeit mit Gleichspannung betrieben werden
> dürfen?

Ja, das ist mir klar. Das war nur als Gegenargument gedacht, weil mich 
manche als Ahnungslosen darstellen wollten. Wie gesagt habe ich von 
diesen Themen schon gehört und mit ihnen gearbeitet.
Und ich habe ich über die physikalische Funktionsweise der Displays 
informiert. Diese müssen über Wechselspannung bzw. Umpolung von 
Backplane und Segment Line betrieben werden.

W.S. schrieb:
> Es geht eigentlich
> leicht, man muß es nur lesen wollen.

Bisher habe ich den LCD Teil mehrmals gelesen. Im Datenblatt ist das 
Mapping angegeben zu den Registern, jedes Segment hat sein eigenes Bit. 
Daher dachte ich, die Zeile wurde ein Element aufleuchten lassen.

LCDDR0 = 0x02;

Die Initialisierung des Displays bin ich Schritt für Schritt 
durchgegangen.
Gerade lese ich mir noch die Abschnitte IOs, Fuses, Clock, Interrupts im 
Datenblatt durch.

Wie gesagt sind die Beispielcodes recht kompliziert, da mit Flash 
Zugriffen und Pointern gearbeitet wird.

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.