Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;===========================================================================
- ; Lab_2_1_student.s - Template for DAT Lab 2_1
- ;
- ; Description : A more complete template for Lab 2_1
- ; Reference(s) : ARM IAR Assembler Reference Guide
- ; Course : Datorteknik (DAT) DT4009
- ;
- ; Authors : Süleyman Savas
- ;
- ;
- ;===========================================================================
- NAME main
- PUBLIC main
- SECTION .text : CODE (2)
- THUMB
- ;===========================================================================
- ; TODO: Find and add the correct addresses,
- ; Check sam3x datasheet - chapter 30 to find the addresses.
- PIOA_WPMR EQU 0x400E0EE4 ; Write Protect Mode Register
- PIOA_PER EQU 0x400E0E00 ;0x0000 ; PIO Enable Register
- PIOA_ODR EQU 0x400E0E14 ;0x0014 ; Output Disable Register
- PIOA_IDR EQU 0x400E0E44 ;0x0044 ; Interrupt Disable Register
- PIOA_PUER EQU 0x400E0E64 ;0x0064 ; Pull Up Enable Register
- PIOA_PDSR EQU 0x400E0E3C ;0x003C ; Pin Data Status Register
- ; C port - (leds)
- PIOC_WPMR EQU 0x400E12E4 ; Write Protect Mode Register
- PIOC_PER EQU 0x400E1200 ;0x0000 ; PIO Enable Register - Arduino Due
- PIOC_OER EQU 0x400E1210 ;0x0010 ; Output Enable Register
- PIOC_SODR EQU 0x400E1230 ;0x0030 ; Set Output Data Register
- PIOC_PUDR EQU 0x400E1260 ;0x0060 ; Pull Up Disable Register
- PIOC_CODR EQU 0x400E1234 ;0x0034 ; Clear Output Data Register
- ; PMC
- PMC_WPMR EQU 0x400E06E4 ; PMC Write Protect Mode Register
- PMC_PCER EQU 0x400E0610 ; Peripheral Clock Enable Register 0
- PMC_PCDR EQU 0x400E0614 ; Peripheral Clock Disable Register 0
- PMC_PCSR EQU 0x400E0618 ; Peripheral Clock Status Register 0
- ;===========================================================================
- ; Initialization of Peripheral Clock
- main LDR R0,=PMC_PCER
- LDR R1,=(5 << 11) ; Peripheral Identifier: bit11=PIOA, bit13=PIOC
- STR R1,[R0]
- ;===========================================================================
- ; Initialization InPort
- ; TODO: Write your code here
- LDR R1,=0xC000
- LDR R0,=PIOA_PER
- STR R1,[R0]
- LDR R0,=PIOA_ODR
- STR R1,[R0]
- LDR R0,=PIOA_IDR
- STR R1,[R0]
- LDR R0,=PIOA_PUER
- STR R1,[R0]
- ;===========================================================================
- ; Initialization OutPort
- ; TODO: Write your code here
- LDR R1,=0x6
- LDR R0,=PIOC_PER
- STR R1, [R0]
- LDR R0,=PIOC_OER
- STR R1, [R0]
- LDR R0,=PIOC_SODR
- STR R1, [R0]
- LDR R0,=PIOC_PUDR
- STR R1, [R0]
- LDR R0,=PIOC_CODR
- STR R1, [R0]
- ;===========================================================================
- ; Turn LED off
- ; TODO: Write your code here
- CLOSELEFT LDR R0,=PIOC_CODR
- LDR R1, =0x2
- STR R1,[R0]
- B LOOP
- CLOSERIGHT LDR R1, =0x4
- LDR R0,=PIOC_CODR
- STR R1,[R0]
- B LOOP
- CLOSE LDR R1, =0x6
- LDR R0,=PIOC_CODR
- STR R1,[R0]
- B LOOP
- ;===========================================================================
- ; Main program
- ; TODO: Write your code here
- LOOP
- LDR R0,=PIOA_PDSR ; Adress till PortA:s dataregister PIO_PDSR (Pin Data Status Register)
- LDR R1,[R0]
- AND R2, R1, #0xc000
- CMP R2,#0
- BEQ BOTH
- AND R2, R1, #0x4000
- CMP R2,#0
- BEQ LEFT
- AND R2, R1, #0x8000
- CMP R2,#0
- BEQ RIGHT
- B CLOSE
- LEFT LDR R0,=PIOC_SODR
- LDR R1, =0x2
- STR R1, [R0]
- B CLOSERIGHT
- RIGHT LDR R0,=PIOC_SODR
- LDR R1, =0x4
- STR R1, [R0]
- B CLOSELEFT
- BOTH LDR R0,=PIOC_SODR
- LDR R1, =0x6
- STR R1, [R0]
- B LOOP
- ;===========================================================================
- STOP B STOP
- END
- UPPGIFT 2
- ;===========================================================================; Lab_2_1_student.s - Template for DAT Lab 2_1
- ;
- ; Description : A more complete template for Lab 2_1; Reference(s) : ARM IAR Assembler Reference Guide; Course : Datorteknik (DAT) DT4009
- ;
- ; Authors : Süleyman Savas
- ;
- ;
- ;=========================================================================== NAME main
- PUBLIC main
- SECTION .text : CODE (2)
- THUMB
- ;===========================================================================
- ; TODO: Find and add the correct addresses,
- ; Check sam3x datasheet - chapter 30 to find the addresses.
- PIOA_WPMR EQU 0x400E0EE4 ; Write Protect Mode RegisterPIOA_PER EQU 0x400E0E00 ; PIO Enable Register´
- PIOA_PER EQU 0x400E0E00 ; PIO Enable Register
- PIOA_ODR EQU 0x400E0E14 ; Output Disable Register
- PIOA_IDR EQU 0x400E0E44 ; Interrupt Disable Register
- PIOA_PUER EQU 0x400E0E64 ; Pull Up Enable Register
- PIOA_PDSR EQU 0x400E0E3C ; Pin Data Status Register; C port - (leds)
- PIOC_WPMR EQU 0x400E12E4 ; Write Protect Mode RegisterPIOC_PER EQU 0x400E1200 ; PIO Enable Register - Arduino Due
- PIOC_OER EQU 0x400E1210 ; Output Enable Register
- PIOC_SODR EQU 0x400E1230 ; Set Output Data Register
- PIOC_PUDR EQU 0x400E1260 ; Pull Up Disable Register
- PIOC_CODR EQU 0x400E1234 ; Clear Output Data Register; PMC
- PMC_WPMR EQU 0x400E06E4 ; PMC Write Protect Mode RegisterPMC_PCER EQU 0x400E0610 ; Peripheral Clock Enable Register 0
- PMC_PCER EQU 0x400E0610 ; Peripheral Clock Enable Register 0
- PMC_PCDR EQU 0x400E0614 ; Peripheral Clock Disable Register 0
- PMC_PCSR EQU 0x400E0618 ; Peripheral Clock Status Register 0;=======
- ; Initialization of Peripheral Clock
- main LDR R0,=PMC_PCER
- LDR R1,=(5 << 11) ; Peripheral Identifier: bit11=PIOA, bit13=PIOC
- STR R1,[R0]
- ;===========================================================================
- ; Initialization InPort
- ; TODO: Write your code here
- LDR R1,=0XC000
- LDR R0,=PIOA_PER
- STR R1,[R0]
- LDR R0,=PIOA_ODR
- STR R1,[R0]
- LDR R0,=PIOA_IDR
- STR R1,[R0]
- LDR R0,=PIOA_PUER
- STR R0,[R1]
- ; Main program
- read
- BL Read_p0
- CMP R0, #0 ; Ej tryckt => 1:a
- BNE read
- LDR R7,=1000
- BL Delay_ms
- loop B loop
- ; ------------------------------------------------------------------
- ;Subrutin Delay_ms ----------------------------------------
- ; Vänta ett antal ms
- ; Inparameter: R7 - delay i ms
- ; ---------------------------------------------------------
- DELAY_CALIB EQU 1200 ; utprovat värde (baserat på master clock – 12Mhz)
- Delay_ms
- STMFD SP!,{R0,R1}
- MOV R0,R7
- do_delay_ms
- LDR R1,=DELAY_CALIB
- loop_ms
- SUBS R1,R1,#1
- BNE loop_ms
- SUBS R0,R0,#1
- BNE do_delay_ms
- LDMFD SP!,{R0,R1}
- BX LR
- ; ---------------------------------------------------------------------------------------------------------------------
- ;Subrutin Read_p0 ---------------------------------------
- ; Avläsning av knapp i subrutin
- ; Utparametrar: R0
- ; ------------------------------------------------------
- Read_p0
- STMFD SP!,{R1}
- LDR R1,=PIOA_PDSR
- LDR R0,[R1]
- AND R0,R0,#0x00008000 ; bitmaska fram aktuell knapp
- LDMFD SP!,{R1}
- BX LR
- ; ------------------------------------------------------
- STOP B STOP
- END
- ;===========================================================================; Lab_2_1_student.s - Template for DAT Lab 2_1
- ;
- ; Description : A more complete template for Lab 2_1; Reference(s) : ARM IAR Assembler Reference Guide; Course : Datorteknik (DAT) DT4009
- ;
- ; Authors : Süleyman Savas
- ;
- ;
- ;=========================================================================== NAME main
- PUBLIC main
- SECTION .text : CODE (2)
- THUMB
- ;===========================================================================
- ; TODO: Find and add the correct addresses,
- ; Check sam3x datasheet - chapter 30 to find the addresses.
- PIOA_WPMR EQU 0x400E0EE4 ; Write Protect Mode RegisterPIOA_PER EQU 0x400E0E00 ; PIO Enable Register´
- PIOA_PER EQU 0x400E0E00 ; PIO Enable Register
- PIOA_ODR EQU 0x400E0E14 ; Output Disable Register
- PIOA_IDR EQU 0x400E0E44 ; Interrupt Disable Register
- PIOA_PUER EQU 0x400E0E64 ; Pull Up Enable Register
- PIOA_PDSR EQU 0x400E0E3C ; Pin Data Status Register; C port - (leds)
- PIOC_WPMR EQU 0x400E12E4 ; Write Protect Mode RegisterPIOC_PER EQU 0x400E1200 ; PIO Enable Register - Arduino Due
- PIOC_OER EQU 0x400E1210 ; Output Enable Register
- PIOC_SODR EQU 0x400E1230 ; Set Output Data Register
- PIOC_PUDR EQU 0x400E1260 ; Pull Up Disable Register
- PIOC_CODR EQU 0x400E1234 ; Clear Output Data Register; PMC
- PMC_WPMR EQU 0x400E06E4 ; PMC Write Protect Mode RegisterPMC_PCER EQU 0x400E0610 ; Peripheral Clock Enable Register 0
- PMC_PCER EQU 0x400E0610 ; Peripheral Clock Enable Register 0
- PMC_PCDR EQU 0x400E0614 ; Peripheral Clock Disable Register 0
- PMC_PCSR EQU 0x400E0618 ; Peripheral Clock Status Register 0;=======
- ; Initialization of Peripheral Clock
- main LDR R0,=PMC_PCER
- LDR R1,=(5 << 11) ; Peripheral Identifier: bit11=PIOA, bit13=PIOC
- STR R1,[R0]
- ;===========================================================================
- ; Initialization InPort
- ; TODO: Write your code here
- LDR R1, =0xC000
- LDR R0,=PIOA_PDSR ; Adress till PortA:s dataregister PIO_PDSR (Pin Data Status Register)
- STR R1,[R0] ; Läser från adress i R1 till R0
- LDR R0,=PIOA_PER
- STR R1,[R0]
- LDR R0,=PIOA_ODR
- STR R1,[R0]
- LDR R0,=PIOA_IDR
- STR R1,[R0]
- LDR R0,=PIOA_PUER
- STR R1,[R0]
- ;===========================================================================
- ; Turn LED off
- ; TODO: Write your code here
- ;===========================================================================
- ; Main program
- ; TODO: Write your code here
- ;LOOP //Huvudprogram "evig loop"
- //Läser av knapparna
- ;Huvudprogram -------------------------------------
- read
- BL Read_p0
- CMP R0, #0 ; Ej tryckt => 1:a
- BNE read
- LDR R7,=1000 ;11111111 ;1000 ;Mönstret i R7:s lägsta 3 bitar ska motsvara de tre lysdioderna. ;innehåller hur lång tid (i ms) som subrutinen ska ta
- BL Delay_ms ;stackpointer 0x20008000
- ;0x20007FF8*/
- loop B loop
- Led ;den ska tända resp. släcka lysdioder
- STMFD SP!,{R2}
- ; Istället för Rl skriver du de register du använder
- MOV R2,R7 ;R7 skall användas som inparameter till funktionen
- ;LDR R1,=PIOC_ODSR ; PIO PortC Output Status Register
- LDR R0,[R1]
- AND R0, R0,R2 ;#0x000000E ; Maska av bit 1-3
- LDR R1,=PIOC_CODR ; PIO PortC Clear Output Data Register
- STR R0,[R1] ; R0 skrivs tillbaks, nollställer ettor
- EOR R0, R0,R2 ;#0xE ; Inventera bit 1-3
- LDR R1,=PIOC_SODR ; PIO PortC Set Output Data Register
- STR R0,[R1] ; R0 skrivs tillbaks, ettställer nollor
- LDMFD SP!,{R1}
- ;Tänk på att spara undan de register som används inuti funktionen.
- ; Istället för Rl skriver du de register du använder
- BX LR
- DELAY_CALIB EQU 1200;22222222 ;1200
- Delay_ms
- STMFD SP!,{R0,R1} ;lr 200702EB
- MOV R0,R7
- do_delay_ms ; den yttre räknar upp till det tal som är inparameter
- LDR R1,=DELAY_CALIB
- loop_ms ;Den inre loopen tar precis 1 ms
- SUBS R1,R1,#1
- BNE loop_ms
- SUBS R0,R0,#1
- BNE do_delay_ms
- LDMFD SP!,{R0,R1}
- BX LR ;0x200702FC
- Read_p0 ;Subrutinen Read_p0 läser av en knapp (USR_RIGHT) på port A.
- STMFD SP!,{R1}
- LDR R1,=PIOA_PDSR
- LDR R0,[R1]
- AND R0, R0, #0x00008000
- ;#0x00008000 ; bitmaska fram aktuell knapp
- LDMFD SP!,{R1}
- BX LR
- ;===========================================================================
- STOP B STOP
- END
- ;===========================================================================; Lab_2_1_student.s - Template for DAT Lab 2_1
- ;
- ; Description : A more complete template for Lab 2_1; Reference(s) : ARM IAR Assembler Reference Guide; Course : Datorteknik (DAT) DT4009
- ;
- ; Authors : Süleyman Savas
- ;
- ;
- ;=========================================================================== NAME main
- PUBLIC main
- SECTION .text : CODE (2)
- THUMB
- ;===========================================================================
- ; TODO: Find and add the correct addresses,
- ; Check sam3x datasheet - chapter 30 to find the addresses.
- PIOA_WPMR EQU 0x400E0EE4 ; Write Protect Mode RegisterPIOA_PER EQU 0x400E0E00 ; PIO Enable Register´
- PIOA_PER EQU 0x400E0E00 ; PIO Enable Register
- PIOA_ODR EQU 0x400E0E14 ; Output Disable Register
- PIOA_IDR EQU 0x400E0E44 ; Interrupt Disable Register
- PIOA_PUER EQU 0x400E0E64 ; Pull Up Enable Register
- PIOA_PDSR EQU 0x400E0E3C ; Pin Data Status Register; C port - (leds)
- PIOC_WPMR EQU 0x400E12E4 ; Write Protect Mode Register
- PIOC_PER EQU 0x400E1200 ; PIO Enable Register - Arduino Due
- PIOC_OER EQU 0x400E1210 ; Output Enable Register
- PIOC_SODR EQU 0x400E1230 ; Set Output Data Register
- PIOC_PUDR EQU 0x400E1260 ; Pull Up Disable Register
- PIOC_CODR EQU 0x400E1234 ; Clear Output Data Register; PMC
- PIOC_ODSR EQU 0x400E1238
- PMC_WPMR EQU 0x400E06E4 ; PMC Write Protect Mode RegisterPMC_PCER EQU 0x400E0610 ; Peripheral Clock Enable Register 0
- PMC_PCER EQU 0x400E0610 ; Peripheral Clock Enable Register 0
- PMC_PCDR EQU 0x400E0614 ; Peripheral Clock Disable Register 0
- PMC_PCSR EQU 0x400E0618 ; Peripheral Clock Status Register 0;=======
- ; Initialization of Peripheral Clock
- main LDR R0,=PMC_PCER
- LDR R1,=(5 << 11) ; Peripheral Identifier: bit11=PIOA, bit13=PIOC
- STR R1,[R0]
- ;===========================================================================
- ; Initialization outPort
- ; TODO: Write your code here
- LDR R1, =0xE //Gröna DLED 0011
- LDR R0,=PIOC_PER ; Adress till PortA:s dataregister PIO_PDSR (Pin Data Status Register)
- STR R1,[R0] ; Läser från adress i R1 till R0
- LDR R0,=PIOC_OER
- STR R1,[R0]
- LDR R0,=PIOC_SODR
- STR R1,[R0]
- LDR R0,=PIOC_PUDR
- STR R1,[R0]
- LDR R0,=PIOC_CODR
- STR R1,[R0]
- LDR R0,=PIOC_ODSR
- STR R1,[R0]
- ;===========================================================================
- ; Turn LED off
- ; TODO: Write your code here
- ;===========================================================================
- ; Main program
- ; TODO: Write your code here
- ;LOOP //Huvudprogram "evig loop"
- //Läser av knapparna
- ;Huvudprogram -------------------------------------
- read
- LDR R7,=0x000000E
- BL Led
- LDR R7,=1000
- BL Delay_ms
- /* BL Read_p0
- CMP R0, #0 ; Ej tryckt => 1:a
- BNE read
- LDR R7,=1000 ;11111111 ;1000 ;Mönstret i R7:s lägsta 3 bitar ska motsvara de tre lysdioderna. ;innehåller hur lång tid (i ms) som subrutinen ska ta
- BL Delay_ms ;stackpointer 0x20008000
- ;0x20007FF8*/
- B read
- ;loop B loop
- Led ;den ska tända resp. släcka lysdioder
- STMFD SP!,{R2}
- ; Istället för Rl skriver du de register du använder
- MOV R2,R7 ;R7 skall användas som inparameter till funktionen
- LDR R1,=PIOC_ODSR ; PIO PortC Output Status Register
- LDR R0,[R1]
- AND R0, R0,R2 ;#0x000000E ; Maska av bit 1-3
- LDR R1,=PIOC_CODR ; PIO PortC Clear Output Data Register
- STR R0,[R1] ; R0 skrivs tillbaks, nollställer ettor
- EOR R0, R0,R2 ;#0xE ; Inventera bit 1-3
- LDR R1,=PIOC_SODR ; PIO PortC Set Output Data Register
- STR R0,[R1] ; R0 skrivs tillbaks, ettställer nollor
- LDMFD SP!,{R1}
- ;Tänk på att spara undan de register som används inuti funktionen.
- ; Istället för Rl skriver du de register du använder
- BX LR
- DELAY_CALIB EQU 1200;22222222 ;1200
- Delay_ms
- STMFD SP!,{R0,R1} ;lr 200702EB
- MOV R0,R7
- do_delay_ms ; den yttre räknar upp till det tal som är inparameter
- LDR R1,=DELAY_CALIB
- loop_ms ;Den inre loopen tar precis 1 ms
- SUBS R1,R1,#1
- BNE loop_ms
- SUBS R0,R0,#1
- BNE do_delay_ms
- LDMFD SP!,{R0,R1}
- BX LR ;0x200702FC
- Read_p0 ;Subrutinen Read_p0 läser av en knapp (USR_RIGHT) på port A.
- STMFD SP!,{R1}
- LDR R1,=PIOA_PDSR
- LDR R0,[R1]
- AND R0, R0, #0x00008000
- ;#0x00008000 ; bitmaska fram aktuell knapp
- LDMFD SP!,{R1}
- BX LR
- ;===========================================================================
- STOP B STOP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement