- 12V Akku mit 280 Ah bauen         
Seite 4 von 18 ErsteErste ... 2345614 ... LetzteLetzte
Ergebnis 31 bis 40 von 173

Thema: Portbelegung auf ATMega für LCD1602

  1. #31
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    Anzeige

    LiFePo4 Akku selber bauen - Video
    @Achim,
    Zitat Zitat von seite5 Beitrag anzeigen
    Lerne C!
    Ich akzeptiere, dass du in C programmierst.
    Kannst du mir dafür meinen Assembler lassen? Jeder wie er will.
    Wenn man keine Hilfestellung leisten kann/will, lässt man in der Regel derartige Kommentare. Zumindest würde ich es so handhaben.


    @Siro,
    Zitat Zitat von Siro Beitrag anzeigen
    Danke!! Super!
    Das ist absolut fein leserlich geschrieben!
    Da kann ich mir so einiges raus nehmen.


    @wkrug
    Zitat Zitat von wkrug Beitrag anzeigen
    Das siehst Du genau richtig.
    Du hast also im Prinzip 4 Werte ( bei einer 3 stelligen Zahl ). Also den eigentlichen Zahlenwert und den ASCII Wert der einzelnen Stellen.
    Und das eine Format muss in das andere gewandelt werden ( Üblicherweise der Zahlenwert in die ASCII Zeichen ).
    In Assembler kann man das so lösen, das man den eigentlichen Zahlenwert durch 10 Teilt und die Reste dann in ASCII Zeichen umwandelt ( eine Methode von mehreren ). Die Division kannst Du in Hardware machen ( falls der verwendete Controllertyp das hergibt ),
    Hab beim Mega16 leider noch keine Divisionsinstruktion gefunden.
    Zitat Zitat von wkrug Beitrag anzeigen
    oder Du musst eine Routine dafür schreiben.
    Wird wohl so werden - oder ich finde was im Netz ...

    Zitat Zitat von wkrug Beitrag anzeigen
    Dann kannst Du noch überlegen, ob Du einfach führende Nullen mit anzeigst, oder diese durch Leerzeichen ersetzt.
    Ich brauche/will keine führenden Nullen.
    Zitat Zitat von wkrug Beitrag anzeigen
    Einfach den aktuellen Zahlenwert am Anfang der gewünschten Position anfangen lassen führt bei einem Übergang zu nächsten Stelle zum Springen der Stellen.
    Da das Display üblicherweise nicht vollständig gelöscht wird kommen dann auch " Geisterzahlen " nach dem eigentlichen Messwert aufs Display wenn die ausgegebene Zahl wieder eine Stelle weniger hat.
    Danke für den Hinweis.
    Zitat Zitat von wkrug Beitrag anzeigen
    Gut! Das hat jetzt eigentlich mit der ursprünglichen Fragestellung nichts zu tun, aber das werden mit ziemlicher Sicherheit Deine nächsten Probleme werden, auf Die Du stossen wirst.
    Sieht danach aus.
    Danke jedenfalls für deine ausführlichen Zeilen!
    Geändert von HeSt (12.12.2018 um 21:28 Uhr)

  2. #32
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Oh sorry Achim,
    die Info war natürlich für HeSt und nicht für Dich.

    Diese (und ähnliche) Displays sind doch noch in erstaunlich vielen Anwenungen vorhanden,
    jedoch meist im privaten Bereich. Sind halt super preiswert und "relativ" einfach zu handhaben.
    ich hab die auch schon in verschiedenen Varianten eingesetzt.
    Es gibt die ja inzwischen auch schon also OLEDs und mit diversen Beleuchtungsfarben.
    Die OLED Version (zumindest die ich hatte) war übrigens "KACKE" wenn man das so sagen darf...
    Je nach Pixeldichte verändert sich der Kontrast der anderen Zeichen.
    Der Hersteller hatte mir das tatsächlich bestätigt und man arbeite dran....

    @HeSt
    Ich hoffe Du kommst mit den Informationen zurecht, ansonsten einfach nochmal fragen,
    kann Dir dann bestimmt weiter helfen. Wichtig: Die Adressen der einzelnen Zeichen sind NICHT direkt hintereinander abgelegt,
    das war Anfangs auch (m)eine Hürde. Die erste Zeile beginnt bei Adresse 0, die zweite bei vielen Displays erst bei 64,
    da wundert man sich zunächst...

    Du kannst bei vielen Displays dann auch noch eigene Zeichen definieren, hab ich auch schon gemacht.
    Viel Erfolg.

    Zusatz:
    Ich habe die Dinger schon in 3 Sprachen programmiert: EN,DE,FR
    neee, in PIC-Assembler, C und in Pascal.
    Jedem wie er es mag, zudem ist das ja hier das "Assembler" Forum, also bist Du hier schon ganz richtig.

    Siro
    Geändert von Siro (12.12.2018 um 20:41 Uhr)

  3. #33
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    Hi Siro,

    die Geschichte mit den Adressen hab ich schon mitbekommen.
    Allerdings hab ich (noch) kein Datenblatt zu meinem LCD.
    Ich habs beim großen C gekauft. Denke, dass ich dort auch das Datenblatt bekomme.

    Die Sache mit den eigenen Zeichen lasse ich mal beiseite.
    Erst muss das Ding funktionieren, dann kommen die Spielereien.

    Ich hab mittlerweile ein ganzes Sammelsurium an LCD-Beispielprogrammen.
    Jeder arbeitet ein bisschen anders. Aber da kann man sich viel raus holen.
    Und manche haben den selben Stil wie man selbst.
    Auf jeden Fall ist der Stil von Donald Weiman eine feine Sache!
    So akkurat und gut dokumentiert hab ich noch kein Programmlisting gesehen.
    Da tut man sich leicht, seinen Gedankengang nachzuvollziehen.

    Nun hab ich, denke ich, genug Beispiele gesammelt um mein Vorhaben umsetzen zu können.
    Mein LCD-Progrämmchen nimmt schön langsam auch Gestalt an, zumal ich jetzt bereits einiges behirnt hab.

    Und falls ich mal wieder nicht weiter weiß, darf ich mich wieder melden.

    Danke für eure Unterstützung !!!

    Gruß Heinz
    ps: mir reicht EINE Sprache

  4. #34
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    Drei Fragen:
    1.
    Eines hab ich bislang nirgendwo so konkret gefunden und weiß nicht genau:
    Der Befehl $20 (RS=0) setzt den Cursor wohin?
    An die 1. Stelle des LCD (Zeile 1, Position 1) oder
    an die 1. Stelle der Zeile in der sich der Cursor gerade befindet?
    2.
    Kann ich mit dem Befehl $49 (RS=0) den Cursor direkt auf Zeile 2 Position 9 positionieren?
    Zeile 2 Anfang ist bei meinem LCD @$40
    3.
    Wird dann an die gesetzte (curosr)@ (Position) auch das Zeichen ausgegeben, wenn ich gleich drauf ein Zeichen sende?

    [edit]
    Was ich auch hinterfragen möchte:
    Immer wieder lese ich in diversen Programmlistings, dass bei der Init-Prozedur $30 3x hintereinander mit einem delay von ca. 4mS gesendet werden muss.
    Ich hab mittlerweile 3 Datenblätter; aber in keinem ist bei der Init-Prozedur auch nur irgend ein Vermerk mit den 3x$30.
    1x genügt offenbar. Die Verarbeitungszeit wird etwas unterschiedlich angegeben. Aber das war's dann.
    Frage: ist 3x$30 notwendig? Dann erspart man sich eine Schleife ...
    [endedit]

    Danke und LG
    Geändert von HeSt (13.12.2018 um 15:12 Uhr)

  5. #35
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Ich hab mittlerweile 3 Datenblätter; aber in keinem ist bei der Init-Prozedur auch nur irgend ein Vermerk mit den 3x$30
    In einem Uralt Datenblatt für den HD44780 Display Controller meine Ich wohl mal sowas gelesen zu haben.
    Anscheinend haben es die Programmierer so beibehalten, da es anscheinend nicht stört und die Initialisierungsroutine üblicherweise nur einmal aufgerufen wird ( Also während des Betriebs keine Zeitverzögerung ).
    In dem EA Datenblatt wird zumindest der "Function Set" für die Umschaltung von 8 auf 4 Bit Modus 3x aufgerufen.
    https://cdn-reichelt.de/documents/da...W162-N3LED.pdf

    Aber wenn Dein Display das nicht braucht und Du nie einen anderen Typ verwenden willst - Was solls dann.

    Deine hex Zahlen setz ich jetzt mal nicht um.
    Wenn Du aber den Curser auf die gewünschte Stelle setzt und dann ein Zeichen ausgibst wird dieses Zeichen dort angezeigt.
    Wie gesagt, Ich arbeite hier lieber mit Strings und geb dann auf dem Display immer eine komplette Zeile aus.
    Das vermeidet dann auch, das Zeichen von der vorherigen Ansicht irgendwo stehen bleiben.
    IMHO ist es auch einfacher Zeichen in einem fertigen String zu ändern, als zu Überlegen wo denn noch welches Zeichen zu löschen ist.
    Man fügt einfach mal Leerzeichen in den String ein wo der Messwert hin soll und Überschreibt dann die benötigten Stellen mit ASCII Zeichen.
    Danach wird der komplette String ans Display gesendet.
    Durch auto Inkrement ist dann auch keine weitere Adressangabe nötig.

  6. #36
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Bei meinem Display sind die 3 mal 0x30 auch drin.
    Ich habe das EA-W162B-BNLW mit dem Controller HD44780U

    Hier meine 4 Bit Mode Initialisierung:
    Code:
    /* Power Up need ca. 40 ms internal Power on reset HD44780U */
        Wait_us(50000);
    
        LCD_DIR_OUTPUT;   /* LCD Data Lines direction to output */
        Wait_us(20);
    
        LCD_DataOut8(0x30);       /* Function set */
        Wait_us(5000);            /* wait > 4,1ms */
    
        LCD_DataOut8(0x30);       /* Function set */
        Wait_us(200);             /* wait > 100 us */
    
        LCD_DataOut8(0x30);       /* Function set */
        Wait_us(200);             /* wait > ??? us */
    
    
        LCD_DataOut8(0x20);       /* Function Set  4 BIT DL=0 */
        Wait_us(200);             /* wait > 26,3 us */
    
        /* !!!! erst ab jetzt ist der 4 Bit Modus aktiv */
    
        LCD_WaitBusy();
    
            LCD_DataOut4(0x28);  /* Function set DL=0==>4 Datalines   N=1==>zwei oder vierzeiliges Display F=0==5x7 Dot*/
        LCD_WaitBusy();
    
        LCD_DataOut4(0x0F);  /* Display On, Cursor blink on */
        LCD_WaitBusy();
    
        LCD_DataOut4(0x06);  /* Entry Mode set Cursor auto inc  40us */
        LCD_WaitBusy();
    
      LCD_GotoXY(2,0);
      LCD_Write("Hallo");
      LCD_GotoXY(2,1);
      LCD_Write("Display");
    !!! das Busy Flag BF darf bei der initialisierung noch NICHT abgefragt werden,
    das funktioniert erst nachdem der 4 Bit Modus gesetzt wurde.
    Deshalb die wartefunktion Wait_us
    -------------------------------------
    Um deine Adresse zu setzen, wo das nächste Zeichen hin soll
    must Du generell noch das Datenbit DB7 setzen
    Also zweite Zeile ist 0x40
    dann das 9te Zeichen
    ist dann deine 49 Hex
    und nun noch +128 oder OR 0x80 um das DB7 Bit zu setzen
    dann erst ausgeben.
    Das RS Bit muss dabei 0 sein, das ist richtig.

    Ich setzte immer die Adresse mit folgender Funktion
    Code:
    GotoXY(x,y)
    
      Adresse = (y * 0x40) + x + 128
    
    Pseudocode:
    a = 0
    wenn y = 1 dann a = 0x40      / 2 Zeile beginnt bei 0x40
    a = a + x                     / Spaltenposition addieren
    a = a OR 0x80                 / immer DB7 Bit setzen 
    
    Auf Port ausgeben dabei RS Pin Low lassen
    Geändert von Siro (13.12.2018 um 16:37 Uhr)

  7. #37
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    Ok,
    danke mal euch beiden!!
    werd weiter werkeln.
    Möchte, wenn ich denke dass ich mit den LCD- Routinen soweit fertig bin, mit einem Tiny24 mal testen.
    Den bring ich mit dem LCD auf meine kleine Steckplatine drauf.
    Wird aber noch ein Weilchen dauern ...
    Ich meld mich wieder.

  8. #38
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    Hi,
    hat jetzt zwar nicht direkt mit LCD was zu tun, aber letzten Endes soll das Ergebnis am LCD angezeigt werden.
    Vielleicht kann mir jemand aus meinem Gedankenkreis helfen ...:
    Es geht um die Umrechnung eines ADC-Wertes (den ich am LCD anzeigen möchte) mit 8Bit (adlar=1).
    Ich hab zwei Konstanten:
    5 (Volt Referenzspannung) und
    255 (max. ADC-Wert)
    Um den ADC-IST-Wert (ADCH) in die Spannung umzurechnen heißt die Formel:
    U(Volt)/maxWert*Ist-Wert = UIst in Volt = 5/255*ADCH.
    5/255 ergibt gerundet 0,0196. Um weiter rechnen zu können, muss ich diese Zahl mit 10.000 multiplizieren. Ergibt 196. Diese Zahl kann ich nun als Rechen-Konstante verwenden und bringe sie in jedem Register unter. Nun muss ich noch mit ADCH multiplizieren (Mega16 MUL). Das Ergebnis steht dann in R1/R0. Nun wieder eine Division durch 10.000 um den tatsächlichen Wert zu erhalten. Dieser Wert soll am LCD angezeigt werden (inklusive Rest als Nach-Kommastelle).
    Ich hab in diversen Foren gesucht, auch einiges gefunden, aber leider nicht behirnt, wie ich die 10.000-Division codieren kann.
    R1/R0 > XH/XL zum Rechnen, aber weiter ???

  9. #39
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Um keine Nachkommastellen zu bekommen, die der Controller wegschmeisst, ist es sinnvoll erst mal alle Multiplikationen auszuführen.
    Ich würde auch nicht mit 5 sondern mit 50 Multiplizieren und somit eine Stelle nach dem Komma kriegen.
    Bei 8 Bit machen mehr Nachkommastellen auch nicht wirklich Sinn.
    Das Ergebnis ist dann das 10 Fache des eigentlichen Messwertes, das kann man dann in der Ausgaberoutine ausgleichen.
    Eine Beschreibung der Möglichkeiten zur Division gibts hier: http://www.avr-projekte.de/rechnen.htm

    Noch was:
    Der A/D Wandler und die Referenzspannung sind niemals genau.
    Ich Bastel dann immer einen Wert in die Formel mit rein der Variabel ist.
    Das wäre z.B. die 5. Wenn man hier stattdessen 500 verwendet kann man diesen über ein Abgleichprogramm neu berechnen lassen und im EEPROM abspeichern.
    Also bekannte Spannung anlegen und an dem Wert ( z.B. 500 ) so lange rum drehen, bis der auf dem Display angezeigte Wert mit dem mit dem Multimeter gemessenen übereinstimmt. Das Ganze noch mal mit anderen Spannungswerten wiederholen ( Nichlinearitäten ).

    Die Reste kannst Du auch verwenden um die ASCII Zeichen von hinten nach Vorne zu berechnen.
    Also Zahl / 10 Rest x ; x + Fix Wert für ASCII ergibt dann den ASCII Code.
    Das Spielchen dann so weiter, bis die komplette Zahl zu ASCII verarbeitet ist.

    Nochmal Nochmal was:
    Wenn der Controller höhere Lasten treiben muss z.B. mehrere LED's schwanken die A/D Wandlerwerte je nach Belastung.
    Anscheinend wird dabei die Controllerinterne GND Schiene belastet und verfälscht den A/D Wert - ( War bei mir auf jeden Fall bei einem ATMEGA 8 so ) .
    Geändert von wkrug (26.12.2018 um 19:44 Uhr)

  10. #40
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    Servus!

    Wahre Freaks sind offenbar auch zu den Weihnachtsfeiertagen im Forum unterwegs!
    Danke für deine Antwort!

    Die Genauigkeit der Spannung und des Ladestroms ist bei meinem Projekt nicht tragisch. Somit bedarf es deiner vorgeschlagenen Genauigkeitsverbesserung nicht.
    Aber danke, das kann ich beim nächsten Mal brauchen!
    Was die Division betrifft hatte ich jetzt am Morgen eine Idee: ich brauch ja nicht durch 10.000 dividieren. 100 reicht auch:
    Als Rechenkonstante dient 196 (5/255*10.000) und ist genau genug.
    Der Rest dieser Division wird ignoriert.
    Beispiel:
    ADCH ist 148. 196*148=29008/100=290. Der Rest wird wieder ignoriert.
    Ich weiß, dass ich bei dieser Zahl die letzten beiden Ziffern Nachkommastellen sind und kann somit die Anzeige entsprechend aufbereiten.
    Und die Genauigkeit ist gar nicht so schlecht (255 entspricht 5V):
    196*255=49980/100=499 (4,99 am LCD) - das ist mir derzeit genau genug.

    Übrigens, in deinem Link wird Dividend und Divisor verwechselt! Oder sehe ich das falsch?
    "Hier wird in einer Schleife gezählt, wie oft der Dividend vom Divisor abgezogen werden kann, bis ein Unterlauf auftritt."
    Der Dividend ist die linke Zahl VOR dem Divisionszeichen und der Divisor die rechte NACH dem Divisionszeichen.

    Das Beispiel funktioniert. Ich kann es lesen, verstanden hab ich es noch nicht ganz. Wird noch werden ...

    Danke nochmals und
    GUTEN RUTSCH!!

Seite 4 von 18 ErsteErste ... 2345614 ... LetzteLetzte

Ähnliche Themen

  1. [ERLEDIGT] Atmega 644 & atmega8 parallel am ISP ... Reset beider atmega notwendig ..
    Von Ritchie im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 29.03.2013, 12:18
  2. CCPRO M128: Portbelegung
    Von Dirk im Forum Robby RP6
    Antworten: 0
    Letzter Beitrag: 22.05.2009, 23:26
  3. Portbelegung bei diesem Display [erledigt]
    Von Rob.Anfänger im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 18.11.2006, 19:12
  4. Portbelegung ATmega32
    Von Rob.Anfänger im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 15.11.2006, 20:59
  5. Antworten: 4
    Letzter Beitrag: 12.11.2006, 17:40

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress