Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;******************** (C) COPYRIGHT HAW-Hamburg ********************************
- ;* File Name : main.s
- ;* Author : Alfred Lohmann
- ;* Author : Tobias Jaehnichen
- ;* Version : V2.0
- ;* Date : 23.04.2017
- ;* Description : This is a simple main.
- ; : The output is send to UART 1. Open Serial Window when
- ; : when debugging. Select UART #1 in Serial Window selection.
- ; :
- ; : Replace this main with yours.
- ;
- ;*******************************************************************************
- EXTERN Init_TI_Board ; Initialize the serial line
- EXTERN ADC3_CH7_DMA_Config ; Initialize the ADC
- EXTERN initHW ; Init Timer
- EXTERN puts ; C output function
- EXTERN TFT_puts ; TFT output function
- EXTERN TFT_cls ; TFT clear function
- EXTERN TFT_gotoxy ; TFT goto x y function
- EXTERN Delay ; Delay (ms) function
- EXTERN GPIO_G_SET ; Set output-LEDs
- EXTERN GPIO_G_CLR ; Clear output-LEDs
- EXTERN GPIO_G_PIN ; Output-LEDs status
- EXTERN GPIO_E_PIN ; Button status
- EXTERN ADC3_DR ; ADC Value (ADC3_CH7_DMA_Config has to be called before)
- EXTERN timer
- LED20 EQU (0x01 << 7)
- LED19 EQU (0x01 << 6)
- LED2019 EQU (0x11 << 6)
- ;********************************************
- ; Data section, aligned on 4-byte boundery
- ;********************************************
- AREA MyData, DATA, align = 2
- GLOBAL text
- text DCB "Hallo TI-Labor.\n\r",0
- timeralt DCW 0
- timeraktuell DCD 0
- minZiffer DCD 6000000 ;Faktor zur Berechnung der Minuten
- sekZiffer DCD 100000 ;Faktor zur Berechnung der Sekunden
- miliZiffer DCD 1000 ;Faktor zur Berechnung der Milisekunden
- zeitReset DCB "00:00.00",0
- zeitAnzeige DCB "00:00.00",0
- ;********************************************
- ; Code section, aligned on 8-byte boundery
- ;********************************************
- AREA |.text|, CODE, READONLY, ALIGN = 3
- ;--------------------------------------------
- ; main subroutine
- ;--------------------------------------------
- EXPORT main [CODE]
- main PROC
- BL Init_TI_Board ; Initialize the serial line to TTY
- ; for compatability to out TI-C-Board
- BL initHW ; Timer init
- MOV R11,#1 ;Aktueller Zustand(R11) zu INIT
- loop BL CheckKey
- CMP R11,#1 ;Zustandsprüfer für INIT
- BLEQ INIT ;Wenn true -> Sprung zu INIT
- CMP R11,#2 ;Zustandsprüfer für HOLD
- BLEQ HOLD ;Wenn true -> Sprung zu HOLD
- CMP R11,#3 ;Zustandsprüfer für RUNNING
- BLEQ RUNNING ;Wenn true -> Sprung zu RUNNING
- B loop
- ;___________________________
- timercheck PROC
- PUSH{R4-R12,LR} ;Callee Save
- LDR R4,=timer ;R4= Adresse von timer
- LDRH R5,[R4] ;R5= Wert von Timer
- LDR R6,=timeralt ;R6= Adresse von timeralt
- LDR R7,[R6] ;R7= Wert von timeralt
- STRH R5,[R6] ;Wert von timer wird in timeralt gespeichert
- SUB R0,R5,R7 ;Differenz von timer und timeralt wird in R0 gespeichert
- MOV R8,#0xFFFF ;R8 wird Konstante #0xFFFF zugewiesen (Bitmaske zur Berechnung der richtigen Zeit bei timer Overflow)
- AND R9,R0,R8 ;R9 = verstrichene Zeit Timer-timeralt
- LDR R10,=timeraktuell ;R10= Adresse von timeraktuell
- LDR R11,[R10] ;R11= Wert von timeraktuell
- ADD R11,R9 ;timeraktuell += VerstricheneZeit
- STR R11,[R10] ;timer erhöht um verstrichene Zeit wird in timeraktuell gespeichert
- POP{R4-R12,PC} ;Register werden restauriert
- ENDP
- ;________________________
- displaytime PROC
- PUSH{R4-R12,LR} ;Callee Save
- LDR R10,=timeraktuell ;R10= Adresse von timeraktuell
- LDR R0,[R10] ;R0= Wert von timeraktuell
- LDR R9,=zeitAnzeige ;R9= Adresse von zeitAnzeige
- minAnfang LDR R1,=minZiffer ;R1= Adresse von minZiffer
- LDR R1,[R1] ;R1= Wert von minZiffer (Faktor zur Berechnung der Minuten)
- UDIV R3,R0,R1 ;Unsigned Division, R3= timeraktuell/minZiffer
- minZehner MOV R5,#10 ;R5=10
- UDIV R4,R3,R5 ;Unsigned Division, R4= R3/10
- MOV R6,R4 ;R6=R4
- ADD R4,#'0' ;R4+= ASCII Wert von 0
- STRB R4,[R9] ;Byte von R4 wird gespeichert in R9 (zeitAnzeige)
- minEiner
- MUL R6,R5 ;Multiply, R6=R6*10
- MOV R7,R3 ;R7=R3 (timeraktuell/minZiffer)
- SUB R7,R6 ;Substract, R7=R7-R6
- ADD R7,#'0' ;R7+= ASCII Wert von 0
- STRB R7,[R9,#1] ;Byte von R7 wird gespeichert in R9 um eine Stelle nach recht (zeitAnzeige)
- minEnd MUL R3,R3,R1 ;Multiply, R3= R3*minZiffer
- SUB R3,R0,R3 ;R3= timeraktuell - R3 (Rest der Division timeraktuell/minZiffer bleibt über)
- sekAnfang
- LDR r1,=sekZiffer
- LDR R1,[R1]
- MOV R0,R3
- UDIV R3,R3,R1
- sekZehner MOV R5,#10
- UDIV R4,R3,R5
- MOV R6,R4
- ADD R4,#'0'
- STRB R4,[R9,#3]
- sekEiner
- MUL R6,R5
- MOV R7,R3
- SUB R7,R6
- ADD R7,#'0'
- STRB R7,[R9,#4]
- sekEnd MUL R3,R3,R1
- SUB R3,R0,R3
- miliAnfang LDR r1,=miliZiffer
- LDR R1,[R1]
- UDIV R3,R3,R1
- miliZehner MOV R5,#10
- UDIV R4,R3,R5
- MOV R6,R4
- ADD R4,#'0'
- STRB R4,[R9,#6]
- miliEiner
- MUL R6,R5
- MOV R7,R3
- SUB R7,R6
- ADD R7,#'0'
- STRB R7,[R9,#7]
- POP{R4-R12,PC}
- ENDP
- ;_______________________________
- displayT PROC
- PUSH{R4,LR}
- MOV R4,R0 ;R4= Adresse von zeitAnzeige
- MOV R0,#2 ;x Koordinate
- MOV r1,#2 ;y Koordinate
- ;MOV R5,R11 ;R5=R11
- BL TFT_gotoxy
- ;MOV R11,R5 ;R11=R5
- MOV R0,R4 ;R0= Adresse von zeitAnzeige
- BL TFT_puts
- POP{R4,PC}
- ENDP
- ;______________________
- HOLD PROC
- PUSH{R4-R12,LR} ;Callee Save
- LDR R2,=LED20 ;R2= Wert von LED20
- LDR R3,=LED19 ;R3= Wert von LED19
- BL setled
- BL timercheck
- BL displaytime
- POP{R4-R12,PC} ;Register werden restauriert
- ENDP
- ;________________________
- RUNNING PROC
- PUSH{R4-R12,LR} ;Callee Save
- LDR R2,=LED20 ;R2= Wert von LED20;
- BL setled
- BL timercheck
- BL displaytime
- LDR R0,=zeitAnzeige ;R0= Adresse von zeitAnzeige
- BL displayT
- POP{R4-R12,PC} ;Register restaurieren
- ENDP
- ;_______________________
- INIT PROC
- PUSH{R4-R12,LR} ;Callee Save
- BL timercheck
- LDR R0,=zeitReset ;R0= Adresse von zeitReset
- ;LDR R0,[R0] ;R0= Wert von zeitReset
- ;LDR R2,=zeitAnzeige ;R2= Adresse von zeitAnzeige
- ;STR R0,[R2] ;R0 wird in zeitAnzeige gespeichert
- ;LDR R0,=zeitAnzeige ;R0= Adresse von zeitAnzeige
- BL displayT
- MOV R2,#0 ;led ausschalte vorbereiten
- MOV R3,#0 ;led ausschalten vorbereiten
- BL setled
- LDR R0,=timeraktuell ;R0= Adresse von timeraktuell
- MOV R1,#0 ;R1=0
- STR R1,[R0] ;timeraktuell = 0
- POP{R4-R12,PC} ;Register werden restauriert
- ENDP
- ;__________________
- CheckKey PROC
- PUSH{R4-R8,LR} ;Callee Save
- LDR R4,=GPIO_E_PIN ;R4 belegt mit adresse von Tastendruck
- LDRB R5,[R4] ;Wert Tastendruck -> R5
- CMP R11,#1 ;Prüfe ob Zustand init
- BEQ check01 ;Wenn R11==1 ->Sprung zu check01
- TST R5,#0x1<<5 ;Ist R5 Taste 5 Prüfer (and & cmp)
- MOVEQ R11,#1 ;Wenn True dann R11=1 -> Zustand INIT
- TST R5,#0x1<<6 ;Ist R5 Taste 6 Prüfer (and & cmp)
- MOVEQ R11,#2 ;Wenn true dann R11=2 -> Zustand HOLD (Nicht erreichbar von INIT)
- check01 TST R5,#0x1<<7 ;Ist R5 Taste 7 Prüfer (and & cmp)
- MOVEQ R11,#3 ;Wenn true dann R11=3 -> Zustand RUNNING
- POP {R4,R5-R8,PC} ; ;Register werden restauriert
- ENDP
- ;______________________
- setled PROC ;in R2 = Wert für LED 20 in R3 = Wert für LED19
- PUSH{R4-R12,LR} ;Callee Save
- LDR R0,=LED20 ;R0= Wert von LED20
- if01_LED20
- CMP R0,R2 ;R0==R2
- BEQ then01_LED20 ;Wenn true dann Sprung zu then
- else01_LED20
- LDR R1,=GPIO_G_CLR ;wenn False R1= Adresse von GPIO_G_CLR
- B end01_LED20
- then01_LED20
- LDR R1,=GPIO_G_SET ;R1= Adresse von GPIO_G_SET
- end01_LED20
- STRH R0,[R1] ;GPIO_G_CLR/SET für LED20 (LED20 an/aus)
- if02_LED19
- LDR R0,=LED19
- CMP R0,R3
- BEQ then02_LED19
- else02_LED19
- LDR r1,=GPIO_G_CLR
- B end02_LED19
- then02_LED19
- LDR R1,=GPIO_G_SET
- end02_LED19
- STRH R0,[R1]
- POP{R4-R12,PC}
- ENDP
- ALIGN
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement