Autor Tema: ayuda con as interrupciones  (Leído 1436 veces)

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

Desconectado josegranada

  • PIC10
  • *
  • Mensajes: 16
ayuda con as interrupciones
« en: 02 de Octubre de 2009, 12:55:40 »
necesito hacer un gran proyecto que tiene un gran programa, y me gustaria  saber como tengo que hacer para poder conseguir que si toco un pulsador de la interrupcion RB4 por ejemplo me salga un 1 para que se encienda un led por otro puerto.

este es el codigo que llevo yo hecho me podrian decir como modificarlo para poder conseguir tal fin.

#include "16f877.h"
#byte pb=6
#byte pa=5
//#byte pc=7
#byte pd=8
#use delay(clock=4m)  //OJOOOOO PONER ANTES ESTE COMANDO PARA EL LCD
#include "mipant4bit.c"
#int_rb
int lectura();
int conta=0;
int pb1;
void main()
   {
  
      set_tris_d(0);
      pb=0;
      pd=0;
      set_tris_b(0b11110000);
    
  switch (lectura)
   {
      case 0b00010000:
    pd= (0b11111111);
               break;
        case 0b00100000:
    pd= (0b01010101);
               break;  
       case 0b01000000:
    pd= (0b10101010);
               break;
        case 0b10000000:
    pd= (0b10000111);
               break;
  
   }


  enable_interrupts(global);
enable_interrupts(int_rb);
  

}


//-------------------------------------------------------------------------
//---------------------lectura  de las teclas-----------------------------
int teclas()
   {
   int pb1=0;//variable dnd guardamos lo q hay en pb una vez sepamos que hay un 1 en cualquier entrada
   int lectura;//guardamos lo que hay en pb
   lectura=input_b();
   delay_ms(20);
   if(!bit_test(lectura,4)) bit_set(pb1,4);//si el bit0=1 se guarda  en pb=0
   else if(!bit_test(lectura,5)) bit_set(pb1,5);//si el bit2=1 se guarda  en pb=0
   else if(!bit_test(lectura,6)) bit_set(pb1,6);//si el bit2=1 se guarda  en pb=0  
   else if(!bit_test(lectura,7)) bit_set(pb1,7);//si el bit3=1 se guarda  en pb=0
   //hacmos un bucle para estar siempre mirando si se tocan los botones
   while(input_b()==lectura&&conta<200)
      {
      delay_ms(20);
      conta++;
      }
  return pb1;//devolvemos lo guardado en la variable pb1  
   }  
« Última modificación: 02 de Octubre de 2009, 17:21:28 por josegranada »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: alguien me ayuda
« Respuesta #1 en: 02 de Octubre de 2009, 14:31:19 »
En el titulo del hilo no indica cual es el posible problema, cámbialo por favor :? Lee las reglas del foro.

En la interrupción puedes manejar una variable que al pulsar te indique que hacer después:

Código: C
  1. #int_RB
  2. void  RB_isr(void){
  3.    delay_ms(20);
  4.    if(input(PIN_B4)==1){
  5.       TypeAcc=~TypeAcc; // TypeAcc es un bit que indica por ejemplo en 0 cargar Puerto B con 0xFF y en 1 0xAA.-
  6.    }
  7.    if(input(PIN_B5)==1){
  8.       ...
  9.    }
  10.    if(input(PIN_B6)==1){
  11.       ...
  12.    }
  13.    if(input(PIN_B7)==1){
  14.      ...  
  15.    }  
  16.    while(input(PIN_B4)||input(PIN_B5)||input(PIN_B6)||input(PIN_B7)){}
  17.    delay_ms(30);
  18. }
  19.  
  20.  
  21. void main(){
  22.  ...
  23.   while(1){
  24.      switch(TypeAcc){
  25.          case 0:
  26.              output_b(0xFF);
  27.          break;
  28.          case 1:
  29.              output_b(0xAA);
  30.          break;
  31.      }
  32.      delay_ms(300);
  33.   }
  34.  
  35. }
No contesto mensajes privados, las consultas en el foro

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: alguien me ayuda
« Respuesta #2 en: 02 de Octubre de 2009, 14:45:07 »
hola intentalo de esta manera:
en la parte donde defines los parametros del pic pone

#byte PORTB = 0x106  // al inicio de tu codogo define como entrada de tus pulsadores puerto B


int8 x;
x=PORTB; //leemos puerto B como esta
output_D(x); // reflejamos lo del puerto B en el puerto D
osea si tengo el el puerto B 00011001, el puerto D quedaria de la misma manera00011001, pero como obio queel puerto B como entrada y el puerto D como salida.

PD: esto lo aprendi el otro dias nomas  :mrgreen: por la ayuda de suky y gera  :D


a y lo otro cambia el nombre a tu titulo y pone en espesifico en que quieren que te ayuden como dijo suky

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: ayuda con as interrupciones
« Respuesta #3 en: 02 de Octubre de 2009, 20:21:22 »
no hay que olvidarse en la rutina de interrupción colocar:

output_b(input_b());

antes de salir, porque es un requisito para deshabilitar el flag de interrupción por cambio de estado, que está explicado en la hoja de datos. Es leer el puerto y sacarlo por el mismo puerto.

saludos
.