Autor Tema: Contador ascendente/descendente  (Leído 9470 veces)

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

Desconectado hsen

  • PIC12
  • **
  • Mensajes: 82
Contador ascendente/descendente
« 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
     
 

 
                 
« Última modificación: 20 de Febrero de 2007, 22:12:59 por hsen »
Un saludo desde Rocha (Uruguay)

Desconectado elreypic2

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 596
Re: Contador ascendente/descendente
« Respuesta #1 en: 29 de Noviembre de 2006, 16:29:27 »
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.

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Contador ascendente/descendente
« Respuesta #2 en: 29 de Noviembre de 2006, 17:36:51 »
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado hsen

  • PIC12
  • **
  • Mensajes: 82
Re: Contador ascendente/descendente
« Respuesta #3 en: 29 de Noviembre de 2006, 18:19:17 »
Gracias  amigos voy a intentarlo.
Un saludo desde Rocha (Uruguay)

Desconectado hsen

  • PIC12
  • **
  • Mensajes: 82
Re: Contador ascendente/descendente
« Respuesta #4 en: 03 de Diciembre de 2006, 20:11:28 »
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
Un saludo desde Rocha (Uruguay)


 

anything