Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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}                 ;Callee Save
  101.             LDR R10,=timeraktuell   ;R10= Adresse von timeraktuell
  102.             LDR R0,[R10]            ;R0= Wert von timeraktuell
  103.             LDR R9,=zeitAnzeige     ;R9= Adresse von zeitAnzeige
  104.            
  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           ;Unsigned Division, R3= timeraktuell/minZiffer
  108.  
  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]            ;Byte von R4 wird gespeichert in R9 (zeitAnzeige)
  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]         ;Byte von R7 wird gespeichert in R9 um eine Stelle nach recht (zeitAnzeige)
  120.        
  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. 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. 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement