Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- En este ejercicio vamos trabajar simultaneamente con las IRQs de los comparadores C1 y C3 del timer. Con C1 controlaremos el encendido consecutivo de los 6 LEDs con una cadencia de 200msg, de forma similar a lo que hicimos en Ejer11.s: el primer led se enciende durante 200msg, pasados los cuales se apagara para encenderse el siguiente LED, y asi sucesivamente (cuando se apague el sexto, volvemos a empezar con el primero). Con C3 controlaremos el altavoz para que se produzca un sonido con una frecuencia de 440Hz. Inicialmente, el programa principal programara la interrupcion del timer para dentro de 200msg. La rutina de tratamiento de la IRQ, tras determinar cual de los dos comparadores ha provocado la interrupcion, lo reprogramara para que interrumpa con la periodicidad deseada.
- */
- .include "inter.inc"
- .text
- /* Agrego vector interrupcion */
- ADDEXC 0x18, irq_handler
- /* Inicializo la pila en modos IRQ y SVC */
- mov r0, #0b11010010 @ Modo IRQ, FIQ&IRQ desact
- msr cpsr_c, r0
- mov sp, #0x8000
- mov r0, #0b11010011 @ Modo SVC, FIQ&IRQ desact
- msr cpsr_c, r0
- mov sp, #0x8000000
- /* Configuro GPIOs 4, 9, 10, 11, 17, 22 y 27 como salida */
- ldr r0, =GPBASE
- ldr r1, =0b00001000000000000001000000000000
- str r1, [r0, #GPFSEL0]
- /*guia bits xx999888777666555444333222111000*/
- ldr r1, =0b00000000001000000000000000001001
- str r1, [r0, #GPFSEL1]
- ldr r1, =0b00000000001000000000000001000000
- str r1, [r0, #GPFSEL2]
- /* Programo C1 y C3 para dentro de 2 microsegundos */
- ldr r0, =STBASE
- ldr r1, [r0, #STCLO]
- add r1, #2
- str r1, [r0, #STC1]
- str r1, [r0, #STC3]
- /* Habilito interrupciones, local y globalmente */
- ldr r0, =INTBASE
- mov r1, #0b1010
- str r1, [r0, #INTENIRQ1]
- mov r0, #0b01010011 @ Modo SVC, IRQ activo msr cpsr_c, r0
- /* Repetir para siempre */
- mov r3, #0
- bucle: b bucle
- /* Rutina de tratamiento de interrupción */
- irq_handler:
- push {r0, r1, r2, r3, r4}
- ldr r0, =GPBASE
- ldr r1, =0b00001000010000100000111000000000
- str r1, [r0, #GPCLR0] @ Apago leds
- /* Consulto si se ha pulsado el boton GPIO2 */
- ldr r2, [r0, #GPEDS0]
- mov r3, r2
- ands r2, #0b00000000000000000000000000000100
- /* Si: Activo LEDS*/
- /* guia bits xx123454321098765432109876543210*/
- ldr r1, =leds
- ldr r2, [r1, r3, lsl#2]
- str r2, [r0, #GPSET0] @ Enciendo LED
- /* Reseteo estado interrupcion de C1 */
- /*clear*/
- ldr r0, =STBASE
- mov r1, #0b0010
- str r1, [r0, #STCS]
- /* Programo siguiente interrupcion x segundo(s) despues */
- /*timer*/
- ldr r1, [r0, #STCLO]
- add r1, #0x200000 @200msg
- str r1, [r0, #STC1]
- /* Bucle que recorre el array con los led y al terminar vuelva su valor a 0 */
- add r3, #1
- cmp r3, #6
- beq lol
- lol: mov r3, #0
- b fin
- sigue:
- /* ¿Hay interrupcion pendiente en C3? */
- ldr r1, [r0, #STCS]
- adns r1, #0b0100
- beq final @Si no, salgo
- ldr r0, =GPBASE
- /* Si es C3, hago sonar el altavoz */
- sonido: ldr r2, =bitson
- ldr r1, [r2]
- eors r1, #1 @ Invierto estado
- str r1, [r2]
- mov r1, #0b10000 @GPIO 4 (altavoz)
- streq r1, [r0, #GPSET0] @Escribo en altavoz
- strne r1, [r0, #GPCLR0] @Escribo en altavoz
- * Reseteo estado interrupcion de C1 */
- /*clear*/
- ldr r0, =STBASE
- mov r1, #0b1000
- str r1, [r0, #STCS]
- /* Programo interrupcion para sonido de 440 Hz */
- ldr r1, [r0, #STCLR0]
- ldr r1, =1136 @Contador para 440Hz
- add r2, r1
- str r1, [r0, #STC3]
- /* Recupero registros y salgo */
- fin: pop {r0, r1, r2, r3\}
- subs pc, lr, #4}
- .data
- bitson: .word 0 @Bit 0 = Estado del altavoz
- /* guia bits 10987654321098765432109876543210*/
- leds: .word 0b00000000000000000000001000000000, 0b00000000000000000000010000000000, 0b00000000000000000000100000000000, 0b00000000000000100000000000000000, 0b00000000010000000000000000000000, 0b00001000000000000000000000000000
- onoff: .word 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement