Autor Tema: Ayuda temporizador con PIC16F88  (Leído 1848 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ignacio88

  • PIC10
  • *
  • Mensajes: 2
Ayuda temporizador con PIC16F88
« en: 02 de Enero de 2016, 09:16:53 »
 :(

Hola a todos, hace ya unos cuantos años que no programo en PIC, pero por circustancias de la vida me he vuelto a meter en este mundillo, la verdad es que tengo las cosas un poco olvidadas. Estoy intentando hacer un programa yo creo que sencillo con un PIC 16F88 usando el oscilador interno. He realizado este PIC por el tema de que no tengo que añadirle un cristal de cuarzo ya que el temporizador no me hace falta que sea muy preciso, y porque es con el que he trabajado siempre

El programa que necesito hacer es el siguiente:

Necesito que active un salida del PORTB,0 , cuando una entrada de PORTA,0 se ponga a 1, mientras esa entrada esté activada que la salida se quede activada. Este paso es muy sencillo y lo tengo perfectamente realizado.

Cuando se desactive la entrada de PORTA, la salida de PORTB,0 se tiene que desactivar, y se tiene que activar otra salidar PORTB,1 durante 10-12 segundos (mas o menos) cuando pase ese tiempo se tienen que desactivar todas las salidas de PORTB. Si antes de que acabe el tiempo se activa por algun motivo la entrada de PORTA,0 el programa tendria que volver a empezar y el temporizador tambien.

Esto es lo que tengo yo realizado por si alguien me puede echar una mano.



   LIST P=16F88
   #INCLUDE "P16F88.INC"
   __CONFIG   _CONFIG1,(2f10)   ;palabra de configuracion

   #DEFINE  atras      PORTA,0      ; Interuptor Marcha atras
   #DEFINE  rear      PORTB,0      ; activar camara trasera
   #DEFINE  front      PORTB,1      ; activar camara delantera


;----------------   DECLARACION DE VARIABLES   ------------

   ; Variables locales
   CBLOCK      0x20
   ENDC
   
;-----------  CONFIGUARION INICIAL  ------------------------

      ORG 0 ; direccion de comienzo del programa, si no le pones nada comienza en la cero
      goto   programa
;------------------------------------CONFIGURACION INICIAL--- ------------------------------------------------------
programa
      bsf    STATUS,RP0  ;ir a bank1 para configurar
      clrf   ANSEL      ;desactivar entradas analogicas
      movlw    b'11111111'   ;cargamos todo a 1 para que el PORTA sea entrada
      movwf   TRISA       ;PORTA entrada
      clrf   TRISB      ;PORTB salida
      bsf     OSCCON,IRCF2;oscilador interno, pone a 1 el bit 15 para que sea salida
      bsf     OSCCON,IRCF1;Fosc = 4MHz, pone a 1 el bit 16 para que sea salida
      movlw   b'01000'   ;Ponemos este numero para configurar el TMR0 a 1:2
      movwf   OPTION_REG   ;Movemos el numero de W al OPTION REG
      bcf      STATUS,RP0   ;volver a bank0
      goto      inicio
      

;_________________PROGRAMA PRINCIPAL_________________________
inicio
      clrf   PORTB         ;Borramos PORTB para que no quede ninguna salida activada y se ponga en marcha al iniciar
      clrf   TMR0         ;Borramos el TMR0
      
bucle
   movlw   b'00000000'
   movwf   PORTB   
   btfss   atras            ;quedarse aqui mientras no se haya metido la marcha atras
   goto   bucle
   goto   trasera

   
trasera

   bsf      rear            ;activamos la cámara trasera
   btfsc   atras            ;quedarse aqui la marcha atras este metida
   goto   trasera
   goto   delantera

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda temporizador con PIC16F88
« Respuesta #1 en: 02 de Enero de 2016, 12:23:44 »
Código: ASM
  1. ; Variables locales
  2.         CBLOCK      0xF0
  3.         Contador
  4.         STATUS_TEMP
  5.         W_TEMP
  6.         PCLATH_TEMP
  7.         ENDC
  8.  
  9.  
  10.  
  11.  
  12. ;-----------  CONFIGUARION INICIAL  ------------------------
  13.  
  14.         ORG 0x00                        ; direccion de comienzo del programa, si no le pones nada comienza en la cero
  15.         GOTO    programa
  16.         ORG 0x04
  17.         GOTO    Interrupcion
  18.  
  19. ;------------------------------------CONFIGURACION INICIAL--- ------------------------------------------------------
  20.  
  21. programa
  22.         BANKSEL ANSEL           ;ir a bank1 para configurar
  23.         clrf    ANSEL           ;desactivar entradas analogicas
  24.         movlw   b'11111111'     ;cargamos todo a 1 para que el PORTA sea entrada
  25.         movwf   TRISA           ;PORTA entrada
  26.         clrf    TRISB           ;PORTB salida
  27.  
  28.         ; Oscilador
  29.  
  30.         bsf     OSCCON,IRCF2    ;oscilador interno, pone a 1 el bit 15 para que sea salida
  31.         bsf     OSCCON,IRCF1    ;Fosc = 4MHz, pone a 1 el bit 16 para que sea salida
  32.  
  33.         ; Timer
  34.        
  35.         movlw   b'01000'        ;Ponemos este numero para configurar el TMR0 a 1:2
  36.         movwf   OPTION_REG      ;Movemos el numero de W al OPTION REG
  37.         BSF     INTCON,TMR0IE   ; Activo interrupcion del TMR0
  38.         BCF     INTCON,TMR0IF   ; Borro flag
  39.         BSF     INTCON,PEIE     ; Activo interrupcion de perifericos
  40.         BSF     INTCON,GIE      ; Activo la interrupciones globales
  41.  
  42.         ;Valores iniciales
  43.  
  44.         BANKSEL PORTB
  45.         CLRF    PORTB         ;Borramos PORTB para que no quede ninguna salida activada y se ponga en marcha al iniciar
  46.         CLRF    TMR0         ;Borramos el TMR0
  47.         CLRF    Contador
  48.  
  49. ;_________________PROGRAMA PRINCIPAL_________________________
  50.  
  51.      
  52. Principal:
  53.         BTFSS   PORTA,0
  54.         GOTO    Activo
  55.  
  56.         ; PORTA,0 = 0
  57.         BCF     PORTB,0         ; Casi que se puso en 0 simplemente pongo en 0 PORTB,0
  58.         GOTO    Principal
  59.  
  60. Activo:
  61.  
  62.         ; PORTA,0 = 1
  63.         MOVLW   0x03            ; Activo los 2 PORTB
  64.         MOVWF   PORTB
  65.         CLRF    Contador        ; Limpio contador de la interrupcion
  66.         GOTO    Principal
  67.  
  68. ;_________________INTERRUPCION_________________________
  69.  
  70. Interrupcion:
  71.         MOVWF   W_TEMP          ;Copy W to TEMP register
  72.         SWAPF   STATUS, W       ;Swap status to be saved into W
  73.         CLRF    STATUS          ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
  74.         MOVWF   STATUS_TEMP     ;Save status to bank zero STATUS_TEMP register
  75.         MOVF    PCLATH, W       ;Only required if using page 1
  76.         MOVWF   PCLATH_TEMP     ;Save PCLATH into W
  77.         CLRF    PCLATH          ;Page zero, regardless of current page
  78.  
  79.         CLRF    TMR0
  80.         BCF     INTCON,TMR0IF
  81.         INCF    Contador,F
  82.         MOVLW   d'250'
  83.         SUBWF   Contador,W
  84.         BTFSC   STATUS,Z
  85.         BCF     PORTB,1
  86.  
  87.         MOVF    PCLATH_TEMP, W  ;Restore PCLATH
  88.         MOVWF   PCLATH          ;Move W into PCLATH
  89.         SWAPF   STATUS_TEMP, W  ;Swap STATUS_TEMP register into W
  90.         MOVWF   STATUS          ;Move W into STATUS register
  91.         SWAPF   W_TEMP, F       ;Swap W_TEMP
  92.         SWAPF   W_TEMP, W       ;Swap W_TEMP into W
  93.         RETFIE

Seria algo parecido asi, dije parecido por que no probe el codigo, ademas estoy seguro que si tenes un oscilador rapido con el TMR0 te va a costar llegar a 12 segundos, sino podrias usar otro timer, especialmente el TMR1 de 16 bits

Desconectado ignacio88

  • PIC10
  • *
  • Mensajes: 2
Re:Ayuda temporizador con PIC16F88
« Respuesta #2 en: 03 de Enero de 2016, 12:11:47 »
Muchas gracias por la ayuda. Me voy a poner con ello haber que consigo