Autor Tema: AYUDA CON PROGRAMACION EN MPLAB PIC16F877  (Leído 1982 veces)

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

Desconectado fichbone

  • PIC10
  • *
  • Mensajes: 1
AYUDA CON PROGRAMACION EN MPLAB PIC16F877
« en: 11 de Octubre de 2007, 20:28:49 »
Hola, tengo esta programacion que hace:
;Programa que cambia el tiempo de encendido y apagado
;de dos led’s conectados al PORTD según la siguiente tabla:
;      Tiempo de Encendido
;   RB7   Descripción
;    1   Led encendido por 1 segundo
;    0   Led encendido por 1/2 segundo
;
;      Tiempo de Apagado
;   RB6   Descripción
;     1   Led apagado por 1 segundo
;     0   Led apagado por 2 segundo
            list p=16f877
            include <p16f877.inc>
            __config (_WDT_OFF & _XT_OSC & _BODEN_OFF)
            errorlevel -302 ;ignorar errores al almacenar en banco 1
;*******************************************************
;Definición de Variables
;*******************************************************
TEMPO1        equ    0x21
;*******************************************************
;Vector de Reset
;*******************************************************
      org   0x0      ;Indica al ensamblador la dirección de memoria de la sig. instrucción
       goto   inicio
;*******************************************************
;Configuración de registros
;*******************************************************
      org   0x5      ;Salta interrupciones
inicio         clrf   INTCON      ;Borra interrupciones
      bcf   STATUS,RP1   ;Cambio a Banco 1
      bsf   STATUS,RP0
      movlw   b'11000111'        ;configura el TMR0 con pre-escaler a 256
      movwf   OPTION_REG
;---------------------------------------------------------------------------------
;Descripción del registro OPTION_REG
;
;Bit 7: Deshabilita las resistencias de pull-up, ya que estan conectadas a los pulsadores en forma externa
;Bit 6: No se ocupa para el TMR0, no importa el valor
;Bit 5 T0CS: Selecciona la fuente de Reloj para TMR0, 0 = Ciclo de instrucción interno (temporizador)
;Bit 4 T0SE: Flanco de incremento, 0 = Incremento en flanco ascendente
;Bit 3 PSA: Bit de asignación del Prescaler, 0 = Divisor asignado al TMR0
;Bit 2-0 PS2,PS1,PS0: en 1, Selección del prescaler en 256
;---------------------------------------------------------------------------------
      clrf   TRISE      ;Habilita PORTD como I/O digital
      clrf   TRISD      ;PORTD como salida
      movlw   b'11000000'   ;Configura RB7 y RB6 como entradas
      movwf   TRISB      ;y los demás pines como salida
      bcf   STATUS,RP0   ;vuelve a banco 0
;*******************************************************
;Programa Principal
;*******************************************************
ppal           btfss   PORTB,7      ;Comprueba RB7
      goto   RB7_0      ;Salta a rutina para encender 1/2 seg
      call   TIME_1s
      goto   LED_ON      ;Salta a rutina que enciende el led
RB7_0   movlw   d'50'      ;Carga TEMPO1 con el valor 50
      movwf      TEMPO1             ;para temporizar 1/2 segundo   
LED_ON   movlw   b'00000011'
      movwf   PORTD      ;enciende led               
      call   DELAY10         ;Llama a la rutina que ocupa el TMR0
      btfss   PORTB,6      ;Comprueba RB6
      goto   RB6_0      ;Salta a rutina para encender 1/2 seg
      call   TIME_1s
      goto   LED_OFF   ;Salta a rutina que enciende el led
RB6_0   movlw   d'200'      ;Carga TEMPO1 con el valor 200
      movwf      TEMPO1             ;para temporizar 2 segundo   
LED_OFF   clrf   PORTD      ;Apaga los led's
      call   DELAY10         ;Llama a la rutina que ocupa el TMR0
      goto      ppal
;****************************************************************
;Rutina que carga TEMPO1 para temporizar 1 segundo
;****************************************************************
TIME_1s   movlw   d'100'      ;Carga TEMPO1 con el valor 100
      movwf      TEMPO1       ;para temporizar 1 segundo
      return         ;Vuelve al programa
;****************************************************************
;Rutina de Temporización , que ocupa el TMR0, sin interrupciones
;****************************************************************
DELAY10   bcf    INTCON,2   ;borra el flag de estado del TMRO
      movlw      d'216'
      movwf      TMR0              ;Carga TMRO para que cuente 39 (255-216)
DELAY10_1   btfss      INTCON,2           ;Espera overflow del TMRO
      goto       DELAY10_1
      decfsz     TEMPO1,1           ;Repite TEMPO1 veces, depende del valor dado por RB7 y RB6
      goto       DELAY10            ;con lo que se logran 1/2, 1 y 2 segundos
      return         ;Vuelve al programa
      end

AHORA NECESITO QUE REALICE ESTO, PERO NO ME RESULTA:
Tiempo de Encendido
RB7   Descripción
1   Led encendido por 2 segundo
0   Led encendido por 1 segundo

Tiempo de Apagado
RB6   Descripción
1   Led apagado por 3 segundo
0   Led apagado por 4 segundo

MUCHAS GRACIAS