Forum: Mikrocontroller und Digitale Elektronik array an fkt. lcd


von tobias hofer (Gast)


Angehängte Dateien:

Lesenswert?

hallo

ich habe mir ein kleines testprogramm geschrieben für die
ansteuerung einens lcd displays.

beim funktionsaufruf WriteData() habe ich folgendes problem:
wenn ich ein asci zeichen so übergebe:
WriteData('A') wir das zeichen richtig dargestellt auf dem display.
wenn ich nun aber ein array übergeben möchte:
WriteData(Text[1]) wird das zeichen nicht richtig dargestellt.

kann mir jemand sagen wo hier das problem ist? oder könnte das ein 
compiler spezifisches problem sein.

gruss tobias

von Hugo (Gast)


Lesenswert?

Hi,

ich hatte ein ähnliches Problem. Sobald ich mehr als ein Zeichen zum 
Display sendete kam nur Murks an. Bei mir lag es an zu kurzen Delays 
zwischen den zu sendenden Zeichen. Zu deinem Code kann ich leider nichts 
sagen da ich mit Assembler arbeite.

Gruß

von tobias hofer (Gast)


Lesenswert?

hallo hugo

ein timing problem kann es nicht sein.
1.fall aufruf der fkt. WriteData('A') funktioniert.
2.fall aufruf der fkt. WriteData(text[1]) funktioniert nicht.

im 2.fall übergebe ich der fkt. ja auch nur 1 charakter.
ich glaube langsam das es ein problem mit dem compiler ist.
ich benutze den wickenhäuser uc51.

gruss tobias

von Uwe (Gast)


Lesenswert?

Hi!
Frage:Was steht denn in "text[x]" drinn? ASCII? Schreibe es doch mal als 
Hex. Irgendwo hatte ich das auch schon mal, der Compiler wollte einfach 
kein ASCII draus machen, aber keine Fehlermeldung.

Gruss Uwe

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Was bedeutet "funktioniert nicht"? Was wird denn statt 'O' angezeigt?

Ich kann mir das eigentlich nicht vorstellen, kein Compiler der Welt 
würde derartigen Murks produzieren.

@Uwe: das mit dem "Schreibe es doch mal als Hex" ist Unsinn, schau dir 
das Programm doch erst mal an bevor du antwortest.

von tobias hofer (Gast)


Lesenswert?

hallo zusammen

auf dem display habe ich dann anstatt des buchstaben
ein komplett schwares feld, quasi einen schwarzen cursor.

als ich einmal die delay zeit nach dem schreiben eines charakters zu 
kurz hatte, hatte ich auch so ne anzeige.

da ich ja mit WriteData('A') kein problem habe schliesse ich ein 
timingproblem aus.

von Andi (Gast)


Lesenswert?

Hi Tobias,

Sieht irgendwie nach Adressen Problem aus... Die übergabe sollte als 
Adresse erfolgen, bzw. als Pointer.

WriteData(Text);

void WriteData(char * cData)
{
  ...
  LCDPORT=cData[1]
  ...
};

Bin mir jetzt aber net ganz sicher probierts mal aus...ansonsten schau 
ich heut abend zuhause..

Viel Erfolg

Andi

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Nein, das Programm von Tobias ist völlig richtig.

char Text[] = "ABCDEFG";
lcd(Text[1]);

MUSS das gleiche ergeben wie

lcd('B');

Ansonsten ist der Compiler so kaputt wie es eigentlich nicht sein kann, 
oder man hat irgend ein exotisches Timingproblem das nur unter ganz 
bestimmten Bedingungen zu einem Fehler führt.

von Hugo (Gast)


Lesenswert?

Hi,

hast Du denn mal testweise die Delays erhöht? Nur um ein Timingproblem 
auszuschließen.

Gruß

von Oryx (Gast)


Lesenswert?

Hallo Tobias,

wie Andreas schon sagte, dein Programm ist richtig.

Aber was ist mit Deiner Startdatei. Werden die initialisierten Variablen 
richtig gesetzt?

Ein ganz einfacher Test ist:
const unsigned char Text[] = "TOBIAS";
Je nach Kompiler bleibt der Text dann komplett im ROM.

Zweite Möglichkeit:

int main(void)
{
  Text[0] = 'T';
  Text[1] = 'O';
  Text[2] = 'B';
  Text[3] = 'I';
  Text[4] = 'A';
  Text[5] = 'S';
  Text[6] = 0;
/* Ab hier deinen Rest, dein Speicher ist jetzt auf jeden fall 
initialisiert */

}

Beide Möglichkeiten sollten nicht zusammen getestet werden, wenn doch, 
kommen Kompilerwarnungen. Wenn keine Kompilerwarnungen kommen, taugt der 
Kompiler garnichts.

Oryx

von Andi (Gast)


Lesenswert?

Hi,

also, ich hab das ganze vor 4 Wochen programmiert und bei mir tuts, hier 
der Programmauszug:

char text[]   = "TOBIAS\0"; // "\0" Endekennung

LCD_sendestring((char *)text);

void LCD_sendestring( char *pText )
{
char zeichen;
int nr = 0;

zeichen = pText[nr];

  while( zeichen != '\0')
  {
  lcd_ready();  // warten auf Busy-Flag
  LCD_sendezeichen( zeichen ); Zeichenausgabe
  nr++;
  zeichen = pText[nr];
  }
}

Vielleicht hilfts...

Andi

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

\0 wird automatisch rangehängt wenn man den String in doppelten
Anführungszeichen "bla" schreibt, zweimal ist unnötig.

Es tut zwar absolut nichts zur Sache, weil Tobias nur ein
einzelnes Zeichen ausgeben möchte, aber so geht das mit dem
String kürzer:

lcd_puts(s) char *s;
{
  char c;

  while (c = *s++)
    lcd_putc(c);
}

von Andi (Gast)


Lesenswert?

Ok =:P überredet...

von tobias hofer (Gast)


Lesenswert?

hallo zusammen

ich habe das problem gefunden.
es ist wie oryx gesagt hat die eingesetzten variablen, oder insbesondere 
das array wird nicht richtig initialisiert.

ich definiere mein text array ja lokal.
bis jetzt unsigned char text1[]="tobias";

ich benutze den wickenhäuser uc51 c-compiler freeware bis 8k.

ich muss das lokale array jedoch so initialisieren:

->unsigned char code text1[]="tobias";
so funktionierts und das array wird im programmspeicher
abgelegt und nicht im ram oder so.

was denkt ihr von diesem compiler so auf die schnelle?
kennt jemand einen besseren "freeware" für 8051 und derivate?

besten dank für eure hilfe
gruss tobias

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Es ist absolut nicht nachvollziehbar warum der Compiler keine Arrays aus 
dem RAM lesen kann. Ich würde so einen Compiler mit Vorsicht genießen... 
Probier's doch mal mit sdcc (http://sdcc.sf.net), der ist völlig 
kostenlos.

von tobias hofer (Gast)


Lesenswert?

um das array ins ram zu plazieren müsste ich eben
die fkt. so deklarieren:

unsigned near char[]="xxx";

ich habe mal mit wickenhäuser telefoniert, er sagte mir das sei 8051 
standart diese art von deklaration.

ich werde mal den anderen compiler anschauen.

gruss tobias

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.