Advertisement
anbo_one

lab6 andy

Mar 31st, 2021
576
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.41 KB | None | 0 0
  1. ;------------------------------------------------------------------------------
  2. ;Archivo: lab6.s
  3. ;Microcontrolador: PIC16F887
  4. ;Autor: Andy Bonilla
  5. ;Compilador: pic-as (v2.30), MPLABX v5.45
  6.  
  7. ;Programa: Laboratorio 6
  8. ;Hardware: PIC16F887
  9.  
  10. ;Creado: 23 de marzo de 2021
  11. ;Descripcion: incrementar variable con Tmr1, luz y displays titilantes con Tmr2
  12. ; displays multiplexados con tmr0
  13. ;------------------------------------------------------------------------------
  14.  
  15. ;---------libreras a emplementar-----------------------------------------------
  16. PROCESSOR 16F887
  17. #include <xc.inc>
  18.  
  19. ;------configuration word 1----------------------------------------------------
  20. CONFIG FOSC=INTRC_NOCLKOUT ;se declara osc interno
  21. CONFIG WDTE=OFF ; Watchdog Timer apagado
  22. CONFIG PWRTE=ON ; Power-up Timer prendido
  23. CONFIG MCLRE=OFF ; MCLRE apagado
  24. CONFIG CP=OFF ; Code Protection bit apagado
  25. CONFIG CPD=OFF ; Data Code Protection bit apagado
  26.  
  27. CONFIG BOREN=OFF ; Brown Out Reset apagado
  28. CONFIG IESO=OFF ; Internal External Switchover bit apagado
  29. CONFIG FCMEN=OFF ; Fail-Safe Clock Monitor Enabled bit apagado
  30. CONFIG LVP=ON ; low voltaje programming prendido
  31.  
  32. ;----------configuration word 2-------------------------------------------------
  33. CONFIG BOR4V=BOR40V ;configuración de brown out reset
  34. CONFIG WRT = OFF ;apagado de auto escritura de c�³digo
  35.  
  36. ;---------------------macros---------------------------------------------------
  37. ;configuracion de macro para reinicio del timer0
  38. reset_timer0 macro ; lo que anteriormente fue subrutina, se hizo macro
  39. movlw 223 ; dada la configuración del prescaler
  40. movwf TMR0 ; se guarda en timer0
  41. bcf T0IF ; bandera cuando no hay overflow
  42. endm
  43.  
  44. ;configuracion de macro para reinicio del timer1
  45. reset_timer1 macro
  46. movlw 0x0B ;se mueven MSB a TM1H
  47. movwf TMR1H
  48. movlw 0xDC ;se mueven LSB a TMR1L
  49. movwf TMR1L
  50. bcf TMR1IF ;PIR1, 0 ;bajo la bandera
  51. endm
  52.  
  53. ;--------------------- variables ----------------------------------------------
  54. PSECT udata_bank0
  55. ;contadora para timer1
  56. cont_timer1: DS 1
  57. cont_timer0: DS 1
  58. cont_timer2: DS 1
  59. ;variable para el multiplexado
  60. banderas: DS 1
  61. nibble: DS 2 ; me lleva la cuenta de los displays
  62. display_var: DS 2
  63.  
  64. ;---------------------- variables de interrupcion -----------------------------
  65. PSECT udata_shr
  66. W_TEMP: DS 1
  67. STATUS_TEMP: DS 1
  68.  
  69.  
  70. ;--------------------------- reset vector -------------------------------------
  71. PSECT resVect, class=CODE, abs, delta=2 ;
  72. ORG 00h
  73. resetVector:
  74. PAGESEL main
  75. goto main
  76.  
  77. ;------------------------ interrupt vector ------------------------------------
  78. PSECT intVect, class=code, abs, delta=2
  79. ORG 04h
  80. push:
  81. movwf W_TEMP
  82. swapf STATUS, W
  83. movwf STATUS_TEMP
  84.  
  85. isr:
  86. btfsc TMR1IF ;ver si Interrupcion Tmr1 está prendida
  87. call suma_timer1
  88.  
  89. btfsc T0IF ;ver si interrupcion Tmr0 está prendida
  90. call display_timer0
  91.  
  92. btfsc TMR2IF ;ver si Interrupcion Tmr2 está prendida
  93. call led_timer2
  94.  
  95. pop:
  96. swapf STATUS_TEMP
  97. movwf STATUS
  98. swapf W_TEMP, F
  99. swapf W_TEMP, W
  100. retfie
  101.  
  102. ;-------------------------- subrutinas de interruption -----------------------
  103. ;incremento de variable con timer1
  104. suma_timer1:
  105. banksel PORTA
  106. incf cont_timer1
  107. ; incf PORTB
  108. reset_timer1
  109. return
  110.  
  111. ;led intermitente con timer2
  112. led_timer2:
  113. ;incf PORTB
  114. btfsc cont_timer2,0
  115. goto luzprendida
  116. goto luzapagado
  117.  
  118. luzprendida:
  119. bsf PORTA,0
  120. bsf PORTD,0
  121. bsf PORTD,1
  122. goto cambioled
  123.  
  124. luzapagado:
  125. bcf PORTA,0
  126. bcf PORTD,0
  127. bcf PORTD,1
  128. goto cambioled
  129.  
  130. cambioled:
  131. movlw 1
  132. xorwf cont_timer2,F
  133. bcf TMR2IF
  134. return
  135.  
  136.  
  137. ;multiplexada de displays con timer0
  138. display_timer0:
  139. reset_timer0
  140. clrf PORTD
  141. btfsc banderas,0
  142. goto display0
  143. goto display1
  144.  
  145. display0:
  146. movf display_var, W
  147. movwf PORTC
  148. bsf PORTD, 1
  149. goto otro_display
  150.  
  151. display1:
  152. movf display_var+1, W
  153. movwf PORTC
  154. bsf PORTD, 0
  155. goto otro_display
  156.  
  157. otro_display:
  158. movlw 1
  159. xorwf banderas,F
  160. bcf T0IF
  161. return
  162.  
  163. ;mux_timer0:
  164.  
  165. ;----------------------------- codigo principal -------------------------------
  166. PSECT code, delta=2, abs
  167. ORG 100h
  168. tabla:
  169. clrf PCLATH ; asegurarase de estar en sección
  170. bsf PCLATH, 0 ;
  171. andlw 0x0f ; se eliminan los 4 MSB y se dejan los 4 LSB
  172. addwf PCL, F ; se guarda en F
  173. retlw 00111111B ; 0
  174. retlw 00000110B ; 1
  175. retlw 01011011B ; 2
  176. retlw 01001111B ; 3
  177. retlw 01100110B ; 4
  178. retlw 01101101B ; 5
  179. retlw 01111101B ; 6
  180. retlw 00000111B ; 7
  181. retlw 01111111B ; 8
  182. retlw 01101111B ; 9
  183. retlw 01110111B ; A
  184. retlw 01111100B ; B
  185. retlw 00111001B ; C
  186. retlw 01011110B ; D
  187. retlw 01111001B ; E
  188. retlw 01110001B ; F
  189.  
  190. ;--------------------------configuraciones ------------------------------------
  191. main:
  192. clrf cont_timer1 ; asegurar que empieza en 0
  193. clrf cont_timer0 ; asegurar que empieza en 0
  194. ;se llaman las subrutinas de configuración
  195. call io_config
  196. call reloj_config
  197. call timer0_config
  198. call timer1_config
  199. call timer2_config
  200. call interruptiones_config
  201.  
  202.  
  203.  
  204. ;------------------------ loop de programa ------------------------------------
  205. loop:
  206. call separar_nibbles
  207. call variables_displays
  208. goto loop
  209.  
  210. ;------------------------ subrutinas regulares --------------------------------
  211. io_config:
  212. banksel ANSEL
  213. clrf ANSEL
  214. clrf ANSELH
  215.  
  216. banksel TRISA
  217. clrf TRISA ; PortA como salida, led intermitente
  218. clrf TRISB ; PortA como salida, led intermitente
  219. clrf TRISC ; POrtC como salida, displays
  220. bcf TRISD,0 ; PortD como salida, transistores
  221. bcf TRISD,1 ; PortD como salida, transistores
  222.  
  223. banksel PORTA
  224. clrf PORTA ; PortA como salida, led intermitente
  225. clrf PORTB ; PortA como salida, led intermitente
  226. clrf PORTC ; PortA como salida, displays
  227. bcf PORTD,0 ; PortA como salida, transistores
  228. bcf PORTD,1 ; PortA como salida, transistores
  229. return
  230.  
  231. reloj_config:
  232. banksel OSCCON ;se llama al registro
  233. bsf OSCCON,0 ;reloj interno
  234. bcf OSCCON,4 ; freq de oscilacion 1MHz, 110
  235. bcf OSCCON,5 ; freq de oscilacion 1MHz, 110
  236. bsf OSCCON,6 ; freq de oscilacion 1MHz, 110
  237. return
  238.  
  239. timer0_config:
  240. banksel TRISA
  241. banksel OPTION_REG
  242. bsf OPTION_REG,0 ; prescaler, 111 1:256
  243. bsf OPTION_REG,1 ; prescaler, 111 1:256
  244. bsf OPTION_REG,2 ; prescaler, 111 1:256
  245. bcf OPTION_REG,3 ; preescaler a WDT apagado
  246. bcf OPTION_REG,4 ; oscilador interno encendido
  247. reset_timer0
  248. return
  249.  
  250. timer1_config:
  251. banksel TRISA
  252. ;bsf PIE1, 0 ; se prende la interrupción del TMR1
  253. banksel T1CON
  254. bsf TMR1ON ;se prende el timer1
  255. bcf TMR1CS ; se activa el temporizador con intosc
  256. bcf T1SYNC ; sincronizacion apagada
  257. bsf T1CON, 3 ; oscilador baja potencia
  258. bsf T1CON, 4 ; prescaler 0, 11-> 1:8
  259. bsf T1CON, 5 ; prescaler 1, 11-> 1:8
  260. bcf TMR1GE ; Gate enable apagado
  261. bcf T1GINV ;gate inverter apagado
  262. reset_timer1
  263. return
  264.  
  265. timer2_config:
  266. ;banksel PORTA
  267. banksel T2CON
  268. bsf T2CON,0 ; configuracion prescaler tmr2 11 1:16
  269. bsf T2CON,1 ; configuracion prescaler tmr2 11 1:16
  270. bsf T2CON,2 ; se enciende el timer2
  271. bsf T2CON,3 ;configuracion del postscaler 1111 1:16
  272. bsf T2CON,4 ;configuracion del postscaler 1111 1:16
  273. bsf T2CON,5 ;configuracion del postscaler 1111 1:16
  274. bsf T2CON,6 ;configuracion del postscaler 1111 1:16
  275. banksel TRISA
  276. movlw 244
  277. movwf PR2
  278. return
  279.  
  280. interruptiones_config:
  281. banksel PORTA
  282. ;interrupciones del Timer0
  283. banksel INTCON
  284. bcf INTCON,2 ; interrupcion del tmr0
  285. bsf INTCON,5 ; enable bit de interrupcion Tmr0
  286. bsf INTCON,7 ; encendido interrupciones globales
  287.  
  288. ;interrupciones del timer1 y timer2
  289. banksel PIE1
  290. bsf PIE1,0 ; enable bit de interrupcion tmr1, encendido
  291. bsf PIE1,1 ; enable bit de interrupcion tmr2, encendido
  292. ;el resto van apagados
  293.  
  294. banksel PIR1
  295. bcf PIR1,0 ; interrupcion tmr1 encendida
  296. bcf PIR1,1 ; interrupcion tmr2 encendida
  297. ;el resto van apagados
  298. return
  299.  
  300. separar_nibbles:
  301. movf PORTB,W
  302. andlw 0x0F
  303. movwf nibble
  304. swapf PORTB, W
  305. andlw 0x0F
  306. movwf nibble+1
  307. return
  308.  
  309. variables_displays:
  310. ;msb
  311. movf nibble+1, W ; display bit0 contador hex
  312. call tabla ; llamo al valor de la tabla
  313. movwf display_var+1 ; muevo variable display_var+1 a f
  314. ;lsb
  315. movf nibble, W ; display bit1 contador hex
  316. call tabla ; llamo al valor de la tabla
  317. movwf display_var ; muevo variable display_var a f
  318. return
  319.  
  320.  
  321. END
  322.  
  323.  
  324.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement