TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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
, no lo he pasado al PIC todavía
-
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.
-
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.
-
quise poner "marca"
un bit q avise al programa principal q se disparo la interrupcion
-
ok, gracias, voy a hacer los cambios
-
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.
-
ohhhhh
¿y esa instrucción debe ir antes o después de enable_interrupts(INT_EXT) ?
-
Despues de declarar las interrupciones debes ponerla:
enable_interrupts(GLOBAL);
-
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.
-
entendido, luego subo el programa final, gracias
-
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;
}
-
Hola ke tal!!! haber siempre esta encendido porque sempre sacas el mismo valor:
output_c(0xff);
deberias poner esto:
output_c(valor);
Suerte!!!
-
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.
-
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!
-
Suele suceder...

Gracias por corregirlo J1M
-
jejeje de nada
si... los joios if .... si esq tendrían q haberlos exo de otra forma! jajaj 

saludos!