Ein Beispiel für die Ansteuerung gibt es hier:
http://www.woe.onlinehome.de/lcd.htm
Allerdings habe bisher nur c-ähnlich Sprache programmiert und kann mit
dem Code nichts anfangen.
Das erste Bit R/W muss ja 0 sein um zu schreiben. Das 2. Ist das Display
das ich ansteuern möchte (also BANK 0, das erste Display). Dann kommt
der Segment Byte Vector, aber ich verstehe nicht warum das 6bits sind
und was man da rein schreiben soll.
Kann mir denn keiner helfen?
Hallo Samuel,
schau' Dir mal Fig. 3 an. Dort wird der Aufbau des Control-Bytes genau
erklärt. die Bits 3..5 stellen die den Teil I2C Adresse dar, die
normalerweise in den Bits 1..3 des Startbytes steckt. Für den 8577 ist
allerdings eine 7 Bittige Adresse fix vom Hersteller vorgegeben. um
denoch mehrere identische Bausteine am selben I2C Bus betreiben zu
können wandert der Adressvektor eben ins Control-Byte. Das gesendete
Bitmuster muss der Beschaltung an A0..A2 enstsprechen, damit der Bautein
adressiert wird.
Viele Grüße,
Marcus
Ich hab den Schaltplan vom oberen Link genommen, da wird bei A0 aber der
Oscillator angeschlossen und an A2 hab ich BP2 angeschlossen. A1 ist
GND. Das heißt die Adresse wäre dann 0-0-0, stimmt das?
MODE BANK |--ADRESS---| SEGMENT DISPLAY
Also muss ich 1 - X - 0 - 0 - 0 - 0 - 0 - 0 senden.
Und danach 1 Byte für die Segment daten.
Und dann das Stop Signal.
Dazwischen muss doch dann noch immer ReadAck oder?
Ja,
passt.
das achkowledge darfst Du NICHT senden, das sendet das Empangende IC.
Wenn Du alo kein ACK bekommst, kannst Du davon augehen, daß irgendetwas
beim Adressieren des ICs nicht funktioniert hat. (Fehler in der
Addressierung, mieses Timing, uswusf.....)
Danke, das Display zeigt jetzt was an, allerdings ist das ein bisschen
komisch. Ich werd mal ein bild posten. Ich glaube die Buchsenleiste die
ich verwende ist nicht geeigne - wenn ich das D. draufpresse erscheinen
mehr segmente. Außerdem sind mache halbhell und andere ganz schwarz.
Zudem leuchten mehr Segmente als 8. Ich kann aber nichts genaueres
sagen, da ich Segmente einfach von S1-32 angeschlossen habe ohne die
Pinbelegung zu beachten. Später korrigiere ich das per Software.
Samuel K. schrieb:> Ich hab den Schaltplan vom oberen Link genommen, da wird bei A0 aber der> Oscillator angeschlossen und an A2 hab ich BP2 angeschlossen. A1 ist> GND. Das heißt die Adresse wäre dann 0-0-0, stimmt das?
Welchen Schaltplan? Im Datenblatt sind mehrere.
BP2 wird nur angeschlossen, wenn Du ein Diplay mit zwei "Backplanes"
bemutzt. Es kommt also auf das Display an, ob Du "Direct Drive" oder
"Duplex Drive" einstellen musst.
Ich habe mal einen PCF8576 verbaut und kann nur empfehlen: sieh' Dir das
Display genau an! Es gibt welche mit bis zu 4 Backplanes.
Ach, jetzt habe ich auch endlich den Schaltplan gefunden, den Du
(wahrscheinlich) meinst - ein direkter Link wäre hilfreich gewesen. Dort
ist nämlich nur BP1 angeschlossen, was bedeutet "Direct Drive", also Bit
muss Null sein. --> Das kann schon Deine unterschiedlichen Helligkeiten
erklären (siehe auch Fig. 5 im Datenblatt)
Samuel K. schrieb:> Hier noch die Bilder. Woher weiß ich eigentlich wierum das display> reinmuss? Soll der Haken nach unten oder oben zeigen?
Siehst Du den Dezimalpunkt auf dem Display? Das ist gewöhnlich unten.
HolgerT schrieb:> Siehst Du den Dezimalpunkt auf dem Display? Das ist gewöhnlich unten.
Da hatte ich irgendwie ein Brett vorm Kopf. Danke.
Im Datenblatt steht 32/64 Segment Treiber.
Das heißt ich müsste auch 2 Displays mit je 32Segmenten betreiben
können.
Ich habe das vom Reichelt:
http://www.reichelt.de/?ACTION=3;ARTICLE=10182;PROVID=2402
Das hat 2 Backplanes die kann man aber auch verbinden und hat dann nur
eine. Bei 2 Displays hab ich dann 32Segmente mit 2BPs.
Achja ich hab noch 5Segmente nicht verbunden. Aber das dürfte doch
nichts machen, oder?
EDIT:
Den Code hab ich bisher genutzt:
Ich vermute das mit dem Code alle Segmente an gehen:
1
#include<avr/io.h>
2
#include"i2cmaster.h"
3
4
#define LCD 0b01110100
5
6
intmain(void)
7
{
8
i2c_init();
9
{
10
i2c_start_wait(LCD+I2C_WRITE);
11
i2c_write(0);
12
i2c_readAck();
13
i2c_write(0xFF);
14
i2c_readAck();
15
i2c_stop();
16
}
17
while(1)
18
asmvolatile("nop");
19
}
Bei mir gehen nur so ca. 20 an, da ich 5 Leitungen noch nicht verbunden
sind und irgendwie min. 3 Leitungen unterbrochen sind. (ich habe bisher
erst 20pins von 40 überprüft).
EDIT: Stimmet doch nicht, ich habe mich vermessen.
Wenn ich es jetzt anschliesse leuchten 8 Segmente bei obrigem Code. Wenn
ich nun auf das Display am Rand drücke leuchten viel mehr auf und
bleiben an.
Sehr komisch:
Wenn ich in dem Code Beitrag "Re: IC2 mit PCF8577"
eine Wartezeit von 500ms einfüge, dann leuchten erst 8Segmente, dann ein
paar andere dazu an, danach gehen die meisten aus, und in den letzten
500ms gehen alle bis auf 2 aus.
Wenn ich as richig sehe, hat dieses Display nur eine Backplane.
Die ist allerdings auf 2 Pins des Displays auffgelegt. Nimm 'mal BP2
weg,
Brücke (am Display Pin 1 und 400 und verwende "DirektDrive".
Das sollte funktionieren.
Gruss,
Marcus
PIN 1 und 40 sind am !Display! nicht verbunden. Ich hab die bisher immer
verbunden gehabt. Directdrive verwende ich auch schon die ganze Zeit.
Ich hab jetzt noch mal alle verbindungen überprüft auf seitlich
verbindungen oder Gegenüberliegende. Ein paar hab ich gefunden, es
ändert sich aber nichts.
Mit dem Prog. sollten alle Ziffern nacheinandern leuchten:
1
#include<avr/io.h>
2
#include"i2cmaster.h"
3
#ifndef F_CPU
4
#define F_CPU 1000000UL
5
#warning F_CPU
6
#endif
7
#include<util/delay.h>
8
9
#define LCD 0b01110100
10
11
intmain(void)
12
{
13
i2c_init();
14
for(uint8_ti=0;i<4;i++)
15
{
16
for(uint8_to=0;o<8;o++)
17
{
18
i2c_start_wait(LCD+I2C_WRITE);
19
i2c_write(32+i*2);
20
i2c_readAck();
21
i2c_write(1<<o);
22
i2c_readAck();
23
i2c_stop();
24
_delay_ms(500);
25
}
26
}
27
while(1)
28
asmvolatile("nop");
29
}
Am Ende müssten dann 4 Ziffern noch an sein, da nach dem Übergang zum
nächsten Digit das alte nicht gelöscht wird.
Allerdings leuchten manchmal 2 Segmente gleichzeitig auf und manschmal
auch keins.
hm. Für mich sieht das inzwischen massiv nach Verdrahtungsproblem aus.
Ich setze diese Displays immer direkt über das Treiber-IC. (Stack) Das
lässt sich dann (fast) 1:1 verbinden und braucht kaum mehr platz als das
Display selbst.
Und noch ein kleiner Tipp für die "32":
Du gehst an dieser Stelle mit Bitvektoren um, also solltest Du "|" und
"<<" statt "+" und "*" nehmen. Dann weisst Du auch noch in ein paar
Jahren, was du da vorhattest....
Also: i2c_write(0x20 | i << 1);
...und wenn Du es ganz Richtig machen möchtest, legst du die Definition
der I2C-Adresse brav im zugehörigen Header-File.
#define DISPLAY_I2C x020
Gruss,
Marcus
Macht es was das 1/2m Kabel zwischen Display und Treiber liegt?
Ich möchte es nicht darüber setzen, da am Ende 2 LCDs angeschlossen
werden sollen.
Für mich sieht es auch wie ein Verdrahtungsproblem aus, aber ich finde
den Fehler einfach nicht.
macht es was wenn nc pins verbunden sind?
Ich versteh das nicht, ich hab alle Pins mit allen überprüft, es sind
keine mehr verbunden.
ich tausch mal display und controller.
Du holst Dir halt mit so einer Strippe alle böse ans Display, dessen
Eingänge doch ziemlich hochohmig sind. Die 0.3mA Treiberstrom sind halt
auch nicht gerade üppig. Bei sauberer Verdrahtung mag das angehen, ich
denke mal, daß Du im Rahmen Deiner Nachforschungen schon ordentlich an
den Kontaktierungen 'rumgebraten hast ;-)
Mein Vorschlag wäre:
1) Verkabelung IC -> Display komplett weg.
2) Pause machen ( Laufen gehen oder sonst irgendwas was den Kopf frei
macht)
3) Die Verkabelung nochmal SYSTEMATISCH aufbauen.
Gruss,
Marcus
Mitten drin während dem Prog das alle Segmente nacheinander zeichnet
sieht man den Fehler. Da wird das 2. und 4. Digit gleich angesteuert.
Das heißt jedes Segment im 2. Display ist auch im 4. an. Das kann
irgendwie kein Hardwarefehler sein.
1
#include<avr/io.h>
2
#include"i2cmaster.h"
3
#ifndef F_CPU
4
#define F_CPU 1000000UL
5
#warning F_CPU
6
#endif
7
#include<util/delay.h>
8
9
#define LCD 0b01110100
10
11
intmain(void)
12
{
13
i2c_init();
14
for(uint8_ti=0;i<4;i++)
15
{
16
for(uint8_to=0;o<8;o++)
17
{
18
i2c_start_wait(LCD|I2C_WRITE);
19
i2c_write(0x20|(i<<1));
20
i2c_readAck();
21
i2c_write(1<<o);
22
i2c_readAck();
23
i2c_stop();
24
_delay_ms(500);
25
}
26
}
27
while(1)
28
asmvolatile("nop");
29
}
Ich mach mal ein Video.
Nochmal bauen... hmmm... ungern. Die Hardware muss eigentlich stimmen.
Ich hab sogar bei dem Display die 780 Möglichkeiten der ungewollten
Verbindungen geprüft.
...dann setz' i mal konstant auf 0x01 und dann in einer 2. Version
Deines Testprogramms auf 0x03. ( for schleife mal auskommentieren )
Was machen die Digits ?
Probier ich gleich aus. Hier erst mal das vid. Windows nutzer können es
mit dem Mdeiaplayer abspielen. Bei Linux weiß ich es nicht. Codec ist
DivX.
Bei i = 1 sind wieder die doppelten segmente. Bei i = 3 ist es das
endbild vom vid:
Digit
1 2 3 4
_
|
|
Dabei ist es ein Standbild und verändert sich nicht.
Du solltest dringend die Digits kongruent anschliessen. Das ist sonst
wirklich Ratererei. Dass dein 4. Digit 3 Segmente auf enimal anzeigt,
das 2. aber nciht ist einklares Indiz auf unsaubere Verkabelung gepaart
mit Schmutz auf dem Kabel.
Nimm Dir die Zeit. Das ist eine gute Investition.
Gruss,
Marcus
Das verrückte ist ja noch ich hab die ganzen Verbindungen geprüft, es
müsste funktionieren.
Aber das mit den 3 Segmenten ist sehr komisch: Wenn ich ein Programm
schreibe das sie blinken lassen sollte bleiben sie an.
Die ReadAck hab ich über den EEProm auch überprüft, die stimmen.
Warum darf man eigntlich kein readAck nach start setzen? Wartet start
automatisch auf den Ack?
So ich mach jetzt einfach mal Messungen. Mit dem Wechselstrom
messfunktion geht das zum Glück.
1
i2c_start_wait(LCD|I2C_WRITE);
2
i2c_write(0x20|0);
3
i2c_readAck();
4
i2c_write(0x01);
5
i2c_readAck();
6
i2c_stop();
7
_delay_ms(500);
Das erste Segment sollte an sein.
Es leuchten allerdings 3 Segmente:
1
1 2 3 4
2
_
3
_
4
.
Am PCF liegt Wechselspannung an Pin 16, 24 und 26 an.
Spanungsversorgung abgeklemmt, Auf Brücken gemessen, nichts.
Das soll ein Hardwarefehler sein???
Nächstes Segment. Im Code eine 0x02 eingefügt. 2 Segmente sind an:
Moin!
Wie hast Du geprüft ? Multimeter ? Sichtprüfung ? Oszilloskop?
Es [i]müsste[/i] funktionieren gilt nicht.
[[Édit: Eben gelesen: Wechselstrommesseingang. Naja. Geh' mal mit dem
Skop dran. Ist bei deinen Messungen das Diplay mit angeschlosen ?
Mach mal Bilder von den Boardrückseiten.
Daß sie anbleiben ist ein weiteres Indiz für eine vergurkte Verkabelung.
wie ich bereichts diverse Postingsvorher schrieb (seufz) snd die
Eingänge von LC-Displays sehr hochohmig. die müssen auf ein
ordentliche Potential gezogen werden, sonst zeigen die alles Mögliche
an.
Ich kenn die AVR I2C Library nicht, ich nehme an das lsens des
Acknowledge steckt in i2c_start_wait drin. Wenn vorhanden -->
Quellcodestudium.
Alle Segmente eines Digits schalest Du an, indem Du 0xFF in das
entsprechende Register schreibt.
Gruss,
Marcus
Ich hab nur ein Multimeter. Mehr nicht. Aber ich könnte mal Probieren
mir in einer Stunde ein 1kHz Atmega Oszi zu bauen.
0x04
1
1 2 3 4
2
_
3
_
4
_
pin14,22,27
Ich mach mal noch die 4. MEssung. Es fällt ja schon auf, dass der
Abstand zw. 1 und 2. pin 8 ist. Außerdem ist Segment A von Digit 2
immer an.
Rein auf Vermutung hab ich 0x01 noch mal gemessen. Da sind es die Pin
16,24,27!.
Also ist 27 das gesuchte Segment das immer an ist.
Also wird es die ganze Zeit angesteuert.
OK, 4. MEssung - erwartetes Ergebnis stimmt:
13, 21, 27.
Also wird immer ein Pin angesteuert, dazu pin + 8 und 27. Wie kann das
ein Hardwarefehler sein?
...dann klemm' das das Dipsplay erstmal ab und verifiziere Deine
ausgegebenen Testpattern direkt am PCF.
Erst wenn das **zweifelsfrei* funktioniert** klemmst Du as Display
wieder an.
habs grad bei den 0x08 prog getestet stimmt überein bei gezogenem
Display.
Und auch wenn ich dsa ganze Flachbandkabel ziehe stimmt es mit den
anderen werten überein.
beschreib nochmal genau, welche Pattern du schreibst, und was du jeweils
misst.
Prüfe die Board-Unterseite auf Schlüsse (litze!)
Schreibe die Patterns nicht in einer Schleife, sondern one-shot.
Eventuell baust Du dir einen taster an, mit dem du dein testpattern
weiterschalten kannst ( entprelen nicht vergessen), dann spart Du dir
das ständige neuflashen.
Deine Software ist -auf Sicht geprüft- ok.
Evenuelle timing-Probleme auf dem Bus aussen vor. Btw: ist der I2C Bus
mit Pullups versehen ?
IC2 Bus ist mit 4k7 pullup. Auf Verbindungen die nebeneinander liegen
könnten, habe ich mehrmals geprüft (gegenüber auch).
Die Clock des IC2s ist auf 100kHz gesetzt ist das zu viel?
Zur Beschreibung:
1
SegmentDaten | Digit | Wechselspannung an Pins des PCF
Der I2C Bus ist bei Dir Hardwareseitig ok, die Kommunikation steht auch
( du bekommst ja auch für das ein oder andere Segment eine brauchbare
Anzeige. I2C geht locker bis 400kHz.
Wenn du nur ein Bit im Segmentvektor setzt, wird auch nur dieses Pin am
Ausgang Aktiviert. Wenn du also mehrere Pins mit Pegel "misst" si die
wahrschinlichkeit eines Softwarefehlers eher gering.
Ich habe da allerdings so einen vagen verdacht, wenn ich mir das Pinout
des 8577 ansehe und mit den Bildern deines Aufbaus und er von Dir
angefertigten Tabelle vergleiche.
hast Du die Unterseite gefädelt ?
Beim Fädeln wären die Drähte u.U. diagonal zwischen den PINS verlaufen.
Bei Deinem Aufbau ( Direkt auf Tischplatte) baut man gerne mal
kapazitive Einkopplungen auf ( ich wiederhole mich nur ungern:
LC-Display -> hochohmige Eingänge)
Streifenraster taugt für diese Anwendung wenig, wenn du die Streifen
nicht kurzhälst ( an der Pfostenleiste) das wirkt alles zusammen wie
eine Antenne für das Display.
However; Dein Drahtverhau sieht nicht sehr Vertrauenerweckend aus.
Miss mal bitte im Gleichspannungsmessbereich gegen Gnd.
Hüstel, das war dann 'ne blöde Idee....
Du kannst en 8577 als Portextender verwenden; dann kannst du
entsprechend messen. Ich bin mir jetzt nicht sicher, ich glaube dazu
musst du den Internen Oszillator lahmlegen. Ausserdem ist es nicht
ungeschickt, die Ausgänge mit testloads zu beaufschlagen (siehe
Datenblatt) dann können sich denfinierte Pegel einstellen.
Schau dir mal die Streifendurchtrennungen an. Du möchtest da 1 mm
isolaton dazwischen haben.
was sind testloads?
Dss wird schwer. Ich müsste die Abstände im Streifenraster verdoppeln.
Außerdem ich hab jetzt ein Oszi. 6 Kanal und Frequenz so schnell wie der
AVR messen und über die serielle Schnittstelle zu Pc senden kann.
Software zum empfangen ist auch fast fertig.
also ich messe mit 2000Hz Abtastfrequenz eine Rechteckähnliche
Schwingung.
Sollten 2000Hz zu niedrig sein, bis 7000 sollte es auch gehen mit ein
bisschen mehr aufwand.
Ich nehme an, du misst mit soundkarte, richtig ?
Wie ist der Messaufbau ?
Zeitachsendimensionierung ?
Y Achse Dimension ?
Wie ist der Oszillator des 8577 denn aktuell beschaltet ?
Lies im Datenblatt nach: Wie ist fLCD angegeben ?
Passt das Alles zusammen ?
Mein Hinweis auf das messen mit Oszilloskop bezog sich nicht auf die zu
messende Frequenz sondern auf die Belastung des Ausgangs mit dem
Messmittel.
Es gibt den Spruch "Wer misst misst Mist". Du musst dafür sorgen, dass
Du in Deiner Anordnung alle potentiellen Störquellen beseitigst und
möglichst viele Parameter so einstellst, dass sie wohldefiniert sind.
Wenn Du ein steckbrett besitzt: Packe den 8577 erstmal dadrauf;
terminiere die ausgänge mit 6k8 widerständen ( meinetwegen auch 10k )
führe den I2C Bus über nicht allzu lange Strippen an's IC ( kannst Du
aus Deinem bestehenden Aufbau abweigen ) und messe DORT. Wenn Du
verstanden hast, was du misst, darfst Du mit diesen neu gewonnenen
Erkenntnissen zurück auf die Ursprungsschaltung.
Viele Grüße,
viel Erfolg
Marcus
Nein ich messe nicht mit der Soundkarte. Das ist ein Atmega an der
seriellen Schnittstelle. Die Frequenz variiert von 1900 - 2000Hz. Das
mit den Widerständen mach ich mal.
Wegen der Y Achse: Ich war zu faul das noch einzuprogrammieren, die
X-Skala hat mich schon genug debugging gekostet.
lass die Oszillatorschaltung erstmal weg. dann benimmt sich der 8577 wie
ein Portextender. Er sollte somit je nach gesetztem segment bit den
entsprechenden ausgang auf low oder high ziehen. Hatte ich das nicht
schon weiter oben erwähnt ?
Damit weisst Du nach, daß deine Software funktioniert. (Wird das, was
über den I2C Bus gesendet wird an den Ausgängen dargestellt ? )
Kann es sein, daß du dich zu sehr in Aktionismus flüchtest, und weniger
versuchst zu verstehen, was Du da tust ?
Leg dein Skope erstmal weg. Du hast nicht verstanden, worauf es bei der
Messung ankommt und so sieht Dein "Messergebnis" aus.
Und was misst Du ?
Vorschlag fuer Testpattern (BANK A 3-2-1-0):
0x00,0x00,0x00,0x00
0x01,0x02,0x04,0x08
0x11,0x22,0x44,0x88
weitere Pattern nach belieben
Wenn der Oszillator nicht läuft, solltest Du DC messen koennen.
Mit beschaltetem Oszillator stellt sich eine Schwingung mit der Fequenz
fLCD ein. ( Auf den jeweiligen PINS)
Digit | Data | Segmente
0 | 0x01 | 16,24
0 | 0x02 | 15,23
0 | 0x04 | 14,22
2 | 0x01 | 8,16 !!!
2 | 0x02 | 7,15
4 | 0x10 | 4,14 !!!
6 | 0x01 | 6,7 !!!
6 | 0x02 | 6,7 !!!
6 | 0x04 | 6,7 !!!
6 | 0x08 | 6,7 !!!
6 | 0x10 | 6,7 !!!
Die LED Reihen hab ich doch nicht benutzt. Ich hätte zwar 20kOhm
WIderstände nehmen können, aber das gefällt mir trotzdem nicht (leuchten
tun sie trotzdem).
Ich denke das reicht. Bei 2 und 4 wird +8 gedoppelt. Bei 4 und 6 sind
die Ergebnisse entsprechend undef.
noch ein 2. 4 Wert:
4 | 0x01 | 8,14 !!!
Der PCF8577 ist nur wie in Fig17 angeschlossen. Die Pin S1-S32 sind nc.
Geprüft habe ich sie indem ich mit einem Draht, der über einen 10kOhm +
LED zu GND führt, über die Pins gefahren bin.
Du hast also BP1, BP2/A2, A1 und A0 auf Gnd gelegt, wie in Fig 17
gezeigt?.
Gut.
Wie schreibst Du?
Mode=0
Bank=0
A2=V5=0
A1=V4=0
A0=V3=0
V2..V0: Adresse
I2C Adresse=0x74+(rw)?1:0;
also: <start> <0x74> <00> <01> <i2c stop>
sollte eine 1 ins Register 0 schreiben
tut es das?
Ein passendes Display hätte ich da, nur den pcf8577 momentan nicht.
Müßte ich bei der nächsten Bestellung mal mit drauf schreiben. Dann kann
ich das mal an meinem STK500 ausprobieren.
Die Fleury-Libs habe ich nie benutzt, sondern immer die von Atmel
selber.
fchk
Ich habe mir eben mal den Quelltext der Library durchgelesen.
Nur mal so zum test:
nimm mal die readAcks 'raus. die warten nämlich nicht auf auf ein
acknowledge sondern wollen gerne ein byte vom bus lesen. und damit ist
das komplette Protokoll im Eimer.
Der Funktionsname ist ein wenig irreführend muss ich sagen....