mikrocontroller.net

Forum: Compiler & IDEs LCD 8-Bit Modus mit Busy Flag: String ausgeben


Autor: Jo. F. (funk3r)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebes Forum,
wie der Titel schon sagt habe ich eine Frage, zu einer LCD Ansteuerung.

Bevor jetzt aber Antworten kommen wie "benutze die Suche", möchte ich 
noch darauf hinweisen, dass ich dies schon getan habe, ich habe sehr 
viele nützliche und weniger nützliche Beiträge gelesen.
Jetzt ist es aber leider so, dass ich irgendwie eine Denkblockade habe, 
bzw. weiß ich gerade nicht weiter.
Dazu muss ich noch sagen, dass ich, was das Programmieren angeht, noch 
nicht all zu Fit bin.
Deshalb habe ich das ganze auch erstmal (zum größten Teil) selbst 
geschrieben, damit ich das ganze lerne, allerdings nicht ohne Hilfe 
dieses Forums hier =)

*Viele Worte, wenig Sinn, hier jetzt mein Problem:*
Also, ich will ein 2x16 LCD im 8-Bit Modus mit einem Tiny861 
beschreiben.
Dazu verwende ich das AVR Studio, und wollte es in C programmieren 
(Deshalb auch diese Forenkategorie)

Angeschlossen habe ich die Datenpins an PortA und die Steuerpins(RS; RW; 
EN) an die ersten drei Pins von PortB

Mein Problem ist es jetzt einen String auf dem Display auszugeben, da 
hakt es irgendwie bei mir.
Das Display initialisiert, bzw. flackert am Anfang etwas, dann bleibt es 
aber leer.
Teilweise hatte ich auch schon erreicht, dass etwas angezeigt wurde, 
aber an der falschen Stelle.
Compilerfehler habe ich gerade keine :)
Außerdem wollte ich das ganze ohne die delay-Funktionen machen, sondern 
mit dem Busy-Flag was auch soweit Funktioniert (denke ich zumindest)

Ich habe jetzt einfach mal *den kompletten Code als Zip-Datei 
angehängt*, vlt. kann mir ja jemand von euch Erfahreneren helfen, dass 
wäre echt nett.
Außerdem habe ich mal meine ganzen Versuche im Code (was die Strings 
angeht) auskommentiert, diese Code-Stücke habe ich Teilweise vom WWW 
irgendwo (Google mein Freund und Helfer) allerdings Funktionieren diese 
auch nicht wirklich.
Sollte ich irgendeine Information vergessen haben, dann schreibe ich 
diese natürlich noch dazu.

*Also nochmals die Frage: Kann mir jemand sagen was ich falsch mache?*

viele Grüßle
Jo

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ohne alles betrachtet zu haben ABER:

> lcd.c
>//RW=0 ==> RW Ausschalten, für follgende Befehle

Wackle an den Steuerleitungen passen zur Aktion, überlasse es nicht 
anderen (Aktionen) dieses zu tun.

Wie im richtigen Leben: mit Fehlern anderer (Aktionen) ist immer zu 
rechnen.

MfG

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes F. schrieb:

> Dazu muss ich noch sagen, dass ich, was das Programmieren angeht, noch
> nicht all zu Fit bin.
> Deshalb habe ich das ganze auch erstmal (zum größten Teil) selbst
> geschrieben, damit ich das ganze lerne, allerdings nicht ohne Hilfe
> dieses Forums hier =)

Das ist eine Gratwanderung.
Auf der einen Seite ist es löblich, wenn du deine Fertigkeiten an einem 
Problem schärfen möchtest. Auf der anderen Seite ist gerade eine 
LCD-Ansteuerung so eine Sache. Du kannst da Tage damit verschwenden nach 
Problemen zu suchen, ohne dass dich das deinem Ziel, nämlich 
C-Programmieren zu lernen, näher bringt. Die Probleme die eine LCD 
Ansteuerung mit sich bringen kann, sind meistens nicht auf C-Ebene, 
sondern haben meistens mit Timing zu tun.

> *Viele Worte, wenig Sinn, hier jetzt mein Problem:*

Daher auch die Erwiderung kurz und bündig:
Benutze eine fertige LCD-Ansteuerung, wie zb die vom Peter Fleury und 
konzentriere dich darauf mit der zu arbeiten. Da gibt es noch genug zu 
lernen.

Wenn du das Gefühl hast, du bist soweit, kannst du ja in diese Routinen 
hineinschauen und dir das eine oder andere abschauen.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei deinem enablen und beim busy
setze dort mal ein volatile asm("nop");  rein

dasn ganze einachslten ausschalten geht dem vlt nen tacken zu schnell

bei der initialisierung ..

die ersten 3 bytes sollten auch laut datenballt OHNE busyabfrage kommen 
und in einem gewissen abstand / zeitrahmen


ab dem 4ten byte darf busy abgefragt werden

Autor: Jo. F. (funk3r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger:
Ja, das habe ich mir auch schon angesehen (also diese Peter Fleury lib) 
aber irgendwie steige ich da nicht so ganz durch, außerdem finde ich die 
etwas überdimensioniert.

@gast:
Danke für den Hinweis, das werde ich morgen gleich mal probieren.

Ich habe es übrigens jetzt mit einem anderen Display und den 
delay-Funktionen hin bekommen, werde es wohl dann doch auch mal mit den 
Delays weiter probieren und diese noch etwas anpassen.

Danke, dass ihr euch trotzdem die Zeit für mich genommen habt, echt 
nett, großes Lob auch nochmal für die wirklich schnellen Antworten :)

Grüßle
Jo

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes F. schrieb:
> Also, ich will ein 2x16 LCD im 8-Bit Modus mit einem *Tiny861*
> beschreiben.

Dann hast Du ja nur noch 4 IOs frei, ohne Reset disabled. Ist das nicht 
ein bischen wenig?

Aber es ist auch überhaupt nicht nötig, 11 Pins zu verschwenden, 6 Pins 
reichen völlig für das LCD.

Ein LCD ist nichts zeitkritisches, die CPU-Last ist vernachläsigbar, 
wenn man vernünftig programmiert.
D.h. wenn man nur so oft LCD-Ausgaben macht, daß der Nutzer auch die 
Chance hat, sie abzulesen.
Aus diesem Grund geben auch Meßgeräte nicht mehr als 2..5 Werte/s aus.

Hier ein kleines übersichtliches Beispiel:

http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip

Der Bequemlichkeit halber gehen irgendwelche 6 Pins des MC, d.h. man 
belegt nicht unnötig Spezialfunktionen von Pins.


Peter

Autor: Jo. F. (funk3r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger hat geschrieben:
>Dann hast Du ja nur noch 4 IOs frei, ohne Reset disabled. Ist das nicht >ein 
bischen wenig?
Naja, für ein kleines Uhrenprojekt würde es schon ausreichen ;)

>Aber es ist auch überhaupt nicht nötig, 11 Pins zu verschwenden, 6 Pins
>reichen völlig für das LCD.
Ja, stimmt natürlich, das werde ich dann einmal mit deiner Routine 
probieren.

>Der Bequemlichkeit halber gehen irgendwelche 6 Pins des MC, d.h. man
>belegt nicht unnötig Spezialfunktionen von Pins.
Sehr cool, das werde ich auf jeden Fall einmal testen.
Vielen Dank

Grüßle Jo

Autor: Jo. F. (funk3r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter Dannegger (oder alle anderen, die mir helfen können)

Ich habe dein Beispiel erfolgreich getestet, wie schon geschrieben war 
das eine Display defekt, jetzt habe ich ein
4x20 Display (204B von Displaytech) angeschlossen

Deine Zeilen-Funktion habe ich auch erfolgreich auf die 4 Zeilen 
Variante abgeändert, bzw. neu geschrieben.

Jetzt habe ich aber noch zwei Verständnisfragen zu deinem Code (weil ich 
ja nicht nur blind Kopieren will, sondern auch lernen und verstehen)

Frage 1
Was geschieht in der Datei MYDEFS.h hier?
#define vu8(x)  (*(volatile u8*)&(x))
#define vs8(x)  (*(volatile s8*)&(x))
#define vu16(x) (*(volatile u16*)&(x))
#define vs16(x) (*(volatile s16*)&(x))
#define vu32(x) (*(volatile u32*)&(x))
#define vs32(x) (*(volatile s32*)&(x))
Und vor allem was geschieht direkt darunter hier?
struct bits {
  u8 b0:1;
  u8 b1:1;
  u8 b2:1;
  u8 b3:1;
  u8 b4:1;
  u8 b5:1;
  u8 b6:1;
  u8 b7:1;
} __attribute__((__packed__));

#define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)

Frage 2
In der Datei LCD_DRV.c steht für Befehle folgender Code:
void lcd_command( u8 d )
{
  LCD_RS = 0;
  lcd_byte( d );
  switch( d ){
    case 1:
    case 2:
    case 3: _delay_ms( 2 );    // wait 2ms
  }
}
Für was genau brauche ich hier die switch-Anweisung?

Grüßle und Danke schonmal für Antworten
Jo

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo. F. schrieb:
> Was geschieht in der Datei MYDEFS.h hier?

Damit kann man das Wegoptimieren von Variablenzugriffen verhindern, die 
nicht volatile sind.
In Interrupts stört ein volatile nur, aber im Main muß das Lesen 
volatile erfolgen.

> [/c]Und vor allem was geschieht direkt darunter hier?[c]

Damit kann man im GCC Bitvariablen definieren. Hier wird es benutzt, um 
gut leserlich Portpins zuzugreifen. Es geht natürlich auch für Variablen 
im SRAM, aber dann können keine Bitbefehle verwendet werden.

> Für was genau brauche ich hier die switch-Anweisung?

Manche LCD-Befehle dauern eben länger.


Peter

Autor: Jo. F. (funk3r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für deine Erklärung

Grüßle und Gottes Segen
Jo

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.