Advertisement
Guest User

Untitled

a guest
Jan 21st, 2018
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.99 KB | None | 0 0
  1. /*
  2. 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.
  3. */
  4.  
  5. .include "inter.inc"
  6. .text
  7. /* Agrego vector interrupcion */
  8. ADDEXC 0x18, irq_handler
  9.  
  10. /* Inicializo la pila en modos IRQ y SVC */
  11. mov r0, #0b11010010 @ Modo IRQ, FIQ&IRQ desact
  12. msr cpsr_c, r0
  13. mov sp, #0x8000
  14. mov r0, #0b11010011 @ Modo SVC, FIQ&IRQ desact
  15. msr cpsr_c, r0
  16. mov sp, #0x8000000
  17.  
  18. /* Configuro GPIOs 4, 9, 10, 11, 17, 22 y 27 como salida */
  19. ldr r0, =GPBASE
  20. ldr r1, =0b00001000000000000001000000000000
  21. str r1, [r0, #GPFSEL0]
  22.  
  23. /*guia bits xx999888777666555444333222111000*/
  24. ldr r1, =0b00000000001000000000000000001001
  25. str r1, [r0, #GPFSEL1]
  26. ldr r1, =0b00000000001000000000000001000000
  27. str r1, [r0, #GPFSEL2]
  28.  
  29. /* Programo C1 y C3 para dentro de 2 microsegundos */
  30. ldr r0, =STBASE
  31. ldr r1, [r0, #STCLO]
  32. add r1, #2
  33. str r1, [r0, #STC1]
  34. str r1, [r0, #STC3]
  35.  
  36. /* Habilito interrupciones, local y globalmente */
  37. ldr r0, =INTBASE
  38. mov r1, #0b1010
  39. str r1, [r0, #INTENIRQ1]
  40. mov r0, #0b01010011 @ Modo SVC, IRQ activo msr cpsr_c, r0
  41.  
  42. /* Repetir para siempre */
  43. mov r3, #0
  44. bucle: b bucle
  45.  
  46. /* Rutina de tratamiento de interrupción */
  47. irq_handler:
  48. push {r0, r1, r2, r3, r4}
  49.  
  50. ldr r0, =GPBASE
  51. ldr r1, =0b00001000010000100000111000000000
  52. str r1, [r0, #GPCLR0] @ Apago leds
  53.  
  54.  
  55. /* Consulto si se ha pulsado el boton GPIO2 */
  56. ldr r2, [r0, #GPEDS0]
  57. mov r3, r2
  58. ands r2, #0b00000000000000000000000000000100
  59.  
  60. /* Si: Activo LEDS*/
  61.  
  62. /* guia bits xx123454321098765432109876543210*/
  63. ldr r1, =leds
  64. ldr r2, [r1, r3, lsl#2]
  65. str r2, [r0, #GPSET0] @ Enciendo LED
  66.  
  67. /* Reseteo estado interrupcion de C1 */
  68. /*clear*/
  69. ldr r0, =STBASE
  70. mov r1, #0b0010
  71. str r1, [r0, #STCS]
  72.  
  73. /* Programo siguiente interrupcion x segundo(s) despues */
  74. /*timer*/
  75. ldr r1, [r0, #STCLO]
  76. add r1, #0x200000 @200msg
  77. str r1, [r0, #STC1]
  78.  
  79. /* Bucle que recorre el array con los led y al terminar vuelva su valor a 0 */
  80. add r3, #1
  81. cmp r3, #6
  82. beq lol
  83.  
  84. lol: mov r3, #0
  85. b fin
  86.  
  87. sigue:
  88.  
  89. /* ¿Hay interrupcion pendiente en C3? */
  90. ldr r1, [r0, #STCS]
  91. adns r1, #0b0100
  92. beq final @Si no, salgo
  93. ldr r0, =GPBASE
  94.  
  95. /* Si es C3, hago sonar el altavoz */
  96. sonido: ldr r2, =bitson
  97. ldr r1, [r2]
  98. eors r1, #1 @ Invierto estado
  99. str r1, [r2]
  100. mov r1, #0b10000 @GPIO 4 (altavoz)
  101. streq r1, [r0, #GPSET0] @Escribo en altavoz
  102. strne r1, [r0, #GPCLR0] @Escribo en altavoz
  103.  
  104. * Reseteo estado interrupcion de C1 */
  105. /*clear*/
  106. ldr r0, =STBASE
  107. mov r1, #0b1000
  108. str r1, [r0, #STCS]
  109.  
  110. /* Programo interrupcion para sonido de 440 Hz */
  111. ldr r1, [r0, #STCLR0]
  112. ldr r1, =1136 @Contador para 440Hz
  113. add r2, r1
  114. str r1, [r0, #STC3]
  115.  
  116. /* Recupero registros y salgo */
  117. fin: pop {r0, r1, r2, r3\}
  118. subs pc, lr, #4}
  119.  
  120. .data
  121. bitson: .word 0 @Bit 0 = Estado del altavoz
  122.  
  123. /* guia bits 10987654321098765432109876543210*/
  124. leds: .word 0b00000000000000000000001000000000, 0b00000000000000000000010000000000, 0b00000000000000000000100000000000, 0b00000000000000100000000000000000, 0b00000000010000000000000000000000, 0b00001000000000000000000000000000
  125. onoff: .word 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement