Autor Tema: Interrupción con RB0  (Leído 2699 veces)

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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Interrupción con RB0
« 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

Desconectado wqtrp

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 170
RE: Interrupción con RB0
« Respuesta #1 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.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Interrupción con RB0
« Respuesta #2 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

Desconectado wqtrp

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 170
RE: Interrupción con RB0
« Respuesta #3 en: 03 de Septiembre de 2005, 17:01:00 »
quise poner "marca"
un bit q avise al programa principal q se disparo la interrupcion

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Interrupción con RB0
« Respuesta #4 en: 03 de Septiembre de 2005, 17:04:00 »
ok, gracias, voy a hacer los cambios

Desconectado xerex

  • PIC16
  • ***
  • Mensajes: 138
    • Mi servidor, mi casa.
RE: Interrupción con RB0
« Respuesta #5 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.
Es falso eso de que el saber no ocupa lugar....


No se donde poner tanto libro.... :P

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Interrupción con RB0
« Respuesta #6 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

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Interrupción con RB0
« Respuesta #7 en: 04 de Septiembre de 2005, 15:51:00 »
Despues de declarar las interrupciones debes ponerla:
enable_interrupts(GLOBAL);
Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado xerex

  • PIC16
  • ***
  • Mensajes: 138
    • Mi servidor, mi casa.
RE: Interrupción con RB0
« Respuesta #8 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.
Es falso eso de que el saber no ocupa lugar....


No se donde poner tanto libro.... :P

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Interrupción con RB0
« Respuesta #9 en: 07 de Septiembre de 2005, 19:32:00 »
entendido, luego subo el programa final, gracias

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Interrupción con RB0
« Respuesta #10 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;
}

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Interrupción con RB0
« Respuesta #11 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
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Interrupción con RB0
« Respuesta #12 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.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: Interrupción con RB0
« Respuesta #13 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!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Interrupción con RB0
« Respuesta #14 en: 13 de Octubre de 2005, 20:03:00 »
Suele suceder... Muchas risas

Gracias por corregirlo J1M Flash