LCD Display Ansteuerung mit Atmega169P

OP #7324227
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
}
Beitrag #7324272 wurde von einem Moderator gelöscht.
Gast #7324283
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:

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?

#7324295
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.

OP #7324304
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.

Gast #7324336
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...

Gast #7324351
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.

OP #7324406
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.

Beitrag #7324449 wurde von einem Moderator gelöscht.
Gast #7324483
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..

Gast #7324705
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.

OP #7326115
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren