LCD-Ansteuerung

Begonnen von Ottmar, 11.05.2023, 16:35:31 CEST

Vorheriges Thema - Nächstes Thema

Ottmar

Hallo,
mich würde mal interessieren wie Ihr in MPLAB-ASM ein HD44780er LCD initialisiert und zur Ausgabe ansteuert.Ich selbst verwende seit langer Zeit eine mehr oder weniger selbst zusammengezimmerte Initialisierung/Ansteuerung welche auf sprut.de zurückgeht.

Diese Initialisierung/Ausgabe habe ich einmal als 8 und 4Bit-Interface und auch für 2-Wire-Interface. Nun bin ich aber der Meinung, dass diese Dateien in die Jahre gekommen und evtl. umständlich und überholt sein könnten. Gibt es da was aktuelleres?  Würde mich mal gerne mit jemand darüber austauschen (bei Bedarf auch die entsprechenden Files).

Angeregt durch dieses Forum habe ich mi auch den 18F14K22 beschafft, vor allem auch weil ich neugierig  war/bin auf  die 64MHz des INTOSZ, den Low/High Priority Interrupt  und das SR-Latch. Bei 64MHz kamen dann meine LCD-Files nicht mehr mit  bevor ich nun daran herumzubasteln beginne....

Da wäre auch schon meine nächste Frage: Was macht den 18F14K22 so wirklich interessant- Ich meine im Gegensatz z.B. zu einem 16F1827 oder 16F1936?

Freue mich auf eine Antwort
Ottmar

picass

#1
Die schier unendliche Auswahl an µC-Typen bei Microchip lässt einen Überblick nicht wirklich leicht werden. Jedenfalls werde ich nicht behaupten, den zu haben. Will sagen: da muss jeder irgendwann/ irgendwie zu einer Entscheidung kommen. Bei mir ging das vergleichsweise einfach. Früher mal hatte ich mit dem PIC16F84 gearbeitet. Als der auslief, musste was Neues her. Aufgrund von Empfehlungen wurde es bei mir der PIC18F14K22 - , es hätte sicher auch was anderes werden können. Diesen Typ verwende ich seit Langem als Standard-µC. Der ist nun mittlerweile auch schon angegraut und wird auch nicht gerade billigst angeboten. Microchip himself empfiehlt als Nachfolger, rsp. neuen µC-Typ den PIC18F24Q10. Der hat dann allerdings 28 Pinne, was aber auch erlaubt, alle drei Grund-Ports (A,B,C) komplett ausfzuführen.
Grüße, picass

Ottmar

Danke für die Antwort,

das mit der Vielfalt ist mir schon klar, habe mich ja selbst durch diese Vielfalt ab 16F84, hauptsächlich aber 16F628, 16F1827 u.a. bewegt. Von den 16F hat mir der 16F827 und der 16F1936 am besten zugesagt. Seit einiger Zeit bin ich dabei meine Erfahrungen mit den 18F zu machen. Na ja, wie  ich schon mal sagte, bin ich nicht einer der sonderlich viele standalone Projekte erstellt hat. Vielmehr macht es mir Spass die einzelnen "Features" zu erkunden und da begnüge ich mich oft damit die Schaltungen auf einem Steckbrett aufzubauen.

LCD???
Grüße Ottmar

Ottmar

Hallo zusammen,
kann mir jemand bitte eine Antwort auf meine erste Frage zur LCD- Initialisierung / Ausgabe geben?
mfG Ottmar

PICkel

Hallo Ottmar,

geht es am 18F14K22 mit langsamerem Takt? Wenn ja, solltest Du es mal mit längeren Wartezyklen versuchen.
Bei ASM ist man ja (leider) auf die programmtechnische Anpassung der Wartezyklen an den uC-Takt angewiesen, was ansonsten der Compiler erledigt.
Noch was: Funktioniert nur die Zeichenausgabe nicht oder klemmt es schon bei der Initialisierung? Eventuell nach dem Umschalten von R/W bzw. RS ein paar Wartezyklen einfügen.

MfG
PICkel

Ottmar


Danke PICkel für  die Antwort.

Mir ist schon klar, daß die Taktfrequenz der LCD-Befehle den Bedingungen im Datenblatt, z.B. des HD44780 entsprechen muss ( 2MHz timing bei Vss 5V ) und daß man dann eben zwischen den Befehlen entsprechend viele "nop's' einfügen muss. Wie es halt so ist, wollte ich den bequemeren Weg gehen und vielleicht einen Hinweis auf etwas 'Fertiges' bekommen.

Inzwischen habe ich mich doch mal bemüht und an sich recht rasch meine 2-Wire-Ansteuerung überarbeitet. Siehe da,  die beigefügte Initialisierung und der Code zur Zeichenausgabe funktioniert noch bis fosc 64MHz -> fosc/4=16MHz. Die Delays habe ich mal etwas variabler, in Abhängikeit von fosc gestaltet.  Für Int1 eressierte füge ich mal das Ergebnis als gepacktes MPLAB 8.92-Projekt  bei.

Doch: gibt es da keine bessere/elegantere Lösung?
mfG Ottmar

Ottmar

Sorry, die Version aus meinem letzten Beitrag gibt einen Fehler aus. Ein "'#ENDIF' ist einfach verschwunden :(

Fehler ist nun behoben und das nun fehlerbereinigte Projekt ist angefügt.

Ottmar

picass

#7
Wärme diesen Fred auf, weil die letzten Statements in anderem Fred dort themenmäßig nicht mehr passten. Also hier weiter mit LCD-Ansteuerung.

Der gestrige Erfolg meines ersten Versuches, ein LCD-Anzeigemodul mit einem PIC anzusteuern, basiert auf dem von pic18 "vermittelten" Sprut-Programm. Das lief auf einen PIC16F84 und seiner Alt-Version des MPASM. Dieses Sprut-Prog hatte ich nun erfolgreich umgestellt auf die "mittlere" Version, auf MPASM X v5.20 (geht bis v5.35). Allerdings blieben vom orig-Prog nur wenige Steine unverändert.
Zunächst hatte ich sämtliche Konstanten raus geworfen, die "Über-2-Banden" sowieso, aber auch die anderen, welche den Ports Namen verliehen. Das dadurch entstehende Sprachwirrwarr machte es für mich aber unübersichtlicher...., ist wohl auch Geschmackssache. Auch die Variablen wurden entmistet, teils umbenannt. Wichtig war, eine - nennen wir es mal - "Nachlässigkeit" von Sprut zu eliminieren. Er hatte auf Ports geschrieben, aber nicht - wie auch damals schon im Datenblatt vermerkt - den Begriff Latch verwendet: "read from port, write to latch". Auch alle aus anderen Sprut-Programmen noch vorhandenen Prog-Bestandteile im orig Prog wurden gekillt, ebenso wie die Ansteuerung von Kontroll-LEDs. Dann noch "Hakeliges" oder Nicht-wirklich-Gelungenes in der Kommentierung überarbeitet und dann lief das neue Prog doch nicht. ??? Bei dem vieeeeelen Umschreiben war einmal noch eine Anweisung für den alten PORTB übersehen worden. Der Ausgabe-Port wurde ja von B auf C umgeschwitscht.  Den Aufbau dann noch in absteigende Funktionsblöcke umgebaut und das wars dann.
Im Anhang der ganze MPASM X - Ordner. Das darin befindliche ASM.File enthält das Prog in leserlicher Form, das lässt sich mit jedem Text-Prog einfach öffnen.
Grüße, picass
lcd09.X.zip 

picass

#8
Wärme erneut auf und gönne mir einen Rückfall ins Assemblieren. Das aber deswegen, weil es mir um die Verwendung von LCD-Displays geht und da wäre im Grundsatz ein Wiedereinstieg in Assembler eher leichter. Wo ist das Prob?
Das oben eingestellte Programm funktioniert immer noch, es gibt in einer Zeile die Worte "danke Piccer" aus. Nun würde ich gerne die zweite Zeile auch in Betrieb nehmen, finde aber weder im Sprut'schen orig Programm noch auf seiner Homepage mit Erklärungen zum LCD-Display einen Hinweis, wie dem Programm beizubringen ist, nicht auf den Anfang der ersten Zeile zu gehen (quasi Reset), sondern halt auf den Anfang der zweiten Zeile.
Die Adresse für Ersters ist schlicht "00", die Adresse für die zweite Zeile lautet "40", soweit klar. Aber wo findet sich das im Programm? Das orig Sprut-Prog ("Hello") ist unten im gezippten Anhang, das ist die alte Version von MPLAB. Mein Prog befindet sich oben und ist die mittlere MPLAB-Version. Der Link auf die Sprut-Beschreibung lautet:
https://sprut.de/electronic/lcd/index.htm
Kann mir da jemand beim Sprung in die zweite Zeile helfen?
Grüßen, picass
lcd.zip

pic18

meinst Du eine Anzeige 4x20 Zeichen?
zum Verständnis gebe ich hier mal den C Code
void LCD_gotoxy(uint8_t spalte, uint8_t zeile)
{
    uint8_t Adresse;

    akt_pos.spalte_nok = spalte;    //hier Spalte gleich merken, wird verändert
    akt_pos.zeile = zeile;
    letzte_pos.nok =1;    //letzte position nicht mehr gültig


    // 2: Zeile 0..3
    // 3: Spalte 0..39
    // Zeile 0: 0x00
    // Zeile 1: 0x40
    // Zeile 2: 0x00+Zeilenlänge
    // Zeile 3: 0x40+Zeilenlänge

    if (zeile>1) //Zeile2, 3
    {
        spalte += 20; //LCD_spalten;
    }
    Adresse = ((zeile & 0x01) * 0x40) + spalte;
    writeLCDCmd(Adresse | 0x80);

    wait_1us (25);//_ff testweise org. 25us

}
bei deinem Prog. müsstest Du folgendes schreiben um den Cursor zu setzen
bcf    PORTC, LcdRs; ist nicht unbedingt nötig da schon gelöscht.
movlw adresse; (0x40)
movwf LcdDaten
bsf LCDDaten,7; (0xc0) bit 7 setzen, kann auch mit oder 0x80 gesetzt werden
call OutLcdControl
Anschließend dein Zeichen laden und mit OutLcdDaten ausgeben.

ich würde nur ein Ausgabeunterprog. schreiben und bei Daten laden RS löschen bzw. setzen. Den Text würde ich in einer Schleife ausgeben.

picass

#10
Hallo pic18 !
Das war eine Überraschung, dass du dich derart fix mit einem Prog-Vorschlag vermeldet hattest. Wau...., danke sehr.
Deinen Vorschlag konnte ich gerade eben zwischen dem täglichen Trouble ausprobieren. Hier war heute der Himmel los: ein während des Mittagessens vage geäußertes Stichwort - nämlich "Teneriffa" - führte in einem Blitzermarathon zur Buchung einer Reise. Plus Leihwagen, plus Platz im Parkhaus - obwohl dort alles dicht war....!
Also gettz dein Vorschlag. Er führte auch schon zu einem feinen Erfolg: der für die zweite Display-Zeile ausgedachte Text "zwei" erschien tatsächlich. Beim ersten Anlauf in der ersten Zeile, wobei Voriges gelöscht wurde, im zweiten Anlauf auch in der ersten Zeile, und der Rest vom Vorigen war noch vorhanden. Nach der Hochkonzentrations-Übung des Urlaubbuchens bin ich jetzt platt und sehne mich nach einem Schluck Rotwein und einem oder zwei Kürbiskernbrötchen, um das demnächstige Abdüsen zu feiern.

Das Prog vom "sprut" krankt u.a. daran, dass dort nicht wirklich eine Einsprungs-Prozedur mit ggf. variabler Adresse enthalten ist, sondern dass stattdessen in der Initialisierung ein "Gesamt-Reset" ausgelöst wird, was den Cursor natürlich auf die erste Stelle setzt. Also genau genommen erfolgt so keine (variable) Adress-Angabe/-Routine. Man müsste mal in einem anderen Programm schnüffeln, das zwei Zeilen bedient. Aber gettz bin ich platt......Nochmal danke für dein Hilfe. Ab zur Rotweinflasche....
Grüße, picass

pic18

der Code sollte eigentlich laufen, zeig mal den aktuellen kompletten Code. Welche Anzeige hast Du denn? Hat diese nur zwei Zeilen?

Schnellantwort

Name:
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau

🡱 🡳