Forum: Mikrocontroller und Digitale Elektronik Nokia 3310 LCD Ansteuerung mit MSP430F5438


von Peyman M. (mzoghian)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche wie bereits oben geschrieben ein NOKIA 3310 LCD mit dem 
MSP430F5438 anzusteuern und etwas auszugeben. Den Code habe ich als 
Anhang beigefügt.
Der Code funktioniert soweit, jedoch nur solange ich in der Funktion 
CLK_init() im Register UCSCTL5 DIVM_x schreibe. Aber der Code 
funktioniert nicht mehr sobald ich beispielsweise DIVS_x schreibe. So 
wie es den Anschein macht, reagiert die SPI Übertragung nicht auf die 
SMCLK sondern nur auf MCLK, obwohl ich bereits im Register UCB2CTL1 
SMCLK als Clock für die SPI-Übertragung ausgewählt habe.
Ich wäre sehr dankbar für nützliche Tipps und Hilfe.

: Verschoben durch User
von Clemens L. (c_l)


Lesenswert?

Zumindest die Initialisierung von XT2DRIVE ist falsch, weil "|=" nur 
dann funktioniert, wenn die Bits vorher auf 0 stehen.

Wenn SPI MCLK benutzen würde, dann hätte eine Änderungen von DIVS keinen 
Effekt.

Und was genau meinst du mit "funktioniert nicht"? Hast du kein 
Oszilloskop/Logic Analyzer?

von Peyman M. (mzoghian)


Lesenswert?

Mit "funktioniert nicht" meine ich, dass Nichts auf dem LCD-Display 
angezeigt wird, sobald man das DIVSX Bit setzt, ansonsten ist die 
Ausgabe ohne das DIVSX Bit korrekt.
Inwiefern ist die Initialisierung von XT2DRIVE falsch? Wie müsste man es 
richtig machen?

von Clemens L. (c_l)


Lesenswert?

Du musst die Bits, die auf "0" stehen sollen, auch löschen. Mit "|" geht 
das nicht. (Siehe Bitmanipulation.)

Und wie versuchst du, DIVS zu ändern?

von Peyman M. (mzoghian)


Angehängte Dateien:

Lesenswert?

Mir ist schon klar wie Bitmanipulation funktioniert! Aber warum soll ich 
XT2DRIVE löschen? Damit wähle ich doch den Frequenzbereich aus, bei dem 
ich arbeiten möchte.
Ich habe jetzt den Code, der nicht funktioniert als Anhang beigefügt. 
Dort kann man sehen, was ich mit DIVS_X meine und wie ich versuche es zu 
ändern.

von Clemens L. (c_l)


Lesenswert?

In UCSCTL6 steht der Wert XT2DRIVE_3. Nach dem Befehl "UCSCTL6 |= 
XT2DRIVE_2" ist dort immer noch XT2DRIVE_3.

Und das eigentliche Problem ist wahrscheinlich, dass du die 
Initialisierung von DIVM entfernt hast.
(Welche Frequenz hat eigentlich der Quarz an XT2?)

von Peyman M. (mzoghian)


Lesenswert?

Ich verstehe nicht, warum in UCSCTL6 der Wert XT2DRIVE_3 stehen soll? 
Woran erkennst du das?
Ich benutze einen 18 MHZ Quarz.
Ich habe auch schon DIVM und DIVS gleichzeitig benutzt und es 
funktioniert nicht. Das Problem ist, dass das ganze nur dann arbeitet 
wenn ich MCLK mit DIVM runterteile, obwohl MCLK für SPI gar nicht 
ausschlaggebend sein sollte.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peyman M. schrieb:
> Ich verstehe nicht, warum in UCSCTL6 der Wert XT2DRIVE_3 stehen soll?

Hast Du Dir mal angesehen, wie die Werte nach einem POR stehen? Das 
steht bei der Registerbeschreibung im "Family User's Guide".

http://www.ti.com/lit/ug/slau208o/slau208o.pdf, Seite 181.

Bits 15 & 14 sind nach POR beide gesetzt.

von Clemens L. (c_l)


Lesenswert?

Woher willst du denn wissen, dass das Problem mit SPI zu tun hat, und 
nicht damit, dass die CPU gar nicht mehr läuft?

von Peyman M. (mzoghian)


Lesenswert?

Das mit XT2DRIVE_3 hatte ich übersehen und wurde jetzt korrigiert. 
Jedoch habe ich immer noch das selbe Problem wie vorher.
Wenn die CPU nicht läuft dann würde doch der Code bei gar keiner Clock 
arbeiten oder nicht?

von Clemens L. (c_l)


Lesenswert?

DIVM = 4  =>  CPU läuft
DIVM = 0  =>  CPU läuft nicht

Wie wäre es denn einmal, zu testen, ob die CPU läuft, z.B. mit einer LED 
an einem GPIO?

von Peyman M. (mzoghian)


Lesenswert?

DIVM = 0 bedeutet doch nur fmclk/1 und DIVM = 4 => fmclk/16. Inwiefern 
sollte die CPU deswegen nicht laufen?
Ich habe eben festgestellt, dass die LCD anzeige läuft, auch wenn ich 
DIVS und DIVM gleichzeitig initialisiere. Bsp. :
DIVM_5 + DIVS_5 => läuft nicht.
DIVM_5 + DIVS_1 => läuft.
Das heißt das DIVM immer "kleiner" sein muss als DIVS damit das ganze 
läuft, aber warum?

von Clemens L. (c_l)


Lesenswert?

Peyman M. schrieb:
> Das heißt das DIVM immer "kleiner" sein muss als DIVS damit das ganze
> läuft, aber warum?

Wahrscheinlich, weil Delay() wegoptimiert wurde. Für so etwas nimmt man 
__delay_cycles().

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.