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
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
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.
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
LCD HD44780
zunaechst LCD HD44780 und gleich rein recieve. vom PC wird eine message uebertragen am LCD ausgegeben
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 .. 9dmachen.
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 -1001rechnen, das ergebnis ist einfach. doch viel passieren kann nicht
10001 1111duch das binaere kann eine zahl, die 1 stelle laenger ist.
100 -10nicht 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/ttyS3der 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:
transmit an PC hat funktioniert
;; folgendes: lpm r16, Z+ subi r16, 0x00 breq l1
Zgeht sehr wohl mit r16
lpm geht mit Z
normalerweise funktioniert
ldi r16, 0x00ach, 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 breqweil: 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...
nach jedem reset, aber das abbruchkriterium versagt trotzdem...noch...bis er von vorne anfaengt...
zumindest, etwas fehlt noch...
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
ldi (immidiate wert)
ld (indirect) mit Predecrement und Postincrement
ldd (indiziert) mit Verschiebewert
lds (direct) also direkt addresse
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 .wordblos
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
;; 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
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:
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:
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^2eine Funktion hat einen
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-1zunaechst 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
char: character: 8 Bit
signed und unsigned: vorzeichenbehaftet und ohne Vorzeichen
integer: Ganzzahl
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
deklarieren geht vor, definieren kommt danach
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
int: steht fuer integer
char: steht fuer character
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
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
&aich kann sie einer Pointer Variable auf Typ int zuweisen
int *ptr; ptr = &anun 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 + 1wie 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 -1es 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
eine Funktion nutzt nichts, wenn man sie nicht aufruft.
aber sie muss definiert werden
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:
3.41 ist eine kommazahl
10 ist eine Ganzzahl
'j' ist ein Zeichen (character)
"hallo" ist eine Zeichenkette (ein Array von Zeichen)
eine Funktion bei der Definition hat
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
stdio.h standard io ist neben
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-fullLaTeX 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
/dev/sda /dev/sda1 /dev/sda2 /dev/sda3 ... /dev/sdb oder /dev/nvme??? irgendwas...
und so weiter
/dev/eth0, /dev/eth1...
/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:
doch an genau diesen Bussen liegt etwas anderes
also:
es gibt am 8086 3 Bit. Sagen wir wir haben ein Flag, zu entscheiden:
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/interfaceshier 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/eth1sind 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/interfacesob 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.jpegund was noch wichtig ist, ich habe natuerlich einen Passwortspeicher fuer meinen linux pc. mit verschluesselung
pass show
pass show -c x/y/zund beim einloggen als user
z auf Rechner y
ssh x@y -pdas 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 ./dirund 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
0777enthaelt:
111 111 111
enthaelt drei: User - Group - Other
Read Write Executedas muss man sich so merken...
Lesen schreiben ausführen...
mehr kann ich nicht helfen. so wie
GID - und UID
GID Identifiziert Gruppen
UID identifiziert User
der Nutzer selber ist eine UID die Übersetzung zum Namen steht in
/etc/usersoder 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
circuiTikZund 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/daviddort ü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:_Interruptsaber 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, r16aha, 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
parodd ist odd parity - logisch ...
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 stopbitweil: 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/ttyS3hinweisen...
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 retbisherige versuche ergaben das.
stty inzwischen verstanden
/dev/ttyS3 angeben - aber mit -F
stty -F /dev/ttyS3also, 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
--helpoder
-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 retheisst 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 retnä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 retaha! 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 asrlogical 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.
RXC: Recieve Complete
TXC: Transmit Complete
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:
USBS -
USART Parity Mode
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