- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 173

Thema: Portbelegung auf ATMega für LCD1602

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.648
    Bei den Assemblern MASM und TASM konnte man schon immer gut Makros einsetzen. Damit kann man so einiges anstellen. Ich habe in den 90gern für jemanden Basic in Makros umgesetzt. Der Quelltext sah nachher aus wie GW-Basic, konnte aber assembliert werden. Allerdings waren das schon fortgeschrittene Assembler. Das C wurde ja bereits in den 70gern entwickelt. Das Problem an den Assemblern war immer, dass man damit nicht sehr schnell voran kam. Programmentwicklungen dauerten wirklich sehr lange. Von daher hatte C sicher seine Berechtigung. Mittlerweile halte ich persönlich C/C++ aber für etwas rückschrittlich. Wie Du ja selbst siehst HaWe, ist es manchmal echt schwierig damit und die Sprache ist "kryptisch" gestaltet - nicht wirklich einfach zu erlernen. Für jemanden, der auf einem System Assembler beherrscht, gibt es eigentlich nichts Besseres, weil man mit Assembler wirklich alles machen kann - keine Grenze. Da ich selber 10 Jahre fast nur Assembler benutzt habe, finde ich auch, dass es für jemanden der C nicht kann / C++, es einfacher ist, sich in die Assemblerprogrammierung - bei den ATmegas zum Beispiel - einzuarbeiten.

    MfG

  2. #2
    HaWe
    Gast
    asm halte ich für eine absolute Sackgasse, aber jedem Tierchen sein Plaisierchen ...

    ... dennoch, wenn du C schon als "rückschrittlich" bezeichnest, was ist dann asm ??

    Übrigens sind auch moderne Sprachen wie C++17 oder Frameworks wie C# oder Mono C-basiert, und selbst Java, Pascal oder Python sind per Syntax äußerst C-ähnlich (und schau mal nach, in welcher Programmiersprache die selber geschrieben worden sind...) .
    Auch was das Lernen angeht, muss ich dir widersprechen:
    C ist sehr einfach zu lernen, es ist extrem einfach konstruiert mit einer ganz simplen Syntax und nur knapp 20 reservierten Wörtern.
    Nur wenn man alle Tricks mit Pointern, Referenzen und Objekten ausreizen will (mit Dingen, die teilw. in anderen Sprachen noch nicht einmal grundsätzlich möglich sind), muss man schon auch dazulernen wollen - aber wo ist das anders?


    Code:
    #include <LiquidCrystal.h>
    // initialize the library by associating any needed LCD interface pin
    const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
    LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
    
    void setup() {
      float ftest;
      ftest=millis() / 1000.0;
    
      lcd.begin(16, 2);
      lcd.setCursor(0, 0);
      lcd.print("hello, world!");
      lcd.setCursor(0, 1);
      lcd.print(ftest);
    }
    Geändert von HaWe (11.12.2018 um 16:04 Uhr)

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    Hallo Freunde,
    euer Eifer in Ehren, aber welche Programmiersprache die bessere ist, ist nicht Thema dieses Treads.
    Hier geht's unter anderem lediglich um die Ansteuerung eines LCDs und wie man "Zahlen" raus schreibt, diese verändern und wieder als Zahl abspeichern kann.
    Oder wie man den Cursor positioniert bzw. auto-cursor abschaltet.
    Und das in Assembler.
    Die Init-Prozedur ist fertig. Ich bin weiter am Suchen nach Lösungen zu obigen Zeilen. Einiges hab ich gefunden, versteh es aber noch nicht ...
    Es dauert noch eine Weile ...

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.648
    Zitat Zitat von HaWe Beitrag anzeigen
    ... was ist dann asm ??
    Der grundlegende Baustein zur Programmierung auf Hardwareebene.

    Zitat Zitat von HaWe Beitrag anzeigen
    Nur wenn man alle Tricks mit Pointern, Referenzen und Objekten ausreizen will...
    Das geht in JavaScript mindestens genau so gut und wesentlich unkomplizierter.

    Wenn der C-Compiler mal Code zur Variablentypenumwandlung mal selbst einfügen würde, anstatt immer nur zu melden, dass es hier und da und dort nicht zusammen passt, wäre es auch schon einiges einfacher - zum Beispiel.

    MfG

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    Hi,
    bei unten stehendem Beispiel handelt es sich um ein 4*20 LCD.

    Bitte was bedeuten die Steuerzeichen am Ende der letzten Zeile? Ich hab leider keinen Hinweis darauf gefunden.
    0x0D ist mir klar: carriage return = cursor in Pos 1 der Zeile.
    Aber 0xFE und 0xFF ???
    Und sollte nach dem 0x0D nicht auch ein 0x0A = line feed = nächste Zeile kommen?
    Oder impliziert 0x0D das LF in diesem Fall?

    LcdTextOut:
    .db "Spannung+Strom tn24",0x0D
    .db "U = xx,xx V",0x0D
    .db "I = xxx,x mA",0xFE,0xFF

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.06.2011
    Ort
    Dresden
    Beiträge
    219
    Da Du alles selber schreibst, liegen CR, LF und andere Steuerzeichen auch in Deiner Regie, das Display versteht
    sowas nicht, vermute das betrifft auch 0xFE, 0xFF.
    Lerne C!
    mfg
    Achim

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Hallo seite5,

    vielleicht hilft Dir das weiter:

    http://web.alfredstate.edu/faculty/w...de_asm_4f.html

    Dort ist der Assemblercode für 4 Bit Ansteuerung
    und auch der C-Code.
    beides recht gut Dokumentiert.

    Siro
    Geändert von Siro (11.12.2018 um 17:36 Uhr)

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.210
    Wie kann ich "Zahlen" in das LCD schreiben? Ein LCD kennt ja keine "Ziffern" oder "Zahlen". Das sind alles nur "Zeichen". Oder liege ich mit dieser Annahme falsch?
    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 ), oder Du musst eine Routine dafür schreiben.
    Dann kannst Du noch überlegen, ob Du einfach führende Nullen mit anzeigst, oder diese durch Leerzeichen ersetzt.
    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.

    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.

    .db "I = xxx,x mA",0xFE,0xFF
    Eventuell ist hier auch 0xFE und 0xFF einfach ein Platzhalter ohne weitere Funktion, damit der Speicherbereich nach dem String nicht versehentlich überschrieben wird.
    Kann aber natürlich auch alles andere sein.
    Das kann eigentlich nur der Quellcode klären.

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.648
    Zitat Zitat von HeSt Beitrag anzeigen
    Hi,
    bei unten stehendem Beispiel handelt es sich um ein 4*20 LCD.

    Bitte was bedeuten die Steuerzeichen am Ende der letzten Zeile? Ich hab leider keinen Hinweis darauf gefunden.
    0x0D ist mir klar: carriage return = cursor in Pos 1 der Zeile.
    Aber 0xFE und 0xFF ???
    Und sollte nach dem 0x0D nicht auch ein 0x0A = line feed = nächste Zeile kommen?
    Oder impliziert 0x0D das LF in diesem Fall?

    LcdTextOut:
    .db "Spannung+Strom tn24",0x0D
    .db "U = xx,xx V",0x0D
    .db "I = xxx,x mA",0xFE,0xFF
    https://de.wikipedia.org/wiki/Byte_Order_Mark

    0x0D und 0x0A werden normalerweise beim Drucker verwendet oder anderen Ausgabegeräten -> CR+LF
    Normalerweise sollte auf einen Wagenrücklauf ein Zeilenvorschub erfolgen, hierzu benötigt man beide Steuerzeichen.
    Für reine Textdateien oder auch andere textbasierte Dateien kann aber auch nur eines von beidem (am ehesten CR) verwendet werden. Das ist nicht ungewöhnlich.
    Ob in diesem Fall das 0xFE und 0xFF als Byte-Reihenfolge-Markierung steht, weiß ich nicht, eigentlich müsste es dann vorangestellt werden - denke ich. Es könnte auch einfach dafür verwendet werden, dass man das Textende eindeutig erkennt. Wenngleich dafür eigentlich eine "0" zuständig ist.

    MfG

Ä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, 11:18
  2. CCPRO M128: Portbelegung
    Von Dirk im Forum Robby RP6
    Antworten: 0
    Letzter Beitrag: 22.05.2009, 22:26
  3. Portbelegung bei diesem Display [erledigt]
    Von Rob.Anfänger im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 18.11.2006, 18:12
  4. Portbelegung ATmega32
    Von Rob.Anfänger im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 15.11.2006, 19:59
  5. Antworten: 4
    Letzter Beitrag: 12.11.2006, 16:40

Berechtigungen

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

12V Akku bauen