Antworten

Einschränkungen: 8 pro Beitrag (8 verbleibend), maximale Gesamtgröße 8,79 MB, maximale Individualgröße 1 MB
Entfernen Sie den Haken der Dateianhänge, die gelöscht werden sollen
Klicken Sie hier oder ziehen Sie Dateien hierher, um sie anzuhängen.
Anhänge und andere Optionen
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

Zusammenfassung

Autor pic18
 - Gestern um 14:07:02 CEST
So wie ich das in Erinnerung habe, hatten die alten 16er kein LAT- Register


Autor Ottmar
 - Gestern um 13:25:34 CEST
..man kann nicht oft genug gegenlesen!
..die Ausgabe beginnt in digit 13!
Falsch: movlw LINE1+d'11'
Richtig: movlw LINE1+d'13' ;(Ausgabe "2")
..
grummel... >:( Ottmar
Autor Ottmar
 - Gestern um 13:09:26 CEST
Tippfehlerberichtigung im vorgenannten File:
Falsch: xorlw SET_DDRAM_ADDR
Richtig: IORLW SET_DDRA_ADDR
Ottmar
Autor picass
 - Gestern um 11:41:00 CEST
Habe es geschafft..... nunmehr wird auch in die zweite Zeile geschrieben! Bin ja so stolz auf mich! Räusper......., ähm......., allerdings geht der Lorbeerkranz selbstredend an pic18, dessen Prog-Schnipsel:
movlw adresse; (0x40)
movwf LcdDaten
bsf LCDDaten,7; (0xc0) bit 7 setzen, kann auch mit oder 0x80 gesetzt werden
call OutLcdControl

den Durchbruch brachte. Danke pic18. Der Grund, warum das im ersten Anlauf nicht funktionierte und zu der unvollkomenen Anzeige "lcd1" führte, war ein trivialer: nach Abarbeitung der ersten drei Zeilen sollte ja in die Zwischenroutine "OutLcdControl" gecallt werden. Und diese erwartete die LCDDaten nicht im Register "LcdDaten", sondern schlicht im W-Reg. Das hätte ja auch fast hin gehauen, aber so wurde die dritte Zeile mit dem Setzen des Bits 7 unterschlagen. Nachdem nun diese Unterschlagung beseitigt ist, kommt es zur passenden Anzeige im Bild "lcd3".
Super....., diese jahrzehnte-lang klaffende Lücke ist nun gefüllt. Also fast. Da ist sicher noch Weiteres nötig. Aber: Jubel, es ist geschafft und ich bin ja so stolz auf ...... ähm....!

@Ottmar : deinen obigen Beitrag entdeckte ich gerade eben, als ich den vorbereiteten Text schon verfasst hatte. Dein Prog-Beispiel werde ich gleich runter laden und mir heute Nachmittag anschauen. Schon mal vorausschauend: danke für dein Hilfe-Angebot.
Nein, der Sprut ist kein Heiliger. Hatte gestern nochmal in seinen anderen Beispielen gesucht und nichts Zweizeiliges gefunden. Und seine Darstellung der Einzeiligkeit krankt - wie dargestellt daran - , dass keine echte Darstellung der Zeilenauswahl beschrieben ist. Reset und das wars, daraus kann man mitnichten auf Positionierung für Zweizeiler schließen. Zudem hatte der alte Knabe einen schlimmen Fehler in seinem Prog. Er hat gegen die u.a. Microsoft-Regel verstoßen:" read from the port and write to the latch". Die galt damals auch schon und mithin war Schreiben auf den Port möglicherweise erfolgreich, aber eben ein Prinzipenverstoß.
Grüße, picass
lcd1.jpglcd2.jpglcd3.jpg

Autor Ottmar
 - Gestern um 10:58:25 CEST
Hallo
beigefuegt ist meine Vorgehensweise zum Schreiben in ein HD44780-LCD per ASM. Ich hoffe das einigermassen verstaendlich und möglichst fehlerfrei dargestellt zu haben. Der Text kann mit korrekter Formatierung in den MPLAB-Editor geladen werden.
Fuer picass:
wichtig bei Dir erscheint mir das Verstaendnis fuer die Adressierung.
Zur Ehrenrettung von sprut: Aus meiner Sicht hat er das Thema "LCD" damals hervorragend, übersichtlich, leicht verständlich und sehr ausführlich dargestellt!

MfG Ottmar
Autor pic18
 - 23.04.2025, 19:43:52 CEST
der Code sollte eigentlich laufen, zeig mal den aktuellen kompletten Code. Welche Anzeige hast Du denn? Hat diese nur zwei Zeilen?
Autor picass
 - 23.04.2025, 19:03:21 CEST
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
Autor pic18
 - 22.04.2025, 20:07:05 CEST
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.
Autor picass
 - 22.04.2025, 18:24:27 CEST
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
Autor picass
 - 25.10.2024, 11:15:38 CEST
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 
🡱 🡳