TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: hsen en 29 de Noviembre de 2006, 14:08:15
-
Hola amigos del foro:
Estoy tratando de hacer un contador por flanco ascendente/descendente, el cual debe contar
N pulsos, (10500), de frecuencia variable, desde 0...300 cs.
Mostrar en la salida un pulso con periodo 50 %.
Esto debe de ser así por que a dicha salida la necesito utilizar en otro contador el cual tiene
varios displays de 7 segmentos, y mientra refresca pasa un periodo de tiempo grande, el cual me hace perder varios pulsos de la fracuencia inicial.
Pensé que para mi lo mas facil es hacer otro contador aparte, el cual no tiene que perder tiempo
prendiendo los display. El problema es que no me funcionó bien en proteus.(no apaga la salida)
Como tengo muy pocos conocimientos de tema, agradezco me ayuden.Creo que manejando interrupciones
se puede hacer, pero es imposible para mí.
Copie, y modifique parte de un código que encontre por ahí, pero funciono a medias, agradezco lo corrijan
'****************************************************************
'* Name : DIVISOR *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2006 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 28/11/2006 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
TRISB=0
TRISA=%00000001 'porta.0 entrada de pulso sensor
'porta.1 salida de pulso
CONT VAR WORD
flag var bit
CONT=0 '
inicio:
PORTB =0
if flag = 0 then
if PORTA.0 = 0 then 'para cambiar al otro flanco cambiar el 1 por 0
cont = cont+1 'con un 1 censa en flanco de subida
flag = 1 'con 0 censa en flanco de bajada
endif
endif
if flag = 1 then
if PORTA.0 = 1 then 'para cambiar al otro flanco cambiar el 0 por 1
flag = 0 'con un 0 censa en flanco de subida
endif 'con 1 censa en flanco de bajada
endif
if cont=2 then 'aquí empieza a contar pulsos
high porta.1 'despues de 2 (5250) pulsos activa porta.1
if cont>4 then 'despues de4 (10500) pulsos activa porta.1
low porta.1 ' pero.... no deactiva ?
CONT=0
endif
endif
goto inicio 'SOLO ACTIVA PORTA.1 PERO NO LA DESACTIVA CUANDO
'ALCANZA A 4 (10500) pulsos, talvez no cuenta?
end 'creo que hay algo mal en las últimas lineas,... por lo menos.
'Simulado en proteus
'la parte que no funciona fué la que hice yo
-
Hola Hsen,
Mira creo que seria mas facil si usas el contador interno del microcontrolador (el que se encuentra en el pin RA4), ya que este lo puees configurar para que cuente en cualquiera de los flancos (ascendente o descendente). Este contador es asignado al registro del timer 1 el cual puede ser de 16 bits (bueno depende del micro que estes usando) y seria mucho mas sencillo ya que en el tiempo dondo haces el refresh el contador seguira haciendo lo suyo (contar). Intentalo de esta manera.
Saludos.
Elreypic.
-
Hsen, revise esto, todo el hilo.
http://www.todopic.com.ar/foros/index.php?topic=14623.0
-
Gracias amigos voy a intentarlo.
-
Hola Amigos del foro:Logre hacer funcionar el programa gracias a la ayuda de los amigos, en realidad aporte muy poco por que mis conocimientos son muy limitados. Me hubiera gustado hacerlo con el timer 0 o 1 pero no me salió.
De todas manera presento el programa, por si le sirve a alguien.
'*******************************************************************
'* Name : UNTITLED.BAS *
'* Author : [ ] * *
'* Notice : Copyright (c) 2006 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 02/11/2006 *
'* Version : 1.0 *
'* Notes : Este es un contador para odómetro de *
'* : un vehículo automotor, entrada de pulsos, rb0 *
'* : salida rb7, para entrar en un presentador *
'* : con display de 7 seg. *
'* : La salida de pulsos es, ciclo 50% *
'* : device = 16f628a *
'*******************************************************************
cmcon = 7
CONT VAR WORD
u var byte
flag var bit
TRISB = %00000001
inizero:
flag=0
cont=0
goto inicio
inicio:
if flag = 0 then
if PORTB.0 = 1 then 'para cambiar al otro flanco cambiar el 1 por 0
cont = cont+1 'con un 1 sensa en flanco de subida
flag = 1 'con 0 sensa en flanco de bajada
endif
endif
if flag = 1 then
if PORTB.0 = 0 then 'para cambiar al otro flanco cambiar el 0 por 1
flag = 0 'con un 0 sensa en flanco de subida
endif 'con 1 sensa en flanco de bajada
endif
if cont=5250 then 'aqui empieza a contar pulsos
cont=0 'despues de 5250 pulsos incrementa cont.en 1
u=u+1
endif
if u.0 = 0 then 'u.0 se refiere al dígito menos significativo de la variable u
portb.7 = 0
endif
if u.0 = 1 then
portb.7 = 1
endif
goto inicio
end