;; (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:
andi
ldi, heisst immidiate, konstante, direktwert
mov r16, r17intel programmierer bekommen das nicht mit
mov ax, bx mov ax, [label1]aber computersysteme 1/2 enttaeuschend, peinlich, immer
mov Register1, register2
ldi, sti, ldd, std - das heisst, i immidiate
add r1, r2 ist wie - oder and
and r1, r2
warum gleich
$3in
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
0b1bcd0000oder
0b0bcd0000
oder wie auch immer
0x20 loest das problem. wenn man
0b0bcd0000aufloesen 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 onsondern - 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
11bcd000sein 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...