TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: cardem en 02 de Febrero de 2014, 02:52:57
-
Hola, estoy iniciandome en este asunto de los pics, con el 16f84, que es el que tengo, he hecho varias pràcticas y hasta ahora màs o menos todobien.
Un amigo me pide algo sencillo; activar una salida por 10 minutos y apagarla por tres minutos, repitiendo el ciclo infinitamente, pero no sè como hacerlo, alguien sabe? gracias y saludos.
-
Bienvenido al foro cardem.
Eso que quieres hacer es muy sencillo, pero aqui no hacemos los proyectos, ayudamos a hacerlos.
Dinos en que lenguaje programas. Intenta empezar a hacerlo.
En el foro hay cursos de C, Basic y asm.
-
Hla, este es el programa, me marca errores que no comprendo.
;Activa RB0 durante 10 minutos, lo apaga 3 minutos y repite infinitamente con un 16F84A
LIST P=16F84A, ; usar PIC 16F84A
#include <p16f84A.inc>
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off
; power up timer on
; watchdog off
; osc XT
cblock 0C
d1
d2
d3
d4
d5
d6
d7
d8
endc
ORG 0
BSF STATUS,5 ; activa la pagina 1
MOVLW B'00000' ; carga 00000 en W
MOVWF TRISA ; puerto a todos salidas
MOVLW B'00000000' ; carga 00000000 en W
MOVWF TRISB ; puerto b todos salidaS
BCF STATUS,5 ; volvemos a la pagina 0
MOVLW B'00000000' ; ponemos a cero el
MOVWF PORTB ; el puerto b
INICIO ; etiqueta
BSF PORTB,0 ; pone a 1 RB0
CALL DEMORA10MIN ; llama a demora de 10 MINUTOS
BCF PORTB,0 ; pone a 0 RB0
CALL DEMORA3MIN ; llama a demora de 3 MINUTOS
GOTO INICIO ; va a inicio
;-------------------------------------------------------------
; ---------------------------------------
DEMORA10MIN
;599999992 cycles
movlw 0xA9
movwf d1
movlw 0x41
movwf d2
movlw 0xFA
movwf d3
movlw 0x04
movwf d4
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto $+2
decfsz d4, f
goto Delay_0
;8 cycles
goto $+1
goto $+1
goto $+1
goto $+1
RETURN
;---------------------------------------
DEMORA3MIN
;179999998 cycles
movlw 0xFF
movwf d5
movlw 0x2D
movwf d6
movlw 0x32
movwf d7
movlw 0x02
movwf d8
Delay_0
decfsz d5, f
goto $+2
decfsz d6, f
goto $+2
decfsz d7, f
goto $+2
decfsz d8, f
goto Delay_0
;2 cycles
goto $+1
RETURN
END ; fin de programa
-
Solo te da un error y es en esta etiqueta:
Delay_0
La tienes repetida, si le llamas en la de 3 minutos:
DEMORA3MIN
;179999998 cycles
movlw 0xFF
movwf d5
movlw 0x2D
movwf d6
movlw 0x32
movwf d7
movlw 0x02
movwf d8
Delay_1
decfsz d5, f
goto $+2
decfsz d6, f
goto $+2
decfsz d7, f
goto $+2
decfsz d8, f
goto Delay_1
;2 cycles
goto $+1
RETURN
Seguro que ya te compila.
Prueba asi a ver si va, ojo no mire si el programa esta bien o no, porque estoy seguro que eso lo sabes hacer tu mejor que yo, solo mire por que no compilaba.
-
LO reviso, muchas gracias.
-
Solo con ese cambio que te pongo arriba funciona bien, esta activado 600.000004seg (copiado del MPLAB) excede 4uS, y apagado esta 180.000004seg tambien excede 4uS, creo que 4uS en 10 y 3min son aceptables.
-
Eres muy amable, muchas gracias, ya quedó funcionando al 100 %. Al final quedó así:
LIST P=16F84A, ; usar PIC 16F84A
#include <p16f84A.inc>
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off
; power up timer on
; watchdog off
; osc XT
cblock 0C
PDel0
PDel1
endc
ORG 0
BSF STATUS,5 ; activa la pagina 1
MOVLW B'00000' ; carga 00000 en W
MOVWF TRISA ; puerto a todos salidas
MOVLW B'00000000' ; carga 00000000 en W
MOVWF TRISB ; puerto b todos salidaS
BCF STATUS,5 ; volvemos a la pagina 0
MOVLW B'00000000' ; ponemos a cero el
MOVWF PORTB ; el puerto b
; usando esta opcion se ahorran
; 6 bytes
INICIO ; etiqueta
BSF PORTB,0 ; pone a 1 RB0
CALL DEMORA10MIN ; llama a demora de 0,5 seg
BCF PORTB,0 ; pone a 0 RB0
CALL DEMORA3MIN ; llama a demora de 0,5 seg
GOTO INICIO ; va a inicio
DEMORA10MIN
cblock
d1
d2
d3
d4
endc
;599999992 cycles
movlw 0xA9
movwf d1
movlw 0x41
movwf d2
movlw 0xFA
movwf d3
movlw 0x04
movwf d4
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto $+2
decfsz d4, f
goto Delay_0
;8 cycles
goto $+1
goto $+1
goto $+1
goto $+1
return
DEMORA3MIN
; Delay = 180 seconds
; Clock frequency = 4 MHz
; Actual delay = 180 seconds = 180000000 cycles
; Error = 0 %
cblock
d5
d6
d7
d8
endc
;179999998 cycles
movlw 0xFF
movwf d5
movlw 0x2D
movwf d6
movlw 0x32
movwf d7
movlw 0x02
movwf d8
Delay_1
decfsz d5, f
goto $+2
decfsz d6, f
goto $+2
decfsz d7, f
goto $+2
decfsz d8, f
goto Delay_1
;2 cycles
goto $+1
return
; 2+2 Fin.
;---------------------------------------
END ; fin de programa