0 Daumen
37 Aufrufe

Aufgabe: Stoppuhr in Assembly


Problem/Ansatz: Wieso funktioniert das nicht dass der je nach dem welche taste gedrückt wurde der  in dem zustand wechslet??


Ichhba de anderen unterfunktion ausgelassen die funktioenieren aber


;* Description       : This is a StopWatch
;
; lcdPrintC ist für R0 R1 und R2 nicht sicher (zeigt random Nummer an)
;***************************
; Define address of selected GPIO and Timer registers
PERIPH_BASE   equ 0x40000000                ;Peripheral base address
AHB1PERIPH_BASE equ (PERIPH_BASE + 0x00020000)
APB1PERIPH_BASE   equ PERIPH_BASE

GPIOD_BASE equ (AHB1PERIPH_BASE + 0x0C00)
GPIOF_BASE equ (AHB1PERIPH_BASE + 0x1400)
TIM2_BASE         equ (APB1PERIPH_BASE + 0x0000)

GPIO_F_PIN       equ (GPIOF_BASE + 0x10)
GPIO_D_PIN equ (GPIOD_BASE + 0x10)
GPIO_D_SET equ (GPIOD_BASE + 0x18)
GPIO_D_CLR equ (GPIOD_BASE + 0x1A)
TIMER equ (TIM2_BASE + 0x24)  ; CNT : current time stamp (32 bit), resolution
TIM2_PSC equ (TIM2_BASE + 0x28)  ; Prescaler resolution
TIM2_ERG equ (TIM2_BASE + 0x14)  ; 16 Bit register, Bit 0 : 1 Restart Timer
EXTERN initITSboard
  EXTERN GUI_init
EXTERN TP_Init
EXTERN initTimer
EXTERN lcdSetFont
EXTERN lcdGotoXY     ; TFT goto x y function
EXTERN lcdPrintS ; TFT output function
  EXTERN lcdPrintC           ; TFT output one character
EXTERN Delay ; Delay (ms) function
;****************
; Data section, aligned on 4-byte boundery
;****************
AREA MyData, DATA, align = 2
    GLOBAL text
DEFAULT_BRIGHTNESS DCW 800

text DCB "00:00:00",0
minuten DCD 6000000
sekunden DCD 100000
millisekunden DCW 100
;****************
; Code section, aligned on 8-byte boundery
;****************
AREA |.text|, CODE, READONLY, ALIGN = 3

;--------------------------------------------
; main subroutine
;--------------------------------------------
EXPORT main [CODE]
main PROC

; Initialisierung der HW
BL initITSboard
LDR r1, =DEFAULT_BRIGHTNESS
LDRH r0, [r1]
BL GUI_init ; Display einschalten
BL initTimer
LDR R1,=TIM2_PSC ; Set pre scaler such that 1 timer tick represents 10 us
MOV R0,#(90*10-1)
STRH R0,[R1]
LDR R1,=TIM2_ERG ; Restart timer
MOV R0,#0x01
STRH R0,[R1] ; Set UG Bit
MOV R0, #24
BL lcdSetFont

superloop

ansteuern_tasten
PUSH {R0-R1,LR}
LDR R0,=GPIO_F_PIN ; Adresse der Unterfunktion in R0 laden
LDRH R0, [R0] ; Lade Halbwort in R0
AND R0, R0, #0xFF ; Mithilfe von AND ermittelt welche Taste gedrückt ist
if_1
  ; Prüfe, ob S5 (Bit 5) gedrückt ist
  AND   R1, R0, #2_11011111          ; Maske für Bit 5 (S5)
  CMP   R1, #2_11011111                        ; Vergleiche mit 0
  BNE   else_if                     ; Springe, wenn S5 nicht gedrückt
  BL     INIT                         ; Springe zu INIT, wenn S5 gedrückt

else_if
  ; Prüfe, ob S6 (Bit 6) gedrückt ist
  AND   R1, R0, #2_10111111          ; Maske für Bit 6 (S6)
  CMP   R1, #2_10111111                        ; Vergleiche mit 0
  BNE   else_if_2                    ; Springe, wenn S6 nicht gedrückt
  BL     HOLD                         ; Springe zu HOLD, wenn S6 gedrückt

else_if_2
  ; Prüfe, ob S7 (Bit 7) gedrückt ist
  AND   R1, R0, #2_01111111          ; Maske für Bit 7 (S7)
  CMP   R1, #2_01111111              ; Vergleiche mit 0
  BNE   superloop                   ; Springe, wenn S7 nicht gedrückt
  BL     RUNNING                     ; Springe zu RUNNING, wenn S7 gedrückt



POP {R0-R1, LR}
B superloop

;********************
;-------------Unterprogramme--------------------------------*
;********************

INIT

PUSH {R0-R1,LR}
BL ausschalten_led
BL zeit_auf_0_setzen
POP {R0-R1,LR}

BX LR
RUNNING

PUSH {R0-R1,LR}
MOV R7, #1
BL einschalten_led
BL timer_starten
POP {R0-R1,LR}

BX LR

HOLD

PUSH {R0-R1,LR}
MOV R7, #2
BL einschalten_led
POP {R0-R1,LR}

BX LR



;******************
;------------------Init Zustand-----------------------*
;******************

zeit_auf_0_setzen
PUSH   {R0-R3, LR}        ; Register sichern

  MOV   R0, #10            ; X-Position auf dem Display
  MOV   R1, #7            ; Y-Position auf dem Display
  BL     lcdGotoXY         ; Cursor setzen

  LDR   R0, =text ; Zeichenkette mit der Zeit "00:00:00"
LDR R1, [R0]
  BL     lcdPrintS   ; Zeichenkette auf dem Display ausgeben

  POP   {R0-R3, LR}        ; Register wiederherstellen
  BX     LR               ; Rückkehr


;+++++++++++++++++++++++++++++++++++++++++++++++;
;-----------------halt_zeit---------------------;

halt_zeit
  LDR   R0, =TIMER   ; Adresse des Timer-Steuerungsregisters laden
  LDR   R1, [R0]          ; Aktuellen Wert des Steuerungsregisters laden
  BIC   R1, R1, #1        ; Timer deaktivieren (entsprechendes Bit auf 0 setzen)
  STR   R1, [R0]          ; Geänderten Wert zurückschreiben

  BX     LR               ; Rückkehr

Avatar von

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community