mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik array an fkt. lcd


Autor: tobias hofer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Hugo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: tobias hofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tobias hofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hugo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

Gruß

Autor: Oryx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok =:P überredet...

Autor: tobias hofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tobias hofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.