Me Costo mucho trabajo llegar a este ejemplo funcional de interrupciones del Pizero usando Sistema Operativo RISC OS, que carga super rapido, y funciona excelente el BASIC
espero les pueda servir
Este basic al ejecutar crea un modulo que debes ejecutar dando doble click
Ademas Crea Un programa que es un Modulo le das doble click y ya funciona
si tienes dudas me puedes preguntar al 9982243891 o a villalobosjpc@hotmail.com
--------------------------------------------------------------------
--------------------------------------------------------------------
1 REM ESTRUCTURA DE MODULO
2 REM CREACION DE MODULO
3 REM MANEJO DE INTERRUPCION GPIO
4 REM ESTE PROGRAMA CREA ARCHIVO INTMod QUE ES UN MODULO
5 REM QUE SE EJECUTA CON DOBLE CLICK Y SE HACE RESIDENTE
6 REM DESPUES DE MUCHOS ESTUDIO LLEGUE A ESTE 9 DE JUNIO 2019
7 REM COPIANDO Y ADAPTANDO EJEMPLOS DE WWW.HEYRICK.UK.COM
8
9
10 ON ERROR PRINT REPORT$+" at "+STR$(ERL) : END
11
12 DIM code% 4096
13
14 FOR x%=0 TO 1023 : code%?x%=0 : NEXT
15
16 FOR pass% = 4 TO 7 STEP 3
17
18 P%=0
19
20 O%=code%
21
22 [ OPT pass%
23
24 EQUD 0 ; Start-up code
25
26 EQUD initialise ; Initialisation
27
28 EQUD finalise ; Finalisation
29
30 EQUD 0 ; Service call handler
31
32 EQUD module_title ; Module title
33
34 EQUD 0 ; Module help
35
36 EQUD 0 ; Help and command decoding table
37
38 EQUD 0 ; SWI chunk base number
39
40 EQUD 0 ; SWI handling code
41
42 EQUD 0 ; SWI decoding code
43
44 EQUD 0 ; SWI decoding code
45
46 EQUD 0 ; Messages file name
47
48 EQUD module_flags ; Module Flags
49
50
51 .module_flags
52
53 EQUD 1
54
55
56 .module_title
57
58 EQUS "TimerINT"
59
60 EQUB 0
61
62 ALIGN
63
64
65
66 ;PIZERO QUE TENGO ACTUALMENTE
67
68 ;direccio base BCM2835 en raspberry pi
69 .g EQUD &20000000 ;base bcm
70 .g2 EQUD &00200000 ;base gpio
71 .g3 EQUD &0000B000 ;BASE irq handler
72
73 ;1---) SELECCIONAR FUNCION GPFSEL0,GPFSEL1,GPFSEL2
74 ;DIRECCIONES Posiciones en Memoria SELECTOR DE FUNCION
75 ;se suman a direcion base g
76
77 ;Selectores de Funcion del Pin, 30 Pines, 3 Bits Para Cada uno
78 ;por eso son 24 Bytes, 192 BITS
79
80 .posPines0a9 EQUD &00000000 ;dir donde poner que pin GPSEL0
81 .posPines10a19 EQUD &00000004
82 .posPines20a29 EQUD &00000008
83
84
85 ;Activar solo si son necesarios mas de 30 pines despues de 39
86 ;.posPines30a39 EQUD &0000000C
87 ;.posPines40a49 EQUD &00000010
88 ;.posPines50a54 EQUD &00000014
89
90 ;1.1
91 ;VALORES A PONER EN DIRECCIONES PARA LA FUNCION
92 ;3 bits cada pin P funcion, LOS 2 bits slitos no se usan
93
94 ;4Bytes,32Bits,10Pines 00 000 000 000 000 000 000 000 001 000 000
95 ;de acuerdo a esto los demas pines 0,1,3,4,5,6,7,8,9 seran salida
96 ;y pin 2 entrada
97 .pin2Sal EQUD &00000040 ;VAL qponer en PosPines0a9,para pin2salida
98
99 ;3 bits cada pin P funcion
100 ;4Bytes,32Bits,10Pines 00 000 000 000 000 000 000 000 000 000 001
101 .pin10Sal EQUD &00000001 ;Val qponer en PosPines10a19,para pin13salida
102
103 ;3 bits cada pin P funcion
104 ;4Bytes,32Bits,10Pines 00 000 000 000 000 000 000 001 000 000 000
105 .pin13Sal EQUD &00000200 ;Val qponer en PosPines10a19,para pin13salida
106
107 ;2---) ENCENDER PIN
108 ;SELECTOR DE PINES ENCENDIDOS g+posOn0
109 ;NOTA casi todos los pines se sontrolan con PosOn0,32 pines
110 .posOn0 EQUD &0000001C ;dir donde poner que pin se activa
111
112 ;Activar linea bajo solo si necesitamos mas de 32 pines
113 .posOn1 EQUD &00000020 ;dir donde poner que pin se activa
114
115 ;SELECTOR DE PINES APAGADOS
116 ;NOTA Casi Todos los pines se controlan con posOf0, 32 pines
117 .posOf0 EQUD &00000028 ;dir donde poner que pin se activa
118
119 ;Activar linea bajo solo si necesitamos mas de 32 pines
120 .posOf1 EQUD &0000002C ;dir donde poner que pin se activa
121
122
123 ;PINES A ENCENDER O APAGAR, VALORES A PONER EN DIRE DE ENCENDER O APAGAR
124 ;4 Bytes 32 Bits 32 pines 0000 0000 0000 0000 0000 0000 0000 0100
125 .pin2 EQUD &000000004 ;Valor qPones es pin a encender debe ser oreado
126
127 ;4 Bytes 32 Bits 32 pines 0000 0000 0000 0000 0000 0100 0000 0000
128 .pin10 EQUD &00000400 ;Valor qPones es pin a encender debe ser oreado
129
130 ;4 Bytes 32 Bits 30 pones 0000 0000 0000 0000 0010 0000 0000 0000
131 .pin13 EQUD &00004000 ;Valor qPones es pin a encender debe ser oreado
132
133
134 ;DIRECION DE LECTURA ESTADO DE PINES GPLEV0
135 .gplev0 EQUD &00000034 ;dir donde se encuentra estado de pines
136
137 .tesp9 EQUD &00000200 ;para hacerle AND a lo que este en gplev0
138 ;escogi pin 9bcm,es al inicio salida y esta pulldown o
139 ;o se por defecto tiene 0 o Pin Para IRQ en gpren0
140
141 ;DIRECION DE DETECCION DE EVENTO GPREN0
142 .gpren0 EQUD &0000004C ;dir donde pin a detectar una subida a 1
143
144 ;DIRECION DE DETECCION DE EVENTO GPREN0
145 .gpfen0 EQUD &00000058 ;dir donde pin a detectar una bajada a 0
146
147 ;DIRECION DE DETECCION DE EVENTO GHEN0
148 .gphen0 EQUD &00000064 ;dir donde pin a detectar un 1
149
150
151 ;DIRECION DE STATUS DE EVENTO GPEDS0, si ocurre una int aqui checas
152 .gpeds0 EQUD &00000040 ;si tu deteccion ocurrio y debes borrarla al ocurrir
153
154 .logM0 EQUD &00000000 ;log base BCM+base Regs+pos gpeds0; directo sin calc
155
156 ;DIRECION ENABLE IRQ2, IRQ PARA PINES GPIO
157 .EnIr2 EQUD &00000214
158 .irq52 EQUD &00080000
159
160 ;VARIABLES DE PROGRAMA
161 .log EQUD &00000000
162 .logI EQUD &00000000
163
164 .apag EQUD &00000000
165
166
167 .DevicedelTimer EQUD &0
168 .TiempodeChequeoPins EQUD 62500 ;1/8 DE SEGUNDO
169
170 .Prende
171 MOV R0,#1
172 LDR R1,posOn0
173
174 .Guarda
175 STR R0,apag
176
177 ;ACTIVA
178 LDR R3, log
179 LDR R2, pin10
180
181 STR R2,[R3,R1]
182
183 MOV PC, R14
184
185 .Led
186 LDR R0,apag
187 CMP R0,#0
188 BEQ Prende
189
190 .Apaga
191 MOV R0,#0
192 LDR R1,posOf0
193 BNE Guarda
194
195
196 .iniGPIO
197 LDR R0, g ;RiscOS dame dir base de GPIO en memoria logica
198 MOV R1,R0
199 MOV R0,#13
200 MOV R2,#&100 ;256 bytes
201
202 PUSH {R14}
203 SWI &68
204 POP {R14}
205
206 LDR R1, g2
207 PUSH {R3} ;preserva dir base para siguiente BCNM
208 ORR R3, R3, R1
209 STR R3, log ;guarda en LOG
210
211 LDR R1, posPines10a19 ;CONFIGURA SALIDA pin 10 y demas pines seran entradas
212 LDR R2, pin10Sal
213 STR R2,[R3,R1] ;Habilita Pin 10 como salida
214
215 ;LDR R1, gpren0 ;Posicion donde poner que bit se Detectan en subida
216 LDR R1, gpfen0 ;Posicion donde poner que bit se Detectan en bajada
217 ;LDR R1, gphen0 ;Posicion donde poner que bit se Detecta al 1
218 LDR R0, tesp9 ; detectar pin9
219 STR R0,[R3,R1] ;Habilita Detectar Pin9 Cuando Sube a 1
220
221 LDR R1,gpeds0 ;Desactiva evento si lo hubiera descomenta si se necesita
222 ORR R3,R3,R1 ; es como un add por el tipo de dir
223 STR R3,logM0 ; guardalo completo para acelerar INT
224
225 ;esta parte es necesaria si no se reinicio PI
226 ;STR R0,[R3] ;Desactiva evento si lo hubiera descomenta si se necesita
227
228 POP {R3} ;recupera direcion base
229
230 LDR R1, g3 ;Calcula base de IrEn2
231 ORR R3, R3, R1
232 STR R3, logI ;guarda en logI Base de Banco Que Habilita Interrupciones
233
234 LDR R0, EnIr2 ; en R0, La Posicion Habilita Irq 52, todos los pines
235
236 LDR R1, [R3,R0] ;toma Ubicacion valor actual de Control IRQs
237 LDR R2, irq52 ;pone la pos en R2
238 ORR R1,R1,R2 ;Agregalo al Control
239 STR R1,[R3,R0] ;grabalo en el Control de Ints O sea habilita
240
241 MOV PC,R14
242
243
244 .irc EQUD &00000106
245 .irr EQUD &00000006
246 .irp EQUD &00000000
247
248 .irq1
249 STMFD SP!,{R0-R12,R14}
250 LDR R3,logM0 ; le direccion de registro de eventos
251 LDR R0,tesp9
252 LDR R2,[R3] ;lee registro de eventos
253
254 AND R2, R2, R0 ;checa el pin que queremos
255 CMP R2,R0
256 BEQ MIO
257 .fin
258 LDMFD SP!,{R0-R12,R14}
259 LDR PC, irp ;ve a la int original
260
261 .MIO
262 STR R0,[R3] ;quita evento que ocurrio
263 BL Led
264 B fin
265
266 .initialise
267
268 STMDB SP!,{R0-R12,R14}
269
270 BL iniGPIO
271
272 LDR R0, irc
273 ADR R1, irq1
274 SWI &69
275
276 STR R1, irp
277
278
279 .SALIDA
280 LDMFD SP!, {R0 - R12, PC}
281
282
283 .finalise
284 STMFD SP!, {R0 - R12, R14}
285 LDR R0,irr
286 ADR R2, irq1
287 SWI &69
288
289 LDR R0, irc
290 LDR R1, irp
291 SWI &69
292 LDMFD SP!, {R0 - R12, PC}
293
294 ]
295
296 NEXT pass%
297
298 :
299
300 OSCLI("Save INTMod "+STR$~code%+" +"+STR$~P%)
301
302 OSCLI("SetType INTMod FFA")
303
304 :
305
306 END
-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
Saludos
No hay comentarios.:
Publicar un comentario