Hola mike666!
Mira este ejemplo que pillé de Internete hace ya un tiempo.
Con este código podrás hacer temporizaciones de la duración que quieras. Además, es muy interesante que utilices las interrupciones (así mientras el micro está contando también puede estar haciendo otras cosas).
Analízalo y modifícalo para que haga lo que tú deseas.
Codigo:
;Ejemplo para simulación y/o MicroPIC Trainer
;
;La interrupción del TMR0.
;
;Se trata de comprobar la interrupción provocada por el TMR0. El programa
;lee el estado de los interruptores conectados a RA0 y RA4 para reflejarlo en
;los leds conectados a RB0 y RB4 respectivamente. Al mismo tiempo el TMR0
;genera una interrupción cada 0.05 seg. (50 mS) que se repetirá 5 veces con objeto
;de hacer intermitencia de 250 mS sobre el led conectado a RB7.
List p=16F84 ;Tipo de procesador
include "P16F84.INC" ;Definiciones de registros internos
Contador equ 0x0c ;Variable para la temporización
org 0x00 ;Vector de Reset
goto Inicio
org 0x04 ;Vector de interrupción
Interrupcion bcf INTCON,T0IF ;Repone flag del TMR0
decfsz Contador,F ;Decrementa el contador
goto Seguir
Con_si_0 movlw 5
movwf Contador ;Repone el contador nuevamente
btfsc PORTB,7 ;Testea último estado de RB7
goto RB7_ES_1 ;Está a 1
bsf PORTB,7 ;Está a 0, activa RB7
goto Seguir
RB7_ES_1 bcf PORTB,7 ;Desactiva RB7
Seguir movlw 0x3c
movwf TMR0 ;Repone el TMR0 con 195
retfie ;Retorno de interrupción
Inicio clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida
movlw b"00011111"
movwf TRISA ;Puerta A se configura como entrada
movlw b"00000111"
movwf OPTION_REG ;Preescaler de 256 para el TMR0
bcf STATUS,RP0 ;Selecciona banco 0
;El TMR0 se incrementa cada 1 uS. Si se emplea un preescaler de 256, deberá sufrir 195
;incrementos para provocar una interrupción cada 50000 uS (50 mS). Si esta se repite 5
;veces, el tiempo total transcurrido es de 250000 uS (250 mS). El complemento del valor
;195 en hex. es 0x3c.
movlw 0x3c
movwf TMR0 ;Carga el TMR0 con 195
movlw 0x05
movwf Contador ;Nº de veces a repetir la interrupción
movlw b"10100000"
movwf INTCON ;Activa la interrupción del TMR0
Loop clrwdt ;Refresca el WDT
btfsc PORTA,0 ;Testea el estado de RA0
goto RA0_ES_1
bcf PORTB,0 ;Desactiva RB0
goto TEST_RB1
RA0_ES_1 bsf PORTB,0 ;Activa RB0
TEST_RB1 btfsc PORTA,1 ;Testea el estado de RA1
goto RA1_ES_1
bcf PORTB,1 ;Desactiva RB1
goto Loop
RA1_ES_1 bsf PORTB,1 ;Activa RB1
goto Loop
end ;Fin del programa fuente
Espero que te sirva.
Un saludo desde Alicante.
Hola mike666, calculo que esto es lo que estabas deseando hacer, el principal problema estaba en la configuración de los puerto, e retirado uno de los contadores porque estaba de sobre para generar el tiempo de 1 segundo y también es cambiado esos valores para adaptar le rutina próxima a 1 segundo.
Codigo:
LIST P=16F84A
INCLUDE <P16F84A.INC>
;----------------------------------------------------------------------
CONTADOR1 EQU 0x0C
CONTADOR2 EQU 0x0D
CONTADOR3 EQU 0x0E
CONTADOR4 EQU 0x0F ;variables o contadores
CONTADOR5 EQU 0x10
;----------------------------------------------------------------------
ORG .0
goto INICIO
ORG .4
return
;----------------------------------------------------------------------
INICIO
bcf STATUS,RP0
bcf STATUS,RP1
clrf PORTB ; Pongo a cero el puerto B
bsf STATUS,RP0 ; Accedemos al banco 1 de RAM
movlw B"00000000" ; Configuración puertos
movwf TRISB
bcf STATUS,RP0 ; Accedemos al banco 0 de RAM
DELAY1S
movlw .10
movwf CONTADOR5
RET1
movlw .20
movwf CONTADOR4
RET2
movlw .14
movwf CONTADOR3
RET3
movlw .72
movwf CONTADOR2
RET4
movlw .247
movwf CONTADOR1
RET5
nop
decfsz CONTADOR1,F ;decrementa si es 0 salta una intruccion
goto RET5 ;vuelve a dly1
decfsz CONTADOR2,F ;decrementa el contador 2
goto RET4 ;carga el 1, y regresa a dly1
decfsz CONTADOR3,F ;decrementa el contador 3
goto RET3 ; carga el 1,2 y regresa a dly1
btfsc PORTB,1 ;si PORTB,1 esta prendido lo apaga o viseversa
goto apaga
goto prende ;Este sector
RET6
decfsz CONTADOR4,F ;decrementa contador 5
goto RET2 ;recupera 4
btfsc PORTB,2 ;prende o apaga el RB2
goto apaga1
goto prende1
RET7
decfsz CONTADOR5,F ;decrementa contador 6
goto RET1 ;recupera 5
btfsc PORTB,2 ;prende o apaga el RB2
goto apaga2
goto prende2
;----------------------------------------------------------------------
prende
bsf PORTB,1 ;prende RB1 y regresa a NO
goto RET6
apaga
bcf PORTB,1 ;apaga RB1 y regresa a NO
goto RET6
prende1
bsf PORTB,2 ;prende RB2 y regresa a SI
goto RET7
apaga1
bcf PORTB,2 ;apaga RB2 y regresa a SI
goto RET7
prende2
bsf PORTB,3 ;prende RB3 y regresa a delay1s
goto DELAY1S
apaga2
bcf PORTB,3 ;apaga RB3 y regresa a delay1s
goto DELAY1S
;----------------------------------------------------------------------
end ;fin de el programa
Espero te sea de utilidad
Un saludo.
Atte. CARLOS