Rechnerarchitekturen 2

Lösungen des RA- Praktikums an der TU-Ilmenau vom 10.12.2003.

Matrixtastatur

;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

Timerbaustein

Aufgabenteil A

;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

Aufgabenteil B

;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

Aufgabenteil C

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