Autor Tema: contar flancos de subida y bajada  (Leído 14124 veces)

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

Desconectado ojkarin

  • PIC10
  • *
  • Mensajes: 39
contar flancos de subida y bajada
« en: 03 de Noviembre de 2009, 06:29:07 »
Hola, saludos a la gente del foro, llevo un tiempo leyedoos y la verdad que me sirve de mucho, pero tengo una duda que no sé si se podrá hacer o no lo he sabido buscar.

Tengo que hacer un contador que cuente tanto flancos de subida como de bajada de una señal externa que le pensaba meter por la interrupción del RB0. 

De momento lo estoy simulando con el Pic Simulator Ide y he escogido un PIC16F877A, el cual busque el otro dia en la página de microchip y no salia. ¿Esta ya obsoleto? si así fuera buscaría otro de similares características.

Si alguien sabe si se puede configurar para contar flancos de subida y bajada me sería de mucha ayuda, si no, pensaba usar un timer para contar flancos de subida y otro para flancos de bajada y meterlo luego todo en un contador general.

Gracias y espero que se haya entendido mi duda, si no trataré de exponerla mejor.
Saludos.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: contar flancos de subida y bajada
« Respuesta #1 en: 03 de Noviembre de 2009, 11:23:17 »
Sé bienvenido en tu estreno como "posteador" ojkarin.  :mrgreen:

Yo tengo escrita toda una serie de artículos en los que mido los anchos de pulsos cuadrados, no los cuento sino que mido cuanto duran ... pero la técnica es casi la misma. Dale un vistazo por si te sirven: Serie Técnicas en C : Presentación e Indice de Contenidos
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado droky

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 628
    • Diseños radikales libres
Re: contar flancos de subida y bajada
« Respuesta #2 en: 03 de Noviembre de 2009, 11:37:28 »
Hola,
Puedes usar el contador interno RTCC del timer0 para contarlos. Bueno, el los cuenta por tí.
El problema es que es de 8 bits y al llegar a 254 vuelve a empezar.
No recuerdo si puedes asignarle una interrupcion por desbordamiento y así establecer un contador de bytes...
Un ejemplo:
Código: C
  1. //Configuracion de las I/O, timers y RTCC
  2.    set_rtcc(0);
  3.    setup_counters(RTCC_EXT_H_TO_L,RTCC_DIV_1); //flancos de bajada
  4.  
  5.    //Inicializa variables
  6.    flancos = 0;

Y para leerlo:
Código: C
  1. flancos = get_rtcc();

Y reiniciarlo:
Código: C
  1. set_rtcc(0);

Salu2
Yo... he visto cosas que vosotros no creeríais... atacar naves en llamas más allá de Orión, he visto rayos C brillar en la oscuridad cerca de la puerta Tannhäuser.
Todos esos momentos se perderán en el tiempo como lágrimas en la lluvia.
Es hora de morir.

Si me buscas en twitter, me tienes por @radikaldesig

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: contar flancos de subida y bajada
« Respuesta #3 en: 03 de Noviembre de 2009, 23:35:50 »
Hola a todos.
Droky estamos en el subforo de Basic  :mrgreen:.

Tal como dijo el maestro Redpic, el hizo y comparte el codigo de como hacer contadores de tiempo de pulsos que bien pueden modificarse para contar unicamente los flancos.

Ojkarin tu cuestion la solucionas configurando el Interrupcion externa, cuando llegue un flanco de subida, aumentas el contador y cambias a flanco de bajada, cuando llega este ultimo flanco aumentas contador y cambias a flanco de subida y asi sucesivamente.
El codigo no implica mucha dificultad de implementarlo en basic, claro esta si es que ya sabes programar en basic.

Saludos.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado droky

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 628
    • Diseños radikales libres
Re: contar flancos de subida y bajada
« Respuesta #4 en: 04 de Noviembre de 2009, 03:09:10 »
Hola a todos.
Droky estamos en el subforo de Basic  :mrgreen:.

Ahi va....
Mil perdones, amigos  :oops: :oops: se me había escapado...
Salu2
Yo... he visto cosas que vosotros no creeríais... atacar naves en llamas más allá de Orión, he visto rayos C brillar en la oscuridad cerca de la puerta Tannhäuser.
Todos esos momentos se perderán en el tiempo como lágrimas en la lluvia.
Es hora de morir.

Si me buscas en twitter, me tienes por @radikaldesig

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: contar flancos de subida y bajada
« Respuesta #5 en: 04 de Noviembre de 2009, 03:43:21 »
Opsss ... yo tampoco me habí dado cuenta. Mil perdones.  :oops:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado ojkarin

  • PIC10
  • *
  • Mensajes: 39
Re: contar flancos de subida y bajada
« Respuesta #6 en: 04 de Noviembre de 2009, 08:58:35 »
Gracias a todos por contestar, lo he hecho como has dicho Kallitos y va perfecto. Lo de programar en basic aún no lo llevo bien del todo pero bueno.. :mrgreen:

El código queda muy sencillo, lo único que me da más problemas que el basic son la configuración de los registros del pic, pero tirando de datasheet trataremos de hacerlo bien.

Os dejo el código de la interrupción, que lo único que hace es, dependiendo de que entrada este activa, incrementar o decrementar un contador en cada flanco de subida y bajada de la señal:

Código: [Seleccionar]
On Interrupt  'Define interrupt handler, disable interrupt
If PORTA.4 = 1 Then
cont = cont + 1
Toggle OPTION_REG.INTEDG  'Cambia el flanco de la interrupcion
Endif
If PORTA.1 = 1 Then
cont = cont - 1
Toggle OPTION_REG.INTEDG  'Cambia el flanco de la interrupcion
Endif
INTCON.1 = 0  'Clear interrupt flag
Resume  'Return to main program, enable interrupt

Saludos y gracias.
« Última modificación: 05 de Noviembre de 2009, 05:21:43 por ojkarin »

Desconectado ojkarin

  • PIC10
  • *
  • Mensajes: 39
Re: contar flancos de subida y bajada
« Respuesta #7 en: 05 de Noviembre de 2009, 07:18:50 »
Hola otra vez, aquí estoy otra vez con más dudas. El caso es que el porta.4 y porta.1 son dos motores que hacen girar una rueda dentada y el contador lo que hace es contar los dientes y valles de esa rueda. El problema viene ahora cuando se paran los motores, ya que en la deceleración la rueda sigue girando un poco y me interesa que esos dientes los cuente.
Había pensado que siguiera contando sabiendo ya desde que motor viene, por si tiene que sumar o restar, pero como una vez frenada la rueda, como podría oscilar un poco , me puede hacer que el sensor se me "vuelva loco" y así ya no me vale.
El caso es que necesitaría que el contador siguiera funcionando durante 1.5 o 2 segundos después del paro de los motores.
Supongo que la solución sería usar uno de los timer del pic pero no se exactamente cómo hacerlo, ya que dentro de la interrupción no creo que se pueda hacer y fuera, en el programa principal, no lo veo.
A ver si se os ocurre alguna forma de hacerlo que yo aún estoy un poco verde en esto. De todas formas si se me ocurre a mi antes os lo cuento.
Saludos.

Desconectado ojkarin

  • PIC10
  • *
  • Mensajes: 39
Re: contar flancos de subida y bajada
« Respuesta #8 en: 10 de Noviembre de 2009, 09:03:20 »
Conseguido :-/
Ya se supone que funciona (con el PSI sí) y cuenta durante dos segundos a partir del paro de los motores.
Gracias por la ayuda

Código: [Seleccionar]
ADCON1 = 0x06  'los pin I/O digitales
T1CON.TMR1CS = 0  'Uso la frec interna del micro (en este caso 20MHz)
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
TRISA = %11111111  'declaro porta.0 como entrada
Dim aux As Bit  'Indica del motor que viene para la deceleracion
Dim cont1 As Byte  'Es el contador PRINCIPAL del programa
Dim cont_seg As Byte
INTCON = 0x90  'Enable INTE interrupt

cont1 = 0
cont_seg = 0
TMR1L = 0
TMR1H = 0

End                                               
On Interrupt  'Define interrupt handler, disable interrupt
Toggle OPTION_REG.INTEDG  'Cambia el flanco

'------------------------Motor1
If PORTA.4 = 1 And PORTA.1 = 0 Then
aux = 1
cont1 = cont1 + 1
T1CON.TMR1ON = 1  'Enable timer1
TMR1L = 0
TMR1H = 0
Endif
If PORTA.4 = 0 And PORTA.1 = 0 And aux = 1 And T1CON.TMR1ON = 1 And cont_seg < 0x98 Then  'Cuenta 2 seg con Timer1
cont1 = cont1 + 1
Endif
'------------------------Motor2
If PORTA.1 = 1 And PORTA.4 = 0 Then
aux = 0
cont1 = cont1 - 1
T1CON.TMR1ON = 1  'Enable timer1
TMR1L = 0
TMR1H = 0
Endif
If PORTA.1 = 0 And PORTA.4 = 0 And aux = 0 And T1CON.TMR1ON = 1 And cont_seg < 0x98 Then  'Cuenta 2 seg con Timer
cont1 = cont1 - 1
Endif
'------------------------Paro del Timer1
If PIR1.TMR1IF = 1 Then  'Despues de 2 seg deja de contar el Timer1
cont_seg = cont_seg + 1
PIR1.TMR1IF = 0
If cont_seg >= 0x98 Then  'Despues de 2 seg deja de contar el Timer1(98)
cont_seg = 0x00
T1CON.TMR1ON = 0  'disable Timer1
TMR1L = 0
TMR1H = 0
Endif
Endif
INTCON.1 = 0  'Clear interrupt flag
Resume  'Return to main program, enable interrupt


Edito: No cuenta durante dos segundo, estoy arreglandolo.
Edito2: ahora creo que si
« Última modificación: 23 de Noviembre de 2009, 05:58:05 por ojkarin »