;; 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!
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
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
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
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