Autor Tema: deshabilitar interrupciones  (Leído 11447 veces)

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

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: deshabilitar interrupciones
« Respuesta #15 en: 07 de Abril de 2007, 07:08:05 »
Los flags se habilitan igualmente sólo que no se accede al servicio de interrupción a no ser que esté habilitado.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: deshabilitar interrupciones
« Respuesta #16 en: 09 de Enero de 2009, 01:42:28 »
Hola! despues de casi una año de abrir este hilo aprendi un monton de cosas gracias a todos ustedes!
Ahora se un poquito mas de las interrupciones, pero sigo teniendo una duda...
Cuando configuro las interrupciones del pic (al principio del main), hace falta que deshabilite TODAS las interrupciones que tiene el PIC y que no uso? o cuando inicias el PIC por defecto vienen todas deshabilitadas?
En el datasheet no encontre nada de esto  :?
Podria configurar directamente INTCON y PIE1 (en el 12f683) pero no es tan directo como los enable/disable_interrupts...
Salu2!
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: deshabilitar interrupciones
« Respuesta #17 en: 09 de Enero de 2009, 03:02:28 »
Busca en la sección donde hablan del reset, seguro encontrarás información al respecto, sobre todo los registros involucrados en este tipo de procesos, a los que se le suele asignar valores específicos en el reset.

Saludos
Reinier

jacrmr

  • Visitante
Re: deshabilitar interrupciones
« Respuesta #18 en: 09 de Enero de 2009, 07:25:55 »
Cuando se hace power-on reset están todas desactivadas. Sin embargo, hay diferentes tipos de reset. En la hoja de datos siempre aparece el estado que tienen los registros inmediatamente después de hacer power-on reset (arriba de caba bit de un registro aparece algo como "R/W - 1" o similar, el número después del guión indica el estado después de power-on reset). En algunas hojas de datos aparece una sección especial con todos los resgistros y sus valores ante power-on reset, watchdog reset, brown-out reset, etc.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: deshabilitar interrupciones
« Respuesta #19 en: 09 de Enero de 2009, 22:52:33 »
efectivamente, los 2 tienen razon!
en la seccion del reset hay una tablita con todos los valores de los registros despues de un POR, MCLR, WDT, etc.
tambien en "memory organization", en la seccion de cada registro, arriba viene el valor despues de un POR, precedido por un R, W o RW
 :-/ :-/ :-/
al principio pensaba que los datasheets  eran aburridos y muy pesados, pero cada vez me parecen mas interesantes... incluso, ver que tenian 200 mas paginas me echaba para atras... pero una vez que te familiarizas con el, la verdad no son tantas paginas!  :-)
Gracias y salu2!
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado pajaro128

  • PIC10
  • *
  • Mensajes: 11
Re: deshabilitar interrupciones
« Respuesta #20 en: 03 de Febrero de 2009, 01:59:53 »
HOLA ..hace poco q estoy con los pic ..y mucho menos con el CCS...hice un programa y tengo un problema con la INT_EXT ..no entra (todo esto simulado en PROTEUS ......el programa es una lavadora de picadoras ...hace la presentacion ..presiono "INICIO" ...mueve una cinta tramsportadora ..si encuentra picadora ...llena de agua ..calienta agua ..y comienza a lavar ....si no encuentra picadora ..pone un mensaje de final de proceso y me indica cuantas picadoras se lavaron ....
PD:hay intrucciones q no se usar ...acepto consejos para mejorar el codigo ..gracias

//------Directivas para el compilador--------
#include <16f877a.h>                      //PIC utilizado
#fuses XT,NOWDT,NOPROTECT,NOLVP           //Configuramos los fuses
#use delay (clock=4000000)                //Oscilador a 4Mhz
#use fast_io(A)                           //Optimizamos E/S del PORTA
#use fast_io(B)                           //Optimizamos E/S del PORTB
#use fast_io(C)                           //Optimizamos E/S del PORTC
#use fast_io(D)                           //Optimizamos E/S del PORTD
#use fast_io(E)                           //Optimizamos E/S del PORTE
#INCLUDE "lcd.c"                          //Incluyo LCD.C
                       

//------Prototipos de funciones-----

void corrigo_salida(void);
void lcd_saludo_inicial(void);
void inicio_proceso(void);
void busca_pica1(void);
void nohay_pica1(void);
int  lleno_agua(void);
int  calor_agua(void);
int  lavando_pica1(void);
void busca_pica2(void);
int  lavando_pica2(void);

//VARIABLES GLOBALES

int vhaypica1  ; //ESTAS VARIABLES VOY HACER Q SI HAY UN 0 ES POR Q NO  SE CARGO EL           
int vhayagua   ; //AGUA(CARGO EL AGUA Y PONGO UN 1 EN LA VARIABLE)Y ASI CADA VES Q PASA
int vhaycalor  ; //UNA PICA SI LA VARIABLE ESTA EN 1 NO CARGA PASA AL LAVADO(O SIMPLEMENTE
int paso_pica1 ; //LO USO CON EL SENSOR 1 DE PICA Y VA A PASAR UNA SOLA VES Y DESPUES ME
long cant_pica  ;


//INTERRUPCION RB0---------------------

#INT_EXT
void isr(void) {
         delay_ms(20); //antirrebote
 
           
         if(input(PIN_A3)==1) output_low(PIN_C0);          //paro la cinta
         if(input(PIN_A3)==1)vhaypica1=1;
         if(input(PIN_A3)==1) cant_pica++;
         }
  //  #INT_EXT
//void
//{
//if (!bit_test(PIN_A2)) {
  // output_bit( PIN_A2, 0);
   //Ddelay_ms(1000);
   //direccion=1;   
/// }
// }
                     
//------Programa principal----------
void main(void) {
//------Puertos y pines-------------

   #byte PORTA=0x05
   #byte PORTB=0x06
   #byte PORTC=0x07
   #byte PORTD=0x08
   #byte PORTE=0x09
   set_tris_A(0xFF);   //PUERTO A como entrada.
   set_tris_B(0xFF);   //PUERTO B como entrada. 
   set_tris_C(0x90);   //PUERTO C 0,1,2,3 como salida y 4,5,6,7 como entrada
   set_tris_D(0x108);  //PUERTO D  como salida
   set_tris_E(0xFF);   //PUERTO E 3 como entrada y 0,1,2,4,5,6,7 como salida

   
    ext_int_edge(L_TO_H);
    disable_interrupts(INT_EXT);
    disable_interrupts(GLOBAL);
   
//-----Inicializo el LCD y muestro el saludo inicial----------

   corrigo_salida();
   lcd_init();
   lcd_saludo_inicial();     
   inicio_proceso();
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_EXT);     
   busca_pica1();
   lleno_agua();     
   calor_agua();   
   lavando_pica1(); 
   buscapica2:
   busca_pica2();
   lavando_pica2();
   goto buscapica2;
}
 
//------------------------------------------------------------------------------
//FUNCIONES
//------------------------------------------------------------------------------
//----IMPRIME SALUDO INICIAL.-------------

void lcd_saludo_inicial(void) {
         
      lcd_gotoxy(4,1);
      Lcd_putc ("LAVAMATIC");         //Escribo en la primera fila
      lcd_gotoxy(3,2);                //columna 4, fila 2
      Lcd_putc( "VERSION 1.00");      //Escribo en la segunda fila
      delay_ms(2000);                 //Espero tres segundos   
}
//-----INICIO PROCESO------------------

void inicio_proceso(void) {

      disable_interrupts(INT_EXT);
      Lcd_putc( "\f");               //Limpio pantalla
      salta:
      lcd_gotoxy(3,1);
      Lcd_putc ("PRESIONE EL");       //Escribo en la primera fila
      lcd_gotoxy(2,2);                //columna 2, fila 2
      Lcd_putc( "BOTON *INICIO*");    //Escribo en la segunda fila
     
      if(!input(PIN_A0))            //COMPRUEBO Y NIEGO LA SALIDA DE RA0
           {goto  salta; }       
      Lcd_putc( "\f");                //Limpio pantalla     
}

//----PONGO EN CERO PINES--------------

void corrigo_salida(void)
    {     
      output_low(PIN_C0);   
      output_low(PIN_B0);
      output_low(PIN_B1);
      output_low(PIN_B2);
      output_low(PIN_B3);       
    }       

//-------BUSCA PICA1--------------------

void busca_pica1(void) {
long i ;
     
     Lcd_putc( "\f");                       //Limpio pantalla       
     lcd_gotoxy(5,1);
     Lcd_putc ("BUSCANDO");             //o en la primera fila
     lcd_gotoxy(2,2);                         //columna 4, fila 2
     Lcd_putc( "PICADORA  1");    //Escribo en la segunda fila
     enable_interrupts(GLOBAL);
     enable_interrupts(INT_EXT);
     output_high(PIN_C0);                   //mueve cinta tramsportadora
     delay_ms(2500);                         //Espero tres segundos
     
      for (i==0 ;  i<1600 ; i++)       //con el valor de i regulo el tiempo
             {                         //en que busco la pica
               delay_ms(50); 
               IF(vhaypica1==1)        //si hay vhaypica1=1 ,i=2536 y salgo
                {                      //del bucle for
                  i=1600;                           
                }             
             }                 
              IF(vhaypica1==0)                 
                 nohay_pica1();       


//-------BUSCA PICA2--------------------
void busca_pica2(void) {
long i ;

     Lcd_putc( "\f");                       //Limpio pantalla
     lcd_gotoxy(5,1);
     Lcd_putc ("BUSCANDO");             //o en la primera fila
     lcd_gotoxy(3,2);                   //columna 4, fila 2
     cant_pica++;
     printf(lcd_putc, "PICADORA  %lu",cant_pica);    //Escribo en la segunda fila 
     cant_pica--;
     enable_interrupts(GLOBAL);
     enable_interrupts(INT_EXT); 
     output_high(PIN_C0);                 //mueve cinta tramsportadora
     delay_ms(2500);                         //Espero tres segundos   
     
      for (i==0 ;  i<80 ; i++)       //con el valor de i regulo el tiempo
             {                         //en que busco la pica
               delay_ms(80); 
               IF(vhaypica1==1)        //si hay vhaypica1=1 ,i=2536 y salgo
                {                      //del bucle for
                  i=80;                           
                }             
             }                 
               IF(vhaypica1==0)                 
                 nohay_pica1();       
}
//--------LLENO DE AGUA------------------

int lleno_agua(void) {
   
      Lcd_putc( "\f");                //Limpio pantalla     
      lcd_gotoxy(4,1);
      Lcd_putc ("LLENANDO ");         //Escribo en la primera fila
      lcd_gotoxy(4,2);                //columna 4, fila 2
      Lcd_putc( "DE AGUA");           //Escribo en la segunda fila
      delay_ms(1000);                 //Espero tres segundos
      salta2:
      output_high(PIN_C1);            //conecto bomba agua
     
      if(!input(PIN_A1))              //COMPRUEBO Y NIEGO LA SALIDA DE RA0
          {goto  salta2; }   
      output_low(PIN_C1);                       //apago bomba agua   
      vhayagua  =1 ; 
      return vhayagua;
}

//----------CALIENTO AGUA--------------------
int calor_agua(void) {

      Lcd_putc( "\f");                  //Limpio pantalla     
      lcd_gotoxy(3,1);
      Lcd_putc ("CALENTANDO ");         //Escribo en la primera fila
      lcd_gotoxy(4,2);                  //columna 4, fila 2
      Lcd_putc( "EL AGUA");             //Escribo en la segunda fila
      delay_ms(1000);                   //Espero tres segundos
      salta3:
      output_high(PIN_C2);              //enciendo resistencias
     
      if(!input(PIN_A2))                //COMPRUEBO Y NIEGO LA SALIDA DE RA0
           {goto  salta3; }
      output_low(PIN_C2);               //apago resistencias   
           vhaycalor=1;
      return vhaycalor;
}

//----------LAVANDO PICADORA 1-----------------
int  lavando_pica1(void){
long  cant_pica1 ;

      cant_pica1 = cant_pica ;
      disable_interrupts(GLOBAL);            //deshabilito las interrupciones
      disable_interrupts(INT_EXT);            //deshabilito las interrupciones     
      Lcd_putc( "\f");                       //Limpio pantalla     
      lcd_gotoxy(3,1);
      Lcd_putc ("LAVANDO  ");            //Escribo en la primera fila
      lcd_gotoxy(3,2);                       //columna 4, fila 2
      printf(lcd_putc, "PICADORA  %lu",cant_pica1);  //Escribo en la segunda fila 
      delay_ms(100);
      output_high(PIN_C3);                   //conecta leva, cepi y agua presion
      delay_ms(6000);                        //Espero seis segundos
      output_low(PIN_C3);                    //apago leva y cepillo   
      vhaypica1=0;
      return paso_pica1;
}

//----------LAVANDO PICADORA 2-----------------
int lavando_pica2(void){     
long  cant_pica1 ;

      cant_pica1 = cant_pica ;
      disable_interrupts(GLOBAL);            //deshabilito las interrupciones
      disable_interrupts(INT_EXT);            //deshabilito las interrupciones     
      Lcd_putc( "\f");                       //Limpio pantalla     
      lcd_gotoxy(3,1);
      Lcd_putc ("LAVANDO  ");            //Escribo en la primera fila
      lcd_gotoxy(4,2);                       //columna 4, fila 2
      printf(lcd_putc, "PICADORA  %lu",cant_pica1); //Escribo en la segunda fila 
      delay_ms(100);
      output_high(PIN_C3);                   //conecta leva, cepi y agua presion
      delay_ms(6000);                        //Espero seis segundos
      output_low(PIN_C3);                    //apago leva y cepillo     
      vhaypica1=0;
      return vhaypica1;         
}

//------NO HAY PICA1-------------------
void nohay_pica1(void) {
long  cant_pica1 ;

      cant_pica1 = cant_pica ;   
      disable_interrupts(GLOBAL);   //deshabilito las interrupciones     
      disable_interrupts(INT_EXT);
    //  disable_interrupts(INT_RTCC);
      output_low(PIN_C0);           //apago la cinta
      repito:
      Lcd_putc( "\f");              //Limpio pantalla     
      lcd_gotoxy(3,1);
      Lcd_putc ("NO HAY JUEGO");    // la primera fila
      lcd_gotoxy(3,2);              //columna 4, fila 2
      Lcd_putc( "DE PICADORA");     //bo en la segunda fila
      delay_ms(1000);               //Espero 10   segundos   
      Lcd_putc( "\f");              //Limpio pantalla
      lcd_gotoxy(5,1);
      Lcd_putc ("PROCESO");         //o en la primera fila
      lcd_gotoxy(4,2);              //columna 4, fila 2
      Lcd_putc( "TERMINADO");       //Escribo en la segunda fila
      delay_ms(1000);               //Espero 10   segundos
      Lcd_putc( "\f");                       //Limpio pantalla     
      lcd_gotoxy(1,1);
      Lcd_putc ("TOTAL PICADORAS");            //Escribo en la primera fila
      lcd_gotoxy(2,2);                       //columna 4, fila 2
      printf(lcd_putc, "LAVADAS  %lu",cant_pica1); //Escribo en la segunda fila 
      delay_ms(2000);
      goto repito;                  //repitoel mensaje

}       



 

anything