Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.91 KB | None | 0 0
  1. ;******************** (C) COPYRIGHT HAW-Hamburg ********************************
  2. ;* File Name : main.s
  3. ;* Author : Carl Kaloff
  4. ;* Author :
  5. ;* Version : V2.0
  6. ;* Date : 25.06.2019
  7. ;* Description : GTP03, Stoppuhr
  8. ;
  9. ;*******************************************************************************
  10.  
  11. EXTERN Init_TI_Board ; Initialize the serial line
  12. EXTERN ADC3_CH7_DMA_Config ; Initialize the ADC
  13. EXTERN initHW ; Init Timer
  14. EXTERN puts ; C output function
  15. EXTERN TFT_puts ; TFT output function
  16. EXTERN TFT_cls ; TFT clear function
  17. EXTERN TFT_gotoxy ; TFT goto x y function
  18. EXTERN Delay ; Delay (ms) function
  19. EXTERN GPIO_G_SET ; Set output-LEDs
  20. EXTERN GPIO_G_CLR ; Clear output-LEDs
  21. EXTERN GPIO_G_PIN ; Output-LEDs status
  22. EXTERN GPIO_E_PIN ; Button status
  23. EXTERN ADC3_DR ; ADC Value (ADC3_CH7_DMA_Config has to be called before)
  24. EXTERN timer ; Timer Register
  25.  
  26. ;********************************************
  27. ; Data section, aligned on 4-byte boundery
  28. ;********************************************
  29.  
  30. AREA MyData, DATA, align = 2
  31.  
  32. ;-----------------------Konstante Werte---------------------------------------------------------
  33.  
  34. Init EQU 0
  35. Running EQU 1
  36. Hold EQU 2
  37. LedOn EQU 0
  38. LedOff EQU 1
  39. NichtGedrueckt EQU 0
  40. Gedrueckt EQU 1
  41. Taste5 EQU 5
  42. Taste6 EQU 6
  43. Taste7 EQU 7
  44. LedD19 EQU 6 ;Position der LED19
  45. LedD20 EQU 7 ;Position der LED20
  46. yStartPos EQU 8
  47. xStartPos EQU 18
  48. ticksIn10Min EQU 100000
  49. overflow EQU 0x10000
  50. zeitAlsText DCB "00:00:00",0
  51.  
  52. ;********************************************
  53. ; Code section, aligned on 8-byte boundery
  54. ;********************************************
  55.  
  56. AREA |.text|, CODE, READONLY, ALIGN = 3
  57.  
  58.  
  59.  
  60. ;********************************************
  61. ; main subroutine
  62. ;********************************************
  63.  
  64. EXPORT main [CODE]
  65.  
  66. ;-----------------------Geteilte Register-------------------------------------------------------
  67.  
  68. gesamterTakt RN 3
  69. Betriebszustand RN 5
  70. aktuellerTakt RN 8
  71. alterTakt RN 9
  72.  
  73. ;---------------------------Main-------------------------------------------------------------------
  74.  
  75. main PROC
  76.  
  77. BL Init_TI_Board ;Initialize the serial line to TTY
  78. ;for compatability to out TI-C-Board
  79. BL initHW ;Timer init
  80. BL RESETTIME ;Springe zur resetTime, setze Zeitanzeige auf Startposition
  81. MOV Betriebszustand, #Init ;Bewege 0 in Register 5
  82. LDR r7, =zeitAlsText ;Lädt die Adresse von zeitAlsText in Register 7
  83. LDR r11, =timer ;Lädt die Adresse des Timers in Register 11
  84.  
  85. ;-----------------------Superloop-------------------------------------------------------------------
  86.  
  87. Superloop
  88.  
  89. ;************************************INIT***********************************************************
  90.  
  91. INIT_if CMP R5, #Init ;Checkt ob Init der aktuelle Betriebszustand ist (0)
  92. BNE RUNNING_if ;Wenn nicht, springe zu Label Running_if
  93. BL RESETTIME ;Wenn ja, setze Zeitanzeige auf Startposition...
  94. BL DISPLAYTIME ;...und übergebe die Zeit an das Display
  95.  
  96. MOV R0, #LedD19 ;Speichert die Position von LED19 in Register 0
  97. MOV R1, #LedOff ;Off-Zustand in Register 1 speichern, sprich: LED19 aus!
  98. BL SETLED ;Definierte LED Einstellung am Board ausführen, Sprung ins Unterprogramm
  99.  
  100. MOV R0, #LedD20 ;Speichert die Position von LED20 in Register 0
  101. MOV R1, #LedOff ;Off-Zustand in Register 1 speichern, sprich: LED20 aus!
  102. BL SETLED ;Definierte LED Einstellung am Board ausführen, Sprung ins Unterprogramm
  103.  
  104. TasteS7_if MOV R0, #Taste7 ;Lädt die Position von Taste 7 in Register 0
  105. BL CHECKKEY ;Liest die Taste 7 aus, Sprung ins Unterprogramm
  106. CMP R0, #Gedrueckt ;Prüft ob die Taste 7 gedrückt wurde
  107. BNE Ende_INIT ;Wenn nicht, springe zum Ende von Init
  108. MOV Betriebszustand, #Running ;Wenn ja, änder den Betriebszustand zu Running (1)
  109.  
  110. Ende_INIT BAL Ende_Superloop ;Springe zum Ende dieses Superloops
  111.  
  112. ;************************************RUNNING********************************************************
  113.  
  114. RUNNING_if CMP Betriebszustand, #Running ;Checkt, ob Running der aktuelle Betriebzustand ist (1)
  115. BNE HOLD_if ;Wenn nicht, springe zu Label HOLD_if
  116. BL CHECKTIMER ;Prüfe die Zeitangabe, Springe zum Unterprogramm
  117. BL TIMETOSTRING ;Konvertier den Takt in String, Springe zu Unterprogramm
  118. BL DISPLAYTIME ;Gebe die Zeit auf dem Display aus, SPringe zu Unterprogramm
  119.  
  120. MOV R0, #LedD19 ;Speichert die Position von LED19 in Register 0
  121. MOV R1, #LedOff ;Off-Zustand in Register 1 speichern, sprich: LED19 aus!
  122. BL SETLED ;Definierte LED Einstellung am Board ausführen, Sprung ins Unterprogramm
  123.  
  124. MOV R0, #LedD20 ;Speichert die Position von LED20 in Register 0
  125. MOV R1, #LedOn ;On-Zustand in Register 1 speichern, sprich: LED20 an!
  126. BL SETLED ;Definierte LED Einstellung am Board ausführen, Sprung ins Unterprogramm
  127.  
  128. TasteS6_if MOV R0, #Taste6 ;Lädt die Position von Taste 6 in Register 0
  129. BL CHECKKEY ;Liest die Taste 6 aus, Sprung ins Unterprogramm
  130. CMP R0, #Gedrueckt ;Prüft ob die Taste 6 gedrückt wurde
  131. BNE End_Taste6 ;Wenn nicht, springe zum Ende von Taste 6
  132. MOV Betriebszustand, #Hold ;Wenn ja, änder den Betriebszustand zu Hold (2)
  133. End_Taste6
  134.  
  135. TasteS5_if MOV R0, #Taste5 ;Lädt die Position von Taste 5 in Register 0
  136. BL CHECKKEY ;Liest die Taste 5 aus, Sprung ins Unterprogramm
  137. CMP R0, #Gedrueckt ;Prüft ob die Taste 5 gedrückt wurde
  138. BNE Ende_HOLD ;Wenn nicht, springe zum Ende von Hold
  139. MOV Betriebszustand, #Init ;Wenn ja, änder den Betriebszustand zu Init (0)
  140.  
  141. Ende_HOLD BAL Ende_Superloop ;Springe zum Ende dieses Superloops
  142.  
  143. ;************************************HOLD***********************************************************
  144.  
  145. HOLD_if CMP Betriebszustand, #Hold ;Checkt, ob Hold der aktuelle Betriebszustand ist (2)
  146. BNE Ende_Superloop ;Wenn nein, springe zum Ende des aktuellen Superloops
  147. BL CHECKTIMER ;Prüfe die Zeitangabe, Springe zum Unterprogramm
  148.  
  149. MOV R0, #LedD19 ;Speichert die Position von LED19 in Register 0
  150. MOV R1, #LedOn ;On-Zustand in Register 1 speichern, sprich: LED19 an!
  151. BL SETLED ;Definierte LED Einstellung am Board ausführen, Sprung ins Unterprogramm
  152.  
  153. TasteS5B_if MOV R0, #Taste5 ;Lädt die Position von Taste 5 in Register 0
  154. BL CHECKKEY ;Liest die Taste 5 aus, Sprung ins Unterprogramm
  155. CMP R0, #Gedrueckt ;Prüft ob die Taste 5 gedrückt wurde
  156. BNE End_Taste5 ;Wenn nicht, springe zum Ende von Hold
  157. MOV Betriebszustand, #Init ;Wenn ja, änder den Betriebszustand zu Init (0)
  158. End_Taste5
  159.  
  160. TasteS7B_if MOV R0, #Taste7 ;Lädt die Position von Taste 7 in Register 0
  161. BL CHECKKEY ;Liest die Taste 7 aus, Sprung ins Unterprogramm
  162. CMP R0, #Gedrueckt ;Prüft ob die Taste 7 gedrückt wurde
  163. BNE End_Taste7 ;Wenn nicht, springe zum Ende von Init
  164. MOV Betriebszustand, #Running ;Wenn ja, änder den Betriebszustand zu Running (1)
  165. End_Taste7
  166.  
  167. Ende_Superloop BAL Superloop ;Springe zum Anfang des Superloops
  168.  
  169. ENDP
  170.  
  171. ;----------------------------LED-------------------------------------------------------------------------
  172. SETLED PROC ;In diesem Unterprogramm werden LEDs am Board an oder ausgemacht
  173. PUSH {R2-R4,LR} ;Register 2-4 werden auf den Stack gepusht um später unverändert weiterverwendet werden zu können
  174. MOV R2,#1 ;1 Bit wird in Register 2 geladen...Ž
  175. LSL R2,R0 ;...und um den Wert der aktuell in R0 steht, nach links geshiftet.
  176.  
  177. if_01 CMP R1,#1 ;ist die LED gedrückt (0)?
  178. BEQ then_01 ;Nein, nicht gedrückt. Springe zu then_01.
  179. BNE else_01 ;Ja, gedrückt. Springe zu else_01.
  180. then_01 LDR R3,=GPIO_G_SET ;Adresse von GPIO_G_SET wird in R3 gespeichert
  181. b endif_01
  182. else_01 LDR R3,=GPIO_G_CLR ;Adresse von GPIO_G_CLR wird in R3 gespeichert
  183.  
  184. endif_01
  185. STRH R2,[R3] ;Hier wird die LED über die vorher erstellte Bitmaske an der richtigen STelle angesteuert
  186. POP {R2-R4,LR}
  187. BX LR
  188. ENDP
  189. ;----------------------------Taste-checken-------------------------------------------------------------------------
  190. CHECKKEY PROC
  191. PUSH {R2,LR}
  192. MOV R1,#1
  193. LSL R1,R0
  194. LDR R2,=GPIO_E_PIN
  195. LDR R2,[R2]
  196. ANDS R2,R1
  197. MOVEQ R0,#1
  198. MOVNE R0,#0
  199. POP {R2,LR}
  200. BX LR
  201. ENDP
  202. ;----------------------------Timer-------------------------------------------------------------------------
  203. CHECKTIMER PROC
  204. PUSH {R12,LR}
  205. LDRH aktuellerTakt,[R11] ;Speichert den aktuellen timer-Wert in aktuellerTakt (Register 8)
  206. CMP aktuellerTakt,alterTakt ;Vergleicht den aktuellen Takt mit dem alten Takt (Register 9)
  207. ADDLO R10,#overflow ;Wenn der aktuelle Takt < als der alte Takt ist, haben wir einen Overflow und addieren die Konstante 0x10000 in Register 10
  208. MOV alterTakt, aktuellerTakt ;Speichert den Wert des aktuellen Taktes als alten Takt
  209. POP {R12,LR}
  210. BX LR ;Springt zurück in den Superloop
  211. ENDP
  212.  
  213. ;----------------------------Zeit-als-String-------------------------------------------------------------------------
  214. TIMETOSTRING PROC
  215. PUSH {R5,R6,R7,R11,R12,LR} ;Um nichts an Werten zu verlieren speichern wir die Register 4-12 im Stack
  216. LDR R7, =zeitAlsText ;Lädt die Adresse des Strings in Register 7
  217. ADD gesamterTakt,alterTakt,R10 ;Wir speichern die Summme der Werte des altenTakts und R10
  218. LDR R12, =60000000 ;6000000 Takte sind 1 Minute
  219. MOV R0, #0 ;R0 ist der Zähler für die folgende for-Loop
  220.  
  221. STRING_for CMP R0, #8 ;Vergleiche den Zähler mit der Zahl 8...
  222. BEQ End_String ;...falls Zähler gleich 8, springe aus dem Loop.
  223. UDIV R5, gesamterTakt, R12 ;Gesamte Taktzahl durch 6000000 teilen, Ergebnis in Register 5 speichern
  224. MUL R6, R5, R12 ;Den isolierten Teil aus der Operation davor multipliezieren wir mit 6000000
  225. SUBS R3,R6 ;Modulorechnung
  226.  
  227. CMP R0, #1 ;Wir vergleichen unseren Zähler mit 1. Ist der Zähler im String also gerade an Stelle 1....
  228. MOVEQ R11, #6 ;...dann wird die Zahl 6 in Register 11 bewegt. Wir divieren im nächsten Schritt mit Register 11.
  229. MOVNE R11, #10 ;...wenn nicht, handelt es sich um eine andere Stelle, an der wir die Zahl 10 in Register 11 bewegen. Wir dividieren dann im nächsten Schritt durch 10.
  230. UDIV R12, R11 ;Der Wert der aktuell in Register 12 steht, wird durch den Wert der zuvor in Register 11 geschrieben wurde, geteilt.
  231. ADD R5,#'0' ;Der Char #0# wird zu unserer Zahl addiert, damit
  232. STRB R5, [R7, R0] ;Der Char wird an Stelle R0 in Register 7 geschrieben
  233.  
  234. ADD R0, #1 ;Zähler wird um 1 erhöht
  235. CMP R0, #2 ;An stelle 2 steht ein DOppelpubkt, den wir überspringen wollen
  236. ADDEQ R0, #1 ;Falls unsere for Loop gerade an dieser Stelle angelangt ist, überspringen wir sie indem wir den Zähler direkt um 1 erhöhen.
  237. CMP R0, #5 ;Auch an Seelle 5 des String kommt ein Doppelpunkt, den wir ebenfalls überspringen wollen
  238. ADDEQ R0, #1 ;Falls unsere for Loop gerade an dieser Stelle angelangt ist, überspringen wir sie indem wir den Zähler direkt um 1 erhöhen.
  239. B STRING_for ;Springe zum Anfang des for Loops
  240.  
  241. End_String
  242. POP {R5,R6,R7,R11,R12,PC} ;Springe zurück in den Superloop und hole vorher alle Werte aus dem Stack
  243. ENDP
  244. ;----------------------------Zeitanzeige-------------------------------------------------------------------------
  245. DISPLAYTIME PROC
  246. PUSH {R2,LR}
  247. MOV R0, #xStartPos
  248. MOV R1, #yStartPos
  249. BL TFT_gotoxy
  250. LDR R0,=zeitAlsText
  251. BL TFT_puts
  252. POP {R2,LR}
  253. BX LR
  254. ENDP
  255. ;----------------------------resetTime-------------------------------------------------------------------------
  256. RESETTIME PROC
  257. MOV R10, #0 ;Overflow auf 0 setzen
  258. MOV alterTakt,#0 ;alterTakt auf 0 setzen
  259. MOV r2,#0 ;Zähler für die RESET_for Schleife
  260. MOV r0,#'0' ;Setze Char wieder auf '0'
  261.  
  262. RESET_for
  263. CMP r2,#8 ;String hat 8 Stellen...
  264. BGE End_Reset ;... wenn Zähler bei 8, verlasse die Schleife.
  265. CMP R2, #2 ;An stelle 2 steht ein DOppelpubkt, den wir überspringen wollen
  266. ADDEQ R2, #1 ;Falls unsere for Loop gerade an dieser Stelle angelangt ist, überspringen wir sie indem wir den Zähler direkt um 1 erhöhen.
  267. CMP R2, #5 ;Auch an Seelle 5 des String kommt ein Doppelpunkt, den wir ebenfalls überspringen wollen
  268. ADDEQ R2, #1 ;Falls unsere for Loop gerade an dieser Stelle angelangt ist, überspringen wir sie indem wir den Zähler direkt um 1 erhöhen.
  269.  
  270. STRB R0,[r7,r2] ;Speichert '0', in ZeitalsText an Stelle des Zählers (Also dem, was gerade in R2 steht)
  271. ADD R2,#1 ;Erhöhrt Zähler um 1
  272. B RESET_for ;Springe an Anfang der For Schleife
  273. End_Reset
  274. BX LR
  275. ENDP
  276.  
  277. ALIGN
  278.  
  279. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement