On off on off on off con el PIC 16f84a

Necesito ayuda para hacer un sencillo programa para el PIC 16f84a, la verdad soy novato en esto, necesito un programa que ponga en ON (encendido) uno de los pines (sólo necesito usar un pin) durante 3 segundos, y en OFF (apagado) durante 57 segundos, para así completar el minuto; el programa debe tener en cuenta lo microsegundos y todos los tiempos que se demora en ejecutar cada instrucción del programa, el bcf, el goto, el call, etc... Teniendo en cuenta también que todas ellas tienen diferentes tiempos de ejecución. Debe ser muy exacto, pues pretendo realizar un reloj mecánico con él, que jamás se adelante o retrase; usaré un cristal de 4MHZ.

3 Respuestas

Respuesta
1
¿Qué precisión necesitas? Piensa que a 4MHz cada instrucción requiere de 250ns!
Por otra parte, esto que pides es impossible, ya que el mismo cristal de cuarzo que utilices tiene una deriva con el tiempo (bastante grande), has pensado en utilizar un RTC (real time clock), aún así deberás ajustarlo cada año.
Aun así, si quieres tirar adelante, primeramente haría unos cálculos con la precisión del cristal, para así assegurarnos que tenemos la precisión requerida, ya que dependiendo del que te quieras gastar tiene una precisión o otra, si no lo sabes hacer pídemelo.
En conclusión, lo primero que tienes que hacer es fijar una precisión y luego mirar que solución software es la necesaria, ya que esta es la primera limitación, luego ya miraremos el software, que puede ser lo preciso que quieras.
Respuesta
1
No lo tomes mal pero lo que puedo hacer por vos es ayudarte a que vos aprendas a hacer tus propios programas, pero no me pidas hacerlo yo porque me llevaría un tiempo que habeses es difícil tenerlo ya para hacerlo lleva un tiempo que a veces no lo tenemos.
¿Por empezar tengo que preguntarte que tipo de conocimiento tienes sobre Assembler?, tienes grabadora de pic y has hecho algún programa ya, si no es haci te doy una página donde es gratuita y esta todo en español, ademas tienes ya programas terminado que con pequeña modificaciones te van a funcionar perfectamente, ademas hay foros donde te vas a sacar todas tus dudas y te enseñan.
Lo que te pido si quieres, es que hagas un programa y lo discutamos juntos hasta obtener los resultados obtimos. Hay te mando la página para que la veas.
 http://www.todopic.com.ar/foros/index.php?PHPSESSID=58090fed507c745ff5620e4421c0e6f7&topic=24720.msg201396#msg201396piloto
Saludos cualquier cosa comunicate conmigo, no te olvides de calificar
Gracias, por contestar; efectivamente siempre intento hacer las cosas por mí mismo. Pero acepto tu propuesta de discutir lo que tenga.
Los delays fueron generados con:
http://www.piclist.com/techref/piclist/codegen/delay.htm
Y la estructura del programa es basada en el ejemplo #2 de este foro:
http://www.todopic.com.ar/foros/index.php?topic=12345.0;wap2
Bueno, baje el MPLAB para compilar el programa que acomodé a mis necesidades, y me genera el *.hex jun ton este mensaje:
Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F84A "Neo.asm" /l"Neo.lst" /e"Neo.err"
Message[302] D:\ASM\NEO.ASM 13 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] D:\ASM\NEO.ASM 15 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[313] D:\ASM\NEO.ASM 21 : CBLOCK constants will start with a value of 0.
Loaded D:\ASM\Neo.COD.
BUILD SUCCEEDED: Sun Aug 15 12:27:36 2010
Espero que esté bien, qué dices???
(Estoy descargando el proteus para simularlo, pero no he encontrado una licencia que sirva.)
El programa sería este:
LIST   P=16F84A
INCLUDE  <P16F84A.INC>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC; code protec off
; power up timeron
; watchdog off
; osc XT
;Cinc
;Cinc_1
;Cinc_2
ORG0
BSFSTATUS, 5 ; activa la página 1
MOVLWB'00000' ; carga 00000 en W
MOVWFTRISA ; puerto a todos salidas
MOVLWB'00000000' ; carga 00000000 en W
MOVWFTRISB ; puerto b todos salidaS
BCFSTATUS,5 ; volvemos a la pagina 0
cblock
Tres
Tres_1
Tres_2
endc
Inicio
BSFPORTB, 3
CALLDelay3
BCFPORTB, 3
CALLDelay57
gotoinicio
Delay3
movlw0x1A
movwfTres
movlw0x8B
movwfTres_1
movlw0x07
movwfTres_2
Delay3_0
decfszTres, f
goto$+2
decfszTres_1, f
goto$+2
decfszTres_2, f
gotoDelay3_0
nop
return
Delay57
movlw0x07
movwfTres
movlw0x41
movwfTres_1
movlw0x7D
movwfTres_2
Delay57_0
decfszTres, f
goto$+2
decfszTres_1, f
goto$+2
decfszTres_2, f
gotoDelay57_0
goto$+1
goto$+1
goto$+1
return
END
PROGRAMA:

COMPILANDO:
<span style="font-weight: normal;"></span>
¿Qué dices? ¿Funcionará?
Aparentemente esta bien, si no conseguís el proteus podes utilizar el pic simulator ide de oshonsoft es muy bueno y lo podes bajar de Taringa.
No obstante lo voy a copiar a tu programa y lo voy a probar con el proteus y en el programa que te ofrecí anterior
no se si lo voy a poder probar ahora pero a la noche seguro, por lo que pude leer aparentemente esta bien, pero en la practica aveces fallan.
¿Has probado si te funciono el programa?, porque acá no me funciona, voy a ver si en vez de hacerlo por asembler lo haga en C++, es más sencillo y fácil.
Lo voy a tratar de hacerlo para mañana
Nos vemos.
PD mandame el .hex a esta dirección de email [email protected]
Respuesta
-1
Puedes usar el Timer 1 de 16 bits pues por tener registros de mayor capacidad permite reterdos más largos. Te conviene usar un cristal bajo, mejor 4MHz, pues da como resultado un ciclo máquina de 1uS.
Así con el timer 1 consigues como máximo 64mS. Te conviene configurar el timer 1 para 50mS y repetir el retardo para conseguir el tiempo que necesitas. Por ejemplo 20 veces para 1 S.
Puedes ajustar el valor que cargas en los registros del Timer para compensar el tiempo que demoran en ejecutarse las instrucciones.
Si es para algo mecánico quizás sólo se necesita alta precisión para el periodo de 1 minuto y no para los 3 segundos.
Otra alternativa a considerar es, si te sirve, dividir la frecuencia de un cristal de baja frecuencia como 32 o 64KHz muchas veces y obtener un periodo de 1 minuto. Hay circuitos integrados para ésto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas