Forum: Mikrocontroller und Digitale Elektronik Fehler bei 7x5 Dotmatrix mit mega32


von Der F. (flins)


Angehängte Dateien:

Lesenswert?

Hallo zusammen!

Habe jetzt seit einiger Zeit ein Dotmatrix Display am laufen. Aufbau wie 
folgt(Sollte auch ohne Schaltplan klar sein):
-Multiplex-Betrieb von zwei mal 7x5 Display
-Spalten an PortA, Zeilen an PortD, zusätzlich die "Aktivierung" eines 
der Displays durch Low an PA5 oder PA6

Im Anhang mein Programm dafür. Es soll den Text in showtext[] Anzeigen, 
und Zeichenweise nach links scrollen.
Das Programm Funktioniert auch, solange man nur Buchstaben, Zahlen oder 
das Leerzeichen verwendet. bei den Sonderzeichen wird entweder 
Datenmüll(Auf dem Display ist kein Zeichen zu erkennen) oder ein '<' 
angezeigt.

Probleme gab es zwar schon beim Compilieren(avr-gcc aus winavr 
20071221), welcher meckerte, doch konnte ich durch Backslashes '\' vor 
relevanten Zeichen wie "  in den arrays showtext[] und zeichensatz[] die 
Fehlermeldungen wegbekommen. Der Fehler tritt aber trotzdem auf.

Gibt es eine andere möglichkeit, diese Sonderzeichen darzustellen, um 
(was meine Vermutung ist) dem Compiler den Fehler auszutreiben (vllt 
optimiert er etwas weg)?
Oder entdeckt ihr schlichtweg einen Fehler von mir, der soetwas 
verursachen könnte?

Vielen Dank für euere Gedanken und Zeit,

Dominic

von Fred S. (Gast)


Lesenswert?

Hi Dominic,

Du hast zwei Möglichkeiten:

  1. "character excape sequences", z.B.
                                       \\ für \
                                       \' für '
                                       \" für "
  oder

  2. Du benutzt die hexadezimalen oder oktalen Werte, z.B.
                                       \x22 für "
                                       \o42 für "

Gruß

Fred

von Der F. (flins)


Angehängte Dateien:

Lesenswert?

Vielen Dank für deine Antwort!

Habe das jetzt alles so geändert, also alle Sonderzeichen in \x.. 
geändert(nach ASCII-Tabelle), aber jetzt zeigt es das gleiche an. Also 
immernoch nur Mist. Schade. Ich glaube der Fehler sitzt doch irgendwo 
anders. aber wo...keine Ahnung. Vielleic
ht habe ich auch trotzdem etws falsch gemacht.
Würde mich freuen wenn sich mein "neues" Programm jemand ansehen könnte. 
Bin für jeden Tip dankbar.

MfG,

Dominic

von Fred S. (Gast)


Lesenswert?

Hallo Dominic,

gleich bei den ersten Zeilen Deines Codes habe ich tief Luft geholt, 
nämlich hier:

for(i=0;i<=(laenge-2);i++){
  for(j=0;j<=63;j++){
    if(showtext[i] == zeichensatz[j]){
      zeichen[i]=j;
      break;
    }
  }
}

Deine Zeichentabelle ist doch in ASCII-Anordnung, oder? Dann könntest Du 
Dir die Suche z.B. so vereinfachen (hier mal so geschrieben, dass es in 
Deinen Code passt):

char *showtext_=showtext;
char *zeichen_=zeichen;
while (*showtext_) *(zeichen_++)=(*showtext_++)-'A';

Wenn nötig, kannst Du in die while-Schleife auch noch einen Zähler 
einfügen, wenn Du die Elemente zählen willst. Weiter habe ich dann nicht 
gesucht... Was ist denn jetzt genau das Verhalten des Programms: Welche 
Zeichen gehen, welche nicht? Wenn Du das genau erklärst (wie im ersten 
Posting??), lässt sich besser nach dem Fehler suchen. Ich nehme an, Du 
hast die 5x7-Tabelle schon überprüft? Die ist schwer im Kopf 
nachvollziehbar, da "negative Logik".

Gruß

Fred

von Fred S. (Gast)


Lesenswert?

Noch zwei Nachträge: Bei meinem Beispiel habe ich Zeichen als char und 
nicht als int angesehen - lässt sich anpassen, obwohl mir ein char 
Pointer sinnvoller für char Adressen scheint!

Was willst Du übrigens mit

     for(i=0;i<100;i++) zeichen[i]=84;

erreichen -- Du füllst zeichen[] dann danach doch noch einmal?


Gruß

Fred

von Fred S. (Gast)


Lesenswert?

Warum läuft j in dieser Schleife nicht durch die gesamte Länge des 
Zeichensatzes?

for(i=0;i<=(laenge-2);i++){
  for(j=0;j<=63;j++){
    if(showtext[i] == zeichensatz[j]){
      zeichen[i]=j;
      break;
    }
  }
}

Hier meine Alternative (da liegt aber wahrscheinlich nicht das Problem):

char *showtext_=showtext;
i=0;
while (*showtext)
    zeichen[i++]=*(showtext_++) -'A';

von Der F. (flins)


Lesenswert?

@Fred S.

Meine Suche habe ich nach bestem Wissen und Gewissen gestaltet, wie man 
so schön sagt. Will heißen dass ich soetwas ähnliches schon einmal 
programmiert habe (erstes Semester Info, war glaub ich ein 
Buchstaben-Zähl-Programm). Habe die Idee genommen, angepasst. Mit 
Pointer habe ich mich noch nicht beschäftigt. Und dementsprechend keine 
Ahnung. Werd ich mir aber für später merken.

Meine 5x7 Tabelle habe ich nicht überprüft. Ich habe mir zum erstellen 
des "Zeichensatzes" ein Programm geschrieben, mit welchem ich diese 
Werte errechnet habe(errechnen habe lassen). Nachdem die Buchstaben und 
Zahlen stimmen, nehme ich den Rest auch als korrekt an.

Die Anzeige zeigt Text inkl Leerzeichen und Zahlen fehlerfrei an. 
Verwende ich allerding Sonderzeichen in showtext[], so werden diese 
nicht angezeigt. Eher Datenmüll...man könnte es mit Emmentaler 
vergleichen. Dort, wo Käse ist, leuchtets, bei den Löchern nicht. Ein 
System bei diesen "Zeichen" erkenne ich nicht, scheinen nie zwei gleiche 
zu kommen. Immer eine neue Scheibe Käse :-)

Mit meiner Schleife habe ich das Array zeichen mit, ich glaube, einem 
Leerzeichen vorbelegt. War zur Fehlersuche gedacht.Mein Gedanke war, 
dass evtl. auf eine Stelle im Array gezeigt wird, wo noch nichts hinein 
geschrieben wurde. Dort könnte ja dann auch irgendetwas stehen, und 
somit ein nicht identifizierbares Zeichen hervorrufen.

Danke für die Hilfe!

MfG

Dominic

PS:
Habe gerade noch deinen letzten Beitrag gesehen. Das 63 stammte noch aus 
der Zeit, als nur Groß und kleinbuchstaben, Zahlen und das Leerzeichen 
implementiert waren. 26+26+10+1=63. Dort könnte auch der Fehler 
liegen...Gleich ausprobieren...

von Fred S. (Gast)


Lesenswert?

Hi Dominic,

ersetze einfach diese Schleife mit if und break durch meine Zeilen oben.
Mit welcher Entwicklungsumgebung arbeitest Du? Steht Dir ein Simulator 
zur Verfügung?

Gruß

Fred

von Der F. (flins)


Lesenswert?

Es geht!!!
Habe einfach die veraltete "63" durch ein "87" ersetzt, welches die neue 
Länge des Arrays ist. Und es geht... Manchmal sieht man eben nix mehr. 
Ich glaube ich sollte mir angewöhnen, solche zahlen, wie diese Länge, in 
einer Variablen zu speichern (sizeof() könnte da auch helfen...).

Aber ich danke dir auf jeden Fall für deine Hilfe.

MfG,

Dominic

von Fred S. (Gast)


Lesenswert?

Hallo Dominic,
> Es geht!!!

schön! Du siehst, mit Pointern wäre es gar nicht zu dem Problem 
gekommen! Ich möchte Dich deshalb ermutigen, Dir den Umgang mit Pointern 
anzueignen.

Viele Grüße

Fred

von Der F. (flins)


Lesenswert?

Hallo Fred,

Ja, damit wäre der Fehler nicht aufgetreten. Bin aber erst am Anfang 
meiner C-Laufbahn (Programmiere seit ca einem Jahr gelegentlich). Ich 
denke aber, in den nächsten Vorlesungen in der FH sollten laut Skript 
auch Pointer dran kommen sehe ich gerade. Meine Kenntnisse sollte also 
weiterhin wachsen.
Ich Danke dir auf jeden Fall für deine Hilfe bei der Suche nach meinem 
Flüchtigkeitsfehler.

Aber wenn ich gerade schon da bin, vielleicht hat noch jemand eine Idee:
Ich will das zeichenweise Scrollen auf Spaltenweises umstellen. Gibt es 
da irgendwelche Ansätze?
Meine Idee war es, ein char Array mit 15 Plätzen(wie nannte man das noch 
gleich?) zu nehmen, und in dieses 3 aufeinanderfolgende Zeichen (mit 
ihren 5 Spalten) zu laden. 3 Zeichen deshalb, weil auf einem 2 stelligen 
Display maximal 1 ganzes und 2 unvollständige Zeichen angezeigt werden 
können. Aus diesem Array werden dann, je nach scroll-Position von einem 
anderen Punkt startend, die Spalten ausgegeben. Ist man am Ende, 
beschreibt man dieses Array neu. Allerdings denke ich, dass das 
neu-beschreiben recht lange dauert, und somit Pausen entstehen könnten.

MfG,

Dominic

von Fred S. (Gast)


Lesenswert?

Hallo Dominic,

Dein Ansatz für das Verschieben in Spalten klingt gut und wird wohl kaum 
zu langsam sein, wenn es nicht übermäßig kompliziert programmiert ist 
und Du den Zugriff auf die Spalten geschickt gestaltest.

Viel Erfolg!

Gruß

Fred

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.