array an fkt. lcd

Gast #27786
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
Angehängte Dateien:
Gast
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ß
Gast
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
Gast
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
Admin Persönliche Seite
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.
Gast
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.
Gast
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
Admin Persönliche Seite
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.
Gast
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
Gast
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
Admin Persönliche Seite
\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);
}
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.