TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: nosair en 29 de Mayo de 2016, 10:29:16

Título: problema con sfr50 y pic 18f452
Publicado por: nosair en 29 de Mayo de 2016, 10:29:16
hola gente necesito ayuda .
// Medidor de distancia //
// LCD module connections
sbit LCD_RS at RC4_bit;
sbit LCD_EN at RC5_bit;
sbit LCD_D4 at RC0_bit;
sbit LCD_D5 at RC1_bit;
sbit LCD_D6 at RC2_bit;
sbit LCD_D7 at RC3_bit;
sbit LCD_RS_Direction at TRISC4_bit;
sbit LCD_EN_Direction at TRISC5_bit;
sbit LCD_D4_Direction at TRISC0_bit;
sbit LCD_D5_Direction at TRISC1_bit;
sbit LCD_D6_Direction at TRISC2_bit;
sbit LCD_D7_Direction at TRISC3_bit;
// End LCD module connectionsbi
int duracion,distancia1;
int distancia2;
char distancia[4];
void interrupt ()
{
if (INTCON.INT0IF==1){
TMR1L=0xB7;                  //VALOR INICIAL DEL TIMER
TMR1H=0x8E;                  //  VALOR INICIAL DEL TIMER
TMR1ON_bit=1;                //ACTIVAR EL TIMER
}
if (INTCON3.INT1IF==0)
TMR1ON_bit=0; //PARAR LA CUENTA
 }
void main() {
          ADCON1=0X07;         //Conf. digital
          TRISA.F0=0X00;       //Conf. salida
          PORTA.F0=0;          //Conf. reset
          TRISB=0XFF;       //Conf. entrada
          PORTB=0;          //Conf. reset
          TRISC=0X00;          //Conf. salida para la LCD
          PORTC=0;             //Conf. reset
          INTCON.GIE=1;        //
          T1CON=0X80;          //Habilitar el timer1
          TMR1L=0XB7;           //Valor inicial 0
          TMR1H=0X8E;          //Valor inicial 0
          IPR1.TMR1IP=0;       //Prioridad BAJA del timer1
          INTCON.IPEN=1;       // Prioridad alta de las interrupciones
          INTCON.INT0IE=1;     // habilitar int0 como externa
          INTCON2.INTEDG0=1;   // int0 con flanco de subida
          INTCON3.INT1IE=1;    // HABILITAR INT1 COMO EXTERNA
          INTCON2.INTEDG1=0;   // int1 con flanco de bajada

                      Lcd_init();                       //Iniciar LCD
                      Lcd_Cmd(_LCD_CURSOR_OFF);         //Apagar el cursor
                      Lcd_Cmd(_LCD_CLEAR);              //Reset
                      Lcd_Out(1,1,"Distancia en cm ");  // MENSAJE
     duracion=0;     //Reset de variables
     distancia1=0;   //Reset de variables
     distancia2=0;   //Reset de variables
while (1){
      PORTA.F0=1;                //
      delay_us(25);              //Onda de 40Khz para el sensor
      PORTA.F0=0;                //
      duracion= TMR1L<<8 + TMR1H;
      distancia1= (duracion*0.034)/2;
      distancia2=distancia1-10;
      IntToStr(distancia2,distancia);
      Lcd_Out(2,1,"  ");
      Lcd_Out(2,3,distancia);
      Lcd_Out(2,7,"cm");
      Lcd_Out(2,9,"        ");
}}
porque no ejecuta la interrupción externa (int0)
Título: Re:problema con sfr50 y pic 18f452
Publicado por: KILLERJC en 29 de Mayo de 2016, 17:30:54
Podrias indicar el compilador?

Lo que estas haciendo parece una mezcla de un compilador XC8 y un CSS.
Título: Re:problema con sfr50 y pic 18f452
Publicado por: nosair en 30 de Mayo de 2016, 06:59:09
es el mikroc
Título: Re:problema con sfr50 y pic 18f452
Publicado por: KILLERJC en 30 de Mayo de 2016, 07:45:10
Citar
IPR1.TMR1IP=0;       //Prioridad BAJA del timer1
          INTCON.IPEN=1;       // Habilitacion de Prioridades

Los PIC18 tiene 2 prioridades, segun una pagina de mikroc las funciones de interrupcion serian asi:

Código: C
  1. void interrupt(void){           //ALTA PRIORIDAD
  2.  GIE_bit = 0;                   //disable global interrupts
  3.  if (INT0IF_bit){               //if interrupt on RB0/INT0 pin
  4.     if (!RB0_bit){              //if button pressed
  5.       delay_ms(10);             //wait a bit to be sure
  6.       if (!RB0_bit)             //if still pressed
  7.         LATA1_bit = ~LATA1_bit; //toggle indication pin on RA1
  8.     }
  9.     INT0IF_bit = 0;             //clear flag bit
  10.   }
  11.   GIE_bit = 1;                  //enable interrupts
  12. }
  13.  
  14. void interrupt_low(void){      //BAJA PRIORIDAD
  15.   GIE_bit = 0;                 //disable global interrupts
  16.   if (TMR0IF_bit){             //if TMR0 overflow interrupt
  17.     TMR0L = 0x00;              //reset TMR0 16-bit counter
  18.     TMR0H = 0xF0;
  19.     LATA0_bit = ~LATA0_bit;    //toggle indication pin on RA0
  20.     TMR0IF_bit = 0;            //clear overflow flag bit
  21.   }
  22.   GIE_bit = 1;                 //enable interrupts
  23. }

Lo curioso de esto es que la persona que lo hizo es parte del staff de MikroC, y encima modifica el GIE_bit DENTRO de la interrupcion, lo cual es algo MALO. El mismo micro se encarga de deshabilitarlo al entrar, y volverlo a habilitar con el RETFIE. Asi que quitale lo de los GIE.

Es casi como que el staff no supiera como funciona el microcontrolador  :D

PD: Sino pone el IPEN a 0, y listo todas van a ser altas prioridades
PD2: El GIE pasa a tener otra funcion cuando se habilitan las prioridades. El pin GIE pasa a ser GIEH es decir la habilitacion de interrupciones de Alta prioridad, y el PEIE pasa a ser el GIEL o habilitacion de interrupciones de baja prioridad.