Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;******************** (C) COPYRIGHT HAW-Hamburg ********************************
- ;* File Name : main.s
- ;* Author : Carl Kaloff
- ;* Author :
- ;* Version : V2.0
- ;* Date : 25.06.2019
- ;* Description : GTP03, Stoppuhr
- ;
- ;*******************************************************************************
- 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 ; Timer Register
- ;********************************************
- ; Data section, aligned on 4-byte boundery
- ;********************************************
- AREA MyData, DATA, align = 2
- ;-----------------------Konstante Werte---------------------------------------------------------
- Init EQU 0
- Running EQU 1
- Hold EQU 2
- LedOn EQU 0
- LedOff EQU 1
- NichtGedrueckt EQU 0
- Gedrueckt EQU 1
- Taste5 EQU 5
- Taste6 EQU 6
- Taste7 EQU 7
- LedD19 EQU 6 ;Position der LED19
- LedD20 EQU 7 ;Position der LED20
- yStartPos EQU 8
- xStartPos EQU 18
- ticksIn10Min EQU 100000
- overflow EQU 0x10000
- zeitAlsText DCB "00:00:00",0
- ;********************************************
- ; Code section, aligned on 8-byte boundery
- ;********************************************
- AREA |.text|, CODE, READONLY, ALIGN = 3
- ;********************************************
- ; main subroutine
- ;********************************************
- EXPORT main [CODE]
- ;-----------------------Geteilte Register-------------------------------------------------------
- gesamterTakt RN 3
- Betriebszustand RN 5
- aktuellerTakt RN 8
- alterTakt RN 9
- ;---------------------------Main-------------------------------------------------------------------
- main PROC
- BL Init_TI_Board ;Initialize the serial line to TTY
- ;for compatability to out TI-C-Board
- BL initHW ;Timer init
- BL RESETTIME ;Springe zur resetTime, setze Zeitanzeige auf Startposition
- MOV Betriebszustand, #Init ;Bewege 0 in Register 5
- LDR r7, =zeitAlsText ;Lädt die Adresse von zeitAlsText in Register 7
- LDR r11, =timer ;Lädt die Adresse des Timers in Register 11
- ;-----------------------Superloop-------------------------------------------------------------------
- Superloop
- ;************************************INIT***********************************************************
- INIT_if CMP R5, #Init ;Checkt ob Init der aktuelle Betriebszustand ist (0)
- BNE RUNNING_if ;Wenn nicht, springe zu Label Running_if
- BL RESETTIME ;Wenn ja, setze Zeitanzeige auf Startposition...
- BL DISPLAYTIME ;...und übergebe die Zeit an das Display
- MOV R0, #LedD19 ;Speichert die Position von LED19 in Register 0
- MOV R1, #LedOff ;Off-Zustand in Register 1 speichern, sprich: LED19 aus!
- BL SETLED ;Definierte LED Einstellung am Board ausführen, Sprung ins Unterprogramm
- MOV R0, #LedD20 ;Speichert die Position von LED20 in Register 0
- MOV R1, #LedOff ;Off-Zustand in Register 1 speichern, sprich: LED20 aus!
- BL SETLED ;Definierte LED Einstellung am Board ausführen, Sprung ins Unterprogramm
- TasteS7_if MOV R0, #Taste7 ;Lädt die Position von Taste 7 in Register 0
- BL CHECKKEY ;Liest die Taste 7 aus, Sprung ins Unterprogramm
- CMP R0, #Gedrueckt ;Prüft ob die Taste 7 gedrückt wurde
- BNE Ende_INIT ;Wenn nicht, springe zum Ende von Init
- MOV Betriebszustand, #Running ;Wenn ja, änder den Betriebszustand zu Running (1)
- Ende_INIT BAL Ende_Superloop ;Springe zum Ende dieses Superloops
- ;************************************RUNNING********************************************************
- RUNNING_if CMP Betriebszustand, #Running ;Checkt, ob Running der aktuelle Betriebzustand ist (1)
- BNE HOLD_if ;Wenn nicht, springe zu Label HOLD_if
- BL CHECKTIMER ;Prüfe die Zeitangabe, Springe zum Unterprogramm
- BL TIMETOSTRING ;Konvertier den Takt in String, Springe zu Unterprogramm
- BL DISPLAYTIME ;Gebe die Zeit auf dem Display aus, SPringe zu Unterprogramm
- MOV R0, #LedD19 ;Speichert die Position von LED19 in Register 0
- MOV R1, #LedOff ;Off-Zustand in Register 1 speichern, sprich: LED19 aus!
- BL SETLED ;Definierte LED Einstellung am Board ausführen, Sprung ins Unterprogramm
- MOV R0, #LedD20 ;Speichert die Position von LED20 in Register 0
- MOV R1, #LedOn ;On-Zustand in Register 1 speichern, sprich: LED20 an!
- BL SETLED ;Definierte LED Einstellung am Board ausführen, Sprung ins Unterprogramm
- TasteS6_if MOV R0, #Taste6 ;Lädt die Position von Taste 6 in Register 0
- BL CHECKKEY ;Liest die Taste 6 aus, Sprung ins Unterprogramm
- CMP R0, #Gedrueckt ;Prüft ob die Taste 6 gedrückt wurde
- BNE End_Taste6 ;Wenn nicht, springe zum Ende von Taste 6
- MOV Betriebszustand, #Hold ;Wenn ja, änder den Betriebszustand zu Hold (2)
- End_Taste6
- TasteS5_if MOV R0, #Taste5 ;Lädt die Position von Taste 5 in Register 0
- BL CHECKKEY ;Liest die Taste 5 aus, Sprung ins Unterprogramm
- CMP R0, #Gedrueckt ;Prüft ob die Taste 5 gedrückt wurde
- BNE Ende_HOLD ;Wenn nicht, springe zum Ende von Hold
- MOV Betriebszustand, #Init ;Wenn ja, änder den Betriebszustand zu Init (0)
- Ende_HOLD BAL Ende_Superloop ;Springe zum Ende dieses Superloops
- ;************************************HOLD***********************************************************
- HOLD_if CMP Betriebszustand, #Hold ;Checkt, ob Hold der aktuelle Betriebszustand ist (2)
- BNE Ende_Superloop ;Wenn nein, springe zum Ende des aktuellen Superloops
- BL CHECKTIMER ;Prüfe die Zeitangabe, Springe zum Unterprogramm
- MOV R0, #LedD19 ;Speichert die Position von LED19 in Register 0
- MOV R1, #LedOn ;On-Zustand in Register 1 speichern, sprich: LED19 an!
- BL SETLED ;Definierte LED Einstellung am Board ausführen, Sprung ins Unterprogramm
- TasteS5B_if MOV R0, #Taste5 ;Lädt die Position von Taste 5 in Register 0
- BL CHECKKEY ;Liest die Taste 5 aus, Sprung ins Unterprogramm
- CMP R0, #Gedrueckt ;Prüft ob die Taste 5 gedrückt wurde
- BNE End_Taste5 ;Wenn nicht, springe zum Ende von Hold
- MOV Betriebszustand, #Init ;Wenn ja, änder den Betriebszustand zu Init (0)
- End_Taste5
- TasteS7B_if MOV R0, #Taste7 ;Lädt die Position von Taste 7 in Register 0
- BL CHECKKEY ;Liest die Taste 7 aus, Sprung ins Unterprogramm
- CMP R0, #Gedrueckt ;Prüft ob die Taste 7 gedrückt wurde
- BNE End_Taste7 ;Wenn nicht, springe zum Ende von Init
- MOV Betriebszustand, #Running ;Wenn ja, änder den Betriebszustand zu Running (1)
- End_Taste7
- Ende_Superloop BAL Superloop ;Springe zum Anfang des Superloops
- ENDP
- ;----------------------------LED-------------------------------------------------------------------------
- SETLED PROC ;In diesem Unterprogramm werden LEDs am Board an oder ausgemacht
- PUSH {R2-R4,LR} ;Register 2-4 werden auf den Stack gepusht um später unverändert weiterverwendet werden zu können
- MOV R2,#1 ;1 Bit wird in Register 2 geladen...Ž
- LSL R2,R0 ;...und um den Wert der aktuell in R0 steht, nach links geshiftet.
- if_01 CMP R1,#1 ;ist die LED gedrückt (0)?
- BEQ then_01 ;Nein, nicht gedrückt. Springe zu then_01.
- BNE else_01 ;Ja, gedrückt. Springe zu else_01.
- then_01 LDR R3,=GPIO_G_SET ;Adresse von GPIO_G_SET wird in R3 gespeichert
- b endif_01
- else_01 LDR R3,=GPIO_G_CLR ;Adresse von GPIO_G_CLR wird in R3 gespeichert
- endif_01
- STRH R2,[R3] ;Hier wird die LED über die vorher erstellte Bitmaske an der richtigen STelle angesteuert
- POP {R2-R4,LR}
- BX LR
- ENDP
- ;----------------------------Taste-checken-------------------------------------------------------------------------
- CHECKKEY PROC
- PUSH {R2,LR}
- MOV R1,#1
- LSL R1,R0
- LDR R2,=GPIO_E_PIN
- LDR R2,[R2]
- ANDS R2,R1
- MOVEQ R0,#1
- MOVNE R0,#0
- POP {R2,LR}
- BX LR
- ENDP
- ;----------------------------Timer-------------------------------------------------------------------------
- CHECKTIMER PROC
- PUSH {R12,LR}
- LDRH aktuellerTakt,[R11] ;Speichert den aktuellen timer-Wert in aktuellerTakt (Register 8)
- CMP aktuellerTakt,alterTakt ;Vergleicht den aktuellen Takt mit dem alten Takt (Register 9)
- ADDLO R10,#overflow ;Wenn der aktuelle Takt < als der alte Takt ist, haben wir einen Overflow und addieren die Konstante 0x10000 in Register 10
- MOV alterTakt, aktuellerTakt ;Speichert den Wert des aktuellen Taktes als alten Takt
- POP {R12,LR}
- BX LR ;Springt zurück in den Superloop
- ENDP
- ;----------------------------Zeit-als-String-------------------------------------------------------------------------
- TIMETOSTRING PROC
- PUSH {R5,R6,R7,R11,R12,LR} ;Um nichts an Werten zu verlieren speichern wir die Register 4-12 im Stack
- LDR R7, =zeitAlsText ;Lädt die Adresse des Strings in Register 7
- ADD gesamterTakt,alterTakt,R10 ;Wir speichern die Summme der Werte des altenTakts und R10
- LDR R12, =60000000 ;6000000 Takte sind 1 Minute
- MOV R0, #0 ;R0 ist der Zähler für die folgende for-Loop
- STRING_for CMP R0, #8 ;Vergleiche den Zähler mit der Zahl 8...
- BEQ End_String ;...falls Zähler gleich 8, springe aus dem Loop.
- UDIV R5, gesamterTakt, R12 ;Gesamte Taktzahl durch 6000000 teilen, Ergebnis in Register 5 speichern
- MUL R6, R5, R12 ;Den isolierten Teil aus der Operation davor multipliezieren wir mit 6000000
- SUBS R3,R6 ;Modulorechnung
- CMP R0, #1 ;Wir vergleichen unseren Zähler mit 1. Ist der Zähler im String also gerade an Stelle 1....
- MOVEQ R11, #6 ;...dann wird die Zahl 6 in Register 11 bewegt. Wir divieren im nächsten Schritt mit Register 11.
- 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.
- UDIV R12, R11 ;Der Wert der aktuell in Register 12 steht, wird durch den Wert der zuvor in Register 11 geschrieben wurde, geteilt.
- ADD R5,#'0' ;Der Char #0# wird zu unserer Zahl addiert, damit
- STRB R5, [R7, R0] ;Der Char wird an Stelle R0 in Register 7 geschrieben
- ADD R0, #1 ;Zähler wird um 1 erhöht
- CMP R0, #2 ;An stelle 2 steht ein DOppelpubkt, den wir überspringen wollen
- 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.
- CMP R0, #5 ;Auch an Seelle 5 des String kommt ein Doppelpunkt, den wir ebenfalls überspringen wollen
- 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.
- B STRING_for ;Springe zum Anfang des for Loops
- End_String
- POP {R5,R6,R7,R11,R12,PC} ;Springe zurück in den Superloop und hole vorher alle Werte aus dem Stack
- ENDP
- ;----------------------------Zeitanzeige-------------------------------------------------------------------------
- DISPLAYTIME PROC
- PUSH {R2,LR}
- MOV R0, #xStartPos
- MOV R1, #yStartPos
- BL TFT_gotoxy
- LDR R0,=zeitAlsText
- BL TFT_puts
- POP {R2,LR}
- BX LR
- ENDP
- ;----------------------------resetTime-------------------------------------------------------------------------
- RESETTIME PROC
- MOV R10, #0 ;Overflow auf 0 setzen
- MOV alterTakt,#0 ;alterTakt auf 0 setzen
- MOV r2,#0 ;Zähler für die RESET_for Schleife
- MOV r0,#'0' ;Setze Char wieder auf '0'
- RESET_for
- CMP r2,#8 ;String hat 8 Stellen...
- BGE End_Reset ;... wenn Zähler bei 8, verlasse die Schleife.
- CMP R2, #2 ;An stelle 2 steht ein DOppelpubkt, den wir überspringen wollen
- 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.
- CMP R2, #5 ;Auch an Seelle 5 des String kommt ein Doppelpunkt, den wir ebenfalls überspringen wollen
- 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.
- STRB R0,[r7,r2] ;Speichert '0', in ZeitalsText an Stelle des Zählers (Also dem, was gerade in R2 steht)
- ADD R2,#1 ;Erhöhrt Zähler um 1
- B RESET_for ;Springe an Anfang der For Schleife
- End_Reset
- BX LR
- ENDP
- ALIGN
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement