Komisches Verhalten mit lcd_puts

OP #3430412
Lesenswert?

Hallo
Habe ein Problem, was ich nicht verstehe

lcd_clrscr();                    // Display löschen
lcd_puts("LCD Text Zeile 1\n");  //Zeile 1 mit Zeilenumbruch
lcd_puts("LCD Text Zeile 2\n");  //Zeile 2 mit Zeilenumbruch
lcd_puts("LCD Text Zeile 3\n");  //Zeile 3 mit Zeilenumbruch
lcd_puts("LCD Text Zeile 4\n");  //Zeile 4 mit Zeilenumbruch

Ich benutze dieses Stück Programm, um in den Zeilen 1 bis 4 jeweils den 
Text innerhalb der Klammer ausgeben möchte. Auf dem Diplay erscheint 
aber nur

LCD Text Zeile 1
LCD Text Zeile 4

Die beiden anderen Texte mit den Zeilen 2 und 3 wird nicht ausgegeben 
oder überschrieben. In der ersten Zeile geht es doch, warum nicht in den 
anderen?
achim
OP #3430423
Lesenswert?

So der Rest, ist nicht viel
1
#define F_CPU 16000000UL
2
#include <stdlib.h>
3
#include <avr/io.h>
4
#include <avr/pgmspace.h>
5
#include <util/delay.h>
6
#include "lcd.h"
7

8
int main(void)
9
{
10
lcd_init(LCD_DISP_ON);        // Display initialisieren
11
for (;;)
12
{
13
/*  Text in jede Zeile schreiben */
14
lcd_clrscr();                      // Display löschen
15
lcd_puts("LCD Text Zeile 1\n");    // Zeile 1     
16
lcd_puts("LCD Text Zeile 2\n");    // Zeile 2
17
lcd_puts("LCD Text Zeile 3\n");    // Zeile 3
18
lcd_puts("LCD Text Zeile 4\n");    // Zeile 4
19
_delay_ms(5000);      // kurz warten
20
}
Gast #3430431
Lesenswert?

>So der Rest, ist nicht viel

Bullshit. Wo ist lcd_puts()?

>Ein LCD kennt keinen Befehl für einen Zeilenumbruch. Wenn das nicht von
>'lcd_puts' geregelt wird funktioniert das nicht.

Das wird es sein. Da wird es irgendeinen lcd_gotoxy() Befehl geben.
#3430482
Lesenswert?

Lass uns erst mal sehen, ob die Einstellungen hier in lcd.h
1
...
2
#define LCD_START_LINE1  0x00     /**< DDRAM address of first char of line 1 */
3
#define LCD_START_LINE2  0x40     /**< DDRAM address of first char of line 2 */
4
#define LCD_START_LINE3  0x14     /**< DDRAM address of first char of line 3 */
5
#define LCD_START_LINE4  0x54     /**< DDRAM address of first char of line 4 */
6
...

für dein LCD passen.



Testprogramm
1
int main(void)
2
{
3
  lcd_init(LCD_DISP_ON);        // Display initialisieren
4

5
  lcd_gotoxy( 0, 0 );
6
  lcd_puts( "1" );
7

8
  lcd_gotoxy( 0, 1 );
9
  lcd_puts( "2" );
10

11
  lcd_gotoxy( 0, 2 );
12
  lcd_puts( "3" );
13

14
  lcd_gotoxy( 0, 3 );
15
  lcd_puts( "4" );
16

17
  for (;;)
18
    ;
19
}

in jeder Zeile sollte eine Ziffer am linken Zeilenrand auftauchen.
Und zwar von oben nach unten: 1, 2, 3, 4
Gast #3430486
Lesenswert?

Achim Seeger schrieb:
> lcd_puts("LCD Text Zeile 4\n");  //Zeile 4 mit Zeilenumbruch..
> Ich benutze dieses Stück Programm,...

Es ist immer wieder dasselbe!
Die Leute benutzen irgendwelche von irgendwo her kopierte 
Treiber-Routinen OHNE sie je auch nur im Mindesten zu verstehen, vom 
Verstehen der eigentlichen Hardware ganz und gar abgesehen.

Mich ärgert sowas bis zum Äußersten! Warum zum Kuckuck sind diese 
grandiosen Programmiereriche bloß von solcher Geistesart heutzutage?

Eigentlich ist das Bedienen eines üblichen Alpha-LCD's eine Kleinigkeit 
und überhaupt keine wirkliche Schwierigkeit. In jedem (wirklich in 
JEDEM!!) Datenblatt jedes 0815-Alpha-LCD's braucht es dazu nur eine 
simple Tabelle.  Warum brauchen also die Leute hier fertige Routinen, 
die sie nicht verstehen? Ist das dasselbe, wie die fertigen Routinen zum 
Tstenentprellen, ja?

Also mein Rat: Der TO sollte sich seine LCD-Routinen besser selbst 
schreiben um dadurch zu verstehen, wie denn nun genau selbiges zuwege 
gebracht wird.

W.S.
#3430493
Lesenswert?

spess53 schrieb:
> Hi
>
> Wenn ich das richtig interpretiere funktioniert \n nur, wenn R/W vom
> Display auch angeschlossen ist.

Die ganze Fleury Lib ist Busy-Flag orientert und funktioniert nur, wenn 
R/W angeschlossen ist.
D.h. wenn er Ausgaben hat, dann ist der Teil mal korrekt.

offensichtlich positioniert ja auch das LCD immer wieder in Zeile 2, 
wenn in lcd_newline() der entsprechende Umbruch angeordnet wird.

Die Frage ist eigentlich: warum immer in Zeile 2.


Alternativ könnte man natürlich auch sagen: leg den ganzen Humbug mit \n 
Auswertung still. Braucht sowieso kein Mensch.
OP #3430501
Lesenswert?

Es wird die Zeile 1,3 und 4 dargestellt, an der linken Seite. Die Zeile 
wird überschrieben

Sorry, was soll das. Hersteller, Peter oder Karl Heinz schreiben sehr 
gute Sache. Warum sollen wir diese nicht nutzen. Muss jeder das rad neu 
erfinden. Wenn ich mir beiden Datein ansehe, so versteh ich einiges da 
von, aber bei weitem nicht alles. Es muss auch nicht jeder sein eigenes 
Auto bauen, bloss wenn er eins fahren will. Ich bin Anfänger, ist klar, 
aber nicht verrückt, das ich alles selber machen muss ist nicht Sinn der 
ganzen Sache,
 Bleibe bitte bei einem Sachlichen Ton
achim
Gast #3430518
Lesenswert?

>Es wird die Zeile 1,3 und 4 dargestellt, an der linken Seite. Die Zeile
>wird überschrieben

Kannst Du das bitte noch einma neu formulieren? Ich verstehe es nämlich 
nicht.

Es ist klar, das Zeilen dargestellt werden. Aber was konkret an Inhalt 
wird auf welcher Zeile dargestellt?

Ist Dein Satz so zu interpretieren:

---------------------
1
3
4

---------------------

oder so:

---------------------
1

3
4
---------------------

oder wie?

Jedenfalls scheinen die Adressen nicht zu stimmen. Nenne doch einmal 
genau das von Dir verwendete Display.
#3430524
Lesenswert?

Bitkracherl schrieb:

> oder wie?


Exakt, Achim.
Da darf es jetzt keine Missverständnisse geben. Zeichne die Dinge auf, 
wenn es nicht anders geht, aber beschreibe nicht verbal. Denn das führt 
fast immer zu MIssverständnissen.

> Jedenfalls scheinen die Adressen nicht zu stimmen.

Seh ich auch so.

> Nenne doch einmal
> genau das von Dir verwendete Display.

Zur Not können wir die Adresslage auch durch Ausgabe von überlangen 
Strings ermitteln.
OP #3430529
Lesenswert?

Hallo Karl Heinz
Habe deine Test gemacht. Jetzt komme langsam dahinter


  lcd_gotoxy( 0, 0 );
  lcd_puts( "1" );

  //lcd_gotoxy( 0, 1 );
  //lcd_puts( "2" );

  lcd_gotoxy( 0, 2 );
  lcd_puts( "3" );

  //lcd_gotoxy( 0, 3 );
  //lcd_puts( "4" );

Habe ein paar Zeile Auskommentiert. Egal was ich mach, die zweite Zeile 
wird nicht geschrieben, das einzigste was passiert, die Zeile 3 rutscht 
in die 2 Zeile. Da ich lcd_gotoxy verwende spreche ich die zweite Zeile 
direkt an. Da fällt mir nur ein Fehler am Display zu ein, ansonsten 
müsste es doch mit lcd_gotoxy gehen?
#3430533
Lesenswert?

Bitkracherl schrieb:
>>Zur Not können wir die Adresslage auch durch Ausgabe von überlangen Strings
>>ermitteln.
>
> Ich bin viel fauler als Du. :-)

:-)
Dafür bin ich zu faul mir das Datenblatt zu suchen und dort die Info 
rauszusuchen. Da mach ich lieber ein
1
  lcd_puts( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" );
und seh nach, mit welchem Zeichen die 3. Zeile (2.te, 4.te) anfängt :-)
Gast #3430534
Lesenswert?

Wenn ich nochmal kurz helfen darf: (Zumindest ich bin immer noch im 
Zweifel).

>Da darf es jetzt keine Missverständnisse geben. Zeichne die Dinge auf,
>wenn es nicht anders geht, aber beschreibe nicht verbal. Denn das führt
>fast immer zu MIssverständnissen.
#3430539
Lesenswert?

Achim Seeger schrieb:

> wird nicht geschrieben, das einzigste was passiert, die Zeile 3 rutscht
> in die 2 Zeile.

Wo genau?
An den linken Rand?

> Da ich lcd_gotoxy verwende spreche ich die zweite Zeile
> direkt an.

Exakt. nach einem lcd_gotoxy wird die nächste Ausgabe an dieser Stelle 
begonnen.

  lcd_gotoxy( spalte, zeile )


> Da fällt mir nur ein Fehler am Display zu ein, ansonsten
> müsste es doch mit lcd_gotoxy gehen?

Quatsch.
Die Adresslagen stimmen einfach nicht. Dein LCD benutzt ein etwas 
anderes Adressierungsschema. Das ist alles. Und das muss man halt jetzt 
einmal rauskriegen, die Konstanten im lcd.h anpassen und der Teil ist 
paletti.
#3430542
Lesenswert?

Achim Seeger schrieb:

> ansonsten
> müsste es doch mit lcd_gotoxy gehen?

lcd_gotoxy ist doch kein Wunderwuzzi.

Es kriegt Spalten und zeilennummer und muss daraus jetzt die Adresse 
errechnen, in der es den Cursor im linear aufgebauten Speicher 
positionieren muss.
Und zwar möglichst so, dass dann auch auf dem LCD das genau der Spalte 
und Zeile entspricht, die angegeben wurde.


Also: wo GENAU taucht der 3-er auf?
#3430560
Lesenswert?

Achim Seeger schrieb:
> So, habe mal weiter getestet.

Achim. Das ist sinnlos.

Deinen Helfern ist völlig klar, was das Problem ist.
Das einzige Problem dabei ist, dass wir ein paar Kennzahlen vom LCD 
brauchen. Die stehen im (vernünftigen) Datenblatt oder wir müssen sie 
mit dir ermitteln.

> Auch mit dem lcd_gotoxy(0, 1) kann ich die erste Stelle in der zweiten
> Zeile nicht beschreiben. Eine Stelle weiter geht alles. Sehr komisch
> achim

Deien Tests sind für die Würscht.
Oder wie die Amerikaner sagen: You are barking up the wrong tree.
OP #3430564
Lesenswert?

mal ganz langsam. In dem Test von KH wir an der linken Seite von oben 
links beginnend (Zeile 0,0)  die Zahlen 1,2,3,4 untereinander 
geschrieben. Es wird lcd_gotoxy verwendet. Auf dem Display erscheinen 
die Zahlen von oben links beginnend 1,3,4 untereinander. die Zahl 2 
kommt nicht.
#3430571
Lesenswert?

@bitkracherl

ok, danke.
Lass uns mal Plan B probieren

1
int main()
2
{
3
  lcd_init(LCD_DISP_ON);        // Display initialisieren
4
  lcd_puts( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" );
5

6
  while( 1 )
7
    ;
8
}

Wie sieht die Ausgabe aus.
Zeichne das bitte hier ein
1
+----------------------------------+
2
|                                  |
3
|                                  |
4
|                                  |
5
|                                  |
6
+----------------------------------+

Ich brauch immer nur jeweils das erste Zeichen in einer Zeile (der Rest 
ergibt sich dann von alleine).
Aber: Das muss eindeutig sein!
-> nicht irgendwie beschreiben, sondern das einzeichnen, was du siehst!
Gast #3430574
Lesenswert?

>mal ganz langsam.

Langsamer gehts wohl kaum noch.

>In dem Test von KH wir an der linken Seite von oben links beginnend (Zeile >0,0) 
die Zahlen 1,2,3,4 untereinander geschrieben.

Ach was!

>Auf dem Display erscheinen die Zahlen von oben links beginnend 1,3,4 
>untereinander. die Zahl 2 kommt nicht.

Schön. Was aber unklar bleibt, ist, ob nun eine Lücke, eine Leere Zeile 
entsteht oder nicht und in welcher Spalte die Ziffern erscheinen.

Lass uns die Variante mit der Ausgabe von "ABCDE...." probieren.
#3430587
Lesenswert?

:-)
das lässt sich auch noch besser machen. Knallen wir das Ding voll
1
int main()
2
{
3
  lcd_init(LCD_DISP_ON);        // Display initialisieren
4
  lcd_puts( "ABCDEF0GHIJKL0MNOPQR0STUVW0XYZa" );
5
  lcd_puts( "ABCDEF1GHIJKL1MNOPQR1STUVW1XYZa" );
6
  lcd_puts( "ABCDEF2GHIJKL2MNOPQR2STUVW2XYZa" );
7
  lcd_puts( "ABCDEF3GHIJKL3MNOPQR3STUVW3XYZa" );
8
  lcd_puts( "ABCDEF4GHIJKL4MNOPQR4STUVW4XYZa" );
9

10
  while( 1 )
11
    ;
12
}

jeder String ist genau 0x20 Zeichen lang. Ins Alphabet hab ich jeweils 
Zahlen eingeschmuggelt, so dass im sichtbaren Bereich Ziffern zu sehen 
sein müssten, mit denen man identifizieren kann, welche Wiederholung in 
jeder Zeile gerade zu sehen ist.
#3430593
Lesenswert?

Karl Heinz schrieb:

> jeder String ist genau 0x20 Zeichen lang.

Ach Mist. Verzählt :-)
1
   lcd_puts( "ABCDEF0GHIJKL0MNOPQR0STUVW0XYZa0" );
2
   lcd_puts( "ABCDEF1GHIJKL1MNOPQR1STUVW1XYZa1" );
3
   lcd_puts( "ABCDEF2GHIJKL2MNOPQR2STUVW2XYZa2" );
4
   lcd_puts( "ABCDEF3GHIJKL3MNOPQR3STUVW3XYZa3" );
5
   lcd_puts( "ABCDEF4GHIJKL4MNOPQR4STUVW4XYZa4" );

Jetzt aber.

Mit welchem Buchstaben fängt jede Zeile an, und welche Ziffer ist in 
jeder Zeile das erste mal zu sehen?
#3430606
Lesenswert?

holger schrieb:
>>Ach Mist. Verzählt :-)
>
> Wieso möchtest du fünf Zeilen auf das Display schreiben?

Ich möcht eigentlich den DDRAM vom LCD voll bekommen. OK, 4 mal den 
String hätte es auch getan. :-)  4 * 0x20 -> 0x80


Achim! Nimm die leztzte Ausgabeanweisung raus.
1
   lcd_puts( "ABCDEF0GHIJKL0MNOPQR0STUVW0XYZa0" );
2
   lcd_puts( "ABCDEF1GHIJKL1MNOPQR1STUVW1XYZa1" );
3
   lcd_puts( "ABCDEF2GHIJKL2MNOPQR2STUVW2XYZa2" );
4
   lcd_puts( "ABCDEF3GHIJKL3MNOPQR3STUVW3XYZa3" );

holger hat recht. Wenn wir den DDRAM überlaufen - wer weiß was dann 
alles passiert.

Selbe Frage:
Mit welchem Buchstaben fängt jede Zeile an, und welche Ziffer ist in 
jeder Zeile das erste mal zu sehen?
Ist überhaupt in allen 4 sichtbare Zeilen irgendwas zu sehen?
OP #3430626
Lesenswert?

So, habe die Tests von KH gemacht, bei der langen Buchstabenreihe 
erscheint in der ersten Zeile alles normal, in der zweiten und dritten 
Zeile laufen sie ständig durch. Ist nur Mist zu erkennen


Wie sieht die Ausgabe aus.
Zeichne das bitte hier ein

+----------------------------------+
| 1                                |
| 3                                |
| 4                                |
|                                  |
+----------------------------------+

bei Angabe aller 4 Zeilen mit gotoxy sieht es so aus, Sieht nach einem 
technischen Schaden aus. Werde den Artikel noch lesen, ansonsten den 
Anbieter. Besteht die Möglichkeit, das ich in den lcd.c oder lcd.h was 
falsch eingestellt habe?
Sorry, morgen ärgere ich mich weiter
achim
#3430628
Lesenswert?

Bitkracherl schrieb:
> Wusstet Ihr, dass der Zusatz von heissem Wasser, Tee wesentlich
> bekömmlicher macht? :-)

Ach darum staubt es bei mir immer so!
Werd ich demnächst probieren.


Achim, was ist los? Das gibts doch nicht, dass ein Copy&Paste von 8 
Zeilen Code so lange dauert.
Wenn mit diesem Code (unverändert, bis auf Tippfehler) das LCD 
vollgeschrieben wird, dann hast du 5 Minuten später ein funktionierendes 
lcd_gotoxy.
Ein Photo vom vollgeschriebenen LCD enthält alle Informationen, die wir 
brauchen um die Konstanten zu ermitteln, die in lcd.h eingetragen werde 
müssen.
#3430639
Lesenswert?

Karl Heinz schrieb:
> Achim Seeger schrieb:
>> So, habe die Tests von KH gemacht, bei der langen Buchstabenreihe
>> erscheint in der ersten Zeile alles normal, in der zweiten und dritten
>> Zeile laufen sie ständig durch. Ist nur Mist zu erkennen
>>
>
> Das läuft durch?
>
> Das kann nicht durchlaufen. Die Textausgabe findet nur ein einziges mal
> statt.


Oder hast du die Textausgaben in die Schleife hinein verschoben.

Das war nicht Sinn der Sache. Die Ausgabe SOLL nur einmal statt finden 
und nicht öfter.
Gast #3430643
Lesenswert?

>>Sorry, morgen ärgere ich mich weiter

Du sollst das erstmal nicht bewerten was Du da siehst.
Das hält Dich und uns nur auf. Wir sind eigentlich schon seit einer 
Stunde kurz vor der Lösung.

Merkst Du wie wir die ganze Zeit eigentlich nur versuchen mal überhaupt 
EINE korrekte und verständliche Information von Dir zu erhalten. Aber Du 
probierst ständig irgendwas herum. Das ist kontraproduktiv. Ehrlich!
Gast #3430649
Lesenswert?

Achim Seeger schrieb:
> So, habe die Tests von KH gemacht, bei der langen Buchstabenreihe
> erscheint in der ersten Zeile alles normal, in der zweiten und dritten
> Zeile laufen sie ständig durch. Ist nur Mist zu erkennen

Ist doch logisch:

 +----------------------------------+
 | ABCDEF0GHIJKL0MNOPQR0STUVW0XYZa0 |
 | MistMistMistMistMistMistMistMist |
 | MistMistMistMistMistMistMistMist |
 |                                  |
 +----------------------------------+
#3430655
Lesenswert?

Karl Heinz schrieb:
> Ein Photo vom vollgeschriebenen LCD enthält alle Informationen, die wir
> brauchen um die Konstanten zu ermitteln, die in lcd.h eingetragen werde
> müssen.

Na, na, ihr wollt doch nicht für ein fehlerhaftes LCD eine 
Standardbibliothek vermurksen, vor allem wenn da noch Rückgaberecht 
drauf ist. Wenn der Mist durchläuft, ist doch klar, dann helfen 
natürlich nur noch Kohlebatterien ...

Manchmal überleg ich auch, mich unter einem zweiten Nick hier anzumelden 
und mal ganz blöd zu stellen ...

LG, Sebastian
#3430656
Lesenswert?

EGS schrieb:
> Ändermich schrieb:
>> Läuft dein Programm etwa in einer Schleife?
>
> sieht man doch, wenn die Befehle nicht zyklisch kommen passiert doch an
> dem Display irgendwann nix mehr, oder? Dann fehlt doch der Refresh der
> Daten.

Das LCD kann von alleine anzeigen.

genau darum geht es uns doch:
Den Speicher vom LCD einmalig vollschreiben und dann anhand der Ausgabe 
identifizieren, welche sichtbare LCD-Zeile im Speicher wo anfängt.

Das ist eine Sache auf ein paar Minuten.
Und das ist das Testprogramm dazu
1
#define F_CPU 16000000UL
2
#include <stdlib.h>
3
#include <avr/io.h>
4
#include <avr/pgmspace.h>
5
#include <util/delay.h>
6
#include "lcd.h"
7

8
int main(void)
9
{
10
   lcd_init(LCD_DISP_ON);        // Display initialisieren
11

12
   lcd_puts( "ABCDEF0GHIJKL0MNOPQR0STUVW0XYZa0" );
13
   lcd_puts( "ABCDEF1GHIJKL1MNOPQR1STUVW1XYZa1" );
14
   lcd_puts( "ABCDEF2GHIJKL2MNOPQR2STUVW2XYZa2" );
15
   lcd_puts( "ABCDEF3GHIJKL3MNOPQR3STUVW3XYZa3" );
16

17
   for (;;)
18
   {
19
   }
20
}

so wie es ist, unverändert übernehmen, compilieren, brennen, laufen 
lassen und Photo vom LCD machen.
#3430660
Lesenswert?

Ach Mist.
Das hab ich noch übersehen.
In der lcd.h muss hier
1
....
2
#define LCD_START_LINE3  0x14     /**< DDRAM address of first char of line 3 */
3
#define LCD_START_LINE4  0x54     /**< DDRAM address of first char of line 4 */
4
#define LCD_WRAP_LINES      1     /**< 0: no wrap, 1: wrap at end of visibile line */
5
....

LCD_WRAP_LINES auf 0 gesetzt werden. Sonst pfuscht die String-Ausgabe da 
dazwischen.
Also
1
#define LCD_WRAP_LINES      0     /**< 0: no wrap, 1: wrap at end of visibile line */

jetzt aber.
Wie ist die Ausgabe?
Gast #3430665
Lesenswert?

> so wie es ist, unverändert übernehmen, compilieren, brennen, laufen
> lassen und Photo vom LCD machen.

Beim TO brennt offensichtlich nur noch die Nachttischlampe und laufen 
lässt er den Fernseher ;-)
#3430672
Lesenswert?

Karl Heinz schrieb:

> In der lcd.h muss hier
> ...
>
1
> #define LCD_WRAP_LINES      0     /**< 0: no wrap, 1: wrap at end of 
2
> visibile line */
3
>

Nur damit es keine Missverständnisse gibt.
> Wie ist die Ausgabe?

gemeint ist: mit dem Programm
1
#define F_CPU 16000000UL
2
#include <stdlib.h>
3
#include <avr/io.h>
4
#include <avr/pgmspace.h>
5
#include <util/delay.h>
6
#include "lcd.h"
7

8
int main(void)
9
{
10
   lcd_init(LCD_DISP_ON);        // Display initialisieren
11

12
   lcd_puts( "ABCDEF0GHIJKL0MNOPQR0STUVW0XYZa0" );
13
   lcd_puts( "ABCDEF1GHIJKL1MNOPQR1STUVW1XYZa1" );
14
   lcd_puts( "ABCDEF2GHIJKL2MNOPQR2STUVW2XYZa2" );
15
   lcd_puts( "ABCDEF3GHIJKL3MNOPQR3STUVW3XYZa3" );
16

17
   for (;;)
18
   {
19
   }
20
}
Gast #3430680
Lesenswert?

>Was'n das für eine Einstellung?

Um die Zeit werden wir gerade erst warm. Und das vor 30 Jahren schon so.
Mein Gott. Haben wir die Nächte durchgehackt und diskutiert und 
rumphantasiert was man alles anstellen könnte.
Gast #3430690
Lesenswert?

Bitkracherl schrieb:
>>Was'n das für eine Einstellung?
>
> Um die Zeit werden wir gerade erst warm. Und das vor 30 Jahren schon so.
> Mein Gott. Haben wir die Nächte durchgehackt und diskutiert und
> rumphantasiert was man alles anstellen könnte.

Also ich geh um diese Zeit bald schlafen, weil für Arbeit um diese Zeit 
nix mehr passiert. Privat hab ich mir auch gesagt, lieber 2 Tage länger 
brauchen als noch nen Auto den Sekundenschlaf opfern.

Manchmal haste aber recht, dann gehts echt bis 1-2 Uhr nachts...privat 
;-)

MfG, der verwendete Displaytyp wurde mich aber doch interessieren 
(Zwecks Datenblatt)
OP #3430865
Lesenswert?

Guten Morgen an alle.
Bin zwar auf Arbeit und komme nicht ans Display, versuche aber einiges 
zu klären.
Das Programm läuft nicht in einer Schleife und wird nur einmal 
dargestellt.
Als Mist bezeichen die Ausgabe, in der 2 und 3 Zeile des Displays. In 
der 1 Zeile sind die ersten 20 Zeichen dargestellt aus dem Programm, 
klar und ohne flackern. in den beiden anderen Zeilen laufen die Zeichen 
so schnell durch, das nur ein wildes flackern zu sehen ist, keine klaren 
Zeichen erkennbar.
Noch was zu der Quelle von lcd.h und lcd.c, nach dem Hinweis von KH habe 
ich es von der offiziellen Seite geladen, zusammen mit einem 
Testprogramm. Die anpassungen an den Port C und anderes habe ich nach 
Angabe des Herstellers gemacht.
achim
#3430964
Lesenswert?

Achim Seeger schrieb:

> Noch was zu der Quelle von lcd.h und lcd.c, nach dem Hinweis von KH habe
> ich es von der offiziellen Seite geladen

ist schon ok.
Nur muss dieses LCD_WRAP_LINES ausgeschaltet werden, sonst pfuscht 
lcd_string in die Ausgabe rein, indem es selbst Zeilenumbrüche 
generiert, wenn die Zeile voll ist. Da dieser Mechanismus noch nicht 
richtig funktioniert, ist das kontrapoduktiv. Daher abschalten.

Das könnte auch das durchlaufen erklären. So gesehen macht mir das im 
Moment weniger Sorgen. Der erste Schritt ist jetzt die Adresskonstanten 
für die einzelnen Zeilen zu bestimmen. Normalerweise liest man die aus 
dem Datenblatt aus, aber so wie es aussieht, finden wir kein Datenblatt, 
das mehr als ein paar Jubel-Verkaufsmeldungen enthält. Also machen wirs 
durch Versuch und Irrtum. Ist nicht so schlimm, das dauert normalerweise 
ein paar Minuten (wenn ich nicht diese WRAP Funktionalität übersehen 
hätte. Könnte mich in den Arsch beissen deswegen)

Ein mögliches Problem lauert noch in der Initialisierung. So kompatibel 
scheint das LCD nicht zu sein. D.h. so ganz traue ich der 
Initialisierung noch nicht, wo die Anzahl der Zeilen eingestellt wird. 
Aber, wir werden sehen.

Tja. So ist das nun mal. Die Zeiten von Plug&Play sind vorbei. Auch 
Treiber müssen unter Umständen konfiguriert werden.
Gast #3430970
Lesenswert?

@ Karl Heinz

Nur zwei Bemerkungen, wenn Du erlaubst:

>Das könnte auch das durchlaufen erklären.

Falls es zutrifft, was Du vermutest, so würde ich erwarten, das das 
"durchlaufen" irgendwann, d.h. kurz nach dem Ende der Ausgabe, aufhört.

Noch eins: Falls das "durchlaufen" wirklich real ist und nicht auf einer 
Schleife beruht, so erinnert mich das an ganz frühe Experimente, in 
denen man den Inhalt des Videospeichers wieder auf dem Bildschirm 
ausgegeben hat, d.h. binäre Pixeldaten wieder als Zeichen ausgab. Das es 
sich um einen solchen Fall handelt, damit sollte man, so glaube ich, 
rechnen.
Gast #3430972
Lesenswert?

>Das es sich um einen solchen Fall handelt, damit sollte man, so glaube ich,
>rechnen.

Das sollte ich, glaube ich, etwas klarer beschreiben:
Es kann doch sein, das wir in das Display, ab einer bestimmten Adresse, 
Daten schreiben, die wiederrum die Ausgabe an anderer Stelle 
beeinflussen.

Wie gesagt, das ist nur Spekulation.
#3430982
Lesenswert?

Bitkracherl schrieb:
>>Das es sich um einen solchen Fall handelt, damit sollte man, so glaube ich,
>>rechnen.
>
> Das sollte ich, glaube ich, etwas klarer beschreiben:
> Es kann doch sein, das wir in das Display, ab einer bestimmten Adresse,
> Daten schreiben, die wiederrum die Ausgabe an anderer Stelle
> beeinflussen.
>
> Wie gesagt, das ist nur Spekulation.

Möglich ist alles.

Aber das wichtigste ist, dass da nicht immer lang gefackelt wird. Ich 
bereite ihm die Testprogramme ohnehin schon so auf, dass er sie nur mit 
Copy&Paste übernehmen muss.
Klar geht da auch schon mal was schief. Immerhin ist diese Form vom 
Debugging nicht so einfach: wir sitzen hier auf der einen Seite vom 
Bildschirm, er auf der anderen. Wir sehen nicht, was passiert, sondern 
sind darauf angewiesen, dass er das so gut und präzise wie möglich 
beschreibt. Woraufhin wir unsere Schlüsse ziehen und die Testprogramme 
entsprechend modifizieren.
Wenn ich die Hardware vor mir habe, dann geht das ratz-fatz. So aber 
sind wir darauf angewiesen, long-range-debugging unter erschwerten 
Bedingungen zu machen.
Gast #3430988
Lesenswert?

>So aber sind wir darauf angewiesen, long-range-debugging unter erschwerten
>Bedingungen zu machen.

Glaub mir, ich bin gewiss ein Mitglied der Gruppe die sich dessen 
bewusst ist. Allein mein Blutdruck weist mich darauf hin. :-)
OP #3431025
Lesenswert?

Ich versuche den Fehler mit einfachen Worten so genau wie möglich zu 
beschreiben. Eine Schleife kann ich ausschliessen. Habe viele 
einstellungen in meinem Prg geändert und Versucht etwas zu bekommen. 
z.B. den Ort der Ausgabe, die Länge einzelnener Zeichen, mehrfache 
Zeichen in verschiedenen Zeilen. Das Ergebnis war immer das selbe. Bin 
gestern abend leider nicht dazu gekommen, die Datein lcd.c (h) zu 
kontrollieren. Habe es jetzt gemacht. Die genannte Einstellung steht auf 
1. Kann die Aenderung erst heute abend machen. Werde dann sofort darüber 
berichten.
Sorry für das frühe schlafen. Muss leider ca 4:00 raus aus dem warmen 
Nest.
Noch was, KH lass das mit dem Arsch be.., man kommt so schlecht ran oder 
man holt sich einen Hexenschuss, wenn man sich so verdreht, oder wie das 
immer sich nennt.
achim
Gast #3431056
Lesenswert?

@ Achim

Ich bitte Dich höflich auf die Situation Rücksicht zu nehmen. 
Insbesondere darauf, dass Du uns um Hilfe gebeten hast. Daraus folgt 
sinnvoller Weise das Du unseren Anweisungen folgst.

Bitte probiere nicht zwischendurch irgendwas herum. Das hält auf. 
Gestern haben wir fast eine Stunde darauf gewartet, das Du einer 
einfachen Anweisung folgst, die in 5 Minuten hätte erledigt werden 
können. Das ist sehr frustrierend.

Und bitte, wenn wir Dich mehrfach auffordern die Ergebnisse nicht verbal 
zu beschreiben, sondern in Form einer Skizze, dann tue das auch.

Du musst Dich entscheiden ob Du mehr Deinem Urteilsvermögen vertraust 
oder unserem. Im Grunde hast Du das schon getan, in dem Du hier fragst. 
Bitte bleibe dann auch konsequent bei dieser Entscheidung. Bedenke 
bitte, dass wir Dir hier kostenlos und freiwillig helfen. Es ist 
frustrierend, dass Du einerseits nach Hilfe fragst, dann aber doch Deine 
eigenen Versuche machst und Anweisungen nicht folgst.

Diese Wünsche haben ihre guten Gründe: Die meisten hier, und 
insbesondere Karl Heinz helfen seit Jahren. Die Dinge, zu denen Du hier 
aufgefordert wirst, sind genau die, die wir auch selbst unternehmen 
würden, um Probleme einzukreisen.
Da Du selbst Dir nicht allein helfen kannst ist es unlogisch, irgendwas 
selbst herumzuprobieren, das den Ablauf der Fehlersuche dann 
kompliziert. Oft stellt sich heraus, das ein eigener Versuch sich mit 
einer Anweisung von uns beisst und die Resultate dann nicht verwertbar 
gewesen sind. In diesem Fall hat das die Angelegenheit so sehr 
verzögert, dass sie nicht mehr gestern Abend erledig werden konnte.
Und wenn wir Dich auffordern Quellcode zu posten, dann tue das bitte 
auch. Das gibt uns eine wertvolle Information, eine Rückkopplung darüber 
was bei Dir genau geschieht. Bedenke, das wir sonst keinerlei 
Möglichkeit haben, zu sehen was geschieht, ausser dem was Du uns gibst. 
Wir arbeiten blind.

Manche Anweisungen mögen Dir sinnlos vorkommen. Du wirst manchmal 
meinen, dass Du eine Frage selbst beantworten kannst und es nicht 
notwendig ist, Quellcode zu posten. (In diesem Fall, das Problem mit der 
Schleife). Es ist aber wesentlich einfach für uns, einfach selbst einen 
Blick auf den Code zu werfen, als Dir erst lang und breit sämtliche 
Möglichkeiten aufzuzählen, was alles falsch gemacht werden kann; z.B. 
wieviele Arten es gibt, unabsichtlich eine Schleife zu bauen.

Also, bis heute abend dann.
#3431067
Lesenswert?

> Es ist aber wesentlich einfach für uns, einfach selbst einen Blick auf den Code 
zu werfen

Vor allen Dingen kommt der entscheidende Geistesblitz oft erst dann, 
wenn man den Code vor sich sieht. Auf die Sache mit dem #define bin ich 
auch erst gekommen, nachdem ich ein wenig im Code rumgescrollt habe. Ich 
hatte zwar vor Jahren ein ähnliches Problem mit dem Fleury Code, aber 
das hab ich längst wieder verdrängt.

> Wir arbeiten blind.
Das ist der entscheidende Punkt. Wir können nichts bei uns ausprobieren 
(wir haben ja nicht exakt die gleiche Hardware). Alles was wir haben ist 
die Vorstellungskraft und Ideen, die sich in Form von Code ausdrücken 
und dessen Ergebnisse wir wiederrum selbst nicht sehen können.
OP #3431132
Lesenswert?

Sorry, den Code habe ich gepostet. Mehr war es nicht. Nach einigen 
längeren Austausch mit Karl-heinz, hat er mich ermutigt, nicht nur 
fertigen Code zu nehmen, sondern auch was selber zu machen. Wer nur 
fertigen Code nimmt verlässt sich blind auf andere. wer selber etwas 
macht, auch mit Fehlern, zeigt seine creativität. Wichtig ist dabei der 
Mut zu fehlern. Keiner ist fehlerfrei. So genug dazu. Mache das heute 
abend, und dann werden wir sehen ob das der Fehler war
achim
Gast #3431146
Lesenswert?

>So genug dazu.
Nein. Nicht wenn Du keine Einsicht zeigst.

>Sorry, den Code habe ich gepostet.

Nein. Das hast Du nicht.
Ich habe Dich hier Beitrag "Re: Komisches Verhalten mit lcd_puts" 
aufgefordert den Code zu posten. Das hast Du NICHT getan.

>Nach einigen längeren Austausch mit Karl-heinz, hat er mich ermutigt, nicht >nur 
fertigen Code zu nehmen, sondern auch was selber zu machen. Wer nur
>fertigen Code nimmt verlässt sich blind auf andere. wer selber etwas
>macht, auch mit Fehlern, zeigt seine creativität. Wichtig ist dabei der
>Mut zu fehlern. Keiner ist fehlerfrei. So genug dazu.

Das sind zwei völlig verschiedene Situationen. Wenn Du für Dich alleine 
arbeitest, dann gilt das wohl. Aber NICHT wenn Du uns hier um Hilfe 
bittest.

Ich nehme Dir nicht ab, das Dir der Unterschied in den Situationen nicht 
bewusst ist. Ich halte das für einen, allerdings untauglichen, 
Rechtfertigungsversuch.
#3431152
Lesenswert?

Lass gut sein.
Ich hab heute Abend sowieso keine Zeit - kriege Besuch.
Gestern wärs gegangen - aber da haben wir ja getrödelt.


Bitkracherl. Falls ich heute am Abend nicht ins Forum komme, könntest du 
das weiter treiben? Die Grundidee kennst du ja. LCD-Bild stabil 
bekommen. Aus der Anzeige die Position des ersten sichtbaren Zeichens 
pro Zeile auszählen und ins lcd.h bei den #define eintragen.
OP #3431210
Lesenswert?

Hallo
Den Code habe ich gepostet, steht ziemlich weit oben. Habe ihn noch mal 
eingetragen:
1
So der Rest, ist nicht viel
2

3
#define F_CPU 16000000UL
4
#include <stdlib.h>
5
#include <avr/io.h>
6
#include <avr/pgmspace.h>
7
#include <util/delay.h>
8
#include "lcd.h"
9

10
int main(void)
11
{
12
lcd_init(LCD_DISP_ON);        // Display initialisieren
13
for (;;)
14
{
15
/*  Text in jede Zeile schreiben */
16
lcd_clrscr();                      // Display löschen
17
lcd_puts("LCD Text Zeile 1\n");    // Zeile 1     
18
lcd_puts("LCD Text Zeile 2\n");    // Zeile 2
19
lcd_puts("LCD Text Zeile 3\n");    // Zeile 3
20
lcd_puts("LCD Text Zeile 4\n");    // Zeile 4
21
_delay_ms(5000);      // kurz warten
22
}

Es ist keine Rechtfertigung.
Genug dazu, möchte nicht vom 100 ins 1000 kommen. Habe Fehler gemacht, 
Asche aufs Haupt, schäme mich, trotzdem möchte ich wissen wo mein Fehler 
liegt.
achim
#3431235
Lesenswert?

Achim Seeger schrieb:
> Hallo
> Den Code habe ich gepostet, steht ziemlich weit oben. Habe ihn noch mal
> eingetragen:

Dieser Code ist mittlerweile sowas von uninteressant.

> trotzdem möchte ich wissen wo mein Fehler liegt.

Das LCD hat, so wie alle Computer, einen linearen Speicher.
D.h. da liegt Speicherzelle an Speicherzelle. Und zwar als eine lange 
Wurscht.
1
+---+---+---+---+---+---+---+---+---+---+---+...
2
|   |   |   |   |   |   |   |   |   |   |   |
3
+---+---+---+---+---+---+---+---+---+---+---+...

Schreibt man in eine Speicherzelle was rein ...
1
+---+---+---+---+---+---+---+---+---+---+---+...
2
|   |   |'H'|   |   |   |   |   |   |   |   |
3
+---+---+---+---+---+---+---+---+---+---+---+...

dann taucht das am Display auf.

Schön.
Nur wird das nicht so dargestellt. Denn schliesslich ist ja deine 
Glasfläche nicht eine lange Wurscht, sondern in 4 Zeilen organisiert.

D.h. es gibt eine logische Aufteilung des Speichers ...
1
|<------------ Zeile 1 ---->|<--- Zeile 2 ------
2
+---+---+---+---+---+---+---+---+---+---+---+...
3
|   |   |   |   |   |   |   |   |   |   |   |
4
+---+---+---+---+---+---+---+---+---+---+---+...

in die physikalischen Zeilen. Schreibt man an diese Position das 'H' in 
den Speicher
1
|<------------ Zeile 1 ---->|<--- Zeile 2 ------
2
+---+---+---+---+---+---+---+---+---+---+---+...
3
|   |   |   |   |   |   |   |'H'|   |   |   |
4
+---+---+---+---+---+---+---+---+---+---+---+...
dann taucht das als erstes Zeichen in der zweiten Zeile auf.
Genau diese Umrechnung macht zb lcd_gotoxy. Es errechnet wo, beginnend 
ab dem Anfang des kompletten Speichers, die Speicherzelle ist, die der 
angegebenen Spalten/Zeilenposition entspricht.
Nur muss lcd_gotoxy dazu natürlich wissen, wo im Speicher die Zeile 2 
anfängt. In der Zeichnung hier ist es die Speicheradresse ...
1
|<------------ Zeile 1 ---->|<--- Zeile 2 ------
2
+---+---+---+---+---+---+---+---+---+---+---+...
3
|   |   |   |   |   |   |   |'H'|   |   |   |
4
+---+---+---+---+---+---+---+---+---+---+---+...
5
  0   1   2   3   4   5   6   7   8   9
... 7
Soll die Ausgabe also in der Zeile 2, Spalte 3 anfangen, dann ist die 
zugehörige Speicheradresse 7 + 3 gleich 10. Dorthin setzt lcd_gotoxy den 
Cursor und dort landet dann die nächste Ausgabe. Im Speicher ist es die 
Adresse 10, auf dem LCD-Glas ist es die Zeile 2, Spalte 3


Jetzt kommt das Problem:
Man muss wissen, wo genau im Speicher dieser Punkt ist. An welcher 
Adresse die Zeile 2, die Zeile 3 bzw. die Zeile 4 anfangen.

Dsa sind diese Konstanten
1
#define LCD_START_LINE1  0x00     /**< DDRAM address of first char of line 1 */
2
#define LCD_START_LINE2  0x40     /**< DDRAM address of first char of line 2 */
3
#define LCD_START_LINE3  0x14     /**< DDRAM address of first char of line 3 */
4
#define LCD_START_LINE4  0x54     /**< DDRAM address of first char of line 4 */

normalerweise passen die auch für die meisten LCD. Nur bei deinem passen 
diese Werte eben anscheinend nicht. Also müssen wir sie ermitteln.

Die Grafik zeigt auch schon die prinzipielle Idee, die benutzt wird. Wir 
schreiben den Speicher einfach voll
1
+---+---+---+---+---+---+---+---+---+---+---+...
2
| A | B | C | D | E | F | G | H | I | J | K |
3
+---+---+---+---+---+---+---+---+---+---+---+...
4
  0   1   2   3   4   5   6   7   8   9

Beginnend ganz vorne einfach einen Buchstaben nach dem anderen in den 
Speicher. Das können wir, weil sich das LCD an dieser Stelle nicht darum 
kümmert, wo die Zeilengrenzen sind, sondern einfach Buchstabe für 
Buchstabe in den Speicher schreibt.

Gut. Nachdem der Speicher so angefüllt wurde, schaut man aufs Display 
und sieht
1
+-------+
2
| ABCDE |
3
| HIJKL |
4
|       |
5
|       |
6
+-------+
Da das erste sichtbare Zeichen in der zweiten Zeile das 'H' ist, weiß 
ich damit, dass in
1
+---+---+---+---+---+---+---+---+---+---+---+...
2
| A | B | C | D | E | F | G | H | I | J | K |
3
+---+---+---+---+---+---+---+---+---+---+---+...
4
  0   1   2   3   4   5   6   7   8   9
hier
1
                              |
2
                              v 
3
+---+---+---+---+---+---+---+---+---+---+---+...
4
| A | B | C | D | E | F | G | H | I | J | K |
5
+---+---+---+---+---+---+---+---+---+---+---+...
6
  0   1   2   3   4   5   6   7   8   9
die Startadresse der zweiten Zeile im LCD_Speicher ist. Nämlich die 7. 
Die trag ich ins lcd.h für die zweite Zeile ein und fortan weiss dann 
auch lcd_gotoxy, dass es in die zweite Zeile kommt, wenn es bei 7 
beginnend die Spalten weiter zählt.
OP #3431371
Lesenswert?

Erst mal wieder Danke für KH, jetzt ist es klar was du machen willst, 
sorry, war mir unklar. Mache es sofort, wenn ich am teilsitze.
Auch der Code von KH steht drin. meine diesen

ok, danke.
Lass uns mal Plan B probieren
int main()
{
  lcd_init(LCD_DISP_ON);        // Display initialisieren
  lcd_puts( 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" );

  while( 1 )
    ;
}

Danach kam diese Ergebis:

 +----------------------------------+
 | ABCDEF0GHIJKL0MNOPQR0STUVW0XYZa0 |
 | MistMistMistMistMistMistMistMist |
 | MistMistMistMistMistMistMistMist |
 |                                  |
 +----------------------------------+

Die erste Zeile wurde ganz korrekt dargestellt. In der 2. und 3. Zeile 
nur Mist. Muss nach dem letzten korrekten Buchstaben schauen.
achim
Gast #3431390
Lesenswert?

http://www.farnell.com/datasheets/50586.pdf
Seite 43 :
When 1-line display mode (N = 0), DDRAM address is from "00H" to "4FH".
In 2-line display mode (N = 1), DDRAM address in the 1st line is from 
"00H" to "27H", and
DDRAM address in the 2nd line is from "40H" to "67H".

Nur mal so aus Interesse, wenn man nun ein Datenblatt zu einem Display 
hat,
wie rechnet man dann die Adressen aus ?
(1 Line Mode)
MaxAdresse / AnzahlLines = Schritte
0x4F (+1) / 0x04 = 0x14
1. 0x00
2. 0x14
3. 0x28
4. 0x3C
Wäre das so richtig oder ist das Mist ?
Gast #3431411
Lesenswert?

Hi

>Wäre das so richtig oder ist das Mist ?

Mist.

Den Bereich 0x00 bis 0x27 teilen sich Displayzeile 1 und 3. Der Inhalt 
von 0x40 bis 0x67 wird in Displayzeile 2 und 4 dargestellt. Damit kommt 
man auf die o.g. Anfangsadressen:

>#define LCD_START_LINE1  0x00
>#define LCD_START_LINE2  0x40
>#define LCD_START_LINE3  0x14
>#define LCD_START_LINE4  0x54

MfG Spess
#3431499
Lesenswert?

Achim Seeger schrieb:

> Danach kam diese Ergebis:

Ja.
Da war aber der Fehler noch enthalten, dass
#define LCD_WRAP_LINES  1
noch auf 1 stand. Damit war der Test unbrauchbar, weil lcd_puts nicht 
einfach nur die Character ausgegeben hat, sondern sich in diese Ausgabe 
mit dazwischen gestreuten lcd_gotoxy eingemischt hat. Das können wir 
aber nicht brauchen. Daher
#define LCD_WRAP_LINES  0


> Die erste Zeile wurde ganz korrekt dargestellt. In der 2. und 3. Zeile
> nur Mist. Muss nach dem letzten korrekten Buchstaben schauen.

Die Information, die jetzt als erstes wichtig ist:
Hat mit dem umstellen dieses #define diese Durchlauferei aufgehört oder 
nicht.

Ich hoffe mal, dass es aufgehört hat.
OP #3431738
Lesenswert?

Hallo
auf ein neues. Habe die entsprechenden Sachen geändert. Stelle die sache 
mit rein.
1
#define LCD_START_LINE1  0x00     /**< DDRAM address of first char of line 1 */
2
#define LCD_START_LINE2  0x40     /**< DDRAM address of first char of line 2 */
3
#define LCD_START_LINE3  0x14     /**< DDRAM address of first char of line 3 */
4
#define LCD_START_LINE4  0x54     /**< DDRAM address of first char of line 4 */
5
#define LCD_WRAP_LINES      0     /**< 0: no wrap, 1: wrap at end of visibile line */
Wenn ich diese Sache eingebe erscheint die nachfolgende Ausgabe
1
lcd_gotoxy(0,0);
2
lcd_puts("1-1-1-1-1");
3

4
lcd_gotoxy(0,1);
5
lcd_puts("2");
6

7
lcd_gotoxy(0,2);
8
lcd_puts("3");
9

10
lcd_gotoxy(0,3);
11
lcd_puts("4-4-4-4-4");

 +----------------------------------+
 | 1-1-1-1-1                        |
 | 2                                |
 | 3                                |
 | 4-4-4-4-4                        |
 +----------------------------------+

Mit dieser Ausgabe sind die Zeichen korrekt

Gebe ich aber den Text ein
1
lcd_puts("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw1234567890A1A2A3A4A5A6A7A8A9B1V");
wird das ganze Display damit gefüllt, aber anders als erwartet

 +----------------------------------+
 | ABC ...                  ... RST |   Zeile 1
 | opq ...                  ... 90A |   Zeile 2
 | UVW ...                  ... lmn |   Zeile 3
 | 1A2 ...                  ... B1V |   Zeile 4
 +----------------------------------+

Mit dieser Ausgabe sind die zeilen 2 und 3 vertauscht
Zwei verschiedene Ausgaben? Sorry, jetzt passe ich langsam
achim
#3431745
Lesenswert?

Achim Seeger schrieb:

>  +----------------------------------+
>  | 1-1-1-1-1                        |
>  | 2                                |
>  | 3                                |
>  | 4-4-4-4-4                        |
>  +----------------------------------+

Super, dann passt es.


>
1
> lcd_puts("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw1234567890A1A2A3A4A5A6A7A8A9B1V");
2
>
> wird das ganze Display damit gefüllt, aber anders als erwartet

Von dir vielleicht.
Ich hab genau das erwartet.
Denn kein Mensch sagt, dass im Speicher hinter der Zeile 1 die Zeile 2 
anfangen muss.
Und das tut es auch nicht, wie das Testprogramm eindrucksvoll beweist.

> Mit dieser Ausgabe

Mit dieser Ausgabe ist vor allen Dingen eines dokumentiert: Das sich das 
Programm an der Zeilensteuerung vorbeimogelt und uns den internen 
Speicheraufbau so zeigt, wie er wirklich ist. Dieses Programm weiß 
nichts von Zeilen.


Lass die Wrap-Steuerung abgeschaltet.
In Wirklichkeit ist die nämlich sowieso zu nichts nütze. Das sieht nur 
auf den ersten Blick so aus, als ob ein automatischer Zeilenumbruch eine 
tolle Sache wäre. Tatsächlich braucht das aber auf so kleinen LCD 
keiner, weil keiner derartige lange Texte (und auch wieder kurz, denn 
länger als 4 Zeilen darfs nicht sein) ausgibt.
Der normale Weg ist: lcd_gotoxy um den Cursor an eine Position zu 
schicken und dann dort den Messwert ausgeben. Cursor mit lcd_gotoxy an 
eine andere Position und dort dann einen anderen Messwert ausgeben. usw. 
usw.
Gast #3431748
Lesenswert?

Schön. Dann sind die Addressen:
1
#define LCD_START_LINE1  0x00     /**< DDRAM address of first char of line 1 */
2
#define LCD_START_LINE2  0x2A     /**< DDRAM address of first char of line 2 */
3
#define LCD_START_LINE3  0x14     /**< DDRAM address of first char of line 3 */
4
#define LCD_START_LINE4  0x44     /**< DDRAM address of first char of line 4 */
5
#define LCD_WRAP_LINES      0     /**< 0: no wrap, 1: wrap at end of visibile line */

Hoffe ich hab richtig abgezählt. Vielleicht kann das jemand 
kontrollieren.
#3431767
Lesenswert?

Bitwackler schrieb:
> Huch! Mach ich gerade einen Denkfehler, Karl Heinz?


Nein, ich rechne auch grad nach.

Seine ausgabe ist
1
   0123456789ABCDEF
2

3
0  ABCDEFGHIJKLMNOP
4
1  QRSTUVWXYZabcdef
5
2  ghijklmnopqrstuv
6
3  w1234567890A1A2A
7
4  3A4A5A6A7A8A9B1V

Der Umbruch von T auf U findet bei Adresse 0x14 statt. Soweit passt das. 
Das war zu erwarten (Zeile 3)

Aber der Umbruch von n auf 0, also in die Zeile 2, wäre an Adresse 0x28. 
Und das ist eigentlich unlogisch.

Auf der anderen Seite ist das Testprogramm
1
lcd_gotoxy(0,0);
2
lcd_puts("1-1-1-1-1");
3

4
lcd_gotoxy(0,1);
5
lcd_puts("2");
6

7
lcd_gotoxy(0,2);
8
lcd_puts("3");
9

10
lcd_gotoxy(0,3);
11
lcd_puts("4-4-4-4-4");
eigentlich recht eindeutig. Wenn gotoxy( 0, 1 ) korrekt in Zeile 2 
positioniert, dann sollte 0x40 eigentlich stimmen (zumal das ja auch der 
Normalfall ist).
Gast #3431781
Lesenswert?

Ich habe mich verzählt. (Hätte gleich Dein Schema nehmen sollen).

Es muss:
1
#define LCD_START_LINE2  0x28     /**< DDRAM address of first char of line 2 */

sein.

Aber wie gesagt. Entweder das erste ist korrekt ODER das zweite. 
Irgendwas ist da faul:
Gast #3431802
Lesenswert?

Wie sind eigentlich LCD_LINES und KS0073_4LINES_MODE definiert bei Dir, 
Achim?

@ Karl Heinz
Im Code wird mit dem Wrap eigentlich nur das neusetzen des der DRAM 
adresse gesteuert. Das newline aber trotzdem ausgewertet und die Adresse 
neu gesetzt. Bin noch beim gucken.
Gast #3431854
Lesenswert?

Wir haben also insgesamt einen vierfachen Widerspruch.

Nur eine von den vier Aussagen kann stimmen.
1. Das hier Beitrag "Re: Komisches Verhalten mit lcd_puts" liefert 
eine fehlerhafte Ausgabe
2. Das erste Programm hier 
Beitrag "Re: Komisches Verhalten mit lcd_puts" liefert eine 
korrekte Ausgabe
3. Das zweite Programm hier liefert die angegebene Ausgabe
4. Das hier Beitrag "Re: Komisches Verhalten mit lcd_puts" liefert 
eine die Ausgabe wie unter 3. für das zweite Programm angegeben.

Das deutet darauf hin, das Du nicht immer das HEX-File programmierst, 
das Du annimmst.

Führe den Test von Beitrag "Re: Komisches Verhalten mit lcd_puts" 
noch einmal durch. Lösche aber bevor Du beginnst im Explorer das HEX 
File. Versichere Dich das es tatsächlich weg ist und nicht versehentlich 
ein anderes geflasht wird, in dem Du so tust als wolltest Du flashen.
Lösche das HEX-File nocheinmal, nachdem Du den ersten Test durchgeführt 
hast. Versichere Dich wieder das es wirklich weg ist.
Dann führe den zweiten Test aus.
Gast #3431863
Lesenswert?

Aus dem Datenblatt vom HD44780

However, when N is 0 (1-line display), AAAAAAA can be 00H to 4FH. When N 
is 1 (2-line display),
AAAAAAA can be 00H to 27H for the first line, and 40H to 67H for the 
second line.

Mit dem Display ist alles in Ordnung und die Offsets aus dem ersten 
Progamm
stimmen. Bei vierzeiligen Displays ist die Reihenfolge

Zeile 1 vorderer Teil
Zeile 2 vorderer Teil
Zeile 1 hinterer Teil
Zeile 2 hinterer Teil

Das Display hat intern also gar keine 4 Zeilen! Es sind nur zwei.
Warum die Anordnung so gewählt wurde hat wohl irgendwelche Gründe.
Gast #3431884
Lesenswert?

Als nächstes versuchst Du dann mal folgendes:

Setze LCD_CONTROLLER_KS0073 auf 1.
Setze die Zeilenadressen wieder auf die ursprünglichen Werte zurück.

An sich nämlich kann ein HD44780 nur eine oder zwei Zeilen behandeln.
Das spielt für eine fortlaufende Ausgabe wie "ABCD...." keine Rolle, 
wenn es auch die Reihenfolge verwürfelt. Aber es führt zu Fehlern bei 
gotoxy.
Gast #3431891
Lesenswert?

>Es könnte eine Erklärung sein, so wie du die Zeilen angibst. Es doch den
HD 44780. Wie ist eine Darstellung damit möglich?

Was könnte eine Erklärung sein und wofür?
Wie gebe ich Zeilen an und wo?
Was heisst: "Es doch den HD 44780."
Von welcher Darstellung schreibst Du? Was meinst Du mit der Frage?

Tut mir leid, aber ich verstehe das überhaupt nicht. Das sind, bis auf 
den letzten, völlig ungrammatikalische Sätze und dem ersten und letzten 
fehlt der inhaltliche Kontext.
Gast #3431956
Lesenswert?

>Tja Holger, du hast es als Bo.. bezeichnet, damit stehst du in der
>Pflicht was besseres zu zeigen.

Du hast doch jetzt gesehen das dein Kram funktioniert
wenn du lcd_gotoxy() benutzt. Also bleib dabei.
Das mit dem automatischen Zeilenvorschub scheint
bei dir aus irgendwelchen Gründen nicht zu funktionieren.
Also benutze das nicht.

Das hier ist korrekt. Genau so passt das für dein Display.

#define LCD_START_LINE1  0x00     /**< DDRAM address of first char of 
line 1 */
#define LCD_START_LINE2  0x40     /**< DDRAM address of first char of 
line 2 */
#define LCD_START_LINE3  0x14     /**< DDRAM address of first char of 
line 3 */
#define LCD_START_LINE4  0x54     /**< DDRAM address of first char of 
line 4 */

Dein Display hat keinen KS0073. Also bleibt das define auf 0.

Schreib nicht über das Ende einer Zeile hinaus und erwarte nicht
das der nächste Buchstabe eine Zeile weiter unten am Anfang der Zeile 
erscheint.

So, und jetzt kannst du glaube ich ohne Probleme das mit deinem
Display machen was du möchtest.
Gast #3431972
Lesenswert?

Das hier könnte es erklären :
http://www.sprut.de/electronic/lcd/#4x20

[...]
4x20 Display
 Vierzeilige Displays mit bis zu 20 Zeichen pro Zeile lassen sich mit 
nur einem Controller und zusätzlichen Displaytreibern aufbauen. Das 4x20 
Display ist eigentlich ein 2x40 Display, das in der Mitte 
durchgeschnitten wurde, und bei dem dann die hinteren Hälften der Zeilen 
unter den vorderen Hälften der Zeilen angebracht wurde. Wenn man also 
dem Controller Daten für die 1. Zeile übergibt, so werden davon die 
ersten 20 Zeichen wirklich in die 1. Zeile geschrieben, während Zeichen 
21 bis 40 in die 3. Zeile gelangen. Genauso gehören die 2. und 4. Zeile 
des Displays eigentlich hintereinander.
[...]
Gast #3431978
Lesenswert?

So, nachdem wir Holger verabschiedet haben, kann's weitergehen.

Das Problem iat, dass wir mit dem abschalten des Wrappings auch das 
weitersetzen der Zeilenanfangsadressen ausser Betrieb gesetzt haben.

Setze LCD_WRAP_LINES wieder auf 1.
1
#define LCD_WRAP_LINES      1     /**< 0: no wrap, 1: wrap at end of visibile line */

Setze LCD_CONTROLLER_KS0073 wieder auf 0. Das ist wichtig!

Setze die Zeilenanfänge so wie ich sie beschrieben habe.

L1 0x00
L2 0x28
L3 0x14
L4 0x3c

Dann probiere dieses Programm noch einmal.
1
 lcd_puts("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw1234567890A1A2A3A4A5A6A7A8A9B1V");

Die Reihenfolge sollte jetzt stimmen. Falls nicht bitte wieder eine 
Skizze machen.
Gast #3431989
Lesenswert?

>So, nachdem wir Holger verabschiedet haben, kann's weitergehen.

Träum weiter;)

>Die Reihenfolge sollte jetzt stimmen.

Wird sie nicht. Dazu muss man kein Hellseher sein.
Zeile 2 und Zeile 3 werden vertauscht bleiben.

Die Gründe habe ich oben schon genannt. Aber du verstehst das ja nicht.
Gast #3432010
Lesenswert?

>Aber du verstehst das ja nicht.

Nein. Tatsächlich. Das verstehe ich nicht.

Schau Dir mal den Code an: (Die Funktion wird für jedes Zeichen des 
Strings aufgerufen.

1
void lcd_putc(char c)
2
{
3
    uint8_t pos;
4

5

6
    pos = lcd_waitbusy();   // read busy-flag and address counter
7
    if (c=='\n')
8
    {
9
        lcd_newline(pos);
10
    }
11
    else
12
    {
13
#if LCD_WRAP_LINES==1
14
#if LCD_LINES==1
15
        if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
16
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
17
        }
18
#elif LCD_LINES==2
19
        if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
20
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0);    
21
        }else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ){
22
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
23
        }
24
#elif LCD_LINES==4
25
        if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
26
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0);    
27
        }else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ) {
28
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE3,0);
29
        }else if ( pos == LCD_START_LINE3+LCD_DISP_LENGTH ) {
30
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE4,0);
31
        }else if ( pos == LCD_START_LINE4+LCD_DISP_LENGTH ) {
32
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
33
        }
34
#endif
35
        lcd_waitbusy();
36
#endif
37
        lcd_write(c, 1);
38
    }
39

40
}/* lcd_putc */

Wenn die pos stimmt, die zurückgegeben wird, dann sollte der Mechanismus 
mit dem weitersetzten der Zeilen eigentlich funktionieren.

Da bei dem Test oben der Mechanismus ausser Betrieb war, konnte man 
tatsächlich die Positionen der Zeichen abzählen und die Offsets waren 
korrekt.

>Träum weiter;)
Davon träumst Du vielleicht, das ich von Dir träume. Eine höfliche 
Verabschiedung scheinst Du nicht zu verstehen.
OP #3432025
Lesenswert?

Habe das gemacht, Einstellungen geändert und das Prg gestartet. Anzeige 
ist wie gehabt. Beide zeilen sind vertauscht.

Noch was, bleibt bitte beide sachlich, es bringt nichts, wenn wir banal 
uns die Köpfe einschlagen. Wir versuchen gemeinsam ein problem zu lösen. 
Dazu zählt auch der Austausch von Gedanken und Vorschlägen, aber bitte 
sachlich mit einem Anteil von Vernunft. Danke
Gast #3432029
Lesenswert?

>Wenn die pos stimmt, die zurückgegeben wird, dann sollte der Mechanismus
>mit dem weitersetzten der Zeilen eigentlich funktionieren.

Dann lies mal noch mal bei mir nach.

Die zweite Zeile beginnt im zwei Zeilen Modus bei 0x40.
Das ist FAKT. Deine Offsets stimmen einfach nicht.

Ich tu dir aber den Gefallen und halte mich ab hier raus.
Wird bestimmt lustig einfach nur weiter zu lesen;)
Gast #3432030
Lesenswert?

Hm. Das ist merkwürdig.

Mache mal die Gegenprobe mit:
1
#define LCD_START_LINE1  0x00     /**< DDRAM address of first char of line 1 */
2
#define LCD_START_LINE2  0x40     /**< DDRAM address of first char of line 2 */
3
#define LCD_START_LINE3  0x14     /**< DDRAM address of first char of line 3 */
4
#define LCD_START_LINE4  0x54     /**< DDRAM address of first char of line 4 */

Das hat ja früher auch eine Vertauschung ergeben.
Gast #3432043
Lesenswert?

> Noch was, bleibt bitte beide sachlich, es bringt nichts, wenn wir banal
> uns die Köpfe einschlagen.

Nur nebenbei: der eine oder andere eingeschlagene Kopf wäre wirklich 
eine Banalität.


Aber was ist mit der Website los - ich kann derzeit jedes ankommende 
Byte per Handschlag begrüßen.
OP #3432072
Lesenswert?

Sorry, hab was zu essen geholt, die Sache macht hunrig
Das gleiche ergebnis, verfolge gerade eine andere Sache. Da sich die 
Anzeige nicht ändert, vermute ich, das ich die Datein ändere aber aus 
einem unbekannten Grund auf andere datein zugegrioffen wird. habe 
Verzeichnis kontrolliert und such dabei noch
Gast #3432084
Lesenswert?

>Das gleiche ergebnis,
Wenn die Zeilen bei der Gegenprobe immer noch vertauscht sind, dann 
stimmt irgendwas mit pos nicht, denke ich.

Das mit dem versehentlich falschen Datei, kannst Du sicherstellen in dem 
Du immer die HEX-Datei löschst und vor dem neuen compilieren den 
Flash-Vorgang startest. Es sollte keine HEX-Datei mehr in dem Dialogfeld 
zu sehen sein. (Ich vermute allerdings nur, das Du AVRSTudio 4 
verwendest).

Um das zu diagnostizieren, möchte ich die Variable pos ausgeben. 
Allerdings sind das ja möglicherweise grössere Zahlen als 9 bzw. f. 
Daher will ich die Zahl in ein Zeichen umwandeln, welches das Display 
darstellen kann.

Ändere als einmal die Funktion wie folgt ab.
1
void lcd_putc(char c)
2
{
3
    uint8_t pos;
4

5

6
    pos = lcd_waitbusy();   // read busy-flag and address counter
7
    if (c=='\n')
8
    {
9
        lcd_newline(pos);
10
    }
11
    else
12
    {
13
#if LCD_WRAP_LINES==1
14
#if LCD_LINES==1
15
        if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
16
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
17
        }
18
#elif LCD_LINES==2
19
        if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
20
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0);    
21
        }else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ){
22
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
23
        }
24
#elif LCD_LINES==4
25
        if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
26
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0);    
27
        }else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ) {
28
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE3,0);
29
        }else if ( pos == LCD_START_LINE3+LCD_DISP_LENGTH ) {
30
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE4,0);
31
        }else if ( pos == LCD_START_LINE4+LCD_DISP_LENGTH ) {
32
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
33
        }
34
#endif
35
        lcd_waitbusy();
36
#endif
37
        lcd_write((pos < 0x5E) ? (pos + 0x21) : (pos + 0xA1), 1);
38
    }
39

40
}/* lcd_putc */

So bekommen wir für jede Position ein eigenes Zeichen. Anhand der Lage 
des Zeichens auf dem Display und dem Zeichen selbst können wir dann 
erkennen, ob welche Adresse das Display jeweils annimmt, bevor es ein 
Zeichen ausgibt.
OP #3432100
Lesenswert?

Mir ist was aufgefallen. Die Datei lcd.c und lcd.h sollen im gleichen 
Ordner sein. sind sie. Wenn ich ein neues Programm schreibe, gebe ich 
den Standort an. Danach scheint das programm sich die Datein zu holen 
und zusätzlich noch mal in das verzeichnes des Programmes zu schreiben. 
Wenn es dann das alte nimmt, kann ich ändern so viel ich will es wird 
nichts. Muss noch einiges kontrollieren, wenn  nicht muss ich einiges 
löschen. Will das Programm zwinen was neues zu nehmen.
achim
Gast #3432108
Lesenswert?

@ Spess53
> Das sind aber die üblichen Zeilenanfänge bei einem 4x20 Display:

Das mag sein. Aber worauf willst Du mit Deinem Beitrag hinaus? Ich kann 
mir da nichts bei denken. Meinst Du es findet keine Vertauschung statt? 
Oder was willst Du sagen?

Im Moment haben wir zwei offene Punkte, denke ich:
1. Der TO macht irgendeinen Fehler beim compilieren und flashen
2. Es stimmt was mit dem Rückgabewert von lcd_waitbusy() nicht.

Siehst Du noch eine Möglichkeit, die man prüfen könnte? Oder meinst Du 
es ist sinnlos das zu prüfen?
Gast #3432123
Lesenswert?

Hi

>Das mag sein. Aber worauf willst Du mit Deinem Beitrag hinaus?

Darauf, das z.B. solche Aussagen

>L1 0x00
>L2 0x28
>L3 0x14
>L4 0x3c

schlichtweg falsch sind.

Hilfreich wäre es auch, wenn der TO mal den genauen Typ des Displays 
bekanntgeben würde.

MfG Spess
Gast #3432126
Lesenswert?

>>Das mag sein. Aber worauf willst Du mit Deinem Beitrag hinaus?
>
>Darauf, das z.B. solche Aussagen
>
>>L1 0x00
>>L2 0x28
>>L3 0x14
>>L4 0x3c
>
>schlichtweg falsch sind.

Sag ich doch schon die ganze Zeit;)

>Hilfreich wäre es auch, wenn der TO mal den genauen Typ des Displays
>bekanntgeben würde.

PC2004. Hast du oben wohl übersehen.
Aber nun ist er schlafen gegangen. Muss früh raus der arme Kerl.
Gast #3432131
Lesenswert?

@ Spess53

>Darauf, das z.B. solche Aussagen ... schlichtweg falsch sind.

Auch das mag so sein. Es spricht sogar vieles dafür. Zugegeben.
Andererseits ist diese Aussage auch nicht völlig aus der Luft gegriffen, 
wenn Du Dir das Testergebnis hier 
Beitrag "Re: Komisches Verhalten mit lcd_puts" anschaust.

>Hilfreich wäre es auch, wenn der TO mal den genauen Typ des Displays
>bekanntgeben würde.
Das sehe ich genauso und diese Frage wurde hier schon gestellt und 
beantwortet. Siehe Beitrag "Re: Komisches Verhalten mit lcd_puts"

Leider hat uns das, wie Du in den darauf folgenden Beiträgen sehen 
kannst, nicht viel weitergebracht, weil wir kein Datenblatt finden 
können.

Spess, ich halte Dich für kompetent, aber ich sehe nicht, wie uns Deine 
Beiträge bis jetzt, auf irgendeine Weise weiterbringen. Auch meine ich 
nicht, das es Anzeichen dafür gibt, das ich (oder wir) uns auf eine 
Annahme versteift haben, so das es nötig wäre, andere Gesichtspunkte 
einzubringen.
Gast #3432140
Lesenswert?

>Sag ich doch schon die ganze Zeit;)

Schon recht.
Aber Du und Spess müsst doch auch sehen, dass das was bisjetzt immer so 
war,
doch auch einmal anders sein kann. Damit muss man doch vernünftiger 
Weise rechnen. Das ist doch ein wenig unvernünftig, hier in der Manier, 
das nicht sein kann, was nicht sein darf, immer wieder das selbe zu 
wiederholen.

Und wie gesagt: Es hat sich ja auch niemand darauf versteift. Wo ist 
etwas anderes erkennbar hier? Falls sich herausstellt, das diese 
Adressen falsch sind, dann wird das eben geändert. Wir/ich sind doch 
noch dabei, das Problem zu lösen.
Gast #3432147
Lesenswert?

@ Holger

Oh weh. Dumm gelaufen.

In dem Beitrag wurde das nicht als Datenblatt für den gesuchten Typ 
benannt und die Frage war so gestellt, als wenn es sich um eine nicht 
direkt zum Thema gehörige Seitenfrage handelt. Ich hatte gestern 
nichtmal in die Datei geschaut.

Das ist mir und Karl Heinz entgangen.

Danke.

Gut. Dann dürfte das mit den Adressen wohl erledigt sein.

Bleibt also noch das beim Compilieren oder flashen was schiefgeht.
Gast #3432153
Lesenswert?

Hi

>PC2004. Hast du oben wohl übersehen.

Das hab ich wohl. Musste zwischendurch jemand zum Krankenhaus fahren.

PC2004: 4x20 von Powertip mit ST7066U Controller.

Am ST7066U kann es aber nicht liegen. Das ist einer der vielen 
kompatiblen zum HD44780.

MfG Spess
OP #3432354
Lesenswert?

Guten morgen an alle
Habe noch was gefunden, was ich nicht verstehe. Wenn ich ein neues 
prigramm schreibe, gebe ich das Verzeichnis an, in dem sich lcd.c und 
lcd.h befinden. Compiliere das Programm, es wird eine hex und elf 
erzeugt und gleichzeitig speichert sich das AVR Studio die Datein lcd.c 
und lcd.h nochmal in das gleiche Verzeichnis in dem sich auch das 
eigentliche Programm befindet. Wird danach die lcd.c und lcd.h 
verändert, wird die Änderung nicht beachtet, da die beiden anderen 
genommen werden. Habe danach auch diese geändert, an einigen stellen 
auch gelöscht. Jetzt bekomme ich teilweise Fehlermeldungen, auch wenn 
ich das Programm neu erstelle. Der zusammanhang ist mir unklar, warum so 
oder so. Werde einiges neu aufsetzen müssen und neue Programme anlegen. 
Bitte ein wenig geduld. Werde sfort berichten
achim
Gast #3432367
Lesenswert?

Schreibe uns bitte mal, welches AVRStudio Du verwendest.

Es gibt nämlich verschiedene Versionen davon.
Leider kenne ich mich nur mit der Version 4 wirklich gut aus.

Eine weitere Möglichkeit Dir zu helfen ist, dass Du mal das gesamte 
Projektverzeichnis in eine ZIP-Datei packst (komprimierst) und hier als 
Anhang postest.
Gast #3432374
Lesenswert?

Wenn ich so überlege, dann ist das durchaus ein sinnvolles Verhalten.
Du lädst C-Dateien aus dem Netz herunter. Beispielsweise in den Ordner 
"Downloads". Dann legst Du ein neues Projekt unter sagen wir "Eigene 
Dateien\Projekte\LCD" an. Nun gibst Du als eine der Quellcodedateien, 
die C-Datei in "Downloads" an. AVRStudio kopiert sie sich in das 
LCD-Verzeichnis.
Die Dateien unter Download bleiben original und man kann sie für weitere 
Projekte verwenden.

Habe ich zwar noch nicht gesehen, aber das wäre doch sehr nützlich.


>Habe danach auch diese geändert, an einigen stellen
>auch gelöscht. Jetzt bekomme ich teilweise Fehlermeldungen, auch wenn
>ich das Programm neu erstelle.

Wenn ich recht verstehe, dann ging es aber, bevor Du die Dateien 
geändert hast? Das ist schon mal gut.

Dann stelle die Originaldateien wieder her und kompilieren das Programm 
mit der ABC-Ausgabe. Falls Fehlermeldungen kommen, bitte posten.
Gast #3432376
Lesenswert?

>Ich verwende das AVR Studio 6

Ah. Na dann kann ich nur nach allgemeinen Grundsätzen raten:

Mache es einfach so, wie Du es vorher gemacht hast.
Aber ändere nur die Kopie von lcd.h in dem Projektverzeichnis.
Das sollte eigentlich super funktionieren.
Gast #3432383
Lesenswert?

>Lasse mich überraschen, was will ich auch machen. Nach altbewährter
>Methode, das grösste Problem sitzt vor dem Monitor .. , bin ich offen
>für alles

Worauf bezieht sich das? Was für einen Rat brauchst Du jetzt? Welches 
Problem steht an?
OP #3432579
Lesenswert?

Bleib erst mal ganz ruhig. Du brauchst eine Pause. Ich muss was tun. 
Besonders die Programme in Ordnung bringen, die Verzeichnisse der 
einzelnen und testen ob der Aufruf wirklich so ist, wie vermutet. Könnte 
ja sein, das es sogar irgendwo steht. Das Problem steht von mir. Ihr 
habt mehr getan als ich jemals erwartet hätte. Für das bis hier auf 
jeden Fall besten Dank. Habe versprochen, das ich berichte und das werde 
ich auch machen. Danke
achim
OP #3433164
Lesenswert?

Hallo
so, habe meinen Fehler gefunden und alle Datein von gestern wieder in 
Ordnung gebracht. Habe an der stelle weitergemacht. Egal welche Adresse 
ich angebe

0x40
0x00
0x14
0x54

oder

0x00
0x28
0x14
0x3c

bei dem Text mit ABCD .. und so weiter, ist die Anzeige

Zeile 1
Zeile 3
Zeile 2
Zeile 4

Bei der Angabe von lcd_gotoxy erscheint

1
2
3
4

Komme auf den Beitrag von oben zurück. Verwende nur noch lcd_goto. Dann 
klapp es damit. Das andere vergessen wir.
Ansonsten stimmte meine Vermutung. Die beiden lcd.c und lcd.h stehen bei 
mir im Ordner "Datein" und diese wird im Programm angegeben. Nach dem 
compilieren schreibt sich AVR Studio diese in das Verzeicnis des 
Programmes und beachtet die anderen gar nicht mehr. Wieder was neues für 
mich. Danke an alle.
achim

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren