TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
18 de Diciembre de 2014, 23:11:16

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
352488 Mensajes en 39578 Temas por 41359 Usuarios
Último usuario: pucara
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  Lenguaje Basic para microcontroladores PIC (Moderadores: dogflu66, doppel, jansuini, Marioguillote, aitopes)
| | |-+  contar flancos de subida y bajada
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Marcar como favorito Imprimir
Autor Tema: contar flancos de subida y bajada  (Leído 5693 veces)
ojkarin
PIC10
*
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 39


Comienza el juego...


« : 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.
En línea
RedPic
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 5233



WWW
« Respuesta #1 : 03 de Noviembre de 2009, 11:23:17 »

Sé bienvenido en tu estreno como "posteador" ojkarin.  Mr. Green

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
En línea

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania
droky
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Madagascar Madagascar

Mensajes: 627



WWW
« Respuesta #2 : 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
GeSHi (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
GeSHi (c):
  1. flancos = get_rtcc();

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

Salu2
En línea

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
KALLITOS
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 1244



WWW
« Respuesta #3 : 03 de Noviembre de 2009, 23:35:50 »

Hola a todos.
Droky estamos en el subforo de Basic  Mr. Green.

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.
En línea

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.
droky
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Madagascar Madagascar

Mensajes: 627



WWW
« Respuesta #4 : 04 de Noviembre de 2009, 03:09:10 »

Hola a todos.
Droky estamos en el subforo de Basic  Mr. Green.

Ahi va....
Mil perdones, amigos  Embarassed Embarassed se me había escapado...
Salu2
En línea

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
RedPic
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 5233



WWW
« Respuesta #5 : 04 de Noviembre de 2009, 03:43:21 »

Opsss ... yo tampoco me habí dado cuenta. Mil perdones.  Embarassed
En línea

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania
ojkarin
PIC10
*
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 39


Comienza el juego...


« Respuesta #6 : 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.. Mr. Green

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:
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 » En línea
ojkarin
PIC10
*
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 39


Comienza el juego...


« Respuesta #7 : 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.
En línea
ojkarin
PIC10
*
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 39


Comienza el juego...


« Respuesta #8 : 10 de Noviembre de 2009, 09:03:20 »

Conseguido rebotando
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:
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 » En línea
TODOPIC
   

 En línea
Páginas: [1] Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.20 | SMF © 2006-2008, Simple Machines XHTML 1.0 válido! CSS válido!
Página creada en 0.116 segundos con 23 consultas.
anything