Differences

This shows you the differences between two versions of the page.

wiki:study:prakt:ra2 [2005/03/02 19:05] (current)
Line 1: Line 1:
 +====== Rechnerarchitekturen 2 ======
 +Lösungen des [[http://www.theoinf.tu-ilmenau.de/ra1/prakti.html#ra|RA- Praktikums an der TU-Ilmenau]] vom 10.12.2003.
 +===== Matrixtastatur  =====
 +<code asm>
 +;Aufgabe a
 +name mainfile
 +public main
 +
 +APP_CODE32 SEGMENT PUBLIC USE32 ER
 +ASSUME DS:APP_DATA32, ES:APP_DATA32, FS:APP_DATA32, GS:APP_DATA32, SS:APP_DATA32
 +
 +
 +main:
 + MOV dl,0x00
 +wmatr:
 + CALL matr
 + CMP dl,dh
 + JZ wmatr
 +
 + CMP dl,0x00 ;Wird die Taste los gelassen, entsteht eine 0, diese wollen wir nicht anzeigen
 + JZ wmatr
 +
 + CALL SLEEP ;entprellung
 + MOV al,dl ;ausgabe in led-zeile
 + OUT 0x5c,al
 +
 + PUSH cx ;für den Zugriff auf die Daten wird ein X-Reg gebraucht, leider haben wir keins mehr :-(
 + MOV ecx,0x00
 + MOV cl,dl
 + SUB cl,0x01
 + MOV al,[segment+ecx];siehe TI Script
 + POP cx ; den Wer von CX wiederherstellen
 +
 + PUSH dx ;und das selbe mit DX
 + MOV dx,0
 + MOV dl,ch
 + OUT dx,al
 + POP dx
 +
 + DEC ch
 + CMP cd,0xaf ;max Anzahl der Segmente
 + JNZ weiter
 + MOV ch,0xbb ;höchster Adresswert der Segmentanzeigen
 + weiter:
 +
 +JMP wmatr
 +
 +;matr
 +;Abfrage der dl
 +;Übergabe der gedrückten Taste
 +matr:
 + MOV dh,dl
 + MOV dl,0x00
 + MOV ah,0x08
 + MOV cl,0x0f ;4*4+1
 +
 + matry:
 + MOV al,ah
 + OUT 0x5a,al
 + IN al,0x5b
 + CALL COMPAREI
 + SUB cl,0x04 ;CL=CL-4
 + SHR ah,0x01 ;AH=AH/2
 + JNZ matry ;until AH!=0
 +RET
 +
 +COMPAREI: ;Init
 + MOV bh,0x08
 + MOV bl,0x04
 +
 + COMPARE:
 + CMP al,bh
 + JZ KEYPRESS
 + DEC bl ;BL--
 + SHR bh,0x01 ;BH=BH/2
 + JNZ COMPARE ;until BH!=0 ;k.A. ob Zero Flag gesetzt wird
 + JMP NOKEY
 + KEYPRESS:
 + ADD bl,cl
 + MOV dl,bl
 + MOV ah,0x00
 + NOKEY:
 +RET
 +
 +SLEEP:
 + MOV ax,0xFFFF
 + SLEEPL:
 + DEC ax ;ax--
 + JNZ SLEEPL
 +RET
 +;Bsp.
 +; <-x->^
 +; 1000 | 01
 +; 0000 y 02
 +; 0000 | 04
 +; 0000 v 08
 +
 +; *** Ab hier den Programmbereich einfuegen ***
 +
 +; *** Ende des Programmbereiches - ab hier nichts veraendern! ***
 +finish: jmp finish ; vorbereitete Endlosschleife
 +APP_CODE32 ENDS
 +
 +APP_DATA32 SEGMENT PUBLIC USE32 RW
 +; *** Ab hier den Datenbereich einfuegen ***
 +; 0 1   2   3 4 5   6   7 8 9
 +segment db 0x3f,0x03,0x6d,0x67,0x53,0x76,0x7e,0x23,0x7f,0x77
 +
 +
 +; *** Ende des Datenbereichs - ab hier nichts veraendern! ***
 + DB 0 ; Datenbereich soll nicht leer sein
 +APP_DATA32 ENDS
 +
 +END main
 +</code>
 +
 +===== Timerbaustein =====
 +==== Aufgabenteil A ====
 +<code asm>
 +;Aufgabe a
 +name mainfile
 +public main
 +
 +APP_CODE32 SEGMENT PUBLIC USE32 ER
 +ASSUME DS:APP_DATA32, ES:APP_DATA32, FS:APP_DATA32, GS:APP_DATA32, SS:APP_DATA32
 +
 +main:
 + ;kanal=0 mode=3
 + ;0011.0110
 + MOV AL,0x36
 + OUT 0x57,AL
 +
 + ;f[out]=440Hz
 + ;Realisierung durch f-Teilung eines 2MHz Oszillators
 + ;2000000/440=4545.4545...
 + ; = 11c1.745D...
 + ;
 + ;sequientiell erst MSB, dann LSB setzen
 + MOV AL,0xc1
 + OUT 0x54,AL
 + MOV AL,0x11
 + OUT 0x54,AL
 + ;Digitalisierungsfehler -> f[neu]=440.044044...Hz
 +</code>
 +==== Aufgabenteil B ====
 +<code asm>
 +;Aufgabe b
 +name mainfile
 +public main
 +
 +APP_CODE32 SEGMENT PUBLIC USE32 ER
 +ASSUME DS:APP_DATA32, ES:APP_DATA32, FS:APP_DATA32, GS:APP_DATA32, SS:APP_DATA32
 +
 +main:
 + ;kanal=1 mode=3
 + ;0111.0110
 + MOV AL,0x76
 + OUT 0x57,AL
 + ;kanal=2 mode=3
 + ;1011.0110
 + MOV AL,0xb6
 + OUT 0x57,AL
 +
 + ;f[out]=2Hz
 + ;Realisierung durch f-Teilung eines 2MHz Oszillators
 + ;2000000/2  =f.4240 -> es werden mehr als 2 byte benörigt -> kaskadierung
 + ; =10*f424
 + ;
 +
 + ;kanal1=f424
 + MOV AL,0x24
 + OUT 0x55,AL
 + MOV AL,0xf4
 + OUT 0x55,AL
 +
 + ;kanal2=0010
 + MOV AL,0x10
 + OUT 0x56,AL
 + MOV AL,0x00
 + OUT 0x56,AL
 +
 +
 +
 +; *** Ende des Programmbereiches - ab hier nichts veraendern! ***
 +finish: jmp finish ; vorbereitete Endlosschleife
 +APP_CODE32 ENDS
 +
 +APP_DATA32 SEGMENT PUBLIC USE32 RW
 +; *** Ab hier den Datenbereich einfuegen ***
 +
 +
 +
 +
 +; *** Ende des Datenbereichs - ab hier nichts veraendern! ***
 + DB 0 ; Datenbereich soll nicht leer sein
 +APP_DATA32 ENDS
 +
 +END main
 +</code>
 +==== Aufgabenteil C ====
 +<code asm>
 +;Aufgabe c
 +name mainfile
 +public main
 +
 +APP_CODE32 SEGMENT PUBLIC USE32 ER
 +ASSUME DS:APP_DATA32, ES:APP_DATA32, FS:APP_DATA32, GS:APP_DATA32, SS:APP_DATA32
 +ledinit:
 + ;LED
 + MOV AL,0x76
 + OUT 0x57,AL
 + MOV AL,0xb6
 + OUT 0x57,AL
 + ;kanal1
 + MOV AL,0x24
 + OUT 0x55,AL
 + MOV AL,0xf4
 + OUT 0x55,AL
 + ;kanal2
 + MOV AL,0x10
 + OUT 0x56,AL
 + MOV AL,0x00
 + OUT 0x56,AL
 +
 +loop:
 + CALL checkkey
 + CMP DL,CL ;tastendruck?
 + JZ loop
 + CMP DL,0x00 ;tastendruck=0?
 + JZ reset
 +
 + ;eine taste wurde gedrückt
 + MOV AL,0x36
 + OUT 0x57,AL
 + MOV AL,[tonleiterLSB+edx-1]
 + OUT 0x54,AL
 + MOV AL,[tonleiterMSB+edx-1]
 + OUT 0x54,AL
 +JMP loop
 +
 +reset:
 + MOV AL,0x34
 + OUT 0x57,AL
 + MOV AL,0x00
 + OUT 0x54,AL
 + OUT 0x54,AL
 +JMP loop
 +
 +
 +
 +checkkey: ;DL=1,2,3,4,5,6,7,8 0-nokey
 + MOV CL,DL
 + IN AL,0x59
 + MOV BH,0x80
 + MOV BL,0x08
 + MOV EDX,0x00
 +
 + compare:
 + CMP AL,BH
 + JZ keypress
 + DEC BL ;BL--
 + SHR BH,0x01 ;BH=BH/2
 + JNZ compare ;until BH!=0 ;k.A. ob Zero Flag gesetzt wird
 + JMP nokey
 + keypress:
 + MOV DL,BL
 + nokey:
 +RET
 +
 +
 +; *** Ende des Programmbereiches - ab hier nichts veraendern! ***
 +finish: jmp finish ; vorbereitete Endlosschleife
 +APP_CODE32 ENDS
 +
 +APP_DATA32 SEGMENT PUBLIC USE32 RW
 +; *** Ab hier den Datenbereich einfuegen ***
 +;261.6Hz => 1dee
 +;293.7Hz => 1aa9
 +;329.6Hz => 17bf
 +;349.2Hz => 1662
 +;392.0Hz => 13ee
 +;440.0Hz => 11c1
 +;493.9Hz => 0fd8
 +;523.2Hz => 0ef0
 +tonleiterMSB db 0xld,0xla,0x17,0x16,0x13,0x11,0x0f,0x0e
 +tonleiterLSB db 0xee,0xa9,0xbf,0x62,0xee,0xc1,0xd8,0xf0
 +
 +
 +
 +
 +; *** Ende des Datenbereichs - ab hier nichts veraendern! ***
 + DB 0 ; Datenbereich soll nicht leer sein
 +APP_DATA32 ENDS
 +
 +END main
 +</code>
 
wiki/study/prakt/ra2.txt · Last modified: 2005/03/02 19:05 (external edit)
 
Except where otherwise noted, content on this wiki is licensed under the following license:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki