Advertisement
anbo_one

Lab 5, PuC

Mar 8th, 2021
1,566
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;------------------------------------------------------------------------------
  2. ;Archivo: Lab5
  3. ;Microcontrolador: PIC16F887
  4. ;Autor: Andy Bonilla
  5. ;Programa: Displys multiplexados con contadores0
  6. ;Descripcion: contadores con despliegue en LEDS y displyas multiplexados
  7. ;Hardware:
  8. ;------------------------------------------------------------------------------
  9.  
  10. ;---------libreras a emplementar-----------------------------------------------
  11. PROCESSOR 16F887
  12. #include <xc.inc>
  13. ;------configuration word 1----------------------------------------------------
  14. CONFIG  FOSC=INTRC_NOCLKOUT ;se declara osc interno
  15. CONFIG  WDTE=OFF            ; Watchdog Timer apagado
  16. CONFIG  PWRTE=ON            ; Power-up Timer prendido
  17. CONFIG  MCLRE=OFF           ; MCLRE apagado
  18. CONFIG  CP=OFF              ; Code Protection bit apagado
  19. CONFIG  CPD=OFF             ; Data Code Protection bit apagado
  20.  
  21. CONFIG  BOREN=OFF           ; Brown Out Reset apagado
  22. CONFIG  IESO=OFF            ; Internal External Switchover bit apagado
  23. CONFIG  FCMEN=OFF           ; Fail-Safe Clock Monitor Enabled bit apagado
  24. CONFIG  LVP=ON          ; low voltaje programming prendido
  25.  
  26. ;----------configuration word 2-------------------------------------------------
  27. CONFIG BOR4V=BOR40V     ;configuración de brown out reset
  28. CONFIG WRT = OFF        ;apagado de auto escritura de código
  29.  
  30. ;---------------------------macros -------------------------------------------
  31. reset_timer macro       ; lo que anteriormente fue subrutina, se hizo macro
  32.     movlw   40      ; dada la configuración del prescaler
  33.     movwf   TMR0        ; se guarda en timer0
  34.     bcf     T0IF        ; bandera cuando no hay overflow
  35.     endm    
  36.    
  37. ;-------------------------variables x --------------------------------------- -
  38. GLOBAL W_TEMP, STATUS_TEMP, cont, var, banderas, nibble, display_var, dis3, dis4, dis5
  39.     PSECT   udata_bank0
  40.     cont:       DS 2 ; variable de contador sencillo
  41.     backup:     DS 2 ; variable de respaldo de contador
  42.     dis3:       DS 1 ; resultado de centenas
  43.     dis4:       DS 1 ; resultado de decenas
  44.     dis5:       DS 1 ; resultado de unidades
  45.     var:        DS 1
  46.     banderas:       DS 1
  47.     nibble:     DS 2 ; me lleva la cuenta de los displays
  48.     display_var:    DS 2
  49.    
  50. ;-------------- variables de interrupcion -------------------------------------
  51. PSECT udata_shr    
  52.  W_TEMP:    DS 1
  53.  STATUS_TEMP:   DS 1
  54.  
  55. ;-----------------vect reset --------------------------------------------------
  56. PSECT resVect, class=CODE, abs, delta=2 ;
  57.  ORG 00h
  58.  PAGESEL main
  59.  goto    main
  60.  
  61. ;------------------------ interrupt vector ------------------------------------
  62. PSECT   intVect, class=code, abs, delta=2
  63. ORG 04h
  64. push:
  65.     movwf   W_TEMP      ; variable se almacena en f
  66.     swapf   STATUS, W   ; se dan vuelta nibble
  67.     movwf   STATUS_TEMP ; se almacena en status_temp   
  68. isr:
  69.     btfsc   T0IF        ; se revisa si está activada la bandera
  70.     call    sumaresta_int
  71.     call    int_timer0  ; se usa subrutina
  72. pop:
  73.     swapf   STATUS_TEMP ; se da vuelta a cantidad
  74.     movwf   STATUS      ; se almacena en status
  75.     swapf   W_TEMP, F   ; se da vuelta otra vez
  76.     swapf   W_TEMP, W   ; se vuelve a dar vuelta y se almacena en w
  77.     retfie
  78. ;---------------------subrutinas de interrupt ---------------------------------
  79. sumaresta_int:
  80.     btfsc   PORTB,0
  81.     incf    PORTA
  82.    
  83.     btfsc   PORTB,1
  84.     decf    PORTA
  85.     return
  86.  
  87. int_timer0:
  88.     reset_timer         ; se reinicia el timer0
  89.     clrf    PORTD       ; PSM limpio el PortD
  90.     btfsc   banderas,0  ; si se si ese bit es 0
  91.     goto    display1    ; info se madna a sub-subrutina
  92.    
  93. display0:    
  94.     clrf    PORTD       ; PSM se limpia PortD
  95.     movf    display_var,; se mueve el de alla abajoa
  96.     movwf   PORTC       ; se mueve al portc multiplezado
  97.     bsf     PORTD, 0    ; se prende transistor que este anclado
  98.     goto    siguiente_display
  99.        
  100. display1:    
  101.     clrf    PORTD       ; PSM se limpia PortD
  102.     movf    display_var+1, W    ; se mueve el de alla abajoa
  103.     movwf   PORTC           ; se mueve al portc multiplezado
  104.     bsf     PORTD, 1        ; se prende transistor que este anclado
  105.    
  106.     goto    siguiente_display
  107.  
  108. ; el display 2 lo dejé en blanco para que no se confundiera, y todo lo
  109. ; relacionado con estas subrutinas tienen el mismo salto 1->3
  110.    
  111. display3:    
  112.     clrf    PORTD           ; PSM se limpia PortD
  113.     movf    display_var+2, W    ; se toma valor almacenado de centenas
  114.     movwf   PORTC           ; se mueve al PortC
  115.     bsf     PORTD, 3        ; se prende transistor que este anclado
  116.     goto    siguiente_display
  117.    
  118. display4:    
  119.     clrf    PORTD
  120.     movf    display_var+3, W
  121.     clrf    PORTC
  122.     movwf   PORTC
  123.     bsf     PORTD, 4
  124.     goto    siguiente_display
  125.    
  126. display5:    
  127.     clrf    PORTD
  128.     movf    display_var+4, W
  129.     clrf    PORTC
  130.     movwf   PORTC
  131.     bsf     PORTD, 5
  132.     goto    siguiente_display
  133.  
  134.  
  135. siguiente_display: ; <----- hay que encontrar la forma de hacer esto, practicamente hacer alternar los tranaistores
  136.     bcf     CARRY
  137.     btfsc   PORTD, 5
  138.     goto    $-3
  139.     movlw   01h
  140.     movwf   banderas
  141.     rlf     banderas, F
  142.     return
  143.    
  144.    /*
  145.     movlw   1      
  146.     xorwf   banderas, F
  147.     return
  148.    */
  149. ;-------------------- código principal ---------------------------------------
  150. PSECT code, delta=2, abs
  151. ORG 100h
  152.  
  153. tabla:
  154.     clrf    PCLATH      ; asegurarase de estar en sección
  155.     bsf     PCLATH, 0       ;
  156.     andlw   0xff        ;
  157.     addwf   PCL, F      ; se guarda en F
  158.     retlw   00111111B       ; 0
  159.     retlw   00000110B       ; 1
  160.     retlw   01011011B       ; 2
  161.     retlw   01001111B       ; 3
  162.     retlw   01100110B       ; 4
  163.     retlw   01101101B       ; 5
  164.     retlw   01111101B       ; 6
  165.     retlw   00000111B       ; 7
  166.     retlw   01111111B       ; 8
  167.     retlw   01101111B       ; 9
  168.     retlw   01110111B       ; A
  169.     retlw   01111100B       ; B
  170.     retlw   00111001B       ; C
  171.     retlw   01011110B       ; D
  172.     retlw   01111001B       ; E
  173.     retlw   01110001B       ; F
  174.    
  175. ;--------------------------configuraciones ------------------------------------
  176. main:
  177.     call    io_config
  178.     call    reloj_config
  179.     call    timer0_config
  180.     banksel PORTA
  181. ;------------------------ loop de programa ------------------------------------    
  182. loop:
  183.     movlw   0x01; aqui pego los contadores de la tabla
  184.     movwf   var ; contador por acá
  185.    ;contador
  186.     call        separar_nibbles
  187.     call    variables_displays
  188.    
  189. ;    btfsc  PORTB, 0    ; incf    
  190. ;    call   suma        ;
  191. ;    btfsc  PORTB, 1    ;
  192. ;    call   resta
  193.     ;call   decimal
  194.     ;bcf        banderas ;, displayValue
  195.     goto    loop
  196.  
  197. ;------------------------ subrutinas regulares --------------------------------
  198. io_config:
  199.     banksel ANSEL
  200.     clrf    ANSEL       ; aseguramos que sea digital
  201.     clrf    ANSELH      ; configuración de pin analógico
  202.    
  203.     banksel TRISA
  204.     clrf    TRISA       ; PortA como salida
  205.     bsf     TRISB, 0    ; PortB0 como entrada
  206.     bsf     TRISB, 1    ; PortB1 como entrada
  207.     clrf    TRISC       ; PortC como salida
  208.     clrf    TRISD       ; POrtD como salida
  209.    
  210.     banksel PORTA      
  211.     clrf    PORTA       ; PortA como salida
  212.     bsf     PORTB, 0    ; PortB0 como entrada
  213.     bsf     PORTB, 1    ; PortB1 como entrada
  214.     clrf    PORTC       ; PortC como salida
  215.     clrf    PORTD       ; PortD como salida
  216.    
  217.     bsf     OPTION_REG, 7
  218.     bsf     WPUB, 0
  219.     bsf     WPUB, 1
  220.    
  221.     return
  222.    
  223. reloj_config:
  224.     banksel OSCCON
  225.     bcf     IRCF2       ; clear, se pone Freq de 500KHz -> 010
  226.     bsf     IRCF1       ; set, ; se pone Freq de 500KHz -> 010
  227.     bcf     IRCF0       ; clear, ; se pone Freq de 500KHz -> 010
  228.     bsf     SCS
  229.     return
  230.  
  231. timer0_config:
  232.     banksel TRISA
  233.     bcf     T0CS
  234.     bcf     PSA     ; se configura preescaler
  235.     bsf     PS2     ; set,
  236.     bsf     PS1     ; set
  237.     bsf     PS0     ; set
  238.     banksel PORTA
  239.     reset_timer
  240.     bsf     GIE     ; se prender bits de interrupciones
  241.     bsf     T0IE        ; interrupt enabel
  242.     bcf     T0IF        ; interrupt flag
  243.     return
  244.  
  245. suma:
  246.     btfsc   PORTB, 0
  247.     goto    $-1     ; regresar una linea en codigo
  248.     incf    PORTA
  249.     incf    cont, F     ; antes estaba
  250.     ;incf   backup, F
  251.     ;call   centenas
  252.     return
  253.  
  254. resta:
  255.     btfsc   PORTB, 1
  256.     goto    $-1     ; regresar una linea en codigo
  257.     decf    PORTA  
  258.     decf    cont, F
  259.     ;decf   backup, F
  260.     ;call   centenas
  261.     return
  262.  
  263. separar_nibbles:
  264.     movf    PORTA, w    ; separo los nibbles del display0
  265.     andlw   0x0f        ; limite de LSB
  266.     movwf   nibble      ; muevo nibble a f
  267.    
  268.     swapf   PORTA, W        ; separo los nibbles del display1
  269.     andlw   0x0f        ; limite de LSB
  270.     movwf   nibble+1    ; muevo nibble+1 a f
  271.  
  272.     return
  273.    
  274. variables_displays:
  275.     movf    nibble, W   ; display bit1 contador hex
  276.     call    tabla       ; llamo al valor de la tabla
  277.     movwf   display_var ; muevo variable display_var a f
  278.  
  279.     movf    nibble+1, W ; display bit0 contador hex
  280.     call    tabla       ; llamo al valor de la tabla
  281.     movwf   display_var+1   ; muevo variable display_var+1 a f
  282.    
  283.     movf    dis3, W     ; display bit0 contador hex
  284.     call    tabla       ; llamo al valor de la tabla
  285.     movwf   display_var+2   ; muevo variable display_var+1 a f
  286.    
  287.     movf    dis4, W     ; display bit0 contador hex
  288.     call    tabla       ; llamo al valor de la tabla
  289.     movwf   display_var+3   ; muevo variable display_var+1 a f
  290.    
  291.     movf    dis5, W     ; display bit0 contador hex
  292.     call    tabla       ; llamo al valor de la tabla
  293.     movwf   display_var+4   ; muevo variable display_var+1 a f
  294.    
  295.     return
  296.    ; nibble tiene el valor de PortA
  297.    ; display_var tiene el binario de la tabla del PortA
  298.    ; evaluar valor de PortA -100
  299.  
  300.  
  301. centena:
  302.     clrf    dis3        ; se limpia nueva variable
  303.     bcf     CARRY       ; se limpia bit carry
  304.     movf    PORTA, W    ; se toma valor del PortA
  305.     movwf   var     ; se mueve a var
  306.     movlw   100     ; se agrega a W 100
  307.     subwf   var, F      ; resta el POrtA y 100
  308.     incf    dis3        ; se suma el número de restas
  309.     btfsc   CARRY       ; se ve si dio 0 o no
  310.     goto    $-3     ; se regresa instruccion hasta que de 0
  311.     decf    dis3        ; se resta una vez 
  312.     addwf   var     ; se agrega el resultado a var
  313.     movf    dis3, W     ; se mueve a dis3 -> centenas
  314.     call    tabla       ; se llama ese valor de la tabla para el 7seg
  315.     movwf   display_var+3   ; se mueve a valor multiplezado
  316.     movwf   PORTC       ; se mueve al PortC
  317.     goto    decena      ; se pasa a siguiente subrutina
  318.    
  319. decena:
  320.     clrf    dis4        ; se limpia nueva variable
  321.     bcf     CARRY       ; se limpia bit carry
  322.     movlw   10      ; se toma valor del PortA
  323.     subwf   var     ; se mueve a var
  324.     incf    dis4         ; se agrega a W 100
  325.     goto    $-3     ; resta el POrtA y 100
  326.     decf    dis4        ; se suma el número de restas
  327.     addwf   var     ; se ve si dio 0 o no
  328.     movwf   dis4, W     ; se regresa instruccion hasta que de 0
  329.     call    tabla       ; se resta una vez 
  330.     movwf   display_var+4       ; se mueve a valor multiplezado
  331.     ;movwf  PORTC           ; se mueve al PortC
  332.     goto    unidad          ; se pasa a siguiente subrutina
  333.     return
  334.    
  335. unidad:
  336.     movf    var, W      ; se toma el residuo y se manda a Q
  337.     call    tabla       ; se llama ese valor de la tabla    
  338.     movwf   display_var+5   ; se guarda en valor multiplexado
  339.     return
  340.  
  341. END
  342.    
  343.    
  344.    
  345.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement