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 |