2024-09-24

Die letzten zwei Tage
;; da funktioniert noch etwas nicht

.include "m8def.inc"

.def temp1 = r16
.def temp2 = r17
.def temp3 = r18

           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten RAM-Adresse
           out SPL, temp1
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten RAM-Adresse
           out SPH, temp1

           rcall lcd_init              ; Display initialisieren
           rcall lcd_clear             ; Display l"oschen

           ;;; David Vajda's Code
           ;;; ============================================
           ldi XL, LOW(text*2)
           ldi XH, HIGH(text*2)
           ldi ZL, LOW(text1*2)
           ldi ZH, HIGH(text1*2)

cpyloop:    ld r16, Z+
            cpi r16, 0
            breq endcpyloop
            st X+, r16
endcpyloop:

           ldi XL, LOW(text*2)
           ldi XH, HIGH(text*2)

            ld r16, X
loop1:

            cpi r16, 0
            breq loop1end
            mov r29, r27
            mov r28, r26
loop2:      ld r16, Y+
            cpi r16, 0
            breq loop2end
            ld r17, Y
            ld r16, X
            cp r16, r17
            brge noexchg
            ld r17, Y
            ld r16, X
            st Y, r16
            st X, r17
            noexchg:
            rjmp loop2
loop2end:   ld r16, X+
            rjmp loop1
loop1end:

           ;;; ============================================

           ldi ZL, LOW(text*2)         ; Adresse des Strings in den
           ldi ZH, HIGH(text*2)        ; Z-Pointer laden

           rcall lcd_flash_string      ; Unterprogramm gibt String aus, der
                                       ; durch den Z-Pointer adressiert wird
loop:
           rjmp loop

text1:
           .db "adasdasdaskdasjdkaskdkasd",0                ; Stringkonstante, durch eine 0
.dseg
text:       .byte 32

                                       ; abgeschlossen

.include "lcd-routines.asm"            ; LCD Funktionen

zum LCD, so kompliziert zu benutzen sind die nicht

Das Display, was ich f"ur meine AVR-Mikrocontroller benutze, hei"st:

HD44780

Das sollte man eigentlich auch wissen - LCD ist sch"on, aber wie hei"st das?

Die Anschlussbelegungen davon sind:

1    VSS (selten: VDD)    GND (selten: +5 V)
2    VDD (selten: VSS)    +5 V (selten: GND)
3    VEE, V0, V5    Kontrastspannung (-5 V / 0 V bis 5 V)
4    RS    Register Select (0=Befehl/Status 1=Daten)
5    RW    1=Read 0=Write
6    E    0=Disable 1=Enable
7    DB0    Datenbit 0
8    DB1    Datenbit 1
9    DB2    Datenbit 2
10    DB3    Datenbit 3
11    DB4    Datenbit 4
12    DB5    Datenbit 5
13    DB6    Datenbit 6
14    DB7    Datenbit 7
15    A    LED-Beleuchtung, meist Anode
16    K    LED-Beleuchtung, meist Kathode

sie muessen besonders auf das achten

4    RS    Register Select (0=Befehl/Status 1=Daten)
5    RW    1=Read 0=Write
6    E    0=Disable 1=Enable

Lesen, Schreiben, ja, auch beim LCD kann man lesen, befehl, Daten

gut - und wie auch die Festplatte oder was den IBM PC 5160 mit minix betrift, das Floppy drive - da muss man sich vor allem - CHS merken und Sektor, ist beim Kuchen das rausgeschnittene stueck, gibt es Parameter. Befehle, dazu - eine Festplatte hat mehr. auswendig lernen. sie senden Befehle und Daten. Die Befehle in Form von numerischen Werten - das sind keine Befehle der CPU, die auch numerisch sind. Diese auswendig zu lernen ist u.a. ein Teil desssn was ich in der naechsten Zeit tue. Das LCD ist so zu sagen mit weniger zu frieden, aber man kann alles auswendig lernne

Warum der letzte Code? Es geht weniger um das LCD Neben den parametern am LCD, und Commands, muss man besonders gut und treffsicher Assembler Code zum Beispiel fuer

ARM, MIPS32, x86, Atmega8, Zilog Z80schreiben. MIPS32, schreibe ich mit mars simulator jetzt auch, gehoert zu uebungen, mache ich nachher - heute ist Sonntag, gehe erst zur Mutter und von da. Aber, der Code muss gut sein, daneben LCD.

Was ich lernen wuerde sind ebensolche Dinge HD44780 und besonders die!

Image IMG_3334

Image IMG_3335

Ich mach Screenshots zu dem, was ich jetzt mache und wenn ich fertig bin, dann mache ich, ohne irgendwas zu posten hier aufschriebe zu dem AVR atmega 8 was ich noch nicht weiß Details von der Seite und damit ich in Zukunft auch lerne

Intel compute Stick tut gut auch hier unten WLAN jetzt auch jetzt mach den Mars simulator drauf

Hier noch screenshot letztes

Ich habe den mars simulator von der Fernuni hagen, in java, man kriegt ihn auch so im netz wichtig was java betrifft. ich selber kann damit was anfangen, aber sie haben javac - das ist der compiler - der macht aus java quelltext fuer die virtual machine class. *.class

Jetzt kommt aber *.jar. das ist noch mal anders, archiv

Image Screenshot_20240910_124451

Image Screenshot_20240910_125035

Image Screenshot_20240922_102621

Image Screenshot_20240922_105107

Image Screenshot_20240922_105153

Image Screenshot_20240922_105229

java -jar Mars.jar

also, compiler

javac xzy meineklasse.java
java xzy.class

java -jar xyz.jar

Wir schreiben jetzt ein ganz einfaches Programm. Wir haben ja den debugger und der zeigt unsere Register an. D.h. wir müssen jetzt erst mal gar nicht auf dem Arbeitsspeicher zugreifen. Wir machen einfach Operation und dann sehen wir mit den Registern ob's funktioniert hat. Also wir wissen müssen ist, dass wir die typischen Register

$t0... $s0...
haben neben paar anderen und dass wir drei Adressformat hauptsächlich haben bei den so genannten r-Typ Befehlen, als man könnte sagen alle mathematischen und logischen Operationen

Lass uns dann am Laden und speichern hindert ld... st... ist letztenendes nichts. Das einzige wir müssen gucken, wie wir von der Syntax her variablen Speicherbereich einrichten. Ich denke mal, das geht wie immer mit dB Dh dd und so weiter und davor eben das Label mit:

Wir können die Register auch

$r0...
nennen. Dann alle 32


; so hier der erste Quelltext, war gleich mal was ein klein wenig nicht richtig, kein Problem. man sieht, die Assembler befehle unterschiedlicher architekturen sind aehnlich, aber ein wenig anders. bei atmega8, ldi - load immidiate, also einen direktwert „konstante``bei mips32, li - egal. womit ein Ladebefehl schon da ist

li $t0, 8
addi $t0, $t0, 1
addi $t0, $t0, 1
addi $t0, $t0, 1
addi $t0, $t0, 1

Image Screenshot_20240922_105426

Image Screenshot_20240922_105950

Image Screenshot_20240922_110345

Image Screenshot_20240922_110558

Image Screenshot_20240922_111950

Image Screenshot_20240922_112108

Image Screenshot_20240922_112312

Image Screenshot_20240922_112356

Das können wir mal ne Schleife schreiben. Wir können ne Zahl durch zwei hoch n teilen, in dem wir sie in Bits nach rechts schifften der Rest ist nicht enthalten, das macht nichts und dabei brauchen wir nicht Zeitschleife, das shiften

li $t0, 5622112
li $t1, 3
li $t2, 0
loop1:
beq $t0, $t1, loop1end
sll $t0, $t0, 1
subi $t1, $t1, 1
j loop1
loop1end:

.data
str1: .asciiz "abc"

Den MIPS 32 habe ich übrigens als CPU und wie gesagt, ich wollte den vhdl als einfachste Version auf Fpga implementieren ist nicht so schwer und ich hab ihn als Prozessor von Elektronik Versand reichelt.de ist kein Problem. Ist natürlich gut wir können auch programmieren. Auf jeden Fall können wir auch trotz vor allem für Minix oder sowieso gebrauchen, auch wenn wir es nicht gleich auf dem laufen lassen, sondern auf dem x86

Sie brauchen mehr oder weniger nur ihr eeprom und LCD und dann können Sie auch den mips32 benutzen

Ich hab dank Mikrocontroller.net schon mal ne interessante Möglichkeit gefunden zu einer indirekten Adresse zu springen, nämlich in dem ich die Stick lege und dann mit Return für unter Programm dahin springen

Was ich heute mache, ich habe noch ein ünverbrauchtes" LCD - das Problem bei mir ist - dass ich einen 10 Bit Wannenstecker? Man sieht man muss immer Begriffe lernen - Bus Kabel wuerde manch eine sagen, mit Wannenstecker, das heisst schon Wannenstecker, auf die platine gemacht habe, wo das LCD ist, aber das Problem ist - bei dem AVR - auf dem STK 500, ist ja auch ein 10 Bit stecker, aber das ist kein Wannenstecker, der hat die Einkerbe nicht, man kann das falsch rum machen. Bei mikrocontroller.net steht, dass man das auf keinen Fall verkehrt einbauen darf, das LCD tut, wie sie sehen, aber - die hintergrundleuchte nicht, ich fuerchte die ist kaputt - jetzt steht da sogar man kann den Kontrast einstellen, das macht mich neugierig, ich loete heute ein neues, allerdings mit einem Unterschied. Ich benutze ja mein Steckboard. Und meine Idee ist, dass ich lediglich steckkabel rein mache und dass dann jedes mal neu rein stecke, dann lerne ich auch dazu. Uebung macht den Meister. immer wenn wir ueben oder auswendig lernen oder beides. Dann merken wir uns das. Und deswegen mache ich das so. Das LCD als uebung

Gleichzeitig schreibe ich jetzt noch notizen auf. heute weiter Notizen. und wenn ich das habe, dann loete ich das mal. Aber vorher notizen.

Um zur Beruhigung bei zu tragen, nach dem gelesenen, habe ich das Display noch viel besser im Griff, und traue mich quasi eigene Routinen zu schreiben, aber ich moechte das auswendig lernen und tue es, vielleicht jeden Tag ins Steckboard setzen, das schreiben, zu meinen Uebungen

Hier habe ich eine Liste weiterer typischer und nicht so typischer Displays

    HD44780
    KS0070
    KS0066U
    TC1602E, Pollin 120420
    ANAG VISION AV1623YFTY-SJW, Pollin 121714
    Epson SED1278

Ich habe herausgefiltert, was dringend an der Zeit ist zu lernen, ASCII und RS-232

clear display
curser home
entry mode
on/off control
curser/scrollen
konfiguration
character RAM Address Set
Display RAM Address Set

clear display: 0b00000001, Ausfuehrungszeit 1,64 ms
curser home: 0b0000001x, Ausfuehrungszeit 40 mikro Sekunden bis 1,64 ms
entry mode: 0b000001is
on/off control: 0b00001dcb
curser/scrollen: 0b0001srxx
konfiguration: 0b001dnfxx
character RAM Address Set: 0b01aaaaaa
Display RAM Address Set: 0b1aaaaaaa

NUL, SOH, STX, ETX, EOT, ENQ, ACK, BEL, BS, HT, LF, VT, FF, CR, SO, SI,
    DLE, DC1, DC2, DC3, DC4, NAK, SYN, ETB, CAN, EM, SUB, ESC, FS, GS, RS, US

    NUL
    SOH     Start of heading            Anfang des Kopfes
    STX     Start of text               Anfang des Textes
    ETX     End of text                 Ende des Textes
    EOT     End of Transmission         Ende der uebertragung
    ENQ     Enquiry                     Stationsaufforderung        (enquiry: anfrage)
    ACK     Acknowledge                 Positive Rueckmeldung
    BEL     Bell                        Klingel
    BS      Backspace                   Rueckwaertsschritt
    HT      Horizontal Tab              Zeichentabulator
    LF      Line Feed                   Zeilenschrift
    VT      Vertical Tab                Zeilentabulator
    FF      Form Feed                   Formalvorschub - wirft die aktuelle Seite aus, loescht den bildschirm
    CR      carriage return             Wagenruecklauf
    SO      Shift Out                   Dauerumschaltung, rot schwarz, fett normal
    SI      Shift in                    Rueckschaltung
    DLE     Data Link Escape            Gibt den nachfolgenden Zeichen besondere Bedeutung
    DC1     Device Control 1            Geraetesteuerzeichen
    DC2     Device Control 2
    DC3     Device Control 3
    DC4     Device Control 4
    NAK
    SYN
    ETB
    CAN
    EM
    SUB
    ESC
    FS
    GS
    RS
    US

Ein Tabulatorzeichen ist ein Steuerzeichen, das in Textdateien je nach der auswertenden Software-Anwendung anzeigt, dass die Positionierung f"ur ein folgendes Textzeichen horizontal (zum n"achsten Tabulatorstopp) oder vertikal gem"a"s den Einstellungen der Software-Anwendung vorzuschieben ist, oder dass ein folgendes Textzeichen zur n"achstfolgenden Spalte in einer Tabelle geh"ort (dann ist die Datei als CSV-Datei mit dem Tabulatorzeichen als Datenfeld-Trennzeichen anzusehen

Der Zeilenvorschub (englisch line feed, kurz LF, deutsch veraltet auch ZL) ist auf Ausgabeger"aten f"ur Text die Anweisung, die n"achste Zeile anzusteuern.

Der Zeilenvorschub ist vom Wagenr"ucklauf und vom Zeilenumbruch als der Kombination von Zeilenvorschub und Wagenr"ucklauf zu unterscheiden.

Zeilenvorschub
Zeilenumbruch
Wagenruecklauf

XON-XOFF    Datenflussteuerung, data flow control

software-Flusssteuerung, Software-handshake, Software-Protokoll oder X-ON/X-OFF

Software-Flusssteuerung, Datenuebertragung durch eingefuegte Zeichen.
Keine gesonderte Schnittstellenleitung
DC1 bis DC4, Geraetesteuerzeichen

DC1, X-ON, Transmission ON Strg-Q, Bash
DC4, X-OFF, Transmission OFF, Strg-S

Bash - Strg-S beendet Transmission, Strg-Q startet

Mit Datenflusssteuerung (engl. data flow control) werden unterschiedliche Verfahren bezeichnet, mit denen die Daten"ubertragung von Endger"aten an einem Datennetz, die nicht synchron arbeiten, so gesteuert wird, dass eine m"oglichst kontinuierliche Daten"ubermittlung ohne Verluste erfolgen kann.

    Flusssteuerung auf Protokollebene.
    Hardwareverfahren "ubertragen Steuerinformationen "uber Leitungen, die zus"atzlich zu den Datenleitungen auf den Steckverbinder gef"uhrt sind.
    Softwareverfahren f"ugen Steuerinformationen in den Datenstrom ein, so dass keine zus"atzlichen Leitungen gebraucht werden.

Parallel:
    Strobe
    ACK
    Busy

Die oft an Druckern verwendete Centronics-Schnittstelle benutzt drei Leitungen zur Flusssteuerung:
    Strobe – zeigt dem Empf"anger an, dass g"ultige Daten anliegen (positive Logik, wie ACK)
    ACK – Acknowledge, Best"atigung der Daten"ubernahme durch den Drucker
    Busy – zeigt die Bereitschaft des Druckers zur Daten"ubernahme an (negative Logik)

Seriell:
    lokale Endeinrichtung
        DTR (Data terminal ready = Datenendger"at bereit)
        DSR (Data set ready = Daten"ubertragungsger"at bereit).
    Endeinrichtung
        RTS (Request to send = Aufforderung zum Senden)
        CTS (Clear to send = Erlaubnis zum Senden erteilt)

        Carrier detected = Tr"ager erkannt.
        CD (Data channel received line signal detector

Common Ground
Transmit Data
Recieve Data
Request to Send
Ready to Recieve
Clear to Send
Data set Ready
Ground
Carrier Detect
Data Terminal Ready
Ring Indicator

Carrier: Tr"ager
„ring“ ist englisch f"ur „klingeln“;

TxD, TX, TD         Transmit Data
RxD, RX, RD         Receive Data
RTS                 Request to Send
RTR                 Ready to Receive
CTS                 Clear to Send
DSR                 Data Set Ready
GND                 Ground
DCD, CD, RLSD       (Data) Carrier Detect
DTR                 Data Terminal Ready
RI                  Ring Indicator

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

Das mache ich gerade und mit RS-232 und UART setze ich mich jetzt auch auseinander.

Jetzt schreibe ich ein programm, uebung mit Unterprogramm und Stack. Danach poste ich das auf der Homepage. ich habe weitere Displays bestellt und MAX232, fuer die serielle Kommunikation.

; funktioniert auf anhieb
.include "m8def.inc"

.def TEMP = r16
;.equ XTAL = 4000000
;.equ PAUSEOPCODECYCLES = 4+3+3
; 4 RET, 3 RCALL, 1 DEC, 1 CPI, 1 BRNE
;.equ NSECS = 1

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

ldi r16, 0xff
out DDRB, r16

again:
ldi r16, 0x0f
rcall f

rjmp again

f:
    cpi r16, 0x00
    breq fend
    out PORTB, r16
    dec r16
    rcall pause
    rcall f

    ret
fend:
    ret

pause:
    ldi r18, 0xff
pauseloop1:
    dec r18
    ldi r19, 0xff
pauseloop2:
    dec r19
    cpi r19, 0x00
    brne pauseloop2
    cpi r18, 0x00
    brne pauseloop1
ret

Image IMG_3336

Image IMG_3337

Image IMG_3338

Image IMG_3339

Image IMG_3340

Image IMG_3341

Image IMG_3342

Image IMG_3343

Image IMG_3344

Image IMG_3345

Image IMG_3346

Image IMG_3347

1.) Rechne die Zahl in binaer Darstellung  in eine Dezimale Darstellung um
0010010001010100b 9300d
2.) Rechne die Zahl in dezimal darstellung in eine Binaerdarstellung um
46933 1011011101010101
3.) Addiere die drei Zahlen schriftlich
            24290
+           12904
+           15921
-----------------
            53115
4.) Subtrahiere die letzten drei Zahlen schriftlich von der ersten schriftlich
            18757
-            6351
-           12571
-            5341
-----------------
            -5506
5.) Rechne die Zahl ins zweier komplement um, mit 8 Bit - und subtrahiere diese zahl von der ersten und rechne das Ergebnis nach dezimal
-18 -125 = -143
11101110 10000011 = 01110001
6.) Multipliziere die zwei Zahlen schriftlich
1944*24950 = 48502800
7.) Dividiere die zwei Zahlen schriftlich
30068/22203 = 1
8.) Errechne x Logarithmisch mit dem Taschenrechner
31692^x = 1466647171
9.) Errechne mit dem Abakus
66 + 60 + 59 + 36 + 68 + 17 + 82 + 22 + 72 + 48
10.) Errechne mit dem Abakus
8724 + 7276 + 909 + 7287 + 1962 + 7897 + 517 + 381 + 8564 + 5855

Image IMG_3348

Image IMG_3349

Image IMG_3350

Image IMG_3351

Image IMG_3352

Image IMG_3353

Image IMG_3354

Image IMG_3355

Image IMG_3356

Image IMG_3357

Image IMG_3358

Image IMG_3359

Image IMG_3360

Image IMG_3361

Image IMG_3362

Image IMG_3363

Image IMG_3364

Image IMG_3365

Image IMG_3366

Image IMG_3367

Image IMG_3368

Image IMG_3369

Image IMG_3370

Image IMG_3371

Image IMG_3372

Image IMG_3373

Image IMG_3374