TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: migsantiago en 03 de Septiembre de 2005, 15:34:00

Título: Interrupción con RB0
Publicado por: migsantiago en 03 de Septiembre de 2005, 15:34:00
Hola

He estado buscando dentro del foro cómo es que se hace esta interrupción y ya escribí un programita.

Lo que quiero es que cuando haya un flanco derecho en RB0 (de 1 a 0), que haya una interrupción y se encienda el puerto B por un segundo.

Luego regresa a donde estaba y apaga el puerto B.

Ya lo compilé y parece que salió bien.

Les paso el programa para ver si tiene algún error.

-------
//migsantiago

#include "16f877.h"
#use delay(clock=4000000)
#fuses nowdt,noput,nobrownout,nolvp,noprotect

void main()
{

set_tris_b(0x00); //todo b salida
enable_interrupts(INT_EXT); //habilita interrupción por flanco en RB0
EXT_INT_EDGE(H_TO_L); //interrumpe cuando pasa de 1 a 0 (f derecho)

while(1)
{
output_b(0x00); //apaga todo
//se la pasa haciendo nada, esperando que haya interrupción
}
}


#int_EXT //aquí llega cuando el flanco es derecho
void inter_externa()
{
output_b(0xff);
delay_ms(1000); //veo que enciende todo b
}

-----------

Gracias por revisarlo Muchas risas, no lo he pasado al PIC todavía
Título: RE: Interrupción con RB0
Publicado por: wqtrp en 03 de Septiembre de 2005, 16:12:00
hola,
  desde ya te diria q eso no va a funcionar....
 1. debes programar rb0 como entrada si quieres q interrumpa, ya q por alli vendra la señal
 2. no te conviente poner un delay dentro de la interrupcion , ya q esto opara el micro por un segundo y si bien funcionara no es lo q corresponderia
 3. aparte el delay soloo soporta valores hasta 255 (creo)
 4. en la int. deberias prender parte edel portB y poner una marda en alguna memoria para despues en el prog principal contar y borrar el portB

Suerte.
Título: RE: Interrupción con RB0
Publicado por: migsantiago en 03 de Septiembre de 2005, 16:58:00
Hola wqtrp

¿A qué te refieres con "poner una marda en alguna memoria"? No entiendo del todo el punto 4.

Sobre el delay, tienes razón, mejor lo quito. Ah y sí se puede dar 1000ms en el delay.

Divertido
Título: RE: Interrupción con RB0
Publicado por: wqtrp en 03 de Septiembre de 2005, 17:01:00
quise poner "marca"
un bit q avise al programa principal q se disparo la interrupcion
Título: RE: Interrupción con RB0
Publicado por: migsantiago en 03 de Septiembre de 2005, 17:04:00
ok, gracias, voy a hacer los cambios
Título: RE: Interrupción con RB0
Publicado por: xerex en 04 de Septiembre de 2005, 15:14:00
no lo he visto pero te falta lo mas importante:

habilitar las interupciones:

enable_interrupts(global);


aunque habilites la interrupcion externa no has habilitado las interupciones del micro.

Saludos.
Título: RE: Interrupción con RB0
Publicado por: migsantiago en 04 de Septiembre de 2005, 15:37:00
ohhhhh

¿y esa instrucción debe ir antes o después de enable_interrupts(INT_EXT) ? Sonrojado
Título: RE: Interrupción con RB0
Publicado por: vszener en 04 de Septiembre de 2005, 15:51:00
Despues de declarar las interrupciones debes ponerla:
enable_interrupts(GLOBAL);
Giño
Título: RE: Interrupción con RB0
Publicado por: xerex en 04 de Septiembre de 2005, 16:16:00
la interrupcion externa puedes declararla cuando quieras, antes o despues del global, depende del programa que estes creando.

Por lo general si quieres que el micro desde su arranque  comienze con esta interupcion activada debes poner primero la externa y despues  hablilitar las interupciones (global). Pero eso no quiere decir que no puedas habilitarla en cualquier parte del programa, asi como la deshabilitacion de la misma.

Saludos.
Título: RE: Interrupción con RB0
Publicado por: migsantiago en 07 de Septiembre de 2005, 19:32:00
entendido, luego subo el programa final, gracias
Título: RE: Interrupción con RB0
Publicado por: migsantiago en 12 de Octubre de 2005, 22:01:00
Aquí está el programa...

Ya lo encendí, pero la salida en RC0 siempre está encendida... me pueden decir por favor que está mal? Gracias

El programa debe hacer esto... si hay un paso de 0 a 1 en RB0, la salida en RC0 encenderá 8ms, luego se apagará.

Cuando ocurre la interrupción, se guarda en un registro el valor ff, lo que enciende a RC0 con el if.

-----
//migsantiago

#include "16f877a.h"
#use delay(clock=4000000)
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#use fast_io (b)
#use fast_io (c)

int valor; //indica que interrupción hubo

void main()
{

set_tris_b(0xff); //RB0 entrada
set_tris_c(0x00); //RC0 salida

enable_interrupts(INT_EXT); //habilita interrupción por flanco en RB0
EXT_INT_EDGE(L_to_H); //interrumpe cuando pasa de 0 a 1
enable_interrupts(global);

while(1)
{

if(valor=0xff)
   {
   valor=0x00;
   output_c(0xff);
   delay_ms(8);
   }

output_c(0x00); //apaga todo
//se la pasa haciendo nada, esperando que haya interrupción
}
}


#int_EXT //aquí llega cuando el flanco es izquierdo
void inter_externa()
{
valor=0xff;
}
Título: RE: Interrupción con RB0
Publicado por: vszener en 13 de Octubre de 2005, 04:59:00
Hola ke tal!!! haber siempre esta encendido porque sempre sacas el mismo valor:
output_c(0xff);
deberias poner esto:
output_c(valor);

Suerte!!!Giño
Título: RE: Interrupción con RB0
Publicado por: migsantiago en 13 de Octubre de 2005, 17:46:00
gracias vszener, pero el registro valor sólo sirve para indicar que hubo interrupción. Si vale 0xff la hubo. Si la hubo prende el puerto C a unos por 8ms y pone 0x00 en valor.

Si valor vale 0x00, el puerto C permanece en ceros.
Título: RE: Interrupción con RB0
Publicado por: J1M en 13 de Octubre de 2005, 18:23:00
mira esto:
if(valor=0xff)

creo q te has colado... deberia ser: if(valor==0xff)

de todas formas prueba el programa de esta forma a ver q tal:

#include "16f877a.h"
#use delay(clock=4000000)
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect

int1 valor; //indica que interrupción hubo

void main()
{

enable_interrupts(INT_EXT); //habilita interrupción por flanco en RB0
EXT_INT_EDGE(L_to_H); //interrumpe cuando pasa de 0 a 1
enable_interrupts(global);

while(1)
{

if(valor==TRUE)
{
valor=FALSE;
output_high(PIN_C0);
delay_ms(8);
}

output_low(PIN_C0); //apaga C0
//se la pasa haciendo nada, esperando que haya interrupción
}
}


#int_EXT //aquí llega cuando el flanco es izquierdo
void inter_externa()
{
valor=TRUE;
}

saludos!
Título: RE: Interrupción con RB0
Publicado por: migsantiago en 13 de Octubre de 2005, 20:03:00
Suele suceder... Muchas risas

Gracias por corregirlo J1M Flash
Título: RE: Interrupción con RB0
Publicado por: J1M en 14 de Octubre de 2005, 11:53:00
jejeje de nada Giño si... los joios if .... si esq tendrían q haberlos exo de otra forma! jajaj Sonrisa GiganteRebotado

saludos!