mikrocontroller.net

Forum: Compiler & IDEs XMC4500 Display Ansteuerung


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.
von semmel9 (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich will mit DAVE4 und dem XMC4500 RelaxKit ein LCD-Display (Dot-Matrix 
4x20) ansteuern. Die Pins mit denen ich das LCD ansteuern kann, sind 
fest vorgegeben:


Enable <-> P5.0
RS <-> P3.2
DB4 <-> P1.2
DB5 <-> P1.0
DB6 <-> P1.8
DB7 <-> P1.9
(RW auf GND gelegt)
Die Pin-Konfiguration in DAVE ist in einem Bild im Anhang dargestellt.

Für die Ansteuerung des LCDs will ich die beigefügte C-Bibliothek 
verwenden, die aber ursprünglich für eine andere Pin-Belegung vorgesehen 
war. Mein Problem ist, dass wenn ich in der Bibliothek nur die PORT-Pins 
anpasse das Display nur Blödsinn bzw. manchmal auch nichts ausgibt 
(LCD_Ausgabe.jpg).

Als Beispiel (Zeile 40 in lcd.c) die folgende Funktion mit der ich die 
Daten-Bits in 'data'
( data = DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 ) in die richtige Positionen 
des OUT-Registers von PORT1 schreiben will ( P1.OUT = ... P1.11 P1.10 
DB7 DB6 ... P1.3 DB4 P1.1 DB5 ):
void lcd_out(uint8_t data)
{
    data &= 0xF0; // DB0-3 zu Null setzen, nur DB4-7 gleich lassen 
    data = ( (data&(1<<4))>>2) | ((data&(1<<5))>>5) | ((data&(1<<6))<<2) | ((data&(1<<7))<<2 ); // von innen nach außen: Daten DB4-7 aus data maskieren, dann in neue Position schieben und zusammenfügen
    PORT1->OUT &= ~((uint16_t)(0xFAFA)); // vorherige Ausgabe-Bits DB4-DB7 zu Null setzen
    PORT1->OUT |= data;
    lcd_enable();
}

In der main werden dann auch nur zwei Bibliotheksfunktion aufgerufen:
#include <DAVE.h> //Declarations from DAVE Code Generation (includes SFR declaration)
#include <LCD.h> // Ansteuerung 4x20 LCD-Display mit 4 Bits und RW auf GND
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  DAVE_STATUS_t status;
  status = DAVE_Init();

  if(status != DAVE_STATUS_SUCCESS)
  {
    XMC_DEBUG("DAVE APPs initialization failed\n");
  }
  
  lcd_init();
  while(1U)
  {
    lcd_string_oLines("Hallo Welt", 0, 1);
  }
}

Ich finde in lcd.c/h einfach keinen Grund wieso das nicht funktioniert, 
mit der vorherigen Pin-Belegung hat es beim gleichen Aufbau (VDD=5V; 
V0=1.3V;AK=5V) tadellos geklappt, kann es sein, dass ich mich bei den 
Bit-Manipulationen vertan habe oder die PORT-Register so nicht 
funktionieren wie ich mir das vorstelle?

Ich wäre euch über Hinweise, und Tipps sehr dankbar.

Beste Grüße,
semmel9

von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
Die Bitschiebereien sehen nicht korrekt aus:

void lcd_out(uint8_t data) 
{
 ((data&(1<<6))<<2) | ((data&(1<<7))<<2 )


Da wird jeweils aus dem 8-Bit Bereich herausgeschoben.

Wenn das ein 16-bittiger Port ist, müsste man eine 16-bittige Variable 
benutzen.

von semmel9 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Jim M.,

vielen Dank für deinen Hinweis! Ich habe deine Antwort leider erst jetzt 
gesehen, werde das demnächst ausprobieren, sobald ich wieder Zugang zu 
dem Display habe!

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.