Forum: Mikrocontroller und Digitale Elektronik Probleme mit CS am EA-DIP204


von Marcel K. (viewer)


Angehängte Dateien:

Lesenswert?

Hallo zusammen hier im Forum, ich komme einfach nicht mehr weiter…

Ich habe Probleme mit dem CS am EA-DIP204. Dieser hängt an meinem 
Prozessor am PB0. Ich konnte das ganze auch sowohl mit dem Multimeter 
(LOW = 0.46V / HIGH = 4.69V) als auch mit dem Oszi messen. Ich möchte 
das Display gerne mit dem CS-Pin steuern. Wenn ich in der 
Initialisierung des DIP204 den CS-Pin auf LOW ziehe und diesen dann dort 
lasse, funktioniert das Programm fehlerfrei. Sobald ich aber, bevor ich 
etwas über SPI senden möchte, das CS auf LOW und nach dem senden wieder 
auf HIGH setzte, dann geht mein Programm nicht mehr, ich kann das nicht 
verstehen.
Ich habe schon probiert den CS mit einem PULL-UP und auch mal mit einem 
PULL-DOWN auszustatten (ich weiß das war unnötig aber ich hab echt alles 
probiert)
Laut Datenblatt des KS0073 darf die Zeit von CS-low zu SCLK-Low 60ns 
betragen. Das ist auch nicht das Problem.
Ich habe aus dem Defines [en/disable_dip204()] schon Funktionen gemacht 
damit ich besser debuggen kann. Auch die Optimization ist aus.

Vielleicht weiß von Euch jemand einen rettenden Tipp für mich…

Randbedingungen:
ATmega644P auf STK500
F_CPU 8MHz intern
EA-DIP204-4 blue über 2m Kabel am STK500
WINAVR mir Eclipse V3.4.2

PS: Die Funktion [wait_dip204_ready] geht noch nicht, wollte erst das 
mit dem CS hin bekommen. Deshalb taucht diese noch nirgends auf!

Viele Grüße,
Marcel

von Ansbach (Gast)


Lesenswert?

Marcel K. schrieb:
> dann geht mein Programm nicht mehr

Was heißt, dein Program geht nicht mehr? Bleibt es hängen, oder wo im 
Debugger befindet es sich dann? Oder geht nur das Display nicht mehr?

von Klaus (Gast)


Lesenswert?

Das mit den Brücken hast berücksichtigt?


SERIELLER MODUS
Das Modul kann auch mit synchron seriellen Daten beschrieben werden. 
Dazu muss die
Wechsellötbrücke 4/8 auf der Modulrückseite geöffnet und auf SPI 
geschlossen werden. Die
Spezifikation zur seriellen Datenübertragung finden Sie im 
Kontrollerdatenblatt KS0073 von Samsung
(z.B. http://www.lcd-module.de/eng/pdf/zubehoer/ks0073.pdf)

von Marcel K. (viewer)


Lesenswert?

Hallo und guten Morgen,
danke erst mal für eure Antworten!

@Ansbach:
Ja, das Diplay zeigt nichts mehr an! Beim debuggen läuft das Programm 
normal durch. Ich habe auch mal versucht, in der Initialierungsphase 
soetwas auszuprobieren, das hat dann geklappt.

init_spi4dip204();
DDRB  |=   (1<<PB0);              // EN Ausgang

enable_dip204();

delay_us(1000);

disable_dip204();
ex_function_set(LINE,LINE_4);
disable_dip204();

delay_us(1000);

enable_dip204();
ex_function_set(CURSOR,NORMAL);
disable_dip204();

delay_us(1000);

enable_dip204();
display_control(DISPLAY,ON);
disable_dip204();

delay_us(1000);

enable_dip204();
lcd_clear();
disable_dip204();

delay_us(1000);

enable_dip204();
cursor_home();
disable_dip204();

delay_us(1000);

enable_dip204();
entry_mode(CURSOR,INCREMENT);
disable_dip204();

delay_us(1000);

Sobald ich allerdings die en/disable_dip204()- Funktionen in die 
Senderoutine gepackt habe, lief das ganze nicht mehr!!!


@Klaus:
Ja, das habe ich alles berücksichtigt! Wie gesagt, es läuft ja wenn ich 
das CS nicht verwende.


Kann es sein, das die CS- Leitung intern irgendwie defekt ist? Mir ist 
auch aufgefallen, wenn ich den Reset-Pin des Display über einen Pull-Up 
oder einen Pull-Down (10k) beschalte, dass das Display trotzdem läuft. 
Seltsam. Ich habe das Display schon sehr lange und sehr oft in den 
Anfangsprojekten verwendet. Ich kann es nicht ausschließen, das es 
eventuell irgendwann mal etwas abbekommen hat. Aber dann dürfte es 
eigentlich gar nicht mehr gehen, oder? Damals habe ich die CS-Leitung 
fest mit GND verbunden gehabt und ein delay für alle Befehle verwendet. 
Das möchte ich jetzt verbessern mit Abfragen von BF und halt das 
CS-Signal!

Grüße...
Marcel(",)

von spess53 (Gast)


Lesenswert?

Hi

Kann es sein, das du mit CS das Display evtl. zu früh abschaltest?

MfG Spess

von Marcel K. (viewer)


Lesenswert?

Hallo Spess,

was meinst du mit: "zu früh abschaltest" ?? CS-LOW oder CS-HIGH?

Im Datenblatt vom KS0073 steht, dass dem Display mit dem 
"herunterziehen" des CS-Leitung signalisiert wird, beim nächsten "LOW" 
auf der SCLK-Leitung folgen Daten. Die Zeit zwischen CS-LOW und SCLK-LOW 
dürfen 60ns betragen. Das wird wohl locker eingehalten.
In den Beispielcodes die ich zu diesem Thema gefunden habe, wird auch 
nicht darauf geachtet, dass das CS-Signal eine bestimmt Zeit einhält!

Grüße, Marcel

von spess53 (Gast)


Lesenswert?

Hi

>was meinst du mit: "zu früh abschaltest" ?? CS-LOW oder CS-HIGH?

Eigentlich meinte ich CS-High bevor die Übertragung abgeschlossen ist.

MfG Spess

von Marcel K. (viewer)


Lesenswert?

Hallo Spess,

naja, sitze jetzt nicht davor, müsste ich testen. Aber da meine 
"spi_putchar()" eigentlich wartet bis das SPIF-Flag = gelöscht wurde, 
gehe ich mal davon aus. Vorher komme ich aus dem "spi_putchar" gar nicht 
raus (while-Schleife).
Daher denke ich, dass das Senden beendet ist bevor ich wieder CS-HIGH, 
mache!

Grüße, Marcel

von Marcel K. (viewer)


Lesenswert?

Hallo Forum,

leider konnte mir hier im Forum niemand bei meinem obigen Problem 
helfen. Trotzdem Danke für die Versuche.

Naja wie so oft, hilft es bei mir, dass ganze einfach mal ein paar Tage 
liegen zu lassen. Dann geht man bei einem Neuversuch ganze anders an die 
Sache ran.
Ich habe den Fehler gefunden und möchte jetzt wenigstens mitteilen, 
woran es gelegen ist. Vielleicht hilft es irgendjemand anderem einmal 
:o) Jetzt im nachhinein ist es ein echt total doofer Fehler, das ist 
schon fast peinlich gg

Es ist so, wenn man sich das Datenblatt des KS0073 anschaut, wird 
erklärt, wie eine serielle Kommunikation ablaufen soll. Die Übertragung 
beginnt mit einem „starting Byte“ und anschließend folgen dann die 
Datenbytes. Ich habe wegen der Übersicht, deshalb zwei Funktionen 
geschrieben. Die erste nannte sich „send_sof()“. Der Übergabe-Wert war 
dann die gewünschten RW bzw. RS bits. Also z.B. so 
„send_sof(WRITE_COMMAND)“. Nach jedem „send_sof() folgten dann die 
reinen Daten in der Funktion „send_data()“.
Naja, den Quellcode für das Display habe ich vor einigen Jahren 
geschrieben damit ich das Display verwenden kann. Damals habe ich aber 
die CS- Leitung nicht verwendet. Jetzt wollte ich, dass die CS-Leitung 
mit verwenden werden soll, so das alles seine Richtigkeit hat :o)

Ich dachte, ich muss jetzt einfach nur das CS-Signal in den Funktionen 
auf „LOW“ bzw. „HIGH“ ziehen und schon funktioniert es.

Ich kann gar nicht glauben wie blöd der Fehler eigentlich war.

Ich habe die CS-Leitung auf „LOW“ gezogen, das „send_sof()“ gesendet und 
dann die CS-Leitung wieder auf „HIGH“ gezogen. Anschließend wieder CS 
auf „LOW“ gezogen und nach senden der eigentlichen Daten CS wieder auf 
„LOW“ gelegt. Naja und darin lag halt der Fehler! Man kann ja am Display 
nicht mitten in der Übertragung einfach den Zustand der CS-Leitung 
ändern.
Jetzt habe ich den Quellcode so umgeschrieben, dass vor dem ersten 
senden, CS auf „LOW“ gezogen wird und erst nach dem letzten Datenbyte 
wieder auf „HIGH“ geht.

Jetzt klappts so wie es soll… :o)

Also danke noch mal für die Anteilnahmen und viele Grüße,

Marcel (",)

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.