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