TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: eduard001 en 20 de Mayo de 2014, 02:31:40
-
Hola que tal?, soy nuevo programando pic y e tratado de controlar mi timer por medio de interrupciones externas pero no lo e conseguido. Lo que quiero lograr es:
Al tener una int_ext, inicie mi timer1 desbordándose una y otra ves. Contar las veces que se a desbordado y que al existir una nueva interrupción externa se detenga el conteo de desbordamientos e imprima el total de veces que se desbordo el timer entre una interrupción y otra.
Espero que alguien pueda ayudarme con algún ejemplo se lo agradeceria, saludos y gracias.
-
Hola Eduardo001,
porque nos dice en que lenguaje usa? y el micro tambien. sabiendo eso, usa nuestros buscador en el foro de acuerdo a tus dudas, porque usar interrupciones externas se ha hablados muchos aqui en todos los lenguajes y seguro que encuentra ejemplos , es solo cuestion de usar el buscador.
Saludos
-
Totalmente de acuerdo con stk500, tenemos que saber algunas cosas como que compilador usas, que pic, frecuencia de trabajo etc, antes de ponerse en el tema, también es bueno poner un pequeño esquema del circuito para evitar posibles fallos en el hardware
-
Aaaa lo siento mucho claro que si.
Estoy utilizando un PIC16F877, y de momento lo uso a 4Mhz. Uso CCS Compiler para programarlo, el circuito es realmente simple solo comprende dos swich o push button para efectuar la interrupción externa con sus resistencias de pull up.
Y con mis muy escasos conocimientos e hecho este codigo.
#include <16F877.h>
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B4,rcv=PIN_B5,bits=8)
#include <stdlib.h>
int16 conteo=0;
int escape=0;
#INT_EXT
IntRB0(){
escape++; /**incrementa el valor para usarlo como
condicion**/
while(escape==1) {
set_timer1 (131); //recarga del TMR1
conteo++; /**Se incrementa cada ves que se desborda
timer1**/
printf("El conteo es: %Lu\r",conteo);
}
}
#INT_RB
IntRB1(){
printf("El conteo2 es: %Lu\r",conteo);
}
void main() {
ext_int_edge(L_TO_H);
clear_interrupt(INT_EXT);
enable_interrupts(int_ext);
ext_int_edge(L_TO_H);
clear_interrupt(INT_RB);
enable_interrupts(int_rb);
enable_interrupts(global);
while(TRUE);
}
-
lo mejor que puedes hacer es activar una bandera al ingresar a la interrupción externa y hacer todo en el main, no uses la función printf dentro de la interrupción.
te recomiendo que busques en el foro acerca de las interrupciones, hay muchos hilos
como bien lo indicas, la interrupción externa activa y desactiva el timer, y en el código estas usando la Int_rb que es otro tipo de interrupcion.
-
Hola, si lo que quieres es contar cuantas veces se desborda la interrupción del timer, deberías de activar esta misma, ya que de esta forma puedes saber cuantas veces se ha desbordado.
en este caso con la interrupción externa solo activarías o desactivarías el timer, pero el incremento sería cada que se desborde el timer
como bien te recomienda jhozate, puedes buscar mas información sobre interrupciones en el foro.
Saludos
-
while(escape==1) {
set_timer1 (131); //recarga del TMR1
conteo++; /**Se incrementa cada ves que se desborda
timer1**/
printf("El conteo es: %Lu\r",conteo);
}
Ahí creo que tenés un error. Una vez que escape llegue a 1, el programa va a entrar en un bucle infinito. Tal vez quisiste usar un if en lugar de un while.
Saludos!
-
Gracias gera, es una gran observacion pero en realidad deje el:
while(escape==1) {
set_timer1 (131); //recarga del TMR1
conteo++; /**Se incrementa cada ves que se desborda
timer1**/
printf("El conteo es: %Lu\r",conteo);
}
Para ocasionar un bucle infinito hasta que ocurra la interrupción :oops: aunque no se refleja en la programación, de momento intentare hacerlo por flancos como menciona jhozate. De todos modos cualquier consejo o sugerencia es mas que bien venido.
-
podrias intentar algo de la siguiente forma usando solo la int_ext y la int_rtcc, podría servir
#int_ext
void intExt_isr()
{
//Aqui condicionas el stop/inicio timer
// Des-activacion de flag
}
#int_rtcc
void intRtcc_isr()
{
//contador de desbordamiento
}
void main()
{
while(true)
{
if(flag==1)
{
printf("El conteo es: %u\r",conteo);
}
}
}