lcd, hd44780 + rs232 - recieve - 06/14/2026

Naja, tut wie erwartet jetzt erst mal nicht. Jetzt muss ich Pause machen. Jetzt hab ich keine Kraft mehr. Ehrlich gesagt für heute für das . Also Pause

Image 8BDB21B0-90CE-492F-B096-FA57D4412B47_1_105_c

Image Screenshot_20260614_205720

puffer vereinfacht: ohne <CR><LF> ist 10, 13 zu prüfen, nur 10

;; so einfacher...
rs232recieve:
ldi YH, HIGH (2*buf)
ldi YL, LOW (2*buf)
rs232recievel1:
rcall rs232revievech
st Y+, r16
cpi r16, 10
brne rs232recievel1
ldi r16, 0x00
st Y+, r16
st Y+, r16
ret

hier der gesamte quelltext, atmega8 faengt mit rs232 - recieve vom PC eine nachricht möglich über konsole gesendet im Puffer ein und gibt sie auf dem LCD HD44780 bei sich aus.

dabei wird ein ende der zeile auf der konsole, auf 10, 13 erkannt und: eine null wird nach der übername auch davon in den puffer eingetragen. bei der ausgabe des puffers auf dem lcd, wird das ende der nachricht im puffer, mit 0 markiert...

;; david vajda
;; 06/14/2026
;; m8/lcd hd44780

.include "m8def.inc"

.equ HD44780WAITLOOPLONGCOUNT1 = $21
.equ HD44780WAITLOOPLONGCOUNT2 = $C9
.equ HD44780WAITLOOPSHORTCOUNT = 42

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
ldi r16, 0xff
out DDRB, r16

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16
ldi r16, (1 << UCSZ1) | (1 << UCSZ0) | (1 << URSEL)
out UCSRC, r16
ldi r16, (1 << TXEN)
out UCSRB, r16

ldi r16, HIGH (2*buf)
mov YH, r16
ldi r16, LOW (2*buf)
mov YL, r16

main1:
rcall hd44780init
rcall hd44780cleardisplay
rcall rs232recieve
rcall rs232hd44780print
rjmp main1

rs232recieve:
ldi YH, HIGH (2*buf)
ldi YL, LOW (2*buf)
ldi r18, 0x00
rs232recievel1:
rcall rs232revievech
st Y+, r16
cpi r16, 10
brne rs232recievel1
ret

rs232revievech:
sbis UCSRA, UDRE
rjmp rs232recieve
in r16, UDR
ret

rs232hd44780print:
ldi ZH, HIGH (2*buf)
ldi ZL, LOW (2*buf)
l1:
ld r16, Z+
rcall hd44780echo
subi r16, 0x00
brne l1
ret

hd44780setup:
sbi PORTB, 5
nop
nop
nop
cbi PORTB, 5
ret

hd44780waitlooplong:
push r16
push r17
ldi r16, HD44780WAITLOOPLONGCOUNT1
hd44780waitlooplongl1:
ldi r17, HD44780WAITLOOPLONGCOUNT2
hd44780waitlooplongl2:
dec r17
brne hd44780waitlooplongl2
dec r16
brne hd44780waitlooplongl1
pop r17
pop r16
ret

hd44780waitloopshort:
push r16
ldi r16, HD44780WAITLOOPSHORTCOUNT
hd44780waitloopshortl1:
dec r16
brne hd44780waitloopshortl1
pop r16
ret

hd44780init:
;; $3, $3, $3, $2, $20
ldi r16, 50 ;; weiss ich auswendig so lange am anfang warten
hd44780initl1:
rcall hd44780waitlooplong
dec r16
brne hd44780initl1
ldi r16, $3
out PORTB, r16
rcall hd44780setup
rcall hd44780waitlooplong
rcall hd44780setup
rcall hd44780waitlooplong
rcall hd44780setup
rcall hd44780waitlooplong
ldi r16, $2
rcall hd44780setup
rcall hd44780waitlooplong
ldi r16, $20
rcall hd44780setup
rcall hd44780waitlooplong

;; weiss auswendig
;; 0b0000 0001 clear display
;; 0b0000 001x cursor home
;; 0b0000 01is entry mode
;; 0b0000 1dbc display on, blink, cursor on
;; 0b0001
;; hier folgt etwas zu konfiguration ist wichtig...
;; damit das interface auch 4 bit modus macht...

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

hd44780cmd:
mov r17, r16
swap r17
andi r17, 0b00001111
out PORTB, r17
rcall hd44780setup
mov r17, r16
andi r17, 0b00001111
out PORTB, r17
rcall hd44780setup
rcall hd44780waitloopshort
ret

hd44780echo:
mov r17, r16
swap r17
andi r17, 0b00001111
ori r17, 0x10
out PORTB, r17
rcall hd44780setup
mov r17, r16
andi r17, 0b00001111
ori r17, 0x10
out PORTB, r17
rcall hd44780setup
rcall hd44780waitloopshort
ret

hd44780cleardisplay:
ldi r16, 0b00000001
rcall hd44780cmd
ret

.dseg
buf: .byte 128

doch, der letzte code, über uns, ist mit der routine über uns ausgestattet. er erkennt nur 10 um es einfacher zu machen 0x0A. dies geschieht

;; nein, jetzt mit buffer...und mit dieser buffer routine kann es nicht gut funktionieren...erscheint nichts am display probiere noch mal, sobald 10 erscheint '\n' new line, 2 ASCII Character <BS><CR>, 10, 13, aber es ist einfacher nur auf 10 zu reagieren...

hier ist der code mit 10, 13, 10, 13 entspricht 0x0A, 0x0D und signalisiert <CR><LF> was so viel heisst, wie carriage return, line feed. das heisst, Waagenrücklauf, zeilen vorschub. zeilen vorschub heisst nicht spalten vorschub. das müssen wir bedenken. wir koennen uns das schreibmaschinenpapier als tabelle vorstellen, vertikal und horizontal. wir koennen vertikalen vorschub leisten, also in die naechste zeile und horizontale, das naechste zeichen. waagenruecklauf bedeutet an den anfang im westen der seite. zeilenvorschub in den sueden. in der spalte, in den osten. wuerde nur ein zeilenvorschub also wechsel in die nächste zeile stattfinden, wuerde in der naechste zeile in der spalte weiter geschrieben, wo wir gerade sind.

;; david vajda
;; 06/14/2026
;; m8/lcd hd44780

.include "m8def.inc"

.equ HD44780WAITLOOPLONGCOUNT1 = $21
.equ HD44780WAITLOOPLONGCOUNT2 = $C9
.equ HD44780WAITLOOPSHORTCOUNT = 42

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
ldi r16, 0xff
out DDRB, r16

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16
ldi r16, (1 << UCSZ1) | (1 << UCSZ0) | (1 << URSEL)
out UCSRC, r16
ldi r16, (1 << TXEN)
out UCSRB, r16

ldi r16, HIGH (2*buf)
mov YH, r16
ldi r16, LOW (2*buf)
mov YL, r16

main1:
rcall hd44780init
rcall hd44780cleardisplay
rcall rs232recieve
rcall rs232hd44780print
rjmp main1

rs232recieve:
ldi YH, HIGH (2*buf)
ldi YL, LOW (2*buf)
ldi r18, 0x00
rs232recievel1:
rcall rs232revievech
cpi r16, 13
brne rs232recievetest1
sbrc r18, 0
st Y+, r16
ldi r16, 0x00
st Y+, r16
st Y+, r16
rjmp rs232recievelend
rs232recievetest1:
ldi r18, 0x00
cpi r16, 10
brne rs232recievetest2
ldi r18, 0x01
rs232recievetest2:
st Y+, r16
rjmp rs232recievel1
rs232recievelend:
ret

rs232revievech:
sbis UCSRA, UDRE
rjmp rs232recieve
in r16, UDR
ret

rs232hd44780print:
ldi ZH, HIGH (2*buf)
ldi ZL, LOW (2*buf)
l1:
ld r16, Z+
rcall hd44780echo
subi r16, 0x00
brne l1
ret

hd44780setup:
sbi PORTB, 5
nop
nop
nop
cbi PORTB, 5
ret

hd44780waitlooplong:
push r16
push r17
ldi r16, HD44780WAITLOOPLONGCOUNT1
hd44780waitlooplongl1:
ldi r17, HD44780WAITLOOPLONGCOUNT2
hd44780waitlooplongl2:
dec r17
brne hd44780waitlooplongl2
dec r16
brne hd44780waitlooplongl1
pop r17
pop r16
ret

hd44780waitloopshort:
push r16
ldi r16, HD44780WAITLOOPSHORTCOUNT
hd44780waitloopshortl1:
dec r16
brne hd44780waitloopshortl1
pop r16
ret

hd44780init:
;; $3, $3, $3, $2, $20
ldi r16, 50 ;; weiss ich auswendig so lange am anfang warten
hd44780initl1:
rcall hd44780waitlooplong
dec r16
brne hd44780initl1
ldi r16, $3
out PORTB, r16
rcall hd44780setup
rcall hd44780waitlooplong
rcall hd44780setup
rcall hd44780waitlooplong
rcall hd44780setup
rcall hd44780waitlooplong
ldi r16, $2
rcall hd44780setup
rcall hd44780waitlooplong
ldi r16, $20
rcall hd44780setup
rcall hd44780waitlooplong

;; weiss auswendig
;; 0b0000 0001 clear display
;; 0b0000 001x cursor home
;; 0b0000 01is entry mode
;; 0b0000 1dbc display on, blink, cursor on
;; 0b0001
;; hier folgt etwas zu konfiguration ist wichtig...
;; damit das interface auch 4 bit modus macht...

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

hd44780cmd:
mov r17, r16
swap r17
andi r17, 0b00001111
out PORTB, r17
rcall hd44780setup
mov r17, r16
andi r17, 0b00001111
out PORTB, r17
rcall hd44780setup
rcall hd44780waitloopshort
ret

hd44780echo:
mov r17, r16
swap r17
andi r17, 0b00001111
ori r17, 0x10
out PORTB, r17
rcall hd44780setup
mov r17, r16
andi r17, 0b00001111
ori r17, 0x10
out PORTB, r17
rcall hd44780setup
rcall hd44780waitloopshort
ret

hd44780cleardisplay:
ldi r16, 0b00000001
rcall hd44780cmd
ret

.dseg
buf: .byte 128

in dem obigen quelltext, wurde das recieve vom pc eingebaut, ueber die serielle schnittstelle, rs232 vom PC. das wird auf dem lcd ausgegeben - hd44780. doch davor wird das lcd selbst definiert:

im zweiten schritt, kommt das recieve noch dazu...von rs232.... das findet im obigen beitrag statt

Image 34EE5ED7-FE5C-454F-A3C7-CB0F421F7E88_1_105_c

Image 81D9EB5B-8FAE-4C9C-8F9A-D5B6267706CD_1_105_c

Image 3440159E-B751-4070-9389-182517E232D3_1_105_c

Image 3440159E-B751-4070-9389-182517E232D3_1_105_c

Image F66C4640-F55A-41C5-BFAE-00B2633EA2C5_1_105_c

nachdem der fehler, unterer beitrag, korrigiert wurde: Ja, es geht auf Anhieb

ich habe wieder etwas vergesssen: Aha, mal wieder mal zwei vergessen

denken wir nach: die daten sind datensegment, einem fluechtigen speicher RAM - oft SRAM - doch wir koennen einen fluechtigen speicherbereich nicht nur fuer variablen reservieren, im datensegment, sondern ganze felder, bereiche buffer,
hier koennen ganze reihen von messergebnissen z.B. hingeschrieben werden, tabellen, deren elemente zur auswertig verknuepft werden.

doch: sie entstehen zur laufzeit. ein programm mit seinen initialisierungsdaten, liegt immer fest vor. auch auf dem PC. hier lagert es im dateisystem. es wird 1:1 durch das betriebssystem mit fork in den RAM geladen. fork ist ein system aufruf. dass das betriebssystem veranlasst. - moeglicherweise irre ich mich hier.

die funktionen allocmem und freemem dienen dazu speicherbereiche im RAM frei zu machen, bereits seit Minix. dazu gibt es auch bei minix eine freispeicherliste. das Paging im x386 ist nicht zwingend darin inbegriffen, das paging selbst, verschleiert dem benutzerprogramm eine zerlegung in mehrere teile, wenn es statt findet. das benutzerprogramm soll nicht darueber in kenntnis gesetzt werden. die freispeicherliste funktioniert immer noch gleich, erfordert aber ein fuellen der einzelnen seiten und seitenrahmen, dazu, erfordert es. dass die luecken im RAM noetigenfalls tatsaechlich geladen werden

doch das programm selbst liegt immer fest vor, wird so geladen. dazu gehoeren auch fest integrierte zeichenkentten

allocmem und freemem, kuemmern sich um das bereitstellen von RAM. system exec ...fuehren das programm schlussendlich aus. funktionen wie fork, kopieren teile des einen prozesses in den anderen, oder: sie kopieren das programm in den RAM

allerdings: bei einer CPU wie in computersysteme 1/2 beschrieben, haben wir es immer - MIPS32, mit getrennten programmspeicher und datenspeicher zu tun. Intel haelt zwar fuer alles einen fluechtigen RAM bereit, unterteilt in Segmente, doch es ist egal, wo diese im RAM hinzeigen, kein RAM ist physisch selbst fuer daten oder code reseviert. trotzdem muss das programm fest vorliegen, im normalfall

bei einer Architektur wie MIPS32 oder Atmega8 gibt es einen festen oder festen, aber zur laufzeit beschreibbaren speicher fuer programm und einen fluechtigen. im fluechtigen koennen zwar bereiche reserviert werden, doch sie werden generell nicht ohne dazu tun des programms beschrieben, da bei einem Intel PC - so oder so - oder Mac OS X, was auch intel nutzt, das betriebssystem benutzerprogramme in den RAM laedt, kann es zeichenketten im Programm auf der platte gleich mitladen.

das ist allerdings aufgabe des betriebssystems dieses laden. was auf dem atmega8 nicht passiert. denn das programm ist schon fest im programmspeicher, der zwar durch das programm beschrieben werden kann und in dem ein lader geschrieben sein kann der den RAM mit seinen daten aus dem code o. textsegment laedt. trotzdem enthaelt es selbst einen lader dann, der programmiert wurde

von alleine kommen keine daten in den RAM...

der unterschied: befehle im Programmsegment arbeiten mit 2 Byte. jeder Befehl ist 2 Byte lang, das entspricht einer RISC architektur. RISC architekturen haben anders als CISC - Befehle von fester laenge und die taktzyklen in denen ein befehl ausgefuehrt wird, ist zumindest je nach ihrer klasse ziemlich identisch, das vereinfacht die ausfuehrung.

im text segment wird mit 2 Byte gerechnet, also muss vor jedes Label, was als Daten fest erscheint ein mal 2 geschrieben werden.

16 Bit Befehle ueber Daten trotdem byte weise addressierbar, siehe Y-Zeiger. usw. der sich trotzdem immer um eines inkrementiert.

Image 608C36BF-855B-44CB-B259-19042FB3A1A7_1_105_c

Naja, was darstellen tut es nur was

wo liegt der fehler

;; david vajda
;; 06/14/2026
;; m8/lcd hd44780

.include "m8def.inc"

.equ HD44780WAITLOOPLONGCOUNT1 = $21
.equ HD44780WAITLOOPLONGCOUNT2 = $C9
.equ HD44780WAITLOOPSHORTCOUNT = 42

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
ldi r16, 0xff
out DDRB, r16

rcall hd44780init
rcall hd44780cleardisplay
ldi ZH, HIGH (str)
ldi ZL, LOW (str)
l1:
lpm r16, Z+
rcall hd44780echo
subi r16, 0x00
brne l1

str: .db "https://www.vajda-breadboard.de", 10, 13, 0x00, 0x00

hd44780setup:
sbi PORTB, 5
nop
nop
nop
cbi PORTB, 5
ret

hd44780waitlooplong:
push r16
push r17
ldi r16, HD44780WAITLOOPLONGCOUNT1
hd44780waitlooplongl1:
ldi r17, HD44780WAITLOOPLONGCOUNT2
hd44780waitlooplongl2:
dec r17
brne hd44780waitlooplongl2
dec r16
brne hd44780waitlooplongl1
pop r17
pop r16
ret

hd44780waitloopshort:
push r16
ldi r16, HD44780WAITLOOPSHORTCOUNT
hd44780waitloopshortl1:
dec r16
brne hd44780waitloopshortl1
pop r16
ret

hd44780init:
;; $3, $3, $3, $2, $20
ldi r16, 50 ;; weiss ich auswendig so lange am anfang warten
hd44780initl1:
rcall hd44780waitlooplong
dec r16
brne hd44780initl1
ldi r16, $3
out PORTB, r16
rcall hd44780setup
rcall hd44780waitlooplong
rcall hd44780setup
rcall hd44780waitlooplong
rcall hd44780setup
rcall hd44780waitlooplong
ldi r16, $2
rcall hd44780setup
rcall hd44780waitlooplong
ldi r16, $20
rcall hd44780setup
rcall hd44780waitlooplong

;; weiss auswendig
;; 0b0000 0001 clear display
;; 0b0000 001x cursor home
;; 0b0000 01is entry mode
;; 0b0000 1dbc display on, blink, cursor on
;; 0b0001
;; hier folgt etwas zu konfiguration ist wichtig...
;; damit das interface auch 4 bit modus macht...

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

hd44780cmd:
mov r17, r16
swap r17
andi r17, 0b00001111
out PORTB, r17
rcall hd44780setup
mov r17, r16
andi r17, 0b00001111
out PORTB, r17
rcall hd44780setup
rcall hd44780waitloopshort
ret

hd44780echo:
mov r17, r16
swap r17
andi r17, 0b00001111
ori r17, 0x10
out PORTB, r17
rcall hd44780setup
mov r17, r16
andi r17, 0b00001111
ori r17, 0x10
out PORTB, r17
rcall hd44780setup
rcall hd44780waitloopshort
ret

hd44780cleardisplay:
ldi r16, 0b00000001
rcall hd44780cmd
ret

screenhots: expr. term. factor - google

jetzt schreiben wir

  1. recieve und LCD HD44780 zunaechst LCD HD44780 und gleich rein recieve. vom PC wird eine message uebertragen am LCD ausgegeben
  2. doch wir gehen einen schritt weiter...

kleine compiler fuer arith. ausdruecke in bakus naur form sind immer schoen.

arithmetische ausdruecke mit klammern und zwei rechenoperationen

+ und *

ausdruecke in dieser vereinfachten sprache, wenn nicht alle moeglichen rekurssionen in der grammatik befreit sind, lauten:

<expr> ::= <expr> + <term> | <term>
<term> ::= <term> * <factor> | <factor>
<factor> ::= <const> | (<expr>)
wobei wir jetzt einfacherhalberweise jede konstante maximal
0 .. 9d
machen.

die umrechnung, laengere dec. zahlen darstellung kommt spaeter.ebenso der fehlende divisionsbefehl. ist wie gesagt einfach.

schriftlich dividieren geht

71 / 2 = 3...

wg 3*2 = 6

dann muss ich

7-6 rechnen und unten hinschreiben.

was das binaere rechnen betrifft, findet diese subtraktion ebenso statt.

ich muss also:

1011
-1001
rechnen, das ergebnis ist einfach. doch viel passieren kann nicht
10001
  1111
duch das binaere kann eine zahl, die 1 stelle laenger ist.
100
-10
nicht so oft da rein passen das erspart mir vieles.

ok, spaeter.

jedenfalls bakus naur ohne (links?)rekursion beseitigen..

so weit ich das auf die schnelle sehe, im netz nachgucken

FALSCH!!!!

<expr> ::= <expr2> | <term>
<expr2> ::= + <expr> | E
<term> ::= <term2> | <factor>
<term2> ::= * <term>
<factor> ::= <const> | (<expr>)
muss ich nachgucken.

am pc gibt ein user code ein:

echo "(3+4)2" >> /dev/ttyS3
der atmega8 faengt den code ein. uebertraegt ihn wie vorher aber in den datenspeicher. rechnet mit rekursion und compiler das aus. zeigt es auf dem LCD und sendet es zurueck an den PC...

nein war falsch

Schritt für

Expr ::= Term Expr'
Expr' ::= + Term Expr'
ok, jetzt, danach:

  1. externes interrupts - ueber taster...
  2. versuch: heute noch timer intervall...
Image Screenshot_20260614_192643

Image Screenshot_20260614_192804

transmit an PC hat funktioniert

Image Screenshot_20260614_190059

;; folgendes:

lpm r16, Z+
subi r16, 0x00
breq l1

Zgeht sehr wohl mit r16

lpm geht mit Z

normalerweise funktioniert

ldi r16, 0x00
ach, ne, habe mich vertan! muesste man im Datasheet nachgucken! die veraenderten flags stehen drin

ich gehe immer von der schleife

dec r16
brne ...
aus oder
dec r16
breq
weil: das ist eine mathematische operation. setzt also flags. muss man im datasheet nachgucken

wenn also r16 durch arithmetische operation anders, flag gesetzt.

damit, wenn im string steht

0...
ich denke, das geht auch nicht bei ld

die situation hatten wir jetzt aber nicht lpm, ld und so weiter setzen wahrscheinlich keine flags

in der alu sind komperatoren eigentlich nicht ueblich.vermutlich atmega8 (datasheet), mips32, cs1/2

alu loesen vergleiche ueber subtraktion. sollten alle bits das ergebnisses null sein laesst sich das ueber logische verknuepfung schnell feststellen, dann wird das z flag aktiviert

was vielleicht auswirkungen auf spruenge hat...

ja, ich habe es geschafft...

Image Screenshot_20260614_190059

nach jedem reset, aber das abbruchkriterium versagt trotzdem...noch...bis er von vorne anfaengt...

Image Screenshot_20260614_185446 zumindest, etwas fehlt noch...

Image Screenshot_20260614_185332

das was uns computersysteme 1/2 so oder so bietet, aber der atmega8 von alleine

lpm r0, Z+
generell kein fehler!

mit

ld r16, Y+
blos, es gibt

das problem - es gibt mehrere speicher

  1. daten
  2. code
zunaechst lpm geht nur mit dem Z pointer...

das zweite: daten ist schoen, und hier gilt das uebliche

(lade- und speicherarchitektur)

ld, ldi, ldd, lds, st, sti, std (uebrigens)

nur - im daten sind daten fluechtig...

"adsasd" kann man eigentlich nicht unterbringen...

das andere ist:

wir benutzen im code

.db .dw ...
bei daten
.byte .word
blos

lpm und spm beziehen sich auf den nicht 100% festen Programmspeicher...

flash eeprom halt. der programm speicher laesst sich auch ohne programmierung beschreiben

trotzdem ist das im code.

die daten sind bei feldern dazu da, z.B. tabellen zu manipulieren, die entstanden oder nachgeladen sind.

zur manipulation. der code enthaelt festes...

;; ich habe den fehler gefunden, ein wenig peinlich, aber... ok, nicht ganz so schlimm, ich erklaere..

;; david vajda
;; 06/14/2026
;; m8/rs232/transmit/excersize

.include "m8def.inc"

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

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16

;; UCSRC, UCSRB, UCRSA

;; UCSRA: UDRE/TXC/RXC
;; UCSRB: TXEN, RXEN, UCSZ2, UPM1:0 (o. UCSRC), URSEL...
;; UCSRC: UCSZ1:0, USBS (o. UCSRB)

ldi r16, (1 << UCSZ1) | (1 << UCSZ0) | (1 << URSEL) | (1 << UPM1) | (1 << UPM0) | (1 << USBS)
out UCSRC, r16
ldi r16, (1 << TXEN) | (0 << UCSZ2)
out UCSRB, r16

l1:
ldi ZH, HIGH (2*str)
ldi ZL, LOW (2*str)
l2:
lpm r0, Z+
breq l1
rcall rs232transmit
rjmp l2

.org 0x100
str: .db "https://www.vajda-breadboard.com", 10, 13, 0

rs232transmit:
sbis UCSRA, UDRE
rjmp rs232transmit
out UDR, r0
ret

davor

;; david vajda
;; 06/14/2026
;; m8/rs232/transmit/excersize

.include "m8def.inc"

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

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16

;; UCSRC, UCSRB, UCRSA

;; UCSRA: UDRE/TXC/RXC
;; UCSRB: TXEN, RXEN, UCSZ2, UPM1:0 (o. UCSRC), URSEL...
;; UCSRC: UCSZ1:0, USBS (o. UCSRB)

ldi r16, (1 << UCSZ1) | (1 << UCSZ0) | (1 << URSEL) | (1 << UPM1) | (1 << UPM0) | (1 << USBS)
out UCSRC, r16
ldi r16, (1 << TXEN) | (0 << UCSZ2)
out UCSRB, r16

l1:
ldi YH, HIGH (2*str)
ldi YL, LOW (2*str)
l2:
ld r16, Y+
breq l1
rcall rs232transmit
rjmp l2

.org 0x100
str: .db "https://www.vajda-breadboard.com", 10, 13, 0

rs232transmit:
sbis UCSRA, UDRE
rjmp rs232transmit
out UDR, r16
ret

aha, ich habe rausgefunden, woran es liegt!!! ich weiss es!!! das ist gravierend!!! das heisst nicht, ich kann nicht .db nehmen, sondern es heisst: da die grenze: immer 2 byte geht, bedeutet das: als Y+ geht trotzdem immer zum naechsten. das muss man unterscheiden, oder es fehlt halt, wenn pech, jeder zweiter buchstabe. sehen wir gleich. Y+, daten hat nicht automatisch was mit programm zu tun. das programm selbst wird aber *2 gerechnet, eben wie ich gerade sagte. bei der angabe HIGH (str) ist es deswegen jetzt die haelfte vom str und muss heissen HIGH (2*str)...

;; ich weiss jetzt woran es liegt, es sind nicht irrtuemlich die einstellungen am USART und nicht bei stty fuer /dev/ttyS3 sondern es ist - die schleife fuer den string...das ist nicht 100% richtig z.B. zunaechst: da der string im programm code definiert wurde, des atmega8 und nicht im datansegment. im programm code, geht der zaehler generell immer 2 byte zum naechsten befehl. deswegen auf die 2 byte grenze achten...und: er geht eben immer 2 byte...

;; david vajda
;; 06/14/2026
;; m8/rs232/transmit/excersize

.include "m8def.inc"

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

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16

;; UCSRC, UCSRB, UCRSA

;; UCSRA: UDRE/TXC/RXC
;; UCSRB: TXEN, RXEN, UCSZ2, UPM1:0 (o. UCSRC), URSEL...
;; UCSRC: UCSZ1:0, USBS (o. UCSRB)

ldi r16, (1 << UCSZ1) | (1 << UCSZ0) | (1 << URSEL) | (1 << UPM1) | (1 << UPM0) | (1 << USBS)
out UCSRC, r16
ldi r16, (1 << TXEN) | (0 << UCSZ2)
out UCSRB, r16

l1:
ldi YH, HIGH (str)
ldi YL, LOW (str)
l2:
ld r16, Y+
breq l1
ldi r16, 'd'
rcall rs232transmit
rjmp l2

.org 0x100
str: .db "https://www.vajda-breadboard.com", 10, 13, 0

rs232transmit:
sbis UCSRA, UDRE
rjmp rs232transmit
out UDR, r16
ret

Image Screenshot_20260614_182026

Image Screenshot_20260614_181928

Image Screenshot_20260614_181328

Image Screenshot_20260614_181351

Image Screenshot_20260614_181358

;; etwas geht

;; david vajda
;; 06/14/2026
;; m8/rs232/transmit/excersize

.include "m8def.inc"

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

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16

;; UCSRC, UCSRB, UCRSA

;; UCSRA: UDRE/TXC/RXC
;; UCSRB: TXEN, RXEN, UCSZ2, UPM1:0 (o. UCSRC), URSEL...
;; UCSRC: UCSZ1:0, USBS (o. UCSRB)

ldi r16, (1 << UCSZ1) | (1 << UCSZ0) | (1 << URSEL) | (1 << UPM1) | (1 << UPM0) | (1 << USBS)
out UCSRC, r16
ldi r16, (1 << TXEN) | (0 << UCSZ2)
out UCSRB, r16

l1:
ldi YH, HIGH (str)
ldi YL, LOW (str)
l2:
ld r16, Y+
breq l1
rcall rs232transmit
rjmp l2

.org 0x100
str: .db "https://www.vajda-breadboard.com", 10, 13, 0

rs232transmit:
sbis UCSRA, UDRE
rjmp rs232transmit
out UDR, r16
ret

die bits beim atmega8, rs232:

wir muessen im atmega8 datasheet nachgucken, hier steht selber, wo URSEL untergebracht werden muss, mikrocontroller.net hat hier wohl einen kleinen fehler an einer stelle, allerdings steht das alles im datasheet des atmega8 - fast das gleiche - eindeutig identisch, das reicht an der stelle absolut...also da gucken...

ich hatte recht...

;; david vajda
;; 06/14/2026
;; m8/rs232/transmit/excersize

.include "m8def.inc"

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

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16

;; UCSRC, UCSRB, UCRSA

;; UCSRA: UDRE/TXC/RXC
;; UCSRB: TXEN, RXEN, UCSZ2, UPM1:0 (o. UCSRC), URSEL...
;; UCSRC: UCSZ1:0, USBS (o. UCSRB)

ldi r16, (1 << UCSZ1) | (1 << UCSZ0) | (1 << USBS) | (1 << URSEL) | (1 << UPM1) | (1 << UPM0)
out UCSRC, r16
ldi r16, (1 << TXEN) | (0 << UCSZ2)
out UCSRB, r16

l1:
ldi YH, HIGH (str)
ldi YL, LOW (str)
l2:
ld r16, Y+
breq l1
rcall rs232transmit
rjmp l2

.org 0x100
str: .db "https://www.vajda-breadboard.com", 10, 13, 0

rs232transmit:
sbis UCSRA, UDRE
rjmp rs232transmit
out UDR, r16
ret

2 videos - stk 500 auf dem drucker...

1 photo: stk500 aus dem drucker

Hier vor der Programmierung

;; David Vajda
;; 06/14/2026
;; atmega8 - zaehlschleife, ... led, count...

.include "m8def.inc"

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

ldi r16, 0xff
out DDRB, r16

ldi r16, 0xff
l1:
out PORTB, r16
rcall waitloop
dec r16
rjmp l1

waitloop:
push r16
push r17
push r18
ldi r16, 0xff
waitloopl1:
ldi r17, 0xff
waitloopl2:
ldi r18, 0x02
waitloopl3:
dec r18
brne waitloopl3
dec r17
brne waitloopl2
dec r16
brne waitloopl1
pop r18
pop r17
pop r16
ret

Ich übe gleich LCD und RS 232 und so weiter ich probier es auch mit dem AD Wandler

Dampfmaschine

  1. https://www.wilesco-shop.de/zubehoer/entkalker-z84.html

  2. https://www.ftcommunity.de/bilderpool/modelle/mechanische-modelle/edv-mechanik/mechanische-logikgatter/

  3. https://fischertechnik-blog.de/2015/02/28/warum-ein-logik-gatter-aus-fischertechnik-auch-ohne-strom-funktioniert/
SCREENSHOTS APPLE IPHONE Fischer technik

wie ich informationstechnik anfang technisches gymnasium lernte was ich machen wuerde, waere mir folgendes bewusst. das was unser TG Informations Technik Lehrer - er hiess, Baer - wie der Baer, der andere Rief, der mit den Papieren - Hentschel - die erste stunde vor dem 09/11 immer gesagt hat:

  1. ein programm entwickelt man mit Stift und Papier (wuerde ich sagen: stimmt nicht
  2. ein computer ist ohne software ein klumpen Metall (wuerde ich sagen: stimmt nicht
  3. als die Amerikaner den ersten computer entwickelt haben: waren die Computer gross wie eine Maschinenhalle, sie bestanden aus röhren und Relais - mechanischen Schaltern, die elektrisch gesteuert werden. ein mal, wussten sie nicht, warum der computer nicht ging, ein Maschinist durchsuchte die Maschine und fand, dass eine Wanze einen Kontakt blockiert hatte, er kam zurueck und sagte: oh it is a bug
  4. Treiber programmieren heute leute fuer ein apple und ein Ei man braucht Ideen.
seit dem heissen Programmierfehler: bugs

bugs, zecken, Kakerlaken, Mücken, aber auch Kühe, Katze, Hunde, menschen, sind immer beliebte ausdrücke. ist nicht so wichtig

jedenfalls:

ich wuerde mir ein Buch ueber C Programmierung kaufen, am besten ein altes deutsches.

sie brauchen einen Compiler. wenn sie sehr lange brauchen wollen, es aber am ende hin kriegen wollen, kaufen sie zu dem C Programmierbuch Robert Sedgewicks Algorithmen in C

dann gehen sie auf die Seite mit dem KMP und Pattern matching, dann brauchen sie sehr lange. sonst nicht, lernen objektorientiert obeflaechen programmieren, Datenbanken, SHA, und RSA und DSA und dann koennen sie es eines Tages. werden cool im banking und die Damen glauben ihnen

aber dann stellen sie immer fest, sie sind teil einer pleite. was ich noch gelernt habe, das hat der Lehrer damals nicht gesagt.

Rieg war teil der Industrie und Handelskammer, wahrscheinlich konnte GAL. Hentschel war teil von Serveradministration und Datenbanken, war im Geschäft ging schnell her. aber: Industrie und Handelskammer arbeitet mit Elektrikern. hat bezüg zu Industrie. ein anderer Zweig, ist, das sage ich so, wie Bug damals in den USA - arbeitet in Albstadt. Die schwäbische Landschaft geht von Tuebingen ins Katholische, das merkt man nur, wenn es gemütlich zu geht, dann geht keiner hin. wenn es nicht mehr gemütlich ist, kommen die alle her.

die haben Strickmaschinen, denn die stricken voll automatisch. oder weben, was auch immer, was auch immer die machen

dabei muessen alle maedchen an der schule 3 Jahre mit der Hand stricken und ist ein Klima an einer mehr oder weniger elemtar schule nicht wie in Russland, aber die industriell vorbereitet und doch vorhanden ist - also: die muessen stricken, weil es hilft ihnen nichts, wenn die Maschine macht und sie nicht. die werden diszipliniert. dabei laufen die Schafe oft frei rum und jammern jeden tag. so geht es in der realitaet zu. wie in all dieser realitaet.

ok: das wuerde ich mir merken: GAL ist leider nicht nur Computer, ganz einfach. wie auch immer - sie muessten trotzdem koennen

der unterschied ist: es gibt viele app Schreiber, aber, wer an KMP kommt bei Robert Sedgewick der wird von Leuten ueber das, was man ueber ...und so weiter und so fort

viele verstehen nicht, geht man nach Amerika, hat seinen computer kaputt gemacht, nimmt noch Algorithmen in C mit, hat man danach ein problem und nichts anderes

dafuer kann man manches besser. irgendwann scheitert es an Apps und so

ich empfehle gehen sie auf die harten Seiten. wie früher.

ich kannte: ugly poeple und so. meine ist nett. etwas das nicht dark net ist, aber ein wenig aehnlichkeit hat. lassen sie sich inspirieren aber nicht nur vom neuesten. seien sie frei. sie koenenn es mal geniessen.

das passt doch? oder? sie brauchen keine Bausteine, koennen, wenn sie Geld haben, wenn sie kein Geld haben, dann halt nicht, geniessen sie ihren PC

wenn das geschehen ist:

dann geht es weiter, zu dem was her Baer sagte:

  1. Compiler
sie fangen an mit der Programmiersprache C und neben ihnen sitzt wahrscheinlich keiner. der sagt: und warum lernen wir nicht Java.

also C

dafuer brauchen sie einen Compiler. der übersetzt ihr programm in ein ausfuehrbares

ein C Programm ist in der Programmiersprache C geschrieben

das besteht aus Funktionen.

eine Funktion ist wie in der Mathematik

y = f(x) := x^2
eine Funktion hat einen
  1. Rumpf
  2. einen Kopf, auch mit dem man sie aufruft, sie hat variablen, die man übergeben kann
also:
  1. unterscheiden: variablen und Argumente
  2. zunaechst die Variable, eine Variable hat
    1. einen Namen
    2. einen Typ
    3. einen Wert
    4. eine Adresse

Eine Variable ist eine benannte Speicherstelle im Arbeitsspeicher RAM

ein RAM ist eine lange liste von Variablen, die durchnummeriert sind

im Arbeitsspeicher wird immer von 0 beginnend gezaehlt

immer mit 0 anfangen zu zählen!

0, 1, 2, 3, ..., n-1
zunaechst binär zaehlen lernen:
0000
0001
0010
0011
0100
...
ok.

immer mit 0 anfangen zu zaehlen

eine variable ist eine benannte Speicherstelle (durch den compiler) sie wird in eine Adresse übersetzt.

ok: eine Variable hat immer einen Wert!

immer! 0000 ist ein Wert naemlich 0. und 0 ist auch ein wert. doch nach dem reset des PC gehen Informationen verloren und sind zufällig, sie sind undefiniert nach dem einschalten...

ok:

ein Feld, ein Array: ist keine Variable die eine Speicherstelle benennt, sondern eine grosse hintereinander liegenden Bereich.

also einen Bereich...und dabei hat nicht jede Zelle in diesem Bereich einen eigenen namen sondern wird indiziert

eine Variable hat einen typ

  1. char: character: 8 Bit
  2. signed und unsigned: vorzeichenbehaftet und ohne Vorzeichen
  3. integer: Ganzzahl
  4. string: Zeichenketten, das ist ein Bereich von Character (Zeichen)

ein String ist selber in C nur ein Feld.

ich muss eine Variable definieren und ich muss eine Funktion definieren, bevor ich sie benutze.

es ist etwas anderes, ob ich etwas

  1. definiere
  2. deklariere

deklarieren geht vor, definieren kommt danach

  1. ich deklariere etwas, heisst, ich mache den namen bekannt
  2. ich definiere eine Variable oder Funktion - ich mache sie nicht nur bekannt, sondern der Inhalt ist da

ich muss bei einer Variablen,

den Typ angeben, ihren Namen

ich muss sie initialisieren

eine Variable initialisieren heisst, ich weise ihr einen wert zu!

das ist wichtig! weise ich eine Variablen keinen wert zu, ich habe sie definiert nicht deklariert, ist sie da.

aber: ihr wert ist undefiniert

int a = 6;
int b = 255;
das sind Definitionen von Variablen
  1. int: steht fuer integer
  2. char: steht fuer character
  3. signed: steht fuer signed

usw.

arrays sind eine Aneinanderreihung von variablen, ich beginne immer von 0 an zu zaehlen. doch ich erreiche die einzelnen Elemente ueber Indizes

char str [16];
int x [12];
eine Zeichenkette ist immer ein Pointer oder String von Charakter

Pointer sind dasselbe wie die Adresse eine Variablen

eine Variable hat

  1. Namen
  2. Typ
  3. Wert
  4. Addresse (Einen Ort im Arbeitsspeicher)

wenn ich die Adresse eine Variable abfragen will, benutze ich den

* Operator

ich kann Pointer Variablen definieren, sie enthalten als Wert die Adresse eine Variablen, die einen Typ hat

int x = 5;
int *ptr = &x;
das * kommt mehrfach vor.

einerseits um: einen pointer zu definieren

eine Pointer Variable muss gleichzeitig vom Typ Int Pointer sein, um die Addressen von Int variablen auf zu nehmen eine Pointer Variable muss gleichzeitig vom Typ char Pointer sein, um die addressen von Char variablen auf zu nehmen ...

also:

Es gibt die Adresse und den Pointer

um die Adresse einer Variable ab zu fragen: tue ich:

int a = 5;

&a;
* und & operator sind wichtig

ich habe ja die Variable a.

und diese hat eine Adresse. um sie zu erfahren, gebe ich ein

&a
ich kann sie einer Pointer Variable auf Typ int zuweisen
int *ptr;

ptr = &a
nun enthaelt ptr die Addresse von a.

um ueber ptr an den wert von a heran zu kommen, gebe ich ein

*ptr
& macht die Adresse einer Variable * wandelt aus einer bestehenden Adresse den wert der an der Adresse steht...

ein Feld ist

char str [12];
das ist ein benannter Speicherbereich, ebenso erreichbar ueber pointer

ok:

wichtig:

dekrement und inkrement

i = i + 1
wie geht das: das ist ein inkrement.

ich nehme den wert der in i steht und tue ihn + 1 in i

i ist um eines groesser geworden

dekrement

i = i -1
es gibt die verkürzte Schreibweise
i++
und
i--
um auf ein Feld gut zu zu greifen, brauche einen index.

das ist wie bei einer Tabelle, mit Spalten und Zeilen oder noch mehr

Pointer - dahinter ist das Geheimnis der Adresse und von * und &

Arrays - Felder dahinter ist das Geheimnis des Index

eine Schleife zählt mehrfach durch und beginnt von vorne

i = 0
while (  I < 10 ) {
  printf ("%i\n", i);
  i = i + 1;
}
was das wichtigste ist:

jede Zeile muss in C mit Semikolon ; enden.

es gibt die Funktion printf

printf heisst print Formate und gibt auf der Konsole eine String aus.

ein einfacher string ist

"hallo welt"
Strings werden immer in Anführungsstrichen geschrieben...
printf("hallo welt");
in einem C Programm laesst sich nicht auf die Main Funktion verzichten

die Funktionen haben verschiedene namen, sie werden vergeben

sowohl die namen fuer variablen wie auch Funktionen werden vom Programmierer vergeben.

aber main muss immer da sein

int main (void) {

}
void ist ein leerer Datentyp. waehrend, int Ganzzahl ist und char - zeichen, ist void leer.

wichtig ist das return bei einer Funktion

eine Funktion hat einen Kopf und einen Rumpf

  1. Kopf
  2. Rumpf

  1. Eine Funktion muss definiert werden
  2. Eine Funktion muss aufgerufen werden

eine Funktion nutzt nichts, wenn man sie nicht aufruft.

aber sie muss definiert werden

  1. Sie hat einen Kopf, damit definiert man wieder einen Namen
  2. sie belegt wiederum Speicher, das ist der Rumpf, selber ein programm
  3. sie hat im Kopf Variablennamen

diese haben typ usw.

sie sind die Argumente im Funktionskopf

#include <stdio.h> // bitte nicht verwirren lassen

int main (void) {
 f (5);
return 0;
}

int f(int x)
 printf ("%i\n", x);
return 0;
}
die Variable hat im Kopf in runden klammern gebündelt die Argumente, bei definition mit Typ, das sind Schablonen fuer Variablen, mit Typ angegeben, die sie beim Aufruf übergeben kriegt

also

definiert mit einer Variable vom Typ int

int f(int x)
muss aufgerufen werden als:
f(5)
definiert mit 2 Variablen vom Typ int muss aufgerufen als
int f(int x, int y)
mit drei Variablen vom Typ int
int f(int x, int y, int z);
also, die Anzahl der Argumente bei der Definition muss beim Aufruf mit der Anzahl der übergebenden Variablen beim Aufruf uebereinstimmen

Man nennt die Variablen oder Konstanten die man anstelle der Variablen beim Aufruf uebergibt, zu übergebende Parameter/Variablen/Konstanten

Konstanten sind die Werte, die in Variablen passen

int x = 55;
55 ist eine Konstante Zeichenkonstanten in einfache Anführungsstriche
char ch = 'b';
immer nach jeder Zeile, Anweisung ; Strichpunkt nicht vergessen

der Typ der Argumente bei der Definition gibt vor, mit welchem typ sie beim Aufruf die Variablen mutaufgerufen werden, bei der uebergabe (Parameteruebergabe)...also

int f(int x, char ch, int y) {

}
wird aufgerufen mit
int f (10, 'h', 100);
oder
int f (1, 'a', 20);
die werte selber koennen in ihrem Bereich immer abweichen.

ein typ selber gibt den wertebereich an.

z.B. von 0 bis 255 es gibt an. Fliesskommazahl, sind kommazahlen:

  1. 3.41 ist eine kommazahl
  2. 10 ist eine Ganzzahl
  3. 'j' ist ein Zeichen (character)
  4. "hallo" ist eine Zeichenkette (ein Array von Zeichen)
ok: ein Typ hat immer einen wertebereich...

eine Funktion bei der Definition hat

  1. einen kopf
  2. einen Rumpf

der rumpf steht in geschweiften klammern

{ }
der Kopf beginnt mit einem Namen und Runden klammern, in dem die Parameter stehen

beim Aufruf heissen sie glaube ich Argumente, bei definition parameter.

Argumente beim Aufruf Parameter bei der Definition

eine Funktion selber hat genau einen Typ als Rückgabewert

der Rückgabewert entsteht, wenn eine Funktion aufgerufen wurde. ihr werden, kein, ein oder mehrere werte uebergeben

doch sie selber liefert einen zurueck.

welchen: entscheidet, return, am ende der Funktion, bei der Definition der Funktion

int func (int a, int b)
return a + b;
}
der Rückgabewert hat einen typ. es gibt immer nur einen.

wichtig ist bei Zeichen

'\n'
das regelt, dass wenn eine Zeichenkette ausgegeben wird, dass es in die naechste Zeile an den Anfang kommt

es gibt Include Files

include files gehen so:

#include <stdio.h>
include files sind header files. sie enden auf *.h und sind teil vom compiler
  1. stdio.h standard io ist neben
  2. stdlib.h standard library

eine der wichtigsten Bibliotheken in C

im laufe der Jahrzehnte schreiben Programmierer immer mehr Funktionen, die aufeinander aufbauen. so entstehen wiederverwertetbare Funktionen. oder sie tun etwas geschicktes.

das immer wieder neu zu programmieren macht nicht immer sinn, ist es fundamental essentiell wichtig, kommt es in eine Bibliothek

#include <stdio.h>
enthaelt, dass ich printf ("Hallo Welt\n");

aufrufen kann, da ist es definiert...

Tips fuer totale einsteiger:

wichtig fuer Anfänger die installation. irgendwie auf einem zweiten PC linux installieren und Debian drauf. nicht ohne Debian. und dann als superuser. ruhig einfache passwoerter am Anfang verwenden, fragt sie ab

und dann installieren

apt-get install texlive-full
LaTeX gibt es in vielen Formen. Aber TexLive ist eine. TeXLive Full wiederum installiert alles, was es nur gibt. alles.

wichtig ist der befehl apt-get install. apt-get ist das programm und install heisst installieren. die programme merkt man sich mit der zeit

dann mit dem editor. ein *.tex file schreiben und mit pdflatex übersetzen, dann geht es.

ich lerne ciruiTikZ

%% ich wuerde mit latex anfangen
%% das kommt hier raus
%% das ist ein w"urdiges nicht what you See is what you get file %% WYSIWYG - was PDF und JPEG letzten endes ist, ist egal
%% sagen wir so: wenn sie ein BMP haben - dann haben sie
%% 256x256 Bildpunkte je 256 Farben, also ein Byte
%% es gibt viele Algorithmen das verkleinert dar zu stellen
%% Laufl"angen Kodierung ... wenn ich 256 x 0x55 habe, dann %% speichere ich 0xff 0x55 z.B. muss aber irgendwie zu
%% erkennen geben 0xff ist keine f"arbe. dazu kommt ...
%% ich kann Farbtabellen verwenden LZW. usw.
%% alles weitere baut darauf auf. JPEG darauf bauen Filme auf
%% hier ist Komprimierung zwingend notwendig. sonst werden
%% 3 MByte file, schnell 4 GByte. usw.
%% dazu wuerde ich mir keine Gedanken machen.
%% LaTeX wiederum besteht aus Grundelementen Bibliotheken
%% wie immer, worauf das naechste kommt
%% ich wuerde nicht nur mit C sondern mit LaTeX anfangen
%% was PDF ist, ich weiss es bis heute nicht, baut irgendwo
%% drauf auf

\documentclass [a4paper]{article}
\usepackage{german,amsmath,amsfonts}
\usepackage[american]{circuitikz}
\author{David Vajda}
\title{06/12/2026 CircuiTikZ - Test File}
\begin{document}
\maketitle
\begin{circuitikz}
\node [and port] (and1) at (5,2) {};
\node [and port] (and2) at (5,6) {};
\node [and port] (and3) at (2,4) {};
\end{circuitikz}
\end{document}
heraus kam das... wenn man uebrigens mit seiner eigenen IP-Addresse zu schaffen hat, wie die im lokalen netz ist, geht das mit ifconfig hier sieht bei in linux, bei Mac andere namen irgendwo etwas, wie eth0 eth1 enp2s0 oder ähnliche namen Geräte, dazu gehören
  1. Festplatten + .../dev/sda /dev/sda1 /dev/sda2 /dev/sda3 ... /dev/sdb oder /dev/nvme??? irgendwas... und so weiter
  2. Netzwerkgeräte: /dev/eth0, /dev/eth1...
  3. Serielle Schnittstellen: /dev/ttyS0 ... usw.

also: Geräte sind hier. das sind mehr oder weniger ganze Prozesse. das sind keine Treiber ...indem sinne. denn das sind mehr oder weniger auch programme. ich erkläre das nicht noch mal. ein port eines Treibers, entspricht keiner Adresse im Arbeitsspeicher - aber ist parallel der witz: bei MMIO - wie bei Intel - gibt es: Beim Datenspeicher:

  1. Addressbus
  2. Datenbus

doch an genau diesen Bussen liegt etwas anderes

  1. System1
  2. System2

also:

  1. System1 ist der Datenspeicher
  2. System2 ist die I/O

es gibt am 8086 3 Bit. Sagen wir wir haben ein Flag, zu entscheiden:

  1. Datenspeicher
  2. I/O

wenn flag=0, dann Datenspeicher, wenn flag=1, dann I/O das ist ein Pin am Prozessor. aussen. es sind zwar dieselben Busse - sprich äusseren Leitungen, aber ausserhalb der CPU ist ein - man koenne sagen - multiplexer ...etwas das entscheidet hierhin oder dahin ein gerät hat Ports - das sind addressen. wenn jedes gerät eine Adresse hat - jedes Programm hat eine Adresse aber eben nicht eine Ich schreibe ja kein programm mit einem Byte? oder ein Programm ist mindestes 512 Byte gross, wuerde Ich sagen, Segment: 1024. also: auch eine Serielle Schnittstelle hat viele einstellungen: Baudrate, 1 o. 2 Stopbit usw. das wird dahin geschrieben nicht nur das: sondern: das gerät hat dann wiederum duerfen sie nicht sagen: RS-232 nach aussen, es ist Baustein. der wie die CPU pins hat. ein pin von der CPU durch den Baustein fuehrt ausserhalb des PC. ist auch nur ein Pin ausserhalb des Gehaeuses. warum geht es dann in die welt? das ist ganz einfach. jedes Der Kabel inzwischen sagen wir: koennte 25m lang sein. nur da ueberall ein PC steht - wird es 100.000 * 25m lang. oder eben bei Vodafone grosser Verstärker auf 60V rauf, dann hält das signal... ok. was raus geht, egal wie schnell kommt vom Baustein, versteht nicht da ist leitung wenn sie das jetzt wissen... deswegen sind devices mehr oder weniger programme. ich kann naemlich an ein programm in UNIX daten geben. wie immer. es hat eingäbe ueber die Konsole und ausgäbe, z.B. wobei die Konsole ein programm ist. und wenn ich an ein programm daten uebergebe, interpretiert es sie. so, das sind die devices. eine form etwas anderes wichtiges sind die

/etc/
files. hier stehen die Konfigurationen drinnen die Netzwerkkarte selber wird mit ifup, ifdown gemanaged. das muss man aber lernen in Wirklichkeit steht die Netzwerkkarte in
/etc/network/interfaces
hier sind die karten vermerkt. es gibt nicht viele sonderbare karten. sie sind aehnlich in den meisten fällen, deswegen Treiber. Treiber selber sind im kernel befindliche programme. sie sind programme sind aber im kernel
/dev/eth0 /dev/eth1
sind Netzwerkkarten und brauchen programme. diese sind als Treiberprogramm im kernel. da sie alle aehnlich sind, braucht es nicht viele programme. fuer die einzelnen devices werden nun die Treiber aktiv. ok. fertig. aber waehrend ifup und ifdown regelt ob das ding nun an oder aus ist, ich Netzwerkadresse aendern kann, stehen fuer das hochfahren infos in
/etc/network/interfaces
ob statisch, ob auto... das kann wichtig sein, wenn server app z.B. noch weiter geht es zum beispiel bei /dev/ttyS3 ich kann ueber die Serielle ein Netzwerk machen, aber ich habe die Netzwerksicherungsschicht ich habe noch eine Schicht, die reguliert etwas, das ungewöhnlich ist, weil: wenn ich RS-232 einfach unterbreche, was nicht ungewöhnlich ist, was ist jetzt mit der Leitung passiert?? lauter so Sachen...

screenshot MAC OS X Apple IBook

heraus kam das...

ssh login Latex...
dasselbe, ssh:

also, erst mal gross und klein Schreibung drauf achten, dann kommt hinzu...

dass es trotzdem auf dem apple nicht geht. ich habe es rüber kopiert und probiere es da...

ist in der Konsole wie hier in der Konsole...

da hat es funktioniert ...

wichtig nachdem auf dem apple. dann

pdftoppm -jpeg file.pdf file.pdf.jpeg
und was noch wichtig ist, ich habe natuerlich einen Passwortspeicher fuer meinen linux pc. mit verschluesselung
pass show
pass show -c x/y/z
und beim einloggen als user z auf Rechner y
ssh x@y -p
das in dem clipboard angegebene Passwort mit
<Ctrl><V>
oder Mac:
<Cmd><V>
eingeben...

die passwoerter kennen sehr lange sein 64 zeichen? oder 128? und viel viel länger, wie auch immer.

und werden per RSA und DSA assymetrisch verschlüsselt.

mit GnuPG - gpg - enthaelt privaten und öffentlichen Schlüssel.

das Verzeichnis in dem alle Passwörter sind, erstellt

pass eine Ordnerstruktur und verschlüsselt automatisch alles Passwoerter.

diese sind bei standard mäßig geöffneten gpg fuer einen Nutzer immer so mit einem Passwort gleich zu öffnen.

das ist wichtig: bei gpg immer mit dem Schlüssel aufpassen und den verzeichnis.

das ist standard linux, so wie

chmod 0777 ./dir
und so ein zeug...

...

jeder kann das hier angucken, rate aber dazu, linux Bücher zu kaufen.... keinen weiteren Kommentar. ausser C ist wichtig, binäres zählen und das wichtig, eben assembler,

...aber auch DB, DW, DD, DQ

Byte Word Double Word

das ist das wichtigste...

mehr kann ich da nicht helfen, gehoert eigentlich nicht hier hin.

also: trotz allem

0777
enthaelt: 111 111 111

enthaelt drei: User - Group - Other

Read Write Execute
das muss man sich so merken...

Lesen schreiben ausführen...

mehr kann ich nicht helfen. so wie

GID - und UID

  1. Die GID Identifiziert Gruppen
  2. Die UID identifiziert User

der Nutzer selber ist eine UID die Übersetzung zum Namen steht in

/etc/users
oder so. also in /etc/... und files. intern nur Nummern, bei anzeige nachgeguckt. wiederum benutzen UNIX Programme UNIX programme, jeder schritt in einem

wichtig sind:

User, Group, Other Read Write Execute

9 = 3 x 3...
mehr hierzu nicht und jetzt LATEXnaemlich mit
circuiTikZ
und damit den IEEE 91-1984 Schaltplänen

es hilft nur eines: auswendig lernen, auswendig lernen, auswendig lernen, egal, wo man steht...

dasselbe:

das muss ich auf den pc mit linux kopieren - das hier Mac OS X, aber so weit ich mir vorstellen kann, hat er dieses package nicht. wg.

apt-get install texlive-full
.. hat glaube nicht funktioniert. mal probieren. sonst nach oben ins zimmer - kann nicht rein mit
scp david06122026circuitikztest.tex david@192.168.0.xxx:/home/david
dort übersetzen mit indem man mit
ssh david@192.168.0.xxx

rein geht...

pdflatex ...

und ...pdf per scp rueberkopieren

so, jetzt geht es weiter...

jetzt kommt das IEEE 91-1984 CircuiTikZ

in LaTeX eingebunden. mit \node [and port] ...

(and1) wuerde ich sagen und at (0,0) {};

usw. und American fuer IEEE 91-1984 und ...

Es war heute Abend, übe ich mit LATEXmit circuiTikZ heute Abend noch ich weiß jetzt ja auch schon länger IEEE aber das ist Institute of electrical and electronic eneneers sieht erst seit neusten Fest und wie gesagt 91-1984

So, und damit Programmierich Versuch, ich heute automatisch generiert, den DNF zu erzeugen LATEXStyle, ohne sozusagen. What you see is what you get?

This is das eine und das kyrillisch kann ich heute Abend nicht mehr üben. Mein Schreibstift ist nicht hier, aber ich hol jetzt noch Energy Drink so.

SCREENHOTS EBAY Manometer

Dann hab ich hier aber noch ein Manometer gefunden. Das kann man statt der Pfeife einbauen. Das wär natürlich fantastisch kann man günstig kaufen. Wenn man bei mir das Klarna abbezahlt ist und so weiter dann Kauf ich mir auch noch das Manometer und natürlich muss man nachts destillieren

am Ende bleibt ein klein bisschen Restdruck und Restdampf bei kleiner Flamme im Kessel, solange die Flamme klein abbrennt. Die Maschine hält an man muss ein wenig warten und kann sie wieder anstoßen. Sie fährt dann kurz wieder. Wenn die Flamme weiter brennt, ergibt sich immer ein bisschen Druck und ein bisschen Dampf dann muss man das Ventil zur Pfeife aufmachen. Damit der Dampf ganz rausgeht muss man inzwischen des Ventil auf der anderen Seite öffnen, in dem man das Wasser anfühlt, dann bietet sich das an die Hitze darunter herauszunehmen mit einem Topflappen, wenn die dampfen Bänder, wenn die Sache schon heiß genug ist zu auszulöschen, was hier nicht das praktische ist, aber jedenfalls generell bei der Dampfmaschine, die Hitze zu beenden. Dafür sozusagen die Pfeife aufzumachen, ist sozusagen das Einlassventil für das Wasser zu fest drin, da es in der Wärme sozusagen fest wurde, wenn es zu festgeschraubt war, als die Dampfmaschine kalt wurde. Wichtig ist generell es bleibt am Ende besonders wenn es ein wenig abbrennt immer noch Restdruck in der Dampfmaschine entsteht neuer weil noch ein klein bisschen Feuer ist. Das reicht vielleicht für ein ganz klein bisschen Fahrt mit noch mal anstoßen wenn eben dann durch den weiteres abbrennen mehr Druck entstanden ist und am Ende immer die Pfeife aufmachen, damit der Rest entweichen kann.

Es ist sicher nicht gut, die Dampfmaschine stehen zu lassen, wenn Druck drauf ist und sie nicht anzustoßen, denn das Problem ist wir haben ja ein Schiebe Kurbel Register und es öffnet quasi das Ventil, mit dem der Dampf in den Kolben eintritt. Es hat eine feste Position und selber nicht die Möglichkeit, sich zu bewegen. Es ist ja quasi eine Sperre auf die der Dampf Ruth bewegt wird es ja selber über das Schwungrad mit dem Kolben doch, wenn die sperre versperrt und und die gesamte Dampfmaschine läuft noch nicht dann sperrt es weiter trotz hohen Druck deswegen immer anstoßen

externes interrupt

;; gut etwas stimmt noch nicht, aber halbwegs... jetzt dampfmaschine, dann auswendig lernen. am ende noch mal kyrillisch, jetzt inzwischen pause, essen, danach dampfmaschine, heute chemie lernen, besonders enthropie und enthalpie aber kohlenhydrate...

;; david vajda
;; 06/12/2026
;; extern interrupt 1/0 - count - hd44780

.include "m8def.inc"

.org 0x0000
rjmp RESET
;; RESET findet beim Einschalten statt
;; wissen wir nach Computersysteme 1/2
.org INT0addr
rjmp INT0handler
.org INT1addr
rjmp INT1handler

RESET:
ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
ldi r16, 0xff
out DDRB, r16
ldi r16, 0x00
out DDRD, r16

ldi r16, (1 << ISC01) | (1 << ISC11)
out MCUCR, r16
ldi r16, (1 << INT0) | (1 << INT1)
out GICR, r16
sei

rcall hd44780init
ldi r17, 0x00
end: rjmp end

INT0handler:
cpi r17, 0b00000001
brne greatno
ldi r16, 'l'
rcall hd44780echo
ldi r16, 'i'
rcall hd44780echo
ldi r16, 't'
rcall hd44780echo
ldi r16, 't'
rcall hd44780echo
ldi r16, 'l'
rcall hd44780echo
ldi r16, ”'
rcall hd44780echo
ldi r16, ' '
rcall hd44780echo
greatno:
andi r17, 0b00000000
rcall hd44780echo
ldi r16, 'n'
rcall hd44780echo
ldi r16, 'o'
rcall hd44780echo
ldi r16, ' '
rcall hd44780echo
ldi r16, ' '
rcall hd44780echo
ret

INT1handler:
cpi r17, 0b00000000
brne greatyes
ldi r16, 'l'
rcall hd44780echo
ldi r16, 'i'
rcall hd44780echo
ldi r16, 't'
rcall hd44780echo
ldi r16, 't'
rcall hd44780echo
ldi r16, 'l'
rcall hd44780echo
ldi r16, ”'
rcall hd44780echo
ldi r16, ' '
rcall hd44780echo
greatyes:
ori r17, 0b00000001
ldi r16, 'y'
rcall hd44780echo
ldi r16, 'e'
rcall hd44780echo
ldi r16, 's'
rcall hd44780echo
ldi r16, ' '
rcall hd44780echo
ret

;; main routine

binhd44780echo:
ldi r16, 0b00000010
rcall hd44780cmd
push r17
ldi r18, 0x08
ldi r19, '0'
binhd44780echol1:
mov r16, r17
andi r16, 0b1000000
ror r16
add r16, r19
rcall hd44780echo
lsl r17
dec r18
brne binhd44780echol1
pop r17
ret

;; more like lcd hd44780

hd44780init:
;; 50 times ca....
ldi r16, 0x42
hd44780initl1:
dec r16
rcall hd44780waitlooplong
brne hd44780initl1
ldi r16, 0x03
out PORTB, r16
rcall hd44780setup
rcall hd44780waitlooplong
rcall hd44780setup
rcall hd44780waitlooplong
rcall hd44780setup
rcall hd44780waitlooplong
ldi r16, 0x02
out PORTB, r16
rcall hd44780setup
rcall hd44780waitlooplong
ldi r16, $20
out PORTB, r16
rcall hd44780setup
rcall hd44780waitlooplong

ldi r16, 0b00101000
rcall hd44780cmd

ldi r16, 0b00001100
rcall hd44780cmd

ldi r16, 0b00000110
rcall hd44780cmd

ret

hd44780echo:
mov r17, r16
swap r17
andi r17, 0x0f
;; ori r17, 0x10
sbr r17, 1<<4
out PORTB, r17
rcall hd44780setup
mov r17, r16
andi r17, 0x0f
;; ori r17, 0x10
sbr r17, 1<<4
out PORTB, r17
rcall hd44780setup
rcall hd44780waitloopshort
reti

hd44780cmd:
mov r17, r16
swap r17
andi r17, 0x0f
;; andi r17, 0b11101111
out PORTB, r17
rcall hd44780setup
mov r17, r16
andi r17, 0x0f
;; andi r17, 0b11101111
out PORTB, r17
rcall hd44780setup
rcall hd44780waitloopshort
reti

;; helper like routines...
hd44780waitlooplong:
push r16
push r17
ldi r16, 0x21
hd44780waitlooplongl1:
ldi r17, 0xC9
hd44780waitlooplongl2:
dec r17
brne hd44780waitlooplongl2
dec r16
brne hd44780waitlooplongl1
pop r17
pop r16
ret

hd44780waitloopshort:
push r16
ldi r16, 42
hd44780waitloopshortl1:
dec r16
brne hd44780waitloopshortl1
pop r16
ret

hd44780setup:
;; sli und cli, weil damit im port
;; setzen loeschen, ..., bit 5...
sbi PORTB, 5
nop
nop
nop
cbi PORTB, 5
ret

jetzt fuehre ich noch kleines yes und littl no ein, indem: wenn das letzte yes war, kommt noch ein yes, ist yes, wenn das letzte ein no war, und jetzt ein \verbyes - dann littl' yes...

externes interrupt + lcd

;; david vajda
;; 06/12/2026
;; extern interrupt 1/0 - count - hd44780

.include "m8def.inc"

.org 0x0000
rjmp RESET
;; RESET findet beim Einschalten statt
;; wissen wir nach Computersysteme 1/2
.org INT0addr
rjmp INT0handler
.org INT1addr
rjmp INT1handler

RESET:
ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
ldi r16, 0xff
out DDRB, r16
ldi r16, 0x00
out DDRD, r16

ldi r16, (1 << ISC01) | (1 << ISC11)
out MCUCR, r16
ldi r16, (1 << INT0) | (1 << INT1)
out GICR, r16
sei

rcall hd44780init
ldi r17, 0x00
end: rjmp end

INT0handler:

rcall hd44780echo
ldi r16, 'n'
rcall hd44780echo
ldi r16, 'o'
rcall hd44780echo
ldi r16, ' '
rcall hd44780echo
ldi r16, ' '
rcall hd44780echo
ret

INT1handler:
ldi r16, 'y'
rcall hd44780echo
ldi r16, 'e'
rcall hd44780echo
ldi r16, 's'
rcall hd44780echo
ldi r16, ' '
rcall hd44780echo
ret

;; main routine

binhd44780echo:
ldi r16, 0b00000010
rcall hd44780cmd
push r17
ldi r18, 0x08
ldi r19, '0'
binhd44780echol1:
mov r16, r17
andi r16, 0b1000000
ror r16
add r16, r19
rcall hd44780echo
lsl r17
dec r18
brne binhd44780echol1
pop r17
ret

;; more like lcd hd44780

hd44780init:
;; 50 times ca....
ldi r16, 0x42
hd44780initl1:
dec r16
rcall hd44780waitlooplong
brne hd44780initl1
ldi r16, 0x03
out PORTB, r16
rcall hd44780setup
rcall hd44780waitlooplong
rcall hd44780setup
rcall hd44780waitlooplong
rcall hd44780setup
rcall hd44780waitlooplong
ldi r16, 0x02
out PORTB, r16
rcall hd44780setup
rcall hd44780waitlooplong
ldi r16, $20
out PORTB, r16
rcall hd44780setup
rcall hd44780waitlooplong

ldi r16, 0b00101000
rcall hd44780cmd

ldi r16, 0b00001100
rcall hd44780cmd

ldi r16, 0b00000110
rcall hd44780cmd

ret

hd44780echo:
mov r17, r16
swap r17
andi r17, 0x0f
;; ori r17, 0x10
sbr r17, 1<<4
out PORTB, r17
rcall hd44780setup
mov r17, r16
andi r17, 0x0f
;; ori r17, 0x10
sbr r17, 1<<4
out PORTB, r17
rcall hd44780setup
rcall hd44780waitloopshort
reti

hd44780cmd:
mov r17, r16
swap r17
andi r17, 0x0f
;; andi r17, 0b11101111
out PORTB, r17
rcall hd44780setup
mov r17, r16
andi r17, 0x0f
;; andi r17, 0b11101111
out PORTB, r17
rcall hd44780setup
rcall hd44780waitloopshort
reti

;; helper like routines...
hd44780waitlooplong:
push r16
push r17
ldi r16, 0x21
hd44780waitlooplongl1:
ldi r17, 0xC9
hd44780waitlooplongl2:
dec r17
brne hd44780waitlooplongl2
dec r16
brne hd44780waitlooplongl1
pop r17
pop r16
ret

hd44780waitloopshort:
push r16
ldi r16, 42
hd44780waitloopshortl1:
dec r16
brne hd44780waitloopshortl1
pop r16
ret

hd44780setup:
;; sli und cli, weil damit im port
;; setzen loeschen, ..., bit 5...
sbi PORTB, 5
nop
nop
nop
cbi PORTB, 5
ret

<PHOTO, LCD, YES, NO>

idee des binaeren dividierens, ohne befehl

ach ja, ich habe ja bisher schwierigkeiten, weil ich keinen div befehl habe. wobei ich neulich schon die ersetzungsmoeglichkeit fuer div hatte. bei binaerzahlen

wenn die basis 1000 ist. dann muss ich

10001 geteilt durch 1000 machen

ich subtrahiere den oberen teil vom unteren bleibt ein rest. den muss ich mir merken. ebenso, wenn ich durch 1001 (9) oder 1010 teile. abziehen (wg. binaer) passt 0 mal oder kein mal rein. den rest merken...aber jetzt keine lust zur umsetzung...

mache ich demnaechst auch, vielleicht mit intel - aufgabe wuerde sich anbieten auf papier aus zu probieren vorher...

allerdings jetzt mache ich lieber hexadezimal ausgabe, dauert mir jetzt zu lange...

ch nehme den lcd hd44780 file von gerade, gebe wieder r16 aus, schreibe eine routine, die ...die zahl in r16 in Dezimalschreibweise umwandelt und auf dem hd44780 lcd ausgibt, die INT0 INT1 (extern) am Port mit Schalter, sollen auf dem display nach oben und unten zaehlen...

externes interrupt, quelltext

;; ok, fuer mich klingt das logisch, moechte nichts erklaeren, ich muss es trotzdem noch mal auswendig lernen, probiere es aus, aber indem ich es selber schreibe...

.include "m8def.inc"

.def temp = r16

.org 0x000
         rjmp main            ; Reset Handler
.org INT0addr
         rjmp int0_handler    ; IRQ0 Handler
.org INT1addr
         rjmp int1_handler    ; IRQ1 Handler

main:                         ; hier beginnt das Hauptprogramm

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

         ldi temp, 0x00
         out DDRD, temp

         ldi temp, 0xFF
         out DDRB, temp

         ldi temp, (1<<ISC01) | (1<<ISC11) ; INT0 und INT1 auf fallende Flanke konfigurieren
         out MCUCR, temp

         ldi temp, (1<<INT0) | (1<<INT1) ; INT0 und INT1 aktivieren
         out GICR, temp

         sei                   ; Interrupts allgemein aktivieren

loop:    rjmp loop             ; eine leere Endlosschleife

int0_handler:
         sbi PORTB, 0
         reti

int1_handler:
         cbi PORTB, 0
         reti
https://www.mikrocontroller.net/articles/AVR-Tutorial:_Interrupts
aber auch im datasheet atmega8 selber...

<PHOTO> hallo david LCD vajda-breadboard

<PHOTO> hallo

es tut, nachdem URSEL wieder im falschen UCSR...gelandet ist. Es gehoert nach UCSRC.. aber es tut...

hab, was vergessen bei lcd init (hd44780)...

out PORTB, r16... bei 0x3...

;; david vajda
;; 06/12/2026
;; rs232 - recieve - hd44780

.include "m8def.inc"

;; more like rs232

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
ldi r16, 0xff
out DDRB, r16

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16

ldi r16, (1 << UCSZ1 | 1 << UCSZ0)
ori r16, (1 << UPM1 | 1 << UPM0)        ;; parity odd
ori r16, 1 << URSEL
out UCSRC, r16
ldi r16, (1 << RXEN)
ori r16, (1 << USBS)                    ;; 2 stop bit
out UCSRB, r16

;; main routine
rcall hd44780init

l1:
rcall rs232recieve
rcall hd44780echo
rjmp l1

rs232recieve:
sbis UCSRA, RXC
rjmp rs232recieve
in r16, UDR
ret

;; more like lcd hd44780

hd44780init:
;; 50 times ca....
ldi r16, 0x42
hd44780initl1:
dec r16
rcall hd44780waitlooplong
brne hd44780initl1
ldi r16, 0x03
out PORTB, r16
rcall hd44780setup
rcall hd44780waitlooplong
rcall hd44780setup
rcall hd44780waitlooplong
rcall hd44780setup
rcall hd44780waitlooplong
ldi r16, 0x02
out PORTB, r16
rcall hd44780setup
rcall hd44780waitlooplong
ldi r16, 0x20
out PORTB, r16
rcall hd44780setup
rcall hd44780waitlooplong

ldi r16, 0b00101000
rcall hd44780cmd

ldi r16, 0b00001100
rcall hd44780cmd

ldi r16, 0b00000110
rcall hd44780cmd

ret

hd44780echo:
mov r17, r16
swap r17
andi r17, 0x0f
;; ori r17, 0x10
sbr r17, 1<<4
out PORTB, r17
rcall hd44780setup
mov r17, r16
andi r17, 0x0f
;; ori r17, 0x10
sbr r17, 1<<4
out PORTB, r17
rcall hd44780setup
rcall hd44780waitloopshort
ret

hd44780cmd:
mov r17, r16
swap r17
andi r17, 0x0f
;; andi r17, 0b11101111
out PORTB, r17
rcall hd44780setup
mov r17, r16
andi r17, 0x0f
;; andi r17, 0b11101111
out PORTB, r17
rcall hd44780setup
rcall hd44780waitloopshort
ret

;; helper like routines...
hd44780waitlooplong:
push r16
push r17
ldi r16, 0x21
hd44780waitlooplongl1:
ldi r17, 0xC9
hd44780waitlooplongl2:
dec r17
brne hd44780waitlooplongl2
dec r16
brne hd44780waitlooplongl1
pop r17
pop r16
ret

hd44780waitloopshort:
push r16
ldi r16, 42
hd44780waitloopshortl1:
dec r16
brne hd44780waitloopshortl1
pop r16
ret

hd44780setup:
;; sli und cli, weil damit im port
;; setzen loeschen, ..., bit 5...
sbi PORTB, 5
nop
nop
nop
cbi PORTB, 5
ret

inzwischen

;; david vajda
;; 06/12/2026
;; rs232 - recieve - hd44780

.include "m8def.inc"

;; more like rs232

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
ldi r16, 0xff
out DDRB, r16

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16

ldi r16, (1 << UCSZ1 | 1 << UCSZ0)
ori r16, (1 << UPM1 | 1 << UPM0)        ;; parity odd
out UCSRC, r16
ldi r16, (1 << URSEL | 1 << RXEN)
ori r16, (1 << USBS)                    ;; 2 stop bit
out UCSRB, r16

;; main routine

l1:
rcall rs232recieve
rcall hd44780echo
rjmp l1

;; more like lcd hd44780

so, jetzt weiter...von pc zu controller - rs232 mit lcd hd44780...

inzwischen

;; david vajda
;; 06/12/2026
;; rs232 - recieve - hd44780

.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
ldi r16, 0xff
out DDRB, r16

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16

ldi r16, (1 << UCSZ1 | 1 << UCSZ0)

ldi r16, (1 << TXEN)
out UCSRB, r16

inzwischen

;; David Vajda
;; 06/12/2026
;; atmega8 - rs232 - versuch

.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
;; ldi r16, 0xff
;; out DDRD, r16

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16

;; ldi r16, (1 << TXEN)
;; out USCRB, r16

;; so, waere das schoen
;; wuerde aber bedeuten, dass alle bit
;; ausser TXEN in USCRA geloescht waeren
;; alternative: ich nehme wirklich alle bits und setze oder loesche sie
;; oder: es gibt eben diese Befehle cbi sbi oder wie auch immer
;; damit lassen sich im Port einzelne Bits setzen... hier im prozessor nachlernen
;; alle bits setzen ... befehle gleich lernen

;; 8 Datenbit
;; 1 Stopbit
;; gerade Paritaet

;; ldi r16, (1 << TXEN |  0 << UCSZ2 | 1 << UPM1 | 1 << UPM0 | 1 << URSEL)
;; out UCSRB, r16
;; alternative:
;; sbi UCSRB, TXEN
;;cli UCSRB, UCSZ2

ldi r16, (1 << UCSZ1 | 1 << UCSZ0 | 1 << USBS | 1 << URSEL)
out UCSRC, r16

sbi UCSRB, TXEN
ldi r16, (1 << TXEN |  0 << UCSZ2 | 1 << UPM1 | 1 << UPM0)
out UCSRB, r16

l1:
ldi r16, 'h'
rcall rs232transmit
ldi r16, 't'
rcall rs232transmit
ldi r16, 't'
rcall rs232transmit
ldi r16, 'p'
rcall rs232transmit
ldi r16, 's'
rcall rs232transmit
ldi r16, ':'
rcall rs232transmit
ldi r16, '/'
rcall rs232transmit
ldi r16, '/'
rcall rs232transmit
ldi r16, 'v'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, 'j'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, '-'
rcall rs232transmit
ldi r16, 'b'
rcall rs232transmit
ldi r16, 'r'
rcall rs232transmit
ldi r16, 'e'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, 'b'
rcall rs232transmit
ldi r16, 'o'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, 'r'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, '.'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, 'e'
rcall rs232transmit
ldi r16, '\'
rcall rs232transmit
ldi r16, 'n'
rcall rs232transmit
rjmp l1

rs232transmit:
;; sbrc oder sbrs;;
;; also folgendes:
;; der naechste befehl nach sbrc und sbrs
;; wird ignoriert/oder nicht ignoriert???
;; wenn das bit geloescht/gesetzt ist
;; wenn danach ein sprungbefehl stattfindet,
;; kann man solange ausfuehren bis das bit
;; gesetzt ist...
;; ignoriert wird der naechste befehl, ja!!!
;; wg.: s = skip - skip heisst ueberspringen:
;; txc wird gesetzt wenn vollstaendig...
rs232transmitL1:
;;sbis UCSRA, TXC
sbis UCSRA, UDRE
rjmp rs232transmitL1
out UDR, r16
ret

tatsaechlich, das hat das problem geloest... die sache geht genauso sauber wie vorher...und ich sage: paritaetsbits und 2 stopbit sollten eingestellt sein...das macht es von anfang an sauber, ohne komische zeichen aber ich habe URSEL dahin, wie gesagt...jetzt geht es mit viel einstellungen..

ja, das tut, und zwar von anfang an, ich halte es somit fuer die bessere konfiguration, moeglicherweise ist ueber die paritaet, aber auch das zusaetzliche stopbit ausgerechnet die sache richtig eingestellt.

beitrag gerade eben verworfen...

also, es war richtig UCSZ2 kommt in UCSRB und da war es aber auch...

URSEL war aber falsch, URSEL gehoert nicht da rein...

ldi r16, (1 << TXEN |  0 << UCSZ2 | 1 << UPM1 | 1 << UPM0 | 1 << URSEL)
out UCSRB, r16
;; alternative:
sbi UCSRB, TXEN
;;cli UCSRB, UCSZ2

ldi r16, (1 << UCSZ1 | 1 << UCSZ0 | 1 << USBS )
out UCSRC, r16

sbi UCSRB, TXEN
ldi r16, (1 << TXEN |  0 << UCSZ2 | 1 << UPM1 | 1 << UPM0 | 1 << URSEL)
out UCSRB, r16
aha, so geht es auch, jetzt probiere ich doch wieder wie im alten code, die bits zu aendern... als UPB oder UBS ...what ever... falsch war wohl der befehl parodd parenb in einem...

aha, jetzt geht es!!!

nach reset - man sieht gleich die zeichenfolge ist anders. ok...

wenn das so ist - gut.

wenn - das war falsch parenb ist nicht das zweite ...

ok: kurz ueberlegen:

der befehl stimmte nicht

parodd hat mit parenb nichts zu tun

  1. parodd ist odd parity - logisch ...
  2. parenb ist even...

das war quatsch

gibt es ausser cstopb noch eines?

wohl kaum?

weil 1 oder 2 stopbit heisst nicht, das war ein denkfehler.

es heisst

1 xor 2 stopbit
weil: es gibt immer ein startbit und es gibt immer mindestens ein stopbit und maximal 2. aja...

aha, ich habe ein lebenszeichen!!! es tut!!

ich habe die bits anders gesetzt (UCSRB, UCSRC)...

ok. was hier erscheint, ergibt zunaechst keinen sinn...

ich moechte zunaechst auf den befehl

stty sane -F /dev/ttyS3
hinweisen...

damit wird /dev/ttyS3 zurueckgesetzt. so...

zweitens:

ich habe hier immer noch stop bits / .../ parity die vielleicht jetzt nicht uebereinstimmt.

3. reset druecken, am STK500

dazu:

von homepage ubernommen:

ldi r16, (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0)
out UCSRC, r16

ldi r16, (1 << TXEN)
out UCSRB, r16

...

;; David Vajda
;; 06/12/2026
;; atmega8 - rs232 - versuch

.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
;; ldi r16, 0xff
;; out DDRD, r16

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16

;; ldi r16, (1 << TXEN)
;; out USCRB, r16

;; so, waere das schoen
;; wuerde aber bedeuten, dass alle bit
;; ausser TXEN in USCRA geloescht waeren
;; alternative: ich nehme wirklich alle bits und setze oder loesche sie
;; oder: es gibt eben diese Befehle cbi sbi oder wie auch immer
;; damit lassen sich im Port einzelne Bits setzen... hier im prozessor nachlernen
;; alle bits setzen ... befehle gleich lernen

;; 8 Datenbit
;; 1 Stopbit
;; gerade Paritaet

ldi r16, (1 << TXEN |  0 << UCSZ2 | 1 << UPM1 | 1 << UPM0 | 1 << URSEL)
out UCSRB, r16
;; alternative:
sbi UCSRB, TXEN
;;cli UCSRB, UCSZ2

ldi r16, (1 << UCSZ1 | 1 << UCSZ0 | 1 << USBS )
out UCSRC, r16

sbi UCSRB, TXEN
ldi r16, (1 << TXEN |  0 << UCSZ2 | 1 << UPM1 | 1 << UPM0 | 1 << URSEL)
out UCSRB, r16

l1:
ldi r16, 'h'
rcall rs232transmit
ldi r16, 't'
rcall rs232transmit
ldi r16, 't'
rcall rs232transmit
ldi r16, 'p'
rcall rs232transmit
ldi r16, 's'
rcall rs232transmit
ldi r16, ':'
rcall rs232transmit
ldi r16, '/'
rcall rs232transmit
ldi r16, '/'
rcall rs232transmit
ldi r16, 'v'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, 'j'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, '-'
rcall rs232transmit
ldi r16, 'b'
rcall rs232transmit
ldi r16, 'r'
rcall rs232transmit
ldi r16, 'e'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, 'b'
rcall rs232transmit
ldi r16, 'o'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, 'r'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, '.'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, 'e'
rcall rs232transmit
ldi r16, '\'
rcall rs232transmit
ldi r16, 'n'
rcall rs232transmit
rjmp l1

rs232transmit:
;; sbrc oder sbrs;;
;; also folgendes:
;; der naechste befehl nach sbrc und sbrs
;; wird ignoriert/oder nicht ignoriert???
;; wenn das bit geloescht/gesetzt ist
;; wenn danach ein sprungbefehl stattfindet,
;; kann man solange ausfuehren bis das bit
;; gesetzt ist...
;; ignoriert wird der naechste befehl, ja!!!
;; wg.: s = skip - skip heisst ueberspringen:
;; txc wird gesetzt wenn vollstaendig...
rs232transmitL1:
;;sbis UCSRA, TXC
sbis UCSRA, UDRE
rjmp rs232transmitL1
out UDR, r16
ret
bisherige versuche ergaben das.

stty inzwischen verstanden

/dev/ttyS3 angeben - aber mit -F

stty -F /dev/ttyS3
also, bei mir, bei anderen vielleicht was anderes. was ich auf meiner eigenen homepage gefunden habe, immerhin ich mache den versuch schon oefter. aber letztes schliesst sich jetzt hier:

https://www.vajda-breadboard.de/html/uebungen4/node11.html

hier steht auch der befehl...

verstanden habe ich ihn damals nicht zu 100 % sry...so verwendet.

aber:

ich wusste, 5, 6, 7, 8, 9 Datenbit odd/even/no parity, 1 o. 2 stop bit, baudrate immer ein startbit...

ok, ich weiss jetzt inzwischen:

gut: cs8 character size 8 bit bietet sich an... habe ja: ucsz2 := 0, ucsz1 :=1, ucsz0 := 0

011 heisst: 8 bit dann odd parity: beide gesetzt: 11 (USART atmega) dann: 2 stop bit:

ok, das geht:

das sind keine paramenter, wie

--help
oder
-F\end
{verbatim}

also, ohne -, aber - moeglich steht hier fuer minus

heisst:
\begin{verbatim}
parodd pareven
als angabe

heisst,

parodd odd parity

dann bei stopbit:

cstopb heisst 1 stopbit parenb - steht wohl fuer wie partity - paritaetisch? bestaetigendes???

zweites: tut leider nichts erscheinen, muss probieren...

code inzwischen - habe statt txc die version mit udre genommen

;; David Vajda
;; 06/12/2026
;; atmega8 - rs232 - versuch

.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
;; ldi r16, 0xff
;; out DDRD, r16

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16

;; ldi r16, (1 << TXEN)
;; out USCRB, r16

;; so, waere das schoen
;; wuerde aber bedeuten, dass alle bit
;; ausser TXEN in USCRA geloescht waeren
;; alternative: ich nehme wirklich alle bits und setze oder loesche sie
;; oder: es gibt eben diese Befehle cbi sbi oder wie auch immer
;; damit lassen sich im Port einzelne Bits setzen... hier im prozessor nachlernen
;; alle bits setzen ... befehle gleich lernen

;; 8 Datenbit
;; 1 Stopbit
;; gerade Paritaet

ldi r16, (1 << TXEN |  0 << UCSZ2 | 1 << UPM1 | 1 << UPM0 | 1 << URSEL)
out UCSRB, r16
;; alternative:
sbi UCSRB, TXEN
;;cli UCSRB, UCSZ2

ldi r16, (1 << UCSZ1 | 1 << UCSZ0 | 1 << USBS )
out UCSRC, r16

sbi UCSRB, TXEN
ldi r16, (1 << TXEN |  0 << UCSZ2 | 1 << UPM1 | 1 << UPM0 | 1 << URSEL)
out UCSRB, r16

l1:
ldi r16, 'h'
rcall rs232transmit
ldi r16, 't'
rcall rs232transmit
ldi r16, 't'
rcall rs232transmit
ldi r16, 'p'
rcall rs232transmit
ldi r16, 's'
rcall rs232transmit
ldi r16, ':'
rcall rs232transmit
ldi r16, '/'
rcall rs232transmit
ldi r16, '/'
rcall rs232transmit
ldi r16, 'v'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, 'j'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, '-'
rcall rs232transmit
ldi r16, 'b'
rcall rs232transmit
ldi r16, 'r'
rcall rs232transmit
ldi r16, 'e'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, 'b'
rcall rs232transmit
ldi r16, 'o'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, 'r'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, '.'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, 'e'
rcall rs232transmit
ldi r16, '\'
rcall rs232transmit
ldi r16, 'n'
rcall rs232transmit
rjmp l1

rs232transmit:
;; sbrc oder sbrs;;
;; also folgendes:
;; der naechste befehl nach sbrc und sbrs
;; wird ignoriert/oder nicht ignoriert???
;; wenn das bit geloescht/gesetzt ist
;; wenn danach ein sprungbefehl stattfindet,
;; kann man solange ausfuehren bis das bit
;; gesetzt ist...
;; ignoriert wird der naechste befehl, ja!!!
;; wg.: s = skip - skip heisst ueberspringen:
;; txc wird gesetzt wenn vollstaendig...
rs232transmitL1:
;;sbis UCSRA, TXC
sbis UCSRA, UDRE
rjmp rs232transmitL1
out UDR, r16
ret
heisst nicht sgtty sondern stty...

das heisst nicht stty. sondern glaube ich sgtty, ich probiere das jetzt aus, also das linux/unix programm mit dem ich die daten vom controller abfange. vorher noch mal programmieren und sgtty muss ich in google nachgucken, trotz allem...

oder mit

sgtty --help

der richtige weg ist letzterer. ...

;; David Vajda
;; 06/12/2026
;; atmega8 - rs232 - versuch

.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
ldi r16, 0xff
out DDRD, r16

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16

;; ldi r16, (1 << TXEN)
;; out USCRB, r16

;; so, waere das schoen
;; wuerde aber bedeuten, dass alle bit
;; ausser TXEN in USCRA geloescht waeren
;; alternative: ich nehme wirklich alle bits und setze oder loesche sie
;; oder: es gibt eben diese Befehle cbi sbi oder wie auch immer
;; damit lassen sich im Port einzelne Bits setzen... hier im prozessor nachlernen
;; alle bits setzen ... befehle gleich lernen

;; 8 Datenbit
;; 1 Stopbit
;; gerade Paritaet

ldi r16, (1 << TXEN |  0 << UCSZ2 | 1 << UPM1 | 1 << UPM0 | 1 << URSEL)
out UCSRB, r16
;; alternative:
sbi UCSRB, TXEN
;;cli UCSRB, UCSZ2

ldi r16, (1 << UCSZ1 | 1 << UCSZ0 | 0 << USBS )
out UCSRC, r16

sbi UCSRB, TXEN

l1:
ldi r16, 'h'
rcall rs232transmit
ldi r16, 't'
rcall rs232transmit
ldi r16, 't'
rcall rs232transmit
ldi r16, 'p'
rcall rs232transmit
ldi r16, 's'
rcall rs232transmit
ldi r16, ':'
rcall rs232transmit
ldi r16, '/'
rcall rs232transmit
ldi r16, '/'
rcall rs232transmit
ldi r16, 'v'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, 'j'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, '-'
rcall rs232transmit
ldi r16, 'b'
rcall rs232transmit
ldi r16, 'r'
rcall rs232transmit
ldi r16, 'e'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, 'b'
rcall rs232transmit
ldi r16, 'o'
rcall rs232transmit
ldi r16, 'a'
rcall rs232transmit
ldi r16, 'r'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, '.'
rcall rs232transmit
ldi r16, 'd'
rcall rs232transmit
ldi r16, 'e'
rcall rs232transmit
ldi r16, '\'
rcall rs232transmit
ldi r16, 'n'
rcall rs232transmit
rjmp l1

rs232transmit:
;; sbrc oder sbrs;;
;; also folgendes:
;; der naechste befehl nach sbrc und sbrs
;; wird ignoriert/oder nicht ignoriert???
;; wenn das bit geloescht/gesetzt ist
;; wenn danach ein sprungbefehl stattfindet,
;; kann man solange ausfuehren bis das bit
;; gesetzt ist...
;; ignoriert wird der naechste befehl, ja!!!
;; wg.: s = skip - skip heisst ueberspringen:
;; txc wird gesetzt wenn vollstaendig...
out UDR, r16
rs232transmitL1:
sbis UCSRA, TXC
rjmp rs232transmitL1
ret
nächstes

;; David Vajda
;; 06/12/2026
;; atmega8 - rs232 - versuch

.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
ldi r16, 0xff
out DDRD, r16

ldi r16, HIGH (25)
out UBBRH, r16
ldi r16, LOW (25
out UBBRL, r16

;; ldi r16, (1 << TXEN)
;; out USCRB, r16

;; so, waere das schoen
;; wuerde aber bedeuten, dass alle bit
;; ausser TXEN in USCRA geloescht waeren
;; alternative: ich nehme wirklich alle bits und setze oder loesche sie
;; oder: es gibt eben diese Befehle cbi sbi oder wie auch immer
;; damit lassen sich im Port einzelne Bits setzen... hier im prozessor nachlernen
;; alle bits setzen ... befehle gleich lernen

;; 8 Datenbit
;; 1 Stopbit
;; gerade Paritaet

ldi r16, (1 << TXEN |  0 << UCSZ2 | 1 << UPM1 | 1 << UPM0 | 1 << URSEL)
out UCSRB, r16
;; alternative:
sbi UCSRB, TXEN
cli UCSRB, UCSZ2

ldi r16, (1 << UCSZ1 | 1 << USCZ0 | 0 << USBS )
out UCSRC, r16

sbi r16, TXEN

rs232transmit:
;; sbrc oder sbrs;;
;; also folgendes:
;; der naechste befehl nach sbrc und sbrs
;; wird ignoriert/oder nicht ignoriert???
;; wenn das bit geloescht/gesetzt ist
;; wenn danach ein sprungbefehl stattfindet,
;; kann man solange
ret
aha! ich habe herausgefunden, das heisst, URSEL muss gesetzt werden, UBBRH und UCSRC teilen sich einen Speicherplatz wie gesagt. wenn ich aber ldi r16, HIGH (25) und out SPH, r16 habe, dann ist der obere teil des Wortes (2 Byte) von 25 immer 0. 1 Byte hat 0..255 und das ist UBBRL. 25 liegt weit unter 255 also wird UBRRH nicht genutzt in dem sinne, dass es 0d ist. also: da wiederum sonst mit gesetztem URSEL UCSRC genutzt wird, was ich tun muss, bietet sich das nicht nur an: sondern: wenn ich werte in UCSRC gesetzt habe, die ich einerseits setzen moechte, wuerden diese nicht unbedingt verloren gehen, weil UBBRH auch nicht neu beschrieben wuerde, aber ihre Funktion beim setzen verloren gehen und:

nun haette UBBRH einen ganz anderen wert. wenn bit 6 und 4 gesetzt sind. dann habe in einem Wort, beim oberen Byte bit 6 und 4 gesetz, damit lande ich irgendwo ganz da oben, ...

;; David Vajda
;; 06/12/2026
;; atmega8 - rs232 - versuch

.include „m8def.inc“

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
ldi r16, 0xff
out DDRD, r16

ldi r16, HIGH (25)
out UBBRH, r16
ldi r16, LOW (25
out UBBRL, r16

;; ldi r16, (1 << TXEN)
;; out USCRB, r16

;; so, waere das schoen
;; wuerde aber bedeuten, dass alle bit
;; ausser TXEN in USCRA geloescht waeren
;; alternative: ich nehme wirklich alle bits und setze oder loesche sie
;; oder: es gibt eben diese Befehle cbi sbi oder wie auch immer
;; damit lassen sich im Port einzelne Bits setzen... hier im prozessor nachlernen
;; alle bits setzen ... befehle gleich lernen

;; 8 Datenbit
;; 1 Stopbit
;; gerade Paritaet

ldi r16, (1 << TXEN |  0 << UCSZ2 | 1 << UPM1 | 1 << UPM0 | 1 << URSEL)
out UCSRB, r16
;; alternative:
sbi UCSRB, TXEN
cli UCSRB, UCSZ2

ldi r16, (1 << UCSZ1 | 1 << USCZ0 | 0 << USBS )
war falsch, nicht in UCSRA!! - TXEN in UCSRB ...uebrigens: UCSRA mit SBRC und SBRS Testen, z.B. ob RXC und TXC completed

also, bei den bits setzen und löschen sind es eben im port

cbi und sbi

clear bit ...set bit ...

mit i am ende im Port..., heisst: i/o register..

genau. nicht

clear bit ...set bit ... sondern kommt von i/o register sbi und cbi ...

die anderen auch lernen...bits Operationen, weiss

lsr lsl asr
logical shift right logical shift left arithmetic shift right
rol ror: rotate left...
bei mips32: wohl: sll slr shift logical left shift logical right oder so.. aber ... bevor, ich das lcd nach lerne, naehmlich bei den cmd's fuer das LCD bcd - blink on/off, cursor on/off usw. z.B. schreibe ich jetzt erst den code fuer RS-232, so weit ich das weiss, z.B. weiss ich bei 2200 baud den wert fuer UBBR (UBBRH und UBBRL beim Atmega8) nicht auswendig, glaube 25d. den kann man ersetzen.

also folgendes:

wie immer - include file rein, dann: Stack Segment initialisieren und ports...

jetzt kommt dazu: kommunikation ueber UDR.

USART Data Register.

Das heisst, sowohl bei Transmit oder Recieve muessen die Daten in UDR geschrieben werden, port...

also

ldi r16, 0xa6
out UDR, r16

bei transmit

bei Recieve:

in r16, UDR

ok: das Empfangs und Senderegister des USART ist nach aussen hin seriell, nach innen hin mehr oder weniger ein 8 Bit Port. das 9. bit wird extra geregelt, ueber UCSRB.

Ports, kann ich auslesen: ueber:

in r16, UDR

das sind dann 8 Bit. Aber ueber die Serielle (Kabel) als Schieberegister raus)

ok, dann muss ich wissen, wann fertig. also: gibt es:

RXC und TXC und UDRE.

  1. RXC: Recieve Complete
  2. TXC: Transmit Complete
  3. UDRE: USART Data Register Empty

wenn das Register leer ist, hat statt gefunden. oder RXC und TXC. abfragen.

ok. vor der Inbetriebnahme, alle initialisieren.

TXEN und RXEN haben mit RXC und TXC eine andere bedeutung

TXEN bedeutet: ich aktiviere das Transmit RXEN bedeutet: ich aktivere das Recieve

Diese sind in UCSRB

dazu kommt: UBBRH, UBBRL darin muss die Baudrate

also

ldi r16, HIGH (25)
out UBRRH, r16
ldi r16, LOW (25)
out UBRRL, r16

ok..

Eben TXEN u/o RXEN aktivieren

URSEL bedeutet: ist mir nicht ganz klar: ich nehme statt UBRRH, nehme ich UCSRC.

was bedeutet das? eine physische Verlagerung? dass vielleicht ueber ein flag in der CPU - das, was UBBRH ist, nun in UCSRC gelagert ist.

daneben gibt es folgende einstellungen:

  1. ein oder 2 stop bits. USBS -
  2. gerade/ungerade/keine Parity: USART Parity Mode
  3. 5/6/7/8/9 Datenbits: USART Character Size: UCSZ2:1:0

UCSZ2 ist dabei in UCSRB und UCSZ1:0 in UCSRC

;; David Vajda
;; 06/12/2026
;; atmega8 - rs232 - versuch

.include „m8def.inc“

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16
ldi r16, 0xff
out DDRD, r16

ldi r16, HIGH (25)
out UBBRH, r16
ldi r16, LOW (25
out UBBRL, r16

;; ldi r16, (1 << TXEN)
;; out USCRB, r16

;; so, waere das schoen
;; wuerde aber bedeuten, dass alle bit
;; ausser TXEN in USCRA geloescht waeren
;; alternative: ich nehme wirklich alle bits und setze oder loesche sie
;; oder: es gibt eben diese Befehle cbi sbi oder wie auch immer
;; damit lassen sich im Port einzelne Bits setzen... hier im prozessor nachlernen
;; alle bits setzen ... befehle gleich lernen

ldi r16, (

https://de.overleaf.com/learn/latex/CircuiTikz_package

das wird es eigentlich sein und sollte man koennen zum zeichnen von schaltplaenen im allgemeinen. mal gucken, wird ein Thema fuer sich wie immer.

trotzdem mal gucken...

ich denke, erst auswendig lernen, bevor machen ...also, erst lernen, nicht probieren, lernen, was da steht ...

speichern google ki und auf der Seite. ich muss heute nicht alles wissen.

im Gegensatz allerdings zur Chemie - sage ich mal - aber auf jeden Falle Computersysteme i/ii (technische Informatik) ist das reine Anwendung - also es genügt es zu benutzen und erfordert auch beim lernen, keine Grundlagen

da aber 2. zeit nicht notwendig, ich muss nicht heute damit zeichnen, sage ich: ich lerne einfach mal nicht zielgerichtet, was da steht. wenn die Bibliothek z.B.

circuitikz

heisst, lerne ich das. waere ja ein fortschritt, ebenso:

\node [and port] (and1) at (0,0) {};

ganz easy ...ohne tun, lernen, jetzt gleich...

%% david vajda
%% LaTeX CircuiTikZ First Test
%% 06/11/2026

\documentclass [a4paper]{article}
\usepackage{german,amsmath,amsfonts}

\usepackage[american, RPvoltages]{circuitikz}

\title{\LaTeX first CircuiTikZ Test}
\author{David Vajda}

\begin{document}
\maketitle

\begin{circuitikz}
\node [and port] (and1) at (0,0) {};
\node [and port] (and2) at (0,1) {};
\node [and port] (and3) at (0,2) {};
\node [and port] (and4) at (0,3) {};
\end{circuitikz}
\end{document}

ich habe

PSA 08-11 RT

Image IMG_3791.HEIC

Image IMG_3794.HEIC

Image IMG_3795.HEIC

Image IMG_3796.HEIC

Image IMG_3797.HEIC

Image IMG_3798.HEIC

Image IMG_3799.HEIC

Image IMG_3682.HEIC

Image IMG_3683.HEIC

Image IMG_3684.HEIC

Image IMG_3685.HEIC

Image IMG_3686.HEIC

Image IMG_3687.HEIC

Image IMG_3688.HEIC

Image IMG_3689.HEIC

Image IMG_3690.HEIC

Image IMG_3691.HEIC

Image IMG_3692.HEIC

Image IMG_3693.HEIC

Image IMG_3694.HEIC

Image IMG_3695.HEIC

Image IMG_3696.HEIC

Image IMG_3697.HEIC

Image IMG_3698.HEIC

Image IMG_3699.HEIC

Image IMG_3700.HEIC

Image IMG_3701.HEIC

Image IMG_3702.HEIC

Image IMG_3703.HEIC

Image IMG_3704.HEIC

Image IMG_3705.HEIC

Image IMG_3706.HEIC

Image IMG_3707.HEIC

Image IMG_3708.HEIC

Image IMG_3709.HEIC

Image IMG_3710.HEIC

Image IMG_3711.HEIC

Image IMG_3712.HEIC

Image IMG_3713.HEIC

Image IMG_3714.HEIC

Image IMG_3715.HEIC

Image IMG_3716.HEIC

Image IMG_3717.HEIC

Image IMG_3718.HEIC

Image IMG_3719.HEIC

Image IMG_3722.HEIC

Image IMG_3723.HEIC

Image IMG_3724.HEIC

Image IMG_3725.HEIC

Image IMG_3726.HEIC

Image IMG_3727.HEIC

Image IMG_3728.HEIC

Image IMG_3729.HEIC

Image IMG_3730.HEIC

Image IMG_3731.HEIC

Image IMG_3732.HEIC

Image IMG_3733.HEIC

Image IMG_3734.HEIC

Image IMG_3735.HEIC

Image IMG_3736.HEIC

Image IMG_3755.HEIC

Image IMG_3756.HEIC

Image IMG_3757.HEIC

Image IMG_3758.HEIC

Image IMG_3759.HEIC

Image IMG_3760.HEIC

Image IMG_3761.HEIC

Image IMG_3762.HEIC

Image IMG_3763.HEIC

Image IMG_3764.HEIC

Image IMG_3765.HEIC

Image IMG_3766.HEIC

Image IMG_3768.HEIC

Image IMG_3769.HEIC

Image IMG_3770.HEIC

Image IMG_3771.HEIC

Image IMG_3772.HEIC