AVRASM ver. 2.2.8 X:\ass\spel\spel\main.asm Thu Dec 04 16:55:29 2025 [builtin](2): Including file 'C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.7.374\avrasm\inc\m16Adef.inc' [builtin](2): Including file 'C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.7.374\avrasm\inc\m16Adef.inc' ; --- lab4_skal . asm ;***** Created: 2011-02-09 12:03 ******* Source: ATmega16A.xml *********** ;************************************************************************* ;* A P P L I C A T I O N N O T E F O R T H E A V R F A M I L Y ;* ;* Number : AVR000 ;* File Name : "m16Adef.inc" ;* Title : Register/Bit Definitions for the ATmega16A ;* Date : 2011-02-09 ;* Version : 2.35 ;* Support E-mail : avr@atmel.com ;* Target MCU : ATmega16A ;* ;* DESCRIPTION ;* When including this file in the assembly program file, all I/O register ;* names and I/O register bit names appearing in the data book can be used. ;* In addition, the six registers forming the three data pointers X, Y and ;* Z have been assigned names XL - ZH. Highest RAM address for Internal ;* SRAM is also defined ;* ;* The Register names are represented by their hexadecimal address. ;* ;* The Register Bit names are represented by their bit number (0-7). ;* ;* Please observe the difference in using the bit names with instructions ;* such as "sbr"/"cbr" (set/clear bit in register) and "sbrs"/"sbrc" ;* (skip if bit in register set/cleared). The following example illustrates ;* this: ;* ;* in r16,PORTB ;read PORTB latch ;* sbr r16,(1< PORTB0-6 A-C -> PORTD4-6 E->U Tidbasmodul: 1kHz->PORTD2 Joystick: X->PORTA0 Y->PORTA1 H gtalare Ut->PORTA7 */ START: ; s tt stackpekaren 000004 e50f ldi r16, LOW(RAMEND) 000005 bf0d out SPL, r16 000006 e004 ldi r16, HIGH(RAMEND) 000007 bf0e out SPH, r16 000008 940e 00ae call HW_INIT 00000a 940e 00be call WARM RUN: 00000c 940e 0051 call JOYSTICK 00000e 940e 00e9 call ERASE 000010 940e 0094 call UPDATE // *** Vanta en stund sa inte spelet gar for fort *** 000012 ef0f ldi r16, $FF 000013 940e 0101 call DELAY // *** Avgor om traff *** 000015 940e 001f call IS_HIT 000017 f429 brne NO_HIT 000018 e604 ldi r16, BEEP_LENGTH 000019 940e 00f0 call BEEP 00001b 940e 00be call WARM NO_HIT: 00001d 940c 000c jmp RUN IS_HIT: 00001f 9100 0060 lds r16, POSX 000021 9110 0062 lds r17, TPOSX 000023 1701 cp r16, r17 000024 f429 brne IS_HIT_END 000025 9100 0061 lds r16, POSY 000027 9110 0063 lds r17, TPOSY 000029 1701 cp r16, r17 IS_HIT_END: 00002a 9508 ret ; --------------------------------------- ; --- Multiplex display ; --- Uses : r16 MUX: //*** skriv rutin som handhar multiplexningen och *** //*** utskriften till diodmatrisen . Oka SEED . *** 00002b 930f push r16 00002c b70f in r16, SREG 00002d 930f push r16 00002e 931f push r17 00002f 93ff push ZH 000030 93ef push ZL 000031 9100 006a 000033 9503 000034 9300 006a INCSRAM SEED 000036 e000 ldi r16, 0 000037 bb08 out PORTB, r16 000038 9100 0064 lds r16, LINE 00003a 9502 swap r16 00003b bb02 out PORTD, r16 00003c 9502 swap r16 00003d e0f0 ldi ZH, HIGH(VMEM) 00003e e6e5 ldi ZL, LOW(VMEM) 00003f 0fe0 add ZL, r16 000040 2400 clr r0 000041 1df0 adc ZH, r0 000042 8110 ld r17, Z 000043 bb18 out PORTB, r17 000044 9503 inc r16 000045 3005 cpi r16, 5 000046 f409 brne NO_RESET 000047 2700 clr r16 NO_RESET: 000048 9300 0064 sts LINE, r16 00004a 91ef pop ZL 00004b 91ff pop ZH 00004c 911f pop r17 00004d 910f pop r16 00004e bf0f out SREG, r16 00004f 910f pop r16 000050 9518 reti ; --------------------------------------- ; --- JOYSTICK Sense stick and update POSX , POSY ; --- Uses : JOYSTICK: //*** skriv kod som okar eller minskar POSX beroende *** //*** pa insignalen fran A/D - omvandlaren i X - led ... *** //*** ... och samma for Y - led *** 000051 e020 ldi r18, 0 ; X - 0; Y - 1 ADC8: 000052 b927 out ADMUX,r18 ; set by X_END 000053 e810 ldi r17,(1 << ADEN) 000054 b916 out ADCSRA, r17 CONVERT: 000055 9a36 sbi ADCSRA,ADSC ; starta en omvandling WAIT: 000056 9936 sbic ADCSRA,ADSC ; om nollst lld r vi klara 000057 cffe rjmp WAIT ; annars testa busy-biten igen 000058 b115 in r17,ADCH ; Hoppa till CHANGE_Y om r16 är på andra kanalen 000059 3021 cpi r18, 1 00005a f089 breq CHANGE_Y ; Om 3: inc, om 0: dec 00005b 3013 cpi r17, 3 00005c f041 breq INC_X 00005d 3010 cpi r17, 0 00005e f459 brne X_END 00005f 9100 0060 000061 950a 000062 9300 0060 DECSRAM POSX 000064 c005 rjmp X_END INC_X: 000065 9100 0060 000067 9503 000068 9300 0060 INCSRAM POSX X_END: 00006a e021 ldi r18, 1 ; byt till andra kanalen 00006b cfe6 rjmp ADC8 CHANGE_Y: 00006c 3013 cpi r17, 3 00006d f041 breq INC_Y 00006e 3010 cpi r17, 0 00006f f459 brne JOY_LIM 000070 9100 0061 000072 950a 000073 9300 0061 DECSRAM POSY 000075 c005 rjmp JOY_LIM INC_Y: 000076 9100 0061 000078 9503 000079 9300 0061 INCSRAM POSY JOY_LIM: 00007b 940e 007e call LIMITS ; don t fall off world ! 00007d 9508 ret ; --------------------------------------- ; --- LIMITS Limit POSX , POSY coordinates ; --- Uses : r16 , r17 LIMITS: 00007e 9100 0060 lds r16 , POSX ; variable 000080 e017 ldi r17 ,7 ; upper limit +1 000081 940e 008d call POS_LIM ; actual work 000083 9300 0060 sts POSX , r16 000085 9100 0061 lds r16 , POSY ; variable 000087 e015 ldi r17 ,5 ; upper limit +1 000088 940e 008d call POS_LIM ; actual work 00008a 9300 0061 sts POSY , r16 00008c 9508 ret POS_LIM: 00008d 6000 ori r16 ,0 ; negative ? 00008e f01a brmi POS_LESS ; POSX neg = > add 1 00008f 1701 cp r16 , r17 ; past edge 000090 f411 brne POS_OK 000091 5002 subi r16 ,2 POS_LESS: 000092 9503 inc r16 POS_OK: 000093 9508 ret ; --------------------------------------- ; --- UPDATE VMEM ; --- with POSX /Y , TPOSX /Y ; --- Uses : r16 , r17 , Z UPDATE: 000094 27ff clr ZH 000095 e6e0 ldi ZL, LOW ( POSX ) 000096 940e 009d call SETPOS 000098 27ff clr ZH 000099 e6e2 ldi ZL, LOW ( TPOSX ) 00009a 940e 009d call SETPOS 00009c 9508 ret ; --- SETPOS Set bit pattern of r16 into * Z ; --- Uses : r16 , r17 , Z ; --- 1 st call Z points to POSX at entry and POSY at exit ; --- 2 nd call Z points to TPOSX at entry and TPOSY at exit SETPOS: 00009d 9111 ld r17, Z+ ; r17 = POSX 00009e 940e 00a7 call SETBIT ; r16 = bitpattern for VMEM + POSY 0000a0 8110 ld r17, Z ; r17 = POSY Z to POSY 0000a1 e6e5 ldi ZL, LOW ( VMEM ) 0000a2 0fe1 add ZL, r17 ; Z= VMEM + POSY , ZL = VMEM +0..4 0000a3 8110 ld r17, Z ; current line in VMEM 0000a4 2b10 or r17, r16 ; OR on place 0000a5 8310 st Z, r17 ; put back into VMEM 0000a6 9508 ret ; --- SETBIT Set bit r17 on r16 ; --- Uses : r16 , r17 SETBIT: 0000a7 e001 ldi r16, $01 ; bit to shift SETBIT_LOOP: 0000a8 951a dec r17 0000a9 f01a brmi SETBIT_END ; til done 0000aa 0f00 lsl r16 ; shift 0000ab 940c 00a8 jmp SETBIT_LOOP SETBIT_END: 0000ad 9508 ret ; --------------------------------------- ; --- Hardware init ; --- Uses : HW_INIT: //*** Konfigurera hardvara och MUX - avbrott enligt *** //*** ditt elektriska schema . Konfigurera *** //*** flanktriggat avbrott pa INT0 ( PD2 ). *** ; S tter fallande flank p avbrotten 0000ae e00a ldi r16, (1<