This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Temporizador PIC 16F873
#1
Buenos dias, estoy embarcado en un pequeño proyecto que me pidio un familiar, desarrollar un temporizador de 0-60 minutos, que active una alarma. Empleo un 16F873, llevaba buen camino, pero jodi el PIC por un error, y ando esperando a que me llege otro....., sin mas distraccion, dejo el esquematico que prepare.

[Imagen: Captura_zpsa975080e.jpg]

[Imagen: IMG_20140707_224507_zps4idmzgps.jpg]

Lleva dos displays multiplexados, manejados por el puerto B, un par de interruptores y un rele para el BUZZER, poco mas, la aplicacion en si es sencilla. Lo estoy programando en ASM, pero como sabemos, tiene su chicha.....

Código:
;Alarma para despertar, a intervalos de un minuto

;===============================================================================
;Configuramos el procesador
    list p=16F873A          ;Definimos el tipo de procesador
    include "P16F873A.inc"  ;Incluimos la libreria
; CONFIG
; __config 0xFF3A
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
;===============================================================================
;MACROS
;Macro para situarnos en el banco de memoria 0
BNK_0 macro
    bcf STATUS,5
    endm
;Macro para situarnos en el banco de memoria 1
BNK_1 macro
    bsf STATUS,5
    endm
;Macro para guardar status y registro de trabajo
PUSH macro
    movwf salv_w
    swapf salv_w,F  ;Hacemos un swap para no modificar F
    swapf STATUS,W  ;Hacemos swap y guardamos en W
    movwf salv_s    ;Guardamos
    endm
;Macro para cargar status y registro de trabajo
POP macro
    swapf salv_s,W
    movwf STATUS
    swapf salv_w,W
    endm
;GUARDAR las unidades y decenas
GUARDAR macro
        movf    unidades,0
        movwf   salv_un
        movf    decenas,0
        movwf   salv_de
        endm
;CARGAR las unidades y decenas
CARGAR  macro
        movf    salv_un,0
        movwf   unidades
        movf    salv_de,0
        movf    decenas
        endm
;===============================================================================
;Variables
salv_w equ 0x20
salv_s equ 0x21
display equ 0x22
unidades equ 0x23
decenas equ 0x24
pulsador1 equ 0x26
antirebote1 equ 0x25
pulsador2 equ 0x27
tempo1 equ 0x28
tempo2 equ 0x29
salv_un equ 0x30
salv_de equ 0x31

;===============================================================================
    org 0x00    ;Vector de reset
    goto    Start

    org 0x04    ;Interrupcion
    goto    Display

;===============================================================================
;Tabla para mostrar los valores en los displays

TABLA       addwf   PCL,1       ;Busca posicion del digito en la tabla
            retlw   b'11000000' ;Digito 0
            retlw   b'11110110' ;Digito 1
            retlw   b'10100001' ;Digito 2
            retlw   b'10100100' ;Digito 3
            retlw   b'10010110' ;Digito 4
            retlw   b'10001100' ;Digito 5
            retlw   b'10011000' ;Digito 6
            retlw   b'11100110' ;Digito 7
            retlw   b'10000000' ;Digito 8
            retlw   b'10000110' ;Digito 9

;===============================================================================
;Rutina de multiplexacion de display
Display PUSH
        bcf INTCON,2    ;Limpiamos flag de interrupcion
        movlw   0xD8    ;Recargamos el timer0
        movwf   TMR0
        movf    display,0
        xorlw   0x00
        btfsc   STATUS,Z    ;Si display es 0, actualizamos el primero
        call    print0
        movf    display,0
        xorlw   0x01
        btfsc   STATUS,Z    ;Si display es 1, actualizamos el segundo
        call    print1
        movlw   0x01        ;Alternamos el display
        xorwf   display,F
        movf    pulsador1,0
        xorlw   0x01
        btfsc   STATUS,Z
        incf    antirebote1
        bcf     STATUS,Z
        movf    antirebote1,0
        xorlw   0x20
        btfsc   STATUS,Z
        call    configu
        POP
        retfie
;===============================================================================
;Impresion en el primer display (Decenas)
print0  movf    decenas,0
        call    TABLA
        bsf     PORTA,0
        bcf     PORTA,1
        movwf   PORTB
        bcf     STATUS,Z
        return
;Impresion en el segundo display (Unidades)
print1  movf    unidades,0
        call    TABLA
        bsf     PORTA,1
        bcf     PORTA,0
        movwf   PORTB
        bcf     STATUS,Z
        return
;===============================================================================
;Configuracion del tiempo a contar
incdec  bcf     STATUS,Z
        incf    decenas
        clrf    unidades
        movf    decenas,W
        xorlw   0x06
        btfsc   STATUS,Z
        clrf    decenas
        return

configu clrf    antirebote1
        bcf     pulsador1,0
        movf    PORTA,0
        andlw   b'00001000'
        btfsc   STATUS,Z
        return
        bcf     STATUS,Z
        incf    unidades
        movf    unidades,0
        xorlw   0x0A
        btfsc   STATUS,Z
        call    incdec
        return
;===============================================================================
tempor  GUARDAR
        goto    tempor_next
tempor_next
        bcf     PIR1,0
        movlw   b'01100011'
        movwf   TMR1H
        movlw   b'11000000'
        movwf   TMR1L
        movlw   b'00000001'
        movwf   T1CON
        movlw   0x00
        movwf   PIE1
        incf    tempo1
temp    btfsc   PIR1,0          ;Si desbordamos el contador
        goto    tempor_next
        movf    tempo1,0
        xorlw   0xFF
        btfsc   STATUS,Z
        call    recall
        movf    tempo2,0
        xorlw   0x0C
        btfsc   STATUS,Z
        call    restarmin
        goto    temp
;===============================================================================
recall  incf    tempo2
        clrf    tempo1
        return
;===============================================================================
restarmin   NOP
            clrf    tempo2
            clrf    tempo1
            decf    unidades,F
            movf    unidades,0
            xorlw   0xFF
            btfsc   STATUS,Z
            call    decrement
            movf    unidades,0
            iorwf   decenas,0
            btfsc   STATUS,Z
            goto    alarma
            goto    tempor
;===============================================================================
decrement   bcf     STATUS,Z
            decf    decenas,F
            movlw   0x09
            movwf   unidades
            return
;===============================================================================
alarma      movf    PORTA,0
            andlw   b'00010000'
            btfss   STATUS,Z
            goto    stop
            goto    alarma
;===============================================================================
stop        CARGAR
            NOP
            goto    Loop
;===============================================================================
Start
    BNK_0
    clrf    PORTB           ;Puertos A y B inicialmente a 0
    clrf    PORTA
    BNK_1
    movlw   b'10000111'     ;Prescaler de 256 asignado a timer0
    movwf   OPTION_REG
    movlw   b'00000110'     ;Configuramos puerto A como digitales
    movwf   ADCON1
    clrf    TRISB
    movlw   b'00011000'     ;Puerto A tres salidas dos entradas (Interruptores)
    movwf   TRISA
    BNK_0
    movlw   b'10100000'
    movwf   INTCON
    movlw   0xD8            ;Cargamos el timmer para tener 10ms
    movwf   TMR0
    clrf    display
    clrf    unidades
    clrf    decenas

Loop
    movf    PORTA,0
    andlw   b'00010000'     ;Comprobamos si esta pulsado el pulsador 2
    btfss   STATUS,Z
    goto    tempor
    bcf     STATUS,Z
    movf    PORTA,0         ;Cargamos el valor de PORTA
    andlw   b'00001000'     ;Comprobamos si esta pulsado el pulsador 1
    btfss   STATUS,Z        ;Si esta pulsado activamos pulsador1
    bsf     pulsador1,0
    bcf     STATUS,Z
    goto Loop
    end

Esto es todo por ahora, el codigo no es del todo funcional, ya cuenta correctamente y se puede establecer la cuenta. Queda hacer que suene el buzzer, el antirrebote de un pulsador, que en ASM no es moco de pavo.... y alguna cosilla mas. Uso dos TIMERS del PIC, uno para la multiplexacion de los displays, y otro para la cuenta.

Espero que a alguien le sirva
  Responder
#2
Programar en ASM lo haces por gusto??
Yo he dado C en pic y no entiendo ni papa jajajajaja
  Responder
#3
La verdad es que si, me gusta bastante programar en ASM jajajaja, ademas ando aprendiendo.

Hay un error en el circuitillo, la salida RA4 del servo no vale, ya que es colector abierto..., la pondre en RA5
  Responder
#4
Buen trabajo amigo! Me pasas tu pista de Eagle? por favor, estoy queriendo hacer el mismo proyecto y no me sale el ruteado! mi correo es: <!-- e --><a href="mailto:tekorei15@gmail.com">tekorei15@gmail.com</a><!-- e -->
de antemano gracias
  Responder
#5
Tengo que corregir una cosa en el esquematico, esta noche te lo subi
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  Reloj/cronometro PIC 16F84A axisgar 16 7,602 23-06-2020, 09:11 PM
Último mensaje: richarddamian
  [INFO+TUTO] Programador USB PIC K150 cansi22 30 38,538 08-12-2018, 02:06 PM
Último mensaje: Shellmer
  Placa de evaluación gratis pic 8 bits Jorge 24 6,851 21-11-2018, 01:11 AM
Último mensaje: Shellmer
  DUDA bootloader para pic OtreblaCU 7 3,615 29-11-2017, 04:17 PM
Último mensaje: OtreblaCU
  Iniciarse programación Pic (USB PIC K150) Kvothe 4 4,419 12-03-2017, 09:33 PM
Último mensaje: Shellmer