OpenCores
URL https://opencores.org/ocsvn/openmsp430/openmsp430/trunk

Subversion Repositories openmsp430

[/] [openmsp430/] [trunk/] [core/] [sim/] [rtl_sim/] [src/] [gpio_irq.s43] - Blame information for rev 111

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 olivier.gi
/*===========================================================================*/
2
/* Copyright (C) 2001 Authors                                                */
3
/*                                                                           */
4
/* This source file may be used and distributed without restriction provided */
5
/* that this copyright statement is not removed from the file and that any   */
6
/* derivative work contains the original copyright notice and the associated */
7
/* disclaimer.                                                               */
8
/*                                                                           */
9
/* This source file is free software; you can redistribute it and/or modify  */
10
/* it under the terms of the GNU Lesser General Public License as published  */
11
/* by the Free Software Foundation; either version 2.1 of the License, or    */
12
/* (at your option) any later version.                                       */
13
/*                                                                           */
14
/* This source is distributed in the hope that it will be useful, but WITHOUT*/
15
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or     */
16
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public       */
17
/* License for more details.                                                 */
18
/*                                                                           */
19
/* You should have received a copy of the GNU Lesser General Public License  */
20
/* along with this source; if not, write to the Free Software Foundation,    */
21
/* Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA        */
22
/*                                                                           */
23
/*===========================================================================*/
24
/*                            DIGITAL I/O                                    */
25
/*---------------------------------------------------------------------------*/
26
/* Test the Digital I/O interface:                                           */
27
/*                                   - Interrupts.                           */
28 18 olivier.gi
/*                                                                           */
29
/* Author(s):                                                                */
30
/*             - Olivier Girard,    olgirard@gmail.com                       */
31
/*                                                                           */
32
/*---------------------------------------------------------------------------*/
33 19 olivier.gi
/* $Rev: 111 $                                                                */
34
/* $LastChangedBy: olivier.girard $                                          */
35
/* $LastChangedDate: 2011-05-20 22:39:02 +0200 (Fri, 20 May 2011) $          */
36 2 olivier.gi
/*===========================================================================*/
37
 
38
.global main
39
 
40 111 olivier.gi
.set   DMEM_BASE, (__data_start     )
41
.set   DMEM_200,  (__data_start+0x00)
42
.set   DMEM_208,  (__data_start+0x08)
43
.set   DMEM_210,  (__data_start+0x10)
44
.set   DMEM_218,  (__data_start+0x18)
45
.set   DMEM_220,  (__data_start+0x20)
46
.set   DMEM_228,  (__data_start+0x28)
47
.set   DMEM_230,  (__data_start+0x30)
48
.set   DMEM_238,  (__data_start+0x38)
49
.set   DMEM_240,  (__data_start+0x40)
50
.set   DMEM_248,  (__data_start+0x48)
51
.set   DMEM_250,  (__data_start+0x50)
52
.set   DMEM_258,  (__data_start+0x58)
53
.set   DMEM_260,  (__data_start+0x60)
54
 
55 2 olivier.gi
.set   P1IN,  0x0020
56
.set   P1OUT, 0x0021
57
.set   P1DIR, 0x0022
58
.set   P1IFG, 0x0023
59
.set   P1IES, 0x0024
60
.set   P1IE,  0x0025
61
.set   P1SEL, 0x0026
62
.set   P2IN,  0x0028
63
.set   P2OUT, 0x0029
64
.set   P2DIR, 0x002A
65
.set   P2IFG, 0x002B
66
.set   P2IES, 0x002C
67
.set   P2IE,  0x002D
68
.set   P2SEL, 0x002E
69
 
70
main:
71
        ; Disable interrupts
72
        dint
73
        mov.b #0x00, &P1IE
74
        mov.b #0x00, &P2IE
75
 
76
 
77
        /* -------------- PORT 1: TEST INTERRUPT FLAGS  --------------- */
78
 
79
 
80
        mov.b   #0x00, &P1IES       ;# TEST IF RISING EDGE ENABLED
81
 
82 111 olivier.gi
        mov     #DMEM_200, r15        ;# Make sure rising edge is detected test 1
83 2 olivier.gi
p1ifg_re_loop1:
84
        nop
85
        nop
86
        mov.b &P1IFG,  0(r15)
87
        mov.b   #0x00, &P1IFG
88
        inc      r15
89 111 olivier.gi
        cmp     #DMEM_208, r15
90 2 olivier.gi
        jne     p1ifg_re_loop1
91
 
92 111 olivier.gi
        mov     #DMEM_210, r15        ;# Make sure falling edge is ignored
93 2 olivier.gi
p1ifg_fe_loop1:
94
        nop
95
        nop
96
        mov.b &P1IFG,  0(r15)
97
        mov.b   #0x00, &P1IFG
98
        inc      r15
99 111 olivier.gi
        cmp     #DMEM_218, r15
100 2 olivier.gi
        jne     p1ifg_fe_loop1
101
 
102 111 olivier.gi
        mov     #DMEM_220, r15        ;# Make sure rising edge is detected test 2
103 2 olivier.gi
p1ifg_re_loop2:
104
        nop
105
        nop
106
        mov.b &P1IFG,  0(r15)
107
        inc      r15
108 111 olivier.gi
        cmp     #DMEM_228, r15
109 2 olivier.gi
        jne     p1ifg_re_loop2
110
        mov.b   #0x00, &P1IFG
111
 
112
 
113
 
114
        mov.b   #0xff, &P1IES       ;# TEST IF FALLING EDGE ENABLED
115
 
116 111 olivier.gi
        mov     #DMEM_230, r15        ;# Make sure falling edge is detected test 1
117 2 olivier.gi
p1ifg_fe_loop2:
118
        nop
119
        nop
120
        mov.b &P1IFG,  0(r15)
121
        mov.b   #0x00, &P1IFG
122
        inc      r15
123 111 olivier.gi
        cmp     #DMEM_238, r15
124 2 olivier.gi
        jne     p1ifg_fe_loop2
125
 
126 111 olivier.gi
        mov     #DMEM_240, r15        ;# Make sure rising edge is ignored
127 2 olivier.gi
p1ifg_re_loop3:
128
        nop
129
        nop
130
        mov.b &P1IFG,  0(r15)
131
        mov.b   #0x00, &P1IFG
132
        inc      r15
133 111 olivier.gi
        cmp     #DMEM_248, r15
134 2 olivier.gi
        jne     p1ifg_re_loop3
135
 
136 111 olivier.gi
        mov     #DMEM_250, r15        ;# Make sure falling edge is detected test 2
137 2 olivier.gi
p1ifg_fe_loop3:
138
        nop
139
        nop
140
        mov.b &P1IFG,  0(r15)
141
        inc      r15
142 111 olivier.gi
        cmp     #DMEM_258, r15
143 2 olivier.gi
        jne     p1ifg_fe_loop3
144
        mov.b   #0x00, &P1IFG
145
 
146
 
147
        /* -------------- PORT 2: TEST INTERRUPT FLAGS  --------------- */
148
 
149
 
150
        mov.b   #0x00, &P2IES       ;# TEST IF RISING EDGE ENABLED
151
 
152 111 olivier.gi
        mov     #DMEM_200, r15        ;# Make sure rising edge is detected test 1
153 2 olivier.gi
p2ifg_re_loop1:
154
        nop
155
        nop
156
        mov.b &P2IFG,  0(r15)
157
        mov.b   #0x00, &P2IFG
158
        inc      r15
159 111 olivier.gi
        cmp     #DMEM_208, r15
160 2 olivier.gi
        jne     p2ifg_re_loop1
161
 
162 111 olivier.gi
        mov     #DMEM_210, r15        ;# Make sure falling edge is ignored
163 2 olivier.gi
p2ifg_fe_loop1:
164
        nop
165
        nop
166
        mov.b &P2IFG,  0(r15)
167
        mov.b   #0x00, &P2IFG
168
        inc      r15
169 111 olivier.gi
        cmp     #DMEM_218, r15
170 2 olivier.gi
        jne     p2ifg_fe_loop1
171
 
172 111 olivier.gi
        mov     #DMEM_220, r15        ;# Make sure rising edge is detected test 2
173 2 olivier.gi
p2ifg_re_loop2:
174
        nop
175
        nop
176
        mov.b &P2IFG,  0(r15)
177
        inc      r15
178 111 olivier.gi
        cmp     #DMEM_228, r15
179 2 olivier.gi
        jne     p2ifg_re_loop2
180
        mov.b   #0x00, &P2IFG
181
 
182
 
183
 
184
        mov.b   #0xff, &P2IES       ;# TEST IF FALLING EDGE ENABLED
185
 
186 111 olivier.gi
        mov     #DMEM_230, r15        ;# Make sure falling edge is detected test 1
187 2 olivier.gi
p2ifg_fe_loop2:
188
        nop
189
        nop
190
        mov.b &P2IFG,  0(r15)
191
        mov.b   #0x00, &P2IFG
192
        inc      r15
193 111 olivier.gi
        cmp     #DMEM_238, r15
194 2 olivier.gi
        jne     p2ifg_fe_loop2
195
 
196 111 olivier.gi
        mov     #DMEM_240, r15        ;# Make sure rising edge is ignored
197 2 olivier.gi
p2ifg_re_loop3:
198
        nop
199
        nop
200
        mov.b &P2IFG,  0(r15)
201
        mov.b   #0x00, &P2IFG
202
        inc      r15
203 111 olivier.gi
        cmp     #DMEM_248, r15
204 2 olivier.gi
        jne     p2ifg_re_loop3
205
 
206 111 olivier.gi
        mov     #DMEM_250, r15        ;# Make sure falling edge is detected test 2
207 2 olivier.gi
p2ifg_fe_loop3:
208
        nop
209
        nop
210
        mov.b &P2IFG,  0(r15)
211
        inc      r15
212 111 olivier.gi
        cmp     #DMEM_258, r15
213 2 olivier.gi
        jne     p2ifg_fe_loop3
214
        mov.b   #0x00, &P2IFG
215
 
216
 
217
        /* --------------            CLEAR MEMORY        --------------- */
218
 
219 111 olivier.gi
        mov     #DMEM_200, r5
220 2 olivier.gi
mem_clear_loop:
221
        mov     #0x00,  0(r5)
222
        incd      r5
223 111 olivier.gi
        cmp     #DMEM_260, r5
224 2 olivier.gi
        jne     mem_clear_loop
225
 
226
 
227
        /* -------------- PORT 1: TEST INTERRUPT VECTOR  --------------- */
228
 
229 111 olivier.gi
        mov     #DMEM_250, r1     ; Initialize stack
230 2 olivier.gi
        eint                    ; Enable interrupts
231
 
232
        mov.b   #0x0001, r6
233
        mov.b        r6, &P1IE
234 111 olivier.gi
        mov     #DMEM_200, r15;
235 2 olivier.gi
p1_irq_loop:
236
        mov.b        r6, &P1IFG ; Generate soft interrupt
237
        nop
238
        nop
239
        nop
240
        rla          r6
241
        mov.b        r6, &P1IE
242
        inc         r15
243 111 olivier.gi
        cmp     #DMEM_208, r15
244 2 olivier.gi
        jne     p1_irq_loop
245
 
246
 
247
        /* -------------- PORT 2: TEST INTERRUPT VECTOR  --------------- */
248
 
249 111 olivier.gi
        mov     #DMEM_250, r1     ; Initialize stack
250 2 olivier.gi
        eint                    ; Enable interrupts
251
 
252
        mov.b   #0x0001, r6
253
        mov.b        r6, &P2IE
254 111 olivier.gi
        mov     #DMEM_210, r15;
255 2 olivier.gi
p2_irq_loop:
256
        mov.b        r6, &P2IFG ; Generate soft interrupt
257
        nop
258
        nop
259
        nop
260
        rla          r6
261
        mov.b        r6, &P2IE
262
        inc         r15
263 111 olivier.gi
        cmp     #DMEM_218, r15
264 2 olivier.gi
        jne     p2_irq_loop
265
 
266
 
267
        /* ----------------------         END OF TEST        --------------- */
268
end_of_test:
269
        nop
270
        br #0xffff
271
 
272
 
273
        /* ----------------------      INTERRUPT ROUTINES    --------------- */
274
 
275
PORT1_VECTOR:
276
        mov.b &P1IFG,  0(r15)
277
        mov.b  #0x00, &P1IFG
278
        reti
279
 
280
PORT2_VECTOR:
281
        mov.b &P2IFG,  0(r15)
282
        mov.b  #0x00, &P2IFG
283
        reti
284
 
285
 
286
 
287
        /* ----------------------         INTERRUPT VECTORS  --------------- */
288
 
289
.section .vectors, "a"
290
.word end_of_test  ; Interrupt  0 (lowest priority)    
291
.word end_of_test  ; Interrupt  1                      
292
.word PORT1_VECTOR ; Interrupt  2                      
293
.word PORT2_VECTOR ; Interrupt  3                      
294
.word end_of_test  ; Interrupt  4                      
295
.word end_of_test  ; Interrupt  5                      
296
.word end_of_test  ; Interrupt  6                      
297
.word end_of_test  ; Interrupt  7                      
298
.word end_of_test  ; Interrupt  8                      
299
.word end_of_test  ; Interrupt  9                      
300
.word end_of_test  ; Interrupt 10                      Watchdog timer
301
.word end_of_test  ; Interrupt 11                      
302
.word end_of_test  ; Interrupt 12                      
303
.word end_of_test  ; Interrupt 13                      
304
.word end_of_test  ; Interrupt 14                      NMI
305
.word main         ; Interrupt 15 (highest priority)   RESET

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.