www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD über GPIOs ansteuern


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Marco (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hi,

ich möchte gern mein neues LCD Display (mit einem integrierten ST7529)
mit einem STM32 Prozessor ansteuern, welcher allerdings keinen
Daten/Adressbus besitzt. Daher muss ich normale GPIOs verwenden.

Ist meine Schreibroutine (Displaydaten und Initialisierungsdaten) so
richtig?
void write_lcd(unsigned char addr, unsigned char data)
{
  // addr (Displaydaten = 1 oder InitDaten = 0) setzen    
  GPIOC->ODR = ((GPIOC->ODR & 0x10) | (addr << 4));

  // daten setzen 
  GPIOB->ODR = ((GPIOB->ODR & 0xFFFF) | data);
     
  // cs auf low setzen
  GPIOC->BRR = (1 << 8);

  // r/w auf low setzen
  GPIOC->BRR = (1 << 5);

  delay(100); 

  /* beide wieder auf high ziehen */
  GPIOC->BSRR = (1 << 8);
  GPIOC->BSRR = (1 << 5);

}


Gruß
Marco

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Marco schrieb:

>   GPIOC->ODR = ((GPIOC->ODR & 0x10) | (addr << 4));

Sollen die Bits 5..15 von ODR wirklich alle gelöscht werden? Wenn man
nicht wirklich alle Pins ansprochen will, dann sollte man unbedingt
BRR/BSRR statt ODR verwenden. Spätestens wenn ein Interrupt-Handler 
ebenfalls den Port anspricht wird das wichtig.

So kann man beispielsweise die Pins 4..7 gezielt auf einen Wert setzen, 
ohne den Rest zu verändern:
  GPIOC->BSRR = (0x00F0 << 16) | (addr << 4);

Von Operationen der Art
  GPIOx->ODR &= ...;
  GPIOx->ODR |= ...;
  GPIOx->ODR = (GPIOx->ODR & ...) | ...;
ist grundsätzlich abzuraten.

Autor: Marco (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Danke für den Hinweis mit dem ODR Register. Warum sollte man dieses 
nicht direkt verwenden?
GPIOC->BSRR = (0xFF << 16) | (data); 

Irgendwas mach ich hier noch falsch, wenn ich die Bits [0, 7] setzen 
möchte... Wenn data z.B. 0x30 ist, dann ist das dritte und vierte Bit 
gesetzt...

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Marco schrieb:

> Danke für den Hinweis mit dem ODR Register. Warum sollte man dieses
> nicht direkt verwenden?

http://www.mikrocontroller.net/articles/Interrupt#...

> Irgendwas mach ich hier noch falsch, wenn ich die Bits [0, 7] setzen
> möchte... Wenn data z.B. 0x30 ist, dann ist das dritte und vierte Bit
> gesetzt...

Zählst du die Bits von links nach rechts?

0x30 setzt das 5. und 6. Bit von rechts. Die übrigen Bits in [0,7] 
werden gelöscht. [8,15] bleibt unverändert. Wo ist das Problem?

Autor: Marco (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
A. K. schrieb:
> 0x30 setzt das 5. und 6. Bit von rechts. Die übrigen Bits in [0,7] sind
> gelöscht. [8,15] bleibt unverändert. Wo ist das Problem?

ok, dann ist mein Problem noch irgendwo anders. Weil bis jetzt das 3. 
und 4. Bit von rechts gesetzt werden und die anderen sind 0.

Autor: Marco (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
kann es sein, dass es daran liegt, wie ich die I/Os für den Datenbus 
konfiguriere? Bis jetzt versuche ich lediglich ein paar Werte ans 
Display zu senden.
//datenbus I/Os 
GPIOB->CRL &= ~0xFFFFFFFF; 
GPIOB->CRL |=  0x22222222;   //push-pull output        

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Wenn du die Pins 4 und 5 einschaltest und die Pins 2 und 3 werden aktiv, 
dann ist nicht die Pinkonfiguration falsch, sondern die Hardware (oder 
deine Zählweise beim Anschluss - alles schon mal dagewesen).

Schieb doch mal Einsen durch die Portpins, also erst Pin 0, dann Pin 1, 
etc. Du merkst dann, welcher Pin wo sitzt.

Autor: Marco (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
ich hab den Fehler gefunden. Ich muss die beiden Pins PB3 und PB4 
remappen, weil diese momentan vom JTAG Interface in Anspruch genommen 
werden.

(Seite 35 sind die beiden Pins)
http://www.st.com/internet/com/TECHNICAL_RESOURCES...

Hierzu muss ich das AFIO_MAPR Register laut UserManual entsprechend 
programmieren. Hier gibt es allerdings mehrere Möglichkeiten, die ich 
noch nicht ganz verstehe:

GPIO_Remap_SWJ_Disable
GPIO_Remap_SWJ_NoJTRST
GPIO_Remap_SWJ_JTAGDisable

Und vor allem, kann ich den Prozessor anschließend immer noch ohne 
Probleme neu programmieren?

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
JTAG/SWJ remappen geht nicht, abschalten geht. Nur ist dann natürlich 
kein Debugging möglich. Programmieren per JTAG/SWJ geht m.E. schon, denn 
nach dem Hardware-Reset ist das ja wieder drauf. Ausserdem kann man per 
Bootloader programmieren.

SWJ geht auch ohne diese beiden Pins, die werden nur fürs komplette JTAG 
verwendet. Siehe Table 37 (9.3.5) in der Reference.

Autor: Marco (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
ok, es funktioniert!

Eine Frage hab ich noch: wenn ich Daten vom Display Lesen möchte, muss 
ich dann die Datenbus I/Os als Input mit Pullup/down oder als floating 
Input installieren?

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Marco schrieb:

> Eine Frage hab ich noch: wenn ich Daten vom Display Lesen möchte, muss
> ich dann die Datenbus I/Os als Input mit Pullup/down oder als floating
> Input installieren?

Das ist im Grunde egal. Floating input reicht aus.

Autor: Marco (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Danke A.K.

Das Display bekomm ich bereits angesteuert.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net