lcd - hd44780

;; (c) david vajda
;; 06/10/2026
;; m8 atmega8 - lcd hd44780 - display - excersize

.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRB, r16

;; 1.) schritt initialisieren
;; 2.) commandos senden
;; 3.) zeichen senden
;; 4.) unterschieden ueber RS - am LCD HD44780
;;            wo egal, richtig angeloetet ...
;;            zweitens: dieses geraet <-> jenes geraet
;;            am controller: ich glaube: RS wurde in dem falle, im
;;            Byte z.B. manipuliert in r16 uebertragen, PORTB
;;            in Bit 5 gesetzt
;; 5.) oder wie war das?
;; 6.) nein, wir haben noch eine routine - danach liste
;; 7.) uebernehmen - uebernehmen, heisst, wie beim revolver,
;; 8.) registriermaschine ... einrasten uebernehmen
;; 9.) das ist glaube ich - ueber EN - E
;; 10.) geht:
;;          bit 5 Setzen, im PORTB
;;          nop
;;          nop
;;          nop
;; 11.) dann lauter warteschleifen
;; 12.) hat sich herausgestellt, warteschleifen von einer laenge reicht ...
;; 13.) initialisieren setzt sich zusammen, aus:
;; 14.) irgendwas senden, irgendein start cmd - ohne dass cmd aktiviert wurden
;; 15.) irgendwie noch mal noch mal noch mal, mit warten
;; 16.) einstellung vornehmen - Blinken, Curser ...
;;
;; d - ist display einschalten ..
;; 17.) ok: also: init heisst:
;; 18.) kurz irgendwas senden, anfangs cmd - aber fuer alles - es gibt in der
;; initialisierungsphase, keinen cmd mode und keinen data mode
;; es geht alles, also ist auf jeden fall: init cmd -
;; gut mehrfach senden - als - "stochastisch" bestaetigtigtes Signal
;; dann 4 Bit Modus einstellen - dann anfangen

;; wichtig - 4 bit - cmd und data byte zerlegen in jeweils 4 bit
;; in der init senden, 4 Bit mode...

;; Routinen
;; 1.) init
;; 2.) cmd send/transmit
;; 3.) data send/transmit
;; 4.) inzwischen: "einrasten" bit 5, en: nach allem ein mal senden
;;      bit 5 set
;;      nop
;;      nop
;;      npo
;;      bit 5 clear
;; 5.) 11 <- ??? oder 1 <-  ??? glaube 0b1bcd000000 zum init
;; teil von init - dann 4 bit modus
;; 6.) unterteilung von cmd und data send, erst untere vier bit, dann obere?
;; 7.) little endian big endian
;; 8.) little endian falsch rum - big endian richtig rum - habe ich mit computersysteme
;; 1/2 gelernt. gut, erst in assembler das was ich kann, z.B. routinen

rcall hd44780init
;; rcall lcd_clear

ldi r16, 'h'
rcall hd44780senddata
ldi r16, 'a'
rcall hd44780senddata
ldi r16, 'l'
rcall hd44780senddata
ldi r16, 'l'
rcall hd44780senddata
ldi r16, 'o'
rcall hd44780senddata
ldi r16, ' '
rcall hd44780senddata
ldi r16, 'w'
rcall hd44780senddata
ldi r16, 'e'
rcall hd44780senddata
ldi r16, 'l'
rcall hd44780senddata
ldi r16, 't'
rcall hd44780senddata
ldi r16, '!'
rcall hd44780senddata
ldi r16, '!'
rcall hd44780senddata
ldi r16, '!'

end: rjmp end

hd44780takeover:
;; vermutlich sti und cli
sbi PORTB, 5
nop
nop
nop
cbi PORTB, 5
ret

hd44780init:
;; hier so pi mal daumen
;; 1.) ich sende irgendein command - bits - glaube vorne zwei gesetzt
;; 2.) 2 oder 3 mal um mit stochastischer wahrscheinlichkeit zu signialisieren
;; 3.) es geht wirklich los - plus warteschleife, also erste version
ldi r16, 50
hd44780initl1:
rcall hd44780slowdownloop5ms
dec r16
brne hd44780initl1
;; nachgeguckt google: wait loop - warteschleife - computer technology
;; aircraft ... ?? craft: holding pattern...
ldi r16, $3
out PORTB, r16
rcall hd44780takeover
rcall hd44780slowdownloop5ms

;;ldi r16, $3
;;out PORTB, r16
rcall hd44780takeover
rcall hd44780slowdownloop5ms

;;ldi r16, $3
;;out PORTB, r16
rcall hd44780takeover
rcall hd44780slowdownloop5ms

ldi r16, $2
out PORTB, r16
rcall hd44780takeover
rcall hd44780slowdownloop5ms

ldi r16, $20
out PORTB, r16
rcall hd44780takeover
rcall hd44780slowdownloop5ms

           ldi r16, 0b00101000        ; 4Bit / 2 Zeilen / 5x8
           rcall hd44780transmitcmd
           ldi r16, 0b00001100        ; Display ein / Cursor aus / kein Blinken
           rcall hd44780transmitcmd
           ldi r16, 0b00000110        ; Cursor inkrementieren / kein Scrollen
           rcall hd44780transmitcmd
           ret

ret

;; think bit 4 - PORTB gesetzt ist CMD
;; think bit 4 - PORTB geloescht ist DATA
;; moeglich 3 .. 0 ist data - bei 4 bit
;; korrektur nachher ...

hd44780transmitcmd:
;; 4 bit uebertragen, mit maske, erst unteres
;; dann oberes ...
mov r17, r16
swap r17
andi r17, 0b00001111
;;clr r17, 0x10
out PORTB, r17
rcall hd44780takeover

;; lsr r17, 4
;; ok lieber swap nehmen, habe ich mit gerechnet...

;; das heisst, enttaeuschender weise, computersysteme 1/2
;; ging auf die schnelle, andi
;; ldi, heisst immidiate, konstante, direktwert
;; mov r16, r17
;; intel programmierer bekommen das nicht mit
;; mov ax, bx
;; mov ax, [label1]
;; aber computersysteme 1/2 enttaeuschend, peinlich, immer
;; drauf achten...
;; mov Register1, register2
;; ldi, sti, ldd, std - das heisst, i immidiate
;; und add r1, r2 ist wie - oder and
;; mov r1, r2 und and r1, r2

mov r17, r16
andi r17, 0b00001111
;; clr r17, 0x10
out PORTB, r17
rcall hd44780takeover
rcall hd44780slowdownloop50us
ret

hd44780senddata:
mov r17, r16
swap r17
andi r17, 0b00001111
sbr r17, 1<<4
;; oder sbr r17, 0x10
out PORTB, r17
rcall hd44780takeover
mov r17, r16
andi r17, 0b00001111
sbr r17, 1<<4
;; oder sbr r17, 0x10
out PORTB, r17
rcall hd44780takeover
rcall hd44780slowdownloop50us
ret

hd44780slowdownloop5ms:
push r16
push r17
ldi r16, $21
hd44780slowdownloop5msl1:
ldi r17, $C9
hd44780slowdownloop5msl2:
dec r17
brne hd44780slowdownloop5msl2
dec r16
brne hd44780slowdownloop5msl1
pop r17
pop r16
ret

hd44780slowdownloop50us:
push r16
ldi r16, 42
hd44780slowdownloop50usl1:
dec r16
brne hd44780slowdownloop50usl1
pop r16
ret

hd44780clear:
           ldi r16, 0b00000001   ; Display l"oschen
           rcall hd44780transmitcmd
           rcall hd44780slowdownloop5ms
           ret

wenn muesste es cbr heissen nicht clr wie sbr und cbr

auf jeden fall fehler...

;;clr r17, 0x10

ok, die zwei slow down schleifen:

hd44780slowdownloop:
push r16
push r17
ldi r16, $21
hd44780slowdownloopl1:
ldi r17, $C9
hd44780slowdownloopl2:
dec r17
brne hd44780slowdownloopl2
dec r16
brne hd44780slowdownloopl1
pop r17
pop r16
ret

aus mikrocontroller.net so abgeguckt, wg. der zahl der schleifendurchlaeufe.

;; ich glaube ich weiss, wo das problem liegt, der schatten zeugt davon
;; das problem ist, ich kann womoeglich auf das kurze warteintervall insofern verzichten, dass ich das laengere nehme, aber statt des laengeren nicht das kuerzere, meines war zu kurz???

 ; L"angere Pause f"ur manche Befehle
delay5ms:                               ; 5ms Pause (bei 4 MHz)
           ldi  temp1, $21
WGLOOP0:   ldi  temp2, $C9
WGLOOP1:   dec  temp2
           brne WGLOOP1
           dec  temp1
           brne WGLOOP0
           ret                          ; wieder zur"uck

so, dieser code tut nicht 100%

;; (c) david vajda
;; 06/10/2026
;; m8 atmega8 - lcd hd44780 - display - excersize

.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRB, r16

;; 1.) schritt initialisieren
;; 2.) commandos senden
;; 3.) zeichen senden
;; 4.) unterschieden ueber RS - am LCD HD44780
;;            wo egal, richtig angeloetet ...
;;            zweitens: dieses geraet <-> jenes geraet
;;            am controller: ich glaube: RS wurde in dem falle, im
;;            Byte z.B. manipuliert in r16 uebertragen, PORTB
;;            in Bit 5 gesetzt
;; 5.) oder wie war das?
;; 6.) nein, wir haben noch eine routine - danach liste
;; 7.) uebernehmen - uebernehmen, heisst, wie beim revolver,
;; 8.) registriermaschine ... einrasten uebernehmen
;; 9.) das ist glaube ich - ueber EN - E
;; 10.) geht:
;;          bit 5 Setzen, im PORTB
;;          nop
;;          nop
;;          nop
;; 11.) dann lauter warteschleifen
;; 12.) hat sich herausgestellt, warteschleifen von einer laenge reicht ...
;; 13.) initialisieren setzt sich zusammen, aus:
;; 14.) irgendwas senden, irgendein start cmd - ohne dass cmd aktiviert wurden
;; 15.) irgendwie noch mal noch mal noch mal, mit warten
;; 16.) einstellung vornehmen - Blinken, Curser ...
;;
;; d - ist display einschalten ..
;; 17.) ok: also: init heisst:
;; 18.) kurz irgendwas senden, anfangs cmd - aber fuer alles - es gibt in der
;; initialisierungsphase, keinen cmd mode und keinen data mode
;; es geht alles, also ist auf jeden fall: init cmd -
;; gut mehrfach senden - als - "stochastisch" bestaetigtigtes Signal
;; dann 4 Bit Modus einstellen - dann anfangen

;; wichtig - 4 bit - cmd und data byte zerlegen in jeweils 4 bit
;; in der init senden, 4 Bit mode...

;; Routinen
;; 1.) init
;; 2.) cmd send/transmit
;; 3.) data send/transmit
;; 4.) inzwischen: "einrasten" bit 5, en: nach allem ein mal senden
;;      bit 5 set
;;      nop
;;      nop
;;      npo
;;      bit 5 clear
;; 5.) 11 <- ??? oder 1 <-  ??? glaube 0b1bcd000000 zum init
;; teil von init - dann 4 bit modus
;; 6.) unterteilung von cmd und data send, erst untere vier bit, dann obere?
;; 7.) little endian big endian
;; 8.) little endian falsch rum - big endian richtig rum - habe ich mit computersysteme
;; 1/2 gelernt. gut, erst in assembler das was ich kann, z.B. routinen

rcall hd44780init
rcall hd44780takeover

ldi r16, 'h'
rcall hd44780senddata
ldi r16, 'a'
rcall hd44780senddata
ldi r16, 'l'
rcall hd44780senddata
ldi r16, 'l'
rcall hd44780senddata
ldi r16, 'o'
rcall hd44780senddata
ldi r16, ' '
rcall hd44780senddata
ldi r16, 'w'
rcall hd44780senddata
ldi r16, 'e'
rcall hd44780senddata
ldi r16, 'l'
rcall hd44780senddata
ldi r16, 't'
rcall hd44780senddata
ldi r16, '!'
rcall hd44780senddata
ldi r16, '!'
rcall hd44780senddata
ldi r16, '!'

end: rjmp end

hd44780takeover:
;; vermutlich sti und cli
sbi PORTB, 5
nop
nop
nop
cbi PORTB, 5
ret

hd44780init:
;; hier so pi mal daumen
;; 1.) ich sende irgendein command - bits - glaube vorne zwei gesetzt
;; 2.) 2 oder 3 mal um mit stochastischer wahrscheinlichkeit zu signialisieren
;; 3.) es geht wirklich los - plus warteschleife, also erste version
rcall hd44780slowdownloop
;; nachgeguckt google: wait loop - warteschleife - computer technology
;; aircraft ... ?? craft: holding pattern...
ldi r16, $3
out PORTB, r16
rcall hd44780takeover
rcall hd44780slowdownloop

ldi r16, $3
out PORTB, r16
rcall hd44780takeover
rcall hd44780slowdownloop

ldi r16, $3
out PORTB, r16
rcall hd44780takeover
rcall hd44780slowdownloop

ldi r16, $2
out PORTB, r16
rcall hd44780takeover
rcall hd44780slowdownloop

ldi r16, $20
out PORTB, r16
rcall hd44780takeover
rcall hd44780slowdownloop

           ldi r16, 0b00101000        ; 4Bit / 2 Zeilen / 5x8
           rcall hd44780transmitcmd
           ldi r16, 0b00001100        ; Display ein / Cursor aus / kein Blinken
           rcall hd44780transmitcmd
           ldi r16, 0b00000110        ; Cursor inkrementieren / kein Scrollen
           rcall hd44780transmitcmd
           ret

ret

;; think bit 4 - PORTB gesetzt ist CMD
;; think bit 4 - PORTB geloescht ist DATA
;; moeglich 3 .. 0 ist data - bei 4 bit
;; korrektur nachher ...

hd44780transmitcmd:
;; 4 bit uebertragen, mit maske, erst unteres
;; dann oberes ...
mov r17, r16
swap r17
andi r17, 0b00001111
clr r17, 0x10
out PORTB, r17
rcall hd44780takeover

;; lsr r17, 4
;; ok lieber swap nehmen, habe ich mit gerechnet...

;; das heisst, enttaeuschender weise, computersysteme 1/2
;; ging auf die schnelle, andi
;; ldi, heisst immidiate, konstante, direktwert
;; mov r16, r17
;; intel programmierer bekommen das nicht mit
;; mov ax, bx
;; mov ax, [label1]
;; aber computersysteme 1/2 enttaeuschend, peinlich, immer
;; drauf achten...
;; mov Register1, register2
;; ldi, sti, ldd, std - das heisst, i immidiate
;; und add r1, r2 ist wie - oder and
;; mov r1, r2 und and r1, r2

mov r17, r16
andi r17, 0b00001111
clr r17, 0x10
out PORTB, r17
rcall hd44780takeover
rcall hd44780slowdownloop
ret

hd44780senddata:
mov r17, r16
swap r17
andi r17, 0b00001111
sbr r17, 0x10
out PORTB, r17
rcall hd44780takeover
mov r17, r16
andi r17, 0b00001111
sbr r17, 0x10
out PORTB, r17
rcall hd44780takeover
rcall hd44780slowdownloop
ret

hd44780slowdownloop:
push r16
ldi r16, 0x72
hd44780slowdownloopl1:
dec r16
brne hd44780slowdownloopl1
pop r16
ret

die aussage vorher stimmte nicht, nach jedem datum senden, natuerlich ein mal take over...sonst $3 senden...

;; (c) david vajda
;; 06/10/2026
;; m8 atmega8 - lcd hd44780 - display - excersize

.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRB, r16

;; 1.) schritt initialisieren
;; 2.) commandos senden
;; 3.) zeichen senden
;; 4.) unterschieden ueber RS - am LCD HD44780
;;            wo egal, richtig angeloetet ...
;;            zweitens: dieses geraet <-> jenes geraet
;;            am controller: ich glaube: RS wurde in dem falle, im
;;            Byte z.B. manipuliert in r16 uebertragen, PORTB
;;            in Bit 5 gesetzt
;; 5.) oder wie war das?
;; 6.) nein, wir haben noch eine routine - danach liste
;; 7.) uebernehmen - uebernehmen, heisst, wie beim revolver,
;; 8.) registriermaschine ... einrasten uebernehmen
;; 9.) das ist glaube ich - ueber EN - E
;; 10.) geht:
;;          bit 5 Setzen, im PORTB
;;          nop
;;          nop
;;          nop
;; 11.) dann lauter warteschleifen
;; 12.) hat sich herausgestellt, warteschleifen von einer laenge reicht ...
;; 13.) initialisieren setzt sich zusammen, aus:
;; 14.) irgendwas senden, irgendein start cmd - ohne dass cmd aktiviert wurden
;; 15.) irgendwie noch mal noch mal noch mal, mit warten
;; 16.) einstellung vornehmen - Blinken, Curser ...
;;
;; d - ist display einschalten ..
;; 17.) ok: also: init heisst:
;; 18.) kurz irgendwas senden, anfangs cmd - aber fuer alles - es gibt in der
;; initialisierungsphase, keinen cmd mode und keinen data mode
;; es geht alles, also ist auf jeden fall: init cmd -
;; gut mehrfach senden - als - "stochastisch" bestaetigtigtes Signal
;; dann 4 Bit Modus einstellen - dann anfangen

;; wichtig - 4 bit - cmd und data byte zerlegen in jeweils 4 bit
;; in der init senden, 4 Bit mode...

;; Routinen
;; 1.) init
;; 2.) cmd send/transmit
;; 3.) data send/transmit
;; 4.) inzwischen: "einrasten" bit 5, en: nach allem ein mal senden
;;      bit 5 set
;;      nop
;;      nop
;;      npo
;;      bit 5 clear
;; 5.) 11 <- ??? oder 1 <-  ??? glaube 0b1bcd000000 zum init
;; teil von init - dann 4 bit modus
;; 6.) unterteilung von cmd und data send, erst untere vier bit, dann obere?
;; 7.) little endian big endian
;; 8.) little endian falsch rum - big endian richtig rum - habe ich mit computersysteme
;; 1/2 gelernt. gut, erst in assembler das was ich kann, z.B. routinen

rcall hd44780init
rcall hd44780takeover

ldi r16, 'h'
rcall hd44780senddata
ldi r16, 'a'
rcall hd44780senddata
ldi r16, 'l'
rcall hd44780senddata
ldi r16, 'l'
rcall hd44780senddata
ldi r16, 'o'
rcall hd44780senddata
ldi r16, ' '
rcall hd44780senddata
ldi r16, 'w'
rcall hd44780senddata
ldi r16, 'e'
rcall hd44780senddata
ldi r16, 'l'
rcall hd44780senddata
ldi r16, 't'
rcall hd44780senddata
ldi r16, '!'
rcall hd44780senddata
ldi r16, '!'
rcall hd44780senddata
ldi r16, '!'

end: rjmp end

hd44780takeover:
;; vermutlich sti und cli
sbi PORTB, 5
nop
nop
nop
cbi PORTB, 5
ret

hd44780init:
;; hier so pi mal daumen
;; 1.) ich sende irgendein command - bits - glaube vorne zwei gesetzt
;; 2.) 2 oder 3 mal um mit stochastischer wahrscheinlichkeit zu signialisieren
;; 3.) es geht wirklich los - plus warteschleife, also erste version
rcall hd44780slowdownloop
;; nachgeguckt google: wait loop - warteschleife - computer technology
;; aircraft ... ?? craft: holding pattern...
ldi r16, $3
out PORTB r16
rcall hd44780takeover
rcall hd44780slowdownloop

ldi r16, $3
out PORTB r16
rcall hd44780takeover
rcall hd44780slowdownloop

ldi r16, $3
out PORTB r16
rcall hd44780takeover
rcall hd44780slowdownloop

ldi r16, $2
out PORTB r16
rcall hd44780takeover
rcall hd44780slowdownloop

ldi r16, $20
out PORTB r16
rcall hd44780takeover
rcall hd44780slowdownloop

ret

;; think bit 4 - PORTB gesetzt ist CMD
;; think bit 4 - PORTB geloescht ist DATA
;; moeglich 3 .. 0 ist data - bei 4 bit
;; korrektur nachher ...

hd44780transmitcmd:
;; 4 bit uebertragen, mit maske, erst unteres
;; dann oberes ...
mov r17, r16
swap r17
andi r17, 0b00001111
clr r17, 0x10
out PORTB, r17
rcall hd44780takeover

;; lsr r17, 4
;; ok lieber swap nehmen, habe ich mit gerechnet...

;; das heisst, enttaeuschender weise, computersysteme 1/2
;; ging auf die schnelle, andi
;; ldi, heisst immidiate, konstante, direktwert
;; mov r16, r17
;; intel programmierer bekommen das nicht mit
;; mov ax, bx
;; mov ax, [label1]
;; aber computersysteme 1/2 enttaeuschend, peinlich, immer
;; drauf achten...
;; mov Register1, register2
;; ldi, sti, ldd, std - das heisst, i immidiate
;; und add r1, r2 ist wie - oder and
;; mov r1, r2 und and r1, r2

mov r17, r16
andi r17, 0b00001111
clr r17, 0x10
out PORTB, r17
rcall hd44780takeover
rcall hd44780slowdownloop
ret

hd44780senddata:
mov r17, r16
swap r17
andi r17, 0b00001111
sbr r17, 0x10
out PORTB, r17
rcall hd44780takeover
mov r17, r16
andi r17, 0b00001111
sbr r17, 0x10
out PORTB, r17
rcall hd44780takeover
rcall hd44780slowdownloop
ret

hd44780slowdownloop:
push r16
ldi r16, 0x72
hd44780slowdownloopl1:
dec r16
brne hd44780slowdownloopl1
pop r16
ret

schauen wir so:

;; trotzdem ist das hier nicht mit $3 senden...

       rcall lcd_enable             ; 1
           rcall delay5ms
           rcall lcd_enable             ; 2
           rcall delay5ms
           rcall lcd_enable             ; und 3!
           rcall delay5ms
mache ich - sondern eben mit take over.

ausprobieren, bald pause...

ein wenig erklaerung:

  1. das heisst, enttaeuschender weise, computersysteme 1/2
  2. ging auf die schnelle, andi
  3. ldi, heisst immidiate, konstante, direktwert
     mov r16, r17
    
    intel programmierer bekommen das nicht mit
    mov ax, bx
    mov ax, [label1]
    
    aber computersysteme 1/2 enttaeuschend, peinlich, immer

    drauf achten...
    mov Register1, register2
    
  4. ldi, sti, ldd, std - das heisst, i immidiate
  5. und add r1, r2 ist wie - oder and
  6. mov r1, r2ünd and r1, r2

warum gleich

$3
in r16 nach PORTB?

ganz einfach: RS - egal, 4, 5, 6. bit muss null sen. waere das nicht so, ok nicht 0x03

aber RS = 0, also 0x03

0b0000 0011

ok, und was ist mit konfigurierbefehl

0b1bcd0000
oder
0b0bcd0000

oder wie auch immer

0x20 loest das problem. wenn man

0b0bcd0000
aufloesen wuerden, es gibt zwei moeglichkeiten das zu lernen, entweder das steuerwort selber, oder wie gerade eben

das gerade. kaeme als: 0x30 in frage.

ach so: stimmt nicht, steht an der stelle nicht...

0x20 ...ist - konfigurierbefehl eben nicht

b = blink  
c = cursor on 
d = display on
sondern - 5x7 format z.B. aber auch: 4 Bit Modus....

aha, letzter ernsthafter init befehl, 4 Bit Modus... ist essentiell

bcd - nicht so sehr...

nein wieder fehler: $20 heisst, wohl, dass 4 Bit bestaetigt

$2 eben, also nach $3 $3 $3 stochastisch einschalten???

heisst: 4 Bit modus, das ist so essentiell ..wg

wenn erst mal eingeschaltet. ich kann keine CMD senden, und auch keine DATA - bzw. kann, nur, ab dem moment, das heisst, das ist eher, hardware ebene im sinne des busses. also sehr stark

wenn ich ab dem moment wo 8 Bit Modus, ich aber 4 bit modus senden, kann ich staendig CMD senden, aber komme nicht zurueck...

ok, das bietet nach lauter $3 ein $2 am anfang, fundamental an...

danach eben der rest...

achso, das habe ich eigentlich im kopf gehabt, habe ich mal auswendig gelernt, kann ich mich erinnern

nicht 0b1100000...

sondern $3, $3, $3

kann ich mich erinnern, ist jetzt wirklich bei ein mal hingucken aus dem kopf, habe ich auswendig gelernt...

klingt wie 

$3 $3 $3

dollar3 dollar3 dollar3 - pause - dollar3 dollar3 dollar3

ist wirklich aus dem kopf und dann folgt 

$3 $3 $3 $30 $20...

stimmts?

war aus dem kopf!

nein, stimmt durch die euphorie und unruhe in meinem kopf!

...

wurde aus $2 $30

ich habe den klang noch im ohr 

dollar3 dollar3 dollar3 

dollar3 dollar3 dollar3 dollar2 dollar20

stimmt durch die ploetzliche unruhe im kopf, wg. glauben und unglauben, dem ploetzlichen wissen... da wurde es ueberlagerte sich 

aus dollar2 dollar30 

erst dollar2 dann dollar30

gehoert das hier hin? wohl kaum!

dollar3 dollar3 dollar3 dollar2

... summ summ, wie noten von den rocky mountains, so stelle ich mir das vor...

Nach dem Anlegen der Betriebsspannung muss eine Zeit von mindestens ca. 15 ms gewartet werden, um dem LCD-Kontroller Zeit f"ur seine eigene Initialisierung zu geben.
    $3 ins Steuerregister schreiben (RS = 0)
    Mindestens 4,1 ms warten
    $3 ins Steuerregister schreiben (RS = 0)
    Mindestens 100 µs warten
    $3 ins Steuerregister schreiben (RS = 0)
    $2 ins Steuerregister schreiben (RS = 0), dadurch wird auf 4-Bit-Daten umgestellt.
    Ab jetzt muss f"ur die "Ubertragung eines Bytes jeweils zuerst das h"oherwertige Nibble und dann das niederwertige Nibble "ubertragen werden, wie oben beschrieben.
    Mit dem Konfigurier-Befehl $20 das Display konfigurieren (4-Bit, 1 oder 2 Zeilen, 5×7-Format)
    Mit den restlichen Konfigurierbefehlen die Konfiguration vervollst"andigen: Display ein/aus, Cursor ein/aus, etc.
    
sie nennen das ansteuern, ich einrasten, lock in - oder take over, gut behalten, bit 5...

  sbi PORTD, 5              ; Enable high
           nop                       ; 3 Taktzyklen warten ("nop" = nichts tun)
           nop
           nop
           cbi PORTD, 5              ; Enable wieder low

falsch war, erst sbi, dann cbi...

ok, beim initialisieren im naechsten schritt korrigieren, ich mache zweiten quelltext...


https://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD
...

so, jetzt weiter, jetzt nachgucken auf

https://www.mikrocontroller.net

korrekte addresse folgt, beitraege zu hd44780...

;; so so weit habe ich es ... dann nachgucken...

;; (c) david vajda
;; 06/10/2026
;; m8 atmega8 - lcd hd44780 - display - excersize

.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRB, r16

;; 1.) schritt initialisieren
;; 2.) commandos senden
;; 3.) zeichen senden
;; 4.) unterschieden ueber RS - am LCD HD44780
;;            wo egal, richtig angeloetet ...
;;            zweitens: dieses geraet <-> jenes geraet
;;            am controller: ich glaube: RS wurde in dem falle, im
;;            Byte z.B. manipuliert in r16 uebertragen, PORTB
;;            in Bit 5 gesetzt
;; 5.) oder wie war das?
;; 6.) nein, wir haben noch eine routine - danach liste
;; 7.) uebernehmen - uebernehmen, heisst, wie beim revolver,
;; 8.) registriermaschine ... einrasten uebernehmen
;; 9.) das ist glaube ich - ueber EN - E
;; 10.) geht:
;;          bit 5 Setzen, im PORTB
;;          nop
;;          nop
;;          nop
;; 11.) dann lauter warteschleifen
;; 12.) hat sich herausgestellt, warteschleifen von einer laenge reicht ...
;; 13.) initialisieren setzt sich zusammen, aus:
;; 14.) irgendwas senden, irgendein start cmd - ohne dass cmd aktiviert wurden
;; 15.) irgendwie noch mal noch mal noch mal, mit warten
;; 16.) einstellung vornehmen - Blinken, Curser ...
;;
;; d - ist display einschalten ..
;; 17.) ok: also: init heisst:
;; 18.) kurz irgendwas senden, anfangs cmd - aber fuer alles - es gibt in der
;; initialisierungsphase, keinen cmd mode und keinen data mode
;; es geht alles, also ist auf jeden fall: init cmd -
;; gut mehrfach senden - als - "stochastisch" bestaetigtigtes Signal
;; dann 4 Bit Modus einstellen - dann anfangen

;; wichtig - 4 bit - cmd und data byte zerlegen in jeweils 4 bit
;; in der init senden, 4 Bit mode...

;; Routinen
;; 1.) init
;; 2.) cmd send/transmit
;; 3.) data send/transmit
;; 4.) inzwischen: "einrasten" bit 5, en: nach allem ein mal senden
;;      bit 5 set
;;      nop
;;      nop
;;      npo
;;      bit 5 clear
;; 5.) 11 <- ??? oder 1 <-  ??? glaube 0b1bcd000000 zum init
;; teil von init - dann 4 bit modus
;; 6.) unterteilung von cmd und data send, erst untere vier bit, dann obere?
;; 7.) little endian big endian
;; 8.) little endian falsch rum - big endian richtig rum - habe ich mit computersysteme
;; 1/2 gelernt. gut, erst in assembler das was ich kann, z.B. routinen

rcall hd44780init
rcall hd44780takeover

ldi r16, 'h'
rcall hd44780senddata
ldi r16, 'a'
rcall hd44780senddata
ldi r16, 'l'
rcall hd44780senddata
ldi r16, 'l'
rcall hd44780senddata
ldi r16, 'o'
rcall hd44780senddata
ldi r16, ' '
rcall hd44780senddata
ldi r16, 'w'
rcall hd44780senddata
ldi r16, 'e'
rcall hd44780senddata
ldi r16, 'l'
rcall hd44780senddata
ldi r16, 't'
rcall hd44780senddata
ldi r16, '!'
rcall hd44780senddata
ldi r16, '!'
rcall hd44780senddata
ldi r16, '!'

end: rjmp end

hd44780takeover:
;; vermutlich sti und cli
sti PORTB, 5
nop
nop
nop
cli PORTB, 5
ret

hd44780init:
;; hier so pi mal daumen
;; 1.) ich sende irgendein command - bits - glaube vorne zwei gesetzt
;; 2.) 2 oder 3 mal um mit stochastischer wahrscheinlichkeit zu signialisieren
;; 3.) es geht wirklich los - plus warteschleife, also erste version
rcall hd44780slowdownloop
;; nachgeguckt google: wait loop - warteschleife - computer technology
;; aircraft ... ?? craft: holding pattern...
ldi r16, 0b11000000
out PORTB r16
rcall hd44780takeover
rcall hd44780slowdownloop
;; noch mal:
ldi r16, 0b11000000
out PORTB r16
rcall hd44780takeover
rcall hd44780slowdownloop
;; ok muesste sitzen, jetzt einstellung vornehmen:
;; falsch, weil bcd gesetzt, also:
ldi r16, 0b11110000
;; oder 0b01110000 or what ever
out PORTB r16
rcall hd44780takeover
rcall hd44780slowdownloop
;; jetzt 4 bit modus: oder vor bcd...
out PORTB, r16
;;....
rcall hd44780takeover
ret

;; think bit 4 - PORTB gesetzt ist CMD
;; think bit 4 - PORTB geloescht ist DATA
;; moeglich 3 .. 0 ist data - bei 4 bit
;; korrektur nachher ...

hd44780transmitcmd:
sti PORTB, 4
;; 4 bit uebertragen, mit maske, erst unteres
;; dann oberes ...
mov r17, r16
and r17, 0b00001111
out PORTB, r17
rcall hd44780takeover
mov r17, r16
lsr r17, 4
and r17, 0b00001111
out PORTB, r17
rcall hd44780takeover
cli PORTB, 4 ;; nicht noetig
ret

hd44780senddata:
cli PORTB, 4

;; 4 bit uebertragen, mit maske, erst unteres
;; dann oberes ...
mov r17, r16
and r17, 0b00001111
out PORTB, r17
rcall hd44780takeover
mov r17, r16
lsr r17, 4
and r17, 0b00001111
out PORTB, r17
rcall hd44780takeover
sti PORTB, 4 ;; nicht noetig
ret

hd44780slowdownloop:
push r16
ldi r16, 0x72
hd44780slowdownloopl1:
dec r16
brne hd44780slowdownloopl1
pop r16
ret

jetzt pause, was mir dann noch adhoch einfaellt, nach der pause

1bcd00000 usw

laesst sich hinschreiben, die warteroutine fehlt.

nu ist es so:

ich kann eine warteroutine so schreiben, ich glaube es war 0x72 oder so.

mit 3 inneren schleifen, auskommentieren

sollte es

11bcd000
sein kann ich das korrigieren

und die zerlegung in 2 4 Bit nibbles, aus r16

erst oben/unten?

kann ich auch so zerlegen, uebertragen...

nach der pause...

;; (c) david vajda
;; 06/10/2026
;; m8 atmega8 - lcd hd44780 - display - excersize

.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRB, r16

;; 1.) schritt initialisieren
;; 2.) commandos senden
;; 3.) zeichen senden
;; 4.) unterschieden ueber RS - am LCD HD44780
;;            wo egal, richtig angeloetet ...
;;            zweitens: dieses geraet <-> jenes geraet
;;            am controller: ich glaube: RS wurde in dem falle, im
;;            Byte z.B. manipuliert in r16 uebertragen, PORTB
;;            in Bit 5 gesetzt
;; 5.) oder wie war das?
;; 6.) nein, wir haben noch eine routine - danach liste
;; 7.) uebernehmen - uebernehmen, heisst, wie beim revolver,
;; 8.) registriermaschine ... einrasten uebernehmen
;; 9.) das ist glaube ich - ueber EN - E
;; 10.) geht:
;;          bit 5 Setzen, im PORTB
;;          nop
;;          nop
;;          nop
;; 11.) dann lauter warteschleifen
;; 12.) hat sich herausgestellt, warteschleifen von einer laenge reicht ...
;; 13.) initialisieren setzt sich zusammen, aus:
;; 14.) irgendwas senden, irgendein start cmd - ohne dass cmd aktiviert wurden
;; 15.) irgendwie noch mal noch mal noch mal, mit warten
;; 16.) einstellung vornehmen - Blinken, Curser ...
;;
;; d - ist display einschalten ..
;; 17.) ok: also: init heisst:
;; 18.) kurz irgendwas senden, anfangs cmd - aber fuer alles - es gibt in der
;; initialisierungsphase, keinen cmd mode und keinen data mode
;; es geht alles, also ist auf jeden fall: init cmd -
;; gut mehrfach senden - als - "stochastisch" bestaetigtigtes Signal
;; dann 4 Bit Modus einstellen - dann anfangen

;; wichtig - 4 bit - cmd und data byte zerlegen in jeweils 4 bit
;; in der init senden, 4 Bit mode...

;; Routinen
;; 1.) init
;; 2.) cmd send/transmit
;; 3.) data send/transmit
;; 4.) inzwischen: "einrasten" bit 5, en: nach allem ein mal senden
;;      bit 5 set
;;      nop
;;      nop
;;      npo
;;      bit 5 clear
;; 5.) 11 <- ??? oder 1 <-  ??? glaube 0b1bcd000000 zum init
;; teil von init - dann 4 bit modus
;; 6.) unterteilung von cmd und data send, erst untere vier bit, dann obere?
;; 7.) little endian big endian
;; 8.) little endian falsch rum - big endian richtig rum - habe ich mit computersysteme
;; 1/2 gelernt. gut, erst in assembler das was ich kann, z.B. routinen

rcall hd44780init
rcall hd44780takeover

ldi r16, 'h'
rcall hd44780senddata
ldi r16, 'a'
rcall hd44780senddata
ldi r16, 'l'
rcall hd44780senddata
ldi r16, 'l'
rcall hd44780senddata
ldi r16, 'o'
rcall hd44780senddata
ldi r16, ' '
rcall hd44780senddata
ldi r16, 'w'
rcall hd44780senddata
ldi r16, 'e'
rcall hd44780senddata
ldi r16, 'l'
rcall hd44780senddata
ldi r16, 't'
rcall hd44780senddata
ldi r16, '!'
rcall hd44780senddata
ldi r16, '!'
rcall hd44780senddata
ldi r16, '!'

end: rjmp end

hd44780takeover:
;; vermutlich sti und cli
sti PORTB, 5
nop
nop
nop
cli PORTB, 5
ret

hd44780init:
rcall hd44780takeover
rcall hd44780takeover
ret

hd44780transmitcmd:
rcall hd44780takeover
rcall hd44780takeover
ret

hd44780senddata:
rcall hd44780takeover
rcall hd44780takeover
ret

;; so weit komme ich jetzt erst mal, schreibe, auf, was dann zu tun ist, und versuche so weit ich kann das zu rekonstruieren...