View difference between Paste ID: NP8hY91L and HxvTcs2W
SHOW: | | - or go back to the newest paste.
1
;******************** (C) COPYRIGHT HAW-Hamburg ********************************
2
;* File Name          : main.s
3
;* Author             : Alfred Lohmann
4
;* Author             : Tobias Jaehnichen	
5
;* Version            : V2.0
6
;* Date               : 23.04.2017
7
;* Description        : This is a simple main.
8
;					  : The output is send to UART 1. Open Serial Window when 
9
;					  : when debugging. Select UART #1 in Serial Window selection.
10
;					  :
11
;					  : Replace this main with yours.
12
;
13
;*******************************************************************************
14
15
	EXTERN Init_TI_Board		; Initialize the serial line
16
	EXTERN ADC3_CH7_DMA_Config  ; Initialize the ADC
17
	EXTERN	initHW				; Init Timer
18
	EXTERN	puts				; C output function
19
	EXTERN	TFT_puts			; TFT output function
20
	EXTERN  TFT_cls				; TFT clear function
21
	EXTERN  TFT_gotoxy      	; TFT goto x y function  
22
	EXTERN  Delay				; Delay (ms) function
23
	EXTERN GPIO_G_SET			; Set output-LEDs
24
	EXTERN GPIO_G_CLR			; Clear output-LEDs
25
	EXTERN GPIO_G_PIN			; Output-LEDs status
26
	EXTERN GPIO_E_PIN			; Button status
27
	EXTERN ADC3_DR				; ADC Value (ADC3_CH7_DMA_Config has to be called before)
28
    EXTERN timer
29
	LED20	EQU (0x01 << 7)			
30
	LED19	EQU (0x01 << 6)
31
	LED2019 EQU (0x11 << 6)
32
;********************************************
33
; Data section, aligned on 4-byte boundery
34
;********************************************
35
	
36
	AREA MyData, DATA, align = 2
37
	
38
	GLOBAL text
39
	
40
text	DCB	"Hallo TI-Labor.\n\r",0
41
timeralt    DCW 0
42
timeraktuell    DCD 0
43
minZiffer	DCD 6000000	 	;Faktor zur Berechnung der Minuten
44
sekZiffer	DCD 100000		;Faktor zur Berechnung der Sekunden
45
miliZiffer	DCD 1000		;Faktor zur Berechnung der Milisekunden
46
zeitReset	DCB "00:00.00"
47
zeitAnzeige DCB "00:00.00"
48
49
;********************************************
50
; Code section, aligned on 8-byte boundery
51
;********************************************
52
53
	AREA |.text|, CODE, READONLY, ALIGN = 3
54
55
;--------------------------------------------
56
; main subroutine
57
;--------------------------------------------
58
	EXPORT main [CODE]
59
	
60
main	PROC
61
62
		BL	Init_TI_Board	; Initialize the serial line to TTY
63
							; for compatability to out TI-C-Board
64
		BL	initHW			; Timer init
65
        MOV R11,#1			;Aktueller Zustand(R11) zu init
66
loop    BL CheckKey
67
        CMP R11,#1  		;Zustandsprüfer für INIT
68
        BLEQ INIT			;Wenn true -> Sprung zu INIT
69
        
70
        CMP R11,#2			;Zustandsprüfer für HOLD
71
        BLEQ HOLD			;Wenn true -> Sprung zu HOLD
72
		CMP R11,#3			;Zustandsprüfer für RUNNING
73
        BLEQ RUNNING		;Wenn true -> Sprung zu RUNNING
74
        B loop
75
76
;___________________________
77
timercheck	PROC
78
    PUSH{R4-R12,LR}			;Callee Save
79
            LDR R4,=timer	;R4= Adresse von timer
80
            LDRH R5,[R4]	;R5= Wert von Timer	
81
            
82
            LDR R6,=timeralt ;R6= Adresse von timeralt	
83
            LDR R7,[R6]		;R7= Wert von timeralt
84
            
85
            STRH R5,[R6]	;Wert von timer wird in timeralt gespeichert
86
            
87
            SUB R0,R5,R7	;Differenz von timer und timeralt wird in R0 gespeichert
88
            MOV R8,#0xFFFF	;R8 wird Konstante #0xFFFF zugewiesen (Bitmaske zur Berechnung der richtigen Zeit bei timer Overflow)
89
            AND R9,R0,R8	;R9 = verstrichene Zeit Timer-timeralt
90
            
91
            LDR R10,=timeraktuell	;R10= Adresse von timeraktuell
92
            LDR R11,[R10]	;R11= Wert von timeraktuell
93
            ADD R11,R9		;timeraktuell += VerstricheneZeit
94
            STR R11,[R10]	;timer erhöht um verstrichene Zeit wird in timeraktuell gespeichert
95
            POP{R4-R12,PC}	;Register werden restauriert
96
            ENDP
97
            
98
;________________________
99
displaytime PROC
100-
    PUSH{R4-R12,LR}
100+
    PUSH{R4-R12,LR}					;Callee Save
101-
            LDR R10,=timeraktuell
101+
102-
            LDR R0,[R10]
102+
            LDR R0,[R10]			;R0= Wert von timeraktuell
103-
            LDR R9,=zeitAnzeige
103+
            LDR R9,=zeitAnzeige		;R9= Adresse von zeitAnzeige
104
            
105-
minAnfang   LDR R1,=minZiffer
105+
minAnfang   LDR R1,=minZiffer		;R1= Adresse von minZiffer
106
            LDR R1,[R1]				;R1= Wert von minZiffer (Faktor zur Berechnung der Minuten)
107-
            UDIV R3,R0,R1
107+
            UDIV R3,R0,R1			;Unsigned Division, R3= timeraktuell/minZiffer
108
109-
minZehner   MOV R5,#10
109+
minZehner   MOV R5,#10				;R5=10
110
            UDIV R4,R3,R5			;Unsigned Division, R4= R3/10
111
            MOV R6,R4				;R6=R4
112
            ADD R4,#'0'				;R4+= ASCII Wert von 0
113-
            STRB R4,[R9]
113+
            STRB R4,[R9]			;Byte von R4 wird gespeichert in R9 (zeitAnzeige)
114-
;minZiffer
114+
minEiner
115
            MUL R6,R5				;Multiply, R6=R6*10 
116
            MOV R7,R3				;R7=R3 (timeraktuell/minZiffer)
117
            SUB R7,R6				;Substract, R7=R7-R6
118
            ADD R7,#'0'				;R7+= ASCII Wert von 0
119-
            STRB R7,[R9,#1]
119+
            STRB R7,[R9,#1]			;Byte von R7 wird gespeichert in R9 um eine Stelle nach recht (zeitAnzeige)
120
       
121-
minEnd      MUL R3,R3,R1
121+
minEnd      MUL R3,R3,R1			;Multiply, R3= R3*minZiffer
122
            SUB R3,R0,R3			;R3= timeraktuell - R3 (Rest der Division timeraktuell/minZiffer bleibt über)
123
            
124
sekAnfang   
125
            LDR r1,=sekZiffer
126
            LDR R1,[R1]
127
            MOV R0,R3
128
            UDIV R3,R3,R1
129
                       
130
sekZehner   MOV R5,#10
131
            UDIV R4,R3,R5
132
            MOV R6,R4
133
            ADD R4,#'0'
134
            STRB R4,[R9,#3]
135-
;sekZiffer            
135+
sekEiner         
136
            MUL R6,R5
137
            MOV R7,R3
138
            SUB R7,R6
139
            ADD R7,#'0'
140
            STRB R7,[R9,#4]
141
            
142
sekEnd      MUL R3,R3,R1
143
            SUB R3,R0,R3
144
            
145
            
146
miliAnfang  LDR r1,=miliZiffer
147
            LDR R1,[R1]
148
            UDIV R3,R3,R1
149
150
miliZehner  MOV R5,#10
151
            UDIV R4,R3,R5
152
            MOV R6,R4
153
            ADD R4,#'0'
154
            STRB R4,[R9,#6]
155-
;miliZiffer            
155+
miliEiner            
156
            MUL R6,R5
157
            MOV R7,R3
158
            SUB R7,R6
159
            ADD R7,#'0'
160
            STRB R7,[R9,#7]
161
162
            POP{R4-R12,PC}
163
            ENDP
164
            
165
;_______________________________            
166
displayT	PROC
167
	PUSH{R4,LR} 		
168
            MOV R4,R0	;R4= Adresse von zeitAnzeige
169
			MOV R0,#2 	;x Koordinate
170
            MOV r1,#2 	;y Koordinate
171
            ;MOV R5,R11	;R5=R11
172
            BL TFT_gotoxy
173
            ;MOV R11,R5	;R11=R5
174
            MOV R0,R4	;R0= Adresse von zeitAnzeige
175
            BL TFT_puts
176
			POP{R4,PC}
177
			ENDP
178
;______________________
179
HOLD    PROC
180
    PUSH{R4-R12,LR}		;Callee Save
181
    LDR R2,=LED20		;R2= Wert von LED20
182
    LDR R3,=LED19		;R3= Wert von LED19
183
    BL setled			
184
    BL timercheck
185
    BL displaytime
186
    POP{R4-R12,PC}		;Register werden restauriert
187
    ENDP
188
;________________________
189
RUNNING PROC
190
    PUSH{R4-R12,LR}		;Callee Save
191
    LDR R2,=LED20		;R2= Wert von LED20;
192
    BL setled
193
    BL timercheck
194
    BL displaytime
195
    LDR R0,=zeitAnzeige	;R0= Adresse von zeitAnzeige
196
    BL displayT
197
    POP{R4-R12,PC}		;Register restaurieren 
198
    ENDP
199
    
200
    
201
202
;_______________________
203
INIT PROC
204
	PUSH{R4-R12,LR}			;Callee Save
205
    BL timercheck
206
	LDR R0,=zeitReset		;R0= Adresse von zeitReset
207
    LDR R0,[R0]				;R0= Wert von zeitReset
208
    LDR R2,=zeitAnzeige		;R2= Adresse von zeitAnzeige
209
    STR R0,[R2]				;R0 wird in zeitAnzeige gespeichert
210
    LDR R0,=zeitAnzeige		;R0= Adresse von zeitAnzeige
211
    BL displayT
212
    MOV R2,#0 				;led ausschalte vorbereiten
213
    MOV R3,#0 				;led ausschalten vorbereiten
214
    BL setled
215
    
216
    LDR R0,=timeraktuell	;R0= Adresse von timeraktuell
217
    MOV R1,#0				;R1=0
218
    STR R1,[R0]				;timeraktuell = 0
219
    
220
	POP{R4-R12,PC}			;Register werden restauriert
221
	ENDP
222
;__________________
223
CheckKey	PROC
224
        PUSH{R4,R5-R8,LR}		;Callee Save
225
        LDR R4,=GPIO_E_PIN		;R4 belegt mit adresse von Tastendruck
226
        LDRB R5,[R4]			;Wert Tastendruck -> R5
227
		CMP R11,#1				;Prüfe ob Zustand init
228
        BEQ check01				;Wenn R11==1 ->Sprung zu check01
229
		TST R5,#0x1<<5 			;Ist R5 Taste 5 Prüfer (and & cmp) 
230
		MOVEQ R11,#1			;Wenn True dann R11=1 -> Zustand INIT
231
		TST R5,#0x1<<6 			;Ist R5 Taste 6 Prüfer (and & cmp) 
232
		MOVEQ R11,#2			;Wenn true dann R11=2 -> Zustand HOLD (Nicht erreichbar von INIT)
233
check01	TST R5,#0x1<<7 			;Ist R5 Taste 7 Prüfer (and & cmp)
234
		MOVEQ R11,#3			;Wenn true dann R11=3 -> Zustand RUNNING
235
        
236
		POP {R4,R5-R8,PC} ;		;Register werden restauriert
237
		ENDP
238
;______________________
239
setled		PROC 				;in R2 = Wert für LED 20 in R3 = Wert für LED19
240
    PUSH{R4-R12,LR}       		;Callee Save    
241
            
242
			LDR R0,=LED20		;R0= Wert von LED20
243
if01_LED20	
244
			CMP R0,R2			;R0==R2
245
			BEQ then01_LED20 	;Wenn true dann Sprung zu then
246
else01_LED20
247
			LDR R1,=GPIO_G_CLR	;wenn False R1= Adresse von GPIO_G_CLR
248
			B end01_LED20
249
then01_LED20
250
			LDR R1,=GPIO_G_SET	;R1= Adresse von GPIO_G_SET
251
end01_LED20
252
			STRH R0,[R1]		;GPIO_G_CLR/SET für LED20 (LED20 an/aus)
253
if02_LED19
254
			LDR R0,=LED19
255
			CMP R0,R3
256
			BEQ then02_LED19
257
else02_LED19
258
			LDR r1,=GPIO_G_CLR
259
			B end02_LED19
260
then02_LED19
261
			LDR R1,=GPIO_G_SET
262
end02_LED19
263
			STRH R0,[R1]
264
            POP{R4-R12,PC}
265
266
			ENDP
267
	
268
		ALIGN
269
       
270
		END