-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbutton.asm
146 lines (133 loc) · 4.98 KB
/
button.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; tutoriel sdas pour stm8
; chapitre 2 button
; Date: 2019-10-30
; Copyright Jacques Deschêens, 2019
; licence: CC-BY-SA version 2 ou ultérieure
;
; Description:
; contrôle de la LED2 par le bouton USER (bouton bleu sur la carte)
; Après la configuration initiale le MCU est placé dans le
; mode de la plus faible consommation avec l'instruction HALT
; Lorsque le bouton USER est enfoncé l'interruption
; externe EXT4 est déclenché. l'état de la LED2 est alors inversé.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.include "../inc/nucleo_8s208.inc"
.include "../inc/stm8s208.inc"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; macros
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; allume LED2
.macro _ledon
bset LED2_PORT,#LED2_BIT
.endm
; éteint LED2
.macro _ledoff
bres LED2_PORT,#LED2_BIT
.endm
; inverse l'état de LED2
.macro _led_toggle
ld a,LED2_PORT
xor a,#LED2_MASK
ld LED2_PORT,a
.endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; section des variables
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.area DATA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; section de la pile
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
STACK_SIZE = 256
STACK_TOP = RAM_END-1
.area SSEG (ABS)
.org RAM_END-STACK_SIZE
.ds STACK_SIZE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; table des vecteurs d'interruption
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.area HOME
int main ; vecteur de réinitialisation
int NonHandledInterrupt ;TRAP software interrupt
int NonHandledInterrupt ;int0 TLI external top level interrupt
int NonHandledInterrupt ;int1 AWU auto wake up from halt
int NonHandledInterrupt ;int2 CLK clock controller
int NonHandledInterrupt ;int3 EXTI0 port A external interrupts
int NonHandledInterrupt ;int4 EXTI1 port B external interrupts
int NonHandledInterrupt ;int5 EXTI2 port C external interrupts
int NonHandledInterrupt ;int6 EXTI3 port D external interrupts
int usr_btn_isr ;int7 EXTI4 port E external interrupts
int NonHandledInterrupt ;int8 beCAN RX interrupt
int NonHandledInterrupt ;int9 beCAN TX/ER/SC interrupt
int NonHandledInterrupt ;int10 SPI End of transfer
int NonHandledInterrupt ;int11 TIM1 update/overflow/underflow/trigger/break
int NonHandledInterrupt ;int12 TIM1 capture/compare
int NonHandledInterrupt ;int13 TIM2 update /overflow
int NonHandledInterrupt ;int14 TIM2 capture/compare
int NonHandledInterrupt ;int15 TIM3 Update/overflow
int NonHandledInterrupt ;int16 TIM3 Capture/compare
int NonHandledInterrupt ;int17 UART1 TX completed
int NonHandledInterrupt ;int18 UART1 RX full
int NonHandledInterrupt ;int19 I2C
int NonHandledInterrupt ;int20 UART3 TX completed
int NonHandledInterrupt ;int21 UART3 RX full
int NonHandledInterrupt ;int22 ADC2 end of conversion
int NonHandledInterrupt ;int23 TIM4 update/overflow
int NonHandledInterrupt ;int24 flash writing EOP/WR_PG_DIS
int NonHandledInterrupt ;int25 not used
int NonHandledInterrupt ;int26 not used
int NonHandledInterrupt ;int27 not used
int NonHandledInterrupt ;int28 not used
.area CODE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; point d'entrée après une réinitialisation du MCU
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main:
; initialisation de la pile
ldw x,#STACK_TOP
ldw sp,x
; initialise la broche du LED2 en mode
; sortie push pull
bset PC_CR1,#LED2_BIT
bset PC_CR2,#LED2_BIT
bset PC_DDR,#LED2_BIT
; mode d'activation de l'interruption:
; sur la transition descendante seulement
bset EXTI_CR2,#1
; active l'interruption sur PE_4 (bouton utilisateur)
bset PE_CR2,#USR_BTN_BIT
; active les interruptions dans le registre CCR du CPU
rim
; suspend le MCU en attendant l'interruption du bouton
1$: halt
jra 1$
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; gestionnaire d'interruption pour
; les interruption non gérées
; réinitialise le MCU
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NonHandledInterrupt:
ld a,#0x80
ld WWDG_CR,a
;iret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; gestionnaire d'interruption pour le bouton USER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DEBOUNCE = 1 ; mettre à zéro pour annule le code anti-rebond.
usr_btn_isr:
_led_toggle
.if DEBOUNCE
; anti-rebond
; attend que le bouton soit relâché
1$: clrw x
btjf USR_BTN_PORT,#USR_BTN_BIT,1$
; tant que le bouton est relâché incrémente X
; si X==0x7fff quitte
; si bouton revient à zéro avant retourne à 1$
2$: incw x
cpw x,#0x7fff
jreq 3$
btjt USR_BTN_PORT,#USR_BTN_BIT,2$
jra 1$
.endif; DEBOUNCE
3$: iret