Autor Tema: dsPIC30F4013 e interrupciones externas.  (Leído 2388 veces)

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

Desconectado Sarge

  • PIC10
  • *
  • Mensajes: 14
dsPIC30F4013 e interrupciones externas.
« en: 23 de Noviembre de 2015, 16:43:44 »
Hola a todos, les vengo a dar lata con un problema que tengo.

Tengo un programa de dsPIC el cual está en modo SLEEP, usa una interrupción externa para despertarse, después con otra interrupción comienza la conversión ADC y una tercera para enviar datos por el UART, la cuestión es que cuando lo pruebo en el dsPIC pues no funciona, el LCD no me muestra nada y el UART no funciona, ¿podrían darme algún consejo o indicarme donde estoy mal? gracias por su ayuda y aquí les dejo el código:

Código: [Seleccionar]
                   // Limpia la bandera de interrupcion.
}

int step = 0;
void Ext_interrupt1() org IVT_ADDR_INT1INTERRUPT {
    step = 1;
    IFS1.INT1IF = 0;
}

 int tmp2 = 0;
 void Ext_interrupt2 () org IVT_ADDR_INT2INTERRUPT{
 tmp2 = 1;
 IFS2.INT2IF = 0;
 }

void main() {

 //Línea de codigo para SLEEP_MODE



  ADPCFG = 0xFFFF;  //Configura los pines AN como digitales.
  PORTB = 0x0000;
  TRISB.F2 = 1;    //Pin RB2 como entrada.
  TRISB.F3 = 1;    //Pin RB3 como 2da entrada.
  TRISA.F1 = 1;    //Entrada de INT0.
  TRISD.F8 = 1;    //Entrada de INT1.
  TRISD.F9 = 1;    //Entrada de INT2.
  TRISD = 0XFFFF;                                    // Puerto D salida digital.
  TRISF = 0XFFFF;                                    //Puerto F como salida digital.
  //IPC0= IPC0 | 0x0111;

  Lcd_Init();
  Lcd_Cmd(_LCD_CLEAR);
  Lcd_Cmd(_LCD_CURSOR_OFF);
 
  INTCON2 = 0x0001;                                   // INT0 se activa con pulso de subida
  IFS0.INT0IF = 0;                                    // Resetear la bandera de INT0
  IEC0.INT0IE = 1;                                    // Habilita el servicio de interupcion de INT0.

  INTCON2 = 0x0001;
  IFS1.INT1IF =0;
  IEC1.INT1IE = 1;
 
  INTCON2 = 0x0001;
  IFS2.INT2IF = 0;
  IEC2.INT2IE = 1;

     while (1){

           while(tmp1){
       asm{
       PWRSAV #1;
          }
   Delay_ms(50);
   asm NOP
  INTCON2=0x0000;
  UART1_Init(9600); //Iniciando el puerto Serial.
  Delay_ms(100);
  ADC1_Init_Advanced(_ADC_EXTERNAL_REF); //Configuración del ADC para tomar valores de referencia externos.
  Delay_ms(100);
 
  U1MODEbits.ALTIO = 1; //Habilita los pines alternativos para UART1.
 
  tmp1=0;
  INTCON2=0x0001;
                           }
 


         //while(step) {
         

         //INTCON2=0x0001;
         adc_rd= ADC1_Get_Sample(2);
         Lcd_Out(1,1,"Peso:");
         MuestraPeso(1,6,adc_rd);
         Lcd_Out(1,14, "g");
         Delay_ms(50);
 
         adc_rd2=ADC1_Get_Sample(3);
         Lcd_Out(2,1,"Agua:");
         MuestraNivel(2,6,adc_rd2);
         Lcd_Out(2,14,"ml");
         Delay_ms(50);
         
         /*step=0;
         INTCON2=0X0001;*/


   //Envio de datos por UART1.
   
   //while (tmp2){
   
   //INTCON2=0x0001;

    if (UART1_Data_Ready()==1) { //Lee si hay datos disponibles en el buffer de recepción.

  entrada=UART1_Read();



    if (entrada=='c') {/*Si llega el caracter 'c' por el puerto serial entonces realiza lo de abajo*/
    /* Esta partte se encarga de tomar los datos del canal RB2, convertilos a texto y mandarlos por puerto serial*/
    adcuart=adc_rd;
    WordToStr(adcuart, txt);
    UART1_Write_Text(txt);
    Delay_ms(100);

    UART1_Write(ch1); //Manda el caracter ',' coma.

    /* Esta partte se encarga de tomar los datos del canal RB3, convertilos a texto y mandarlos por puerto serial*/
    adcuart2=adc_rd2;
    WordToStr(adcuart2, txt2);
    UART1_Write_Text(txt2);
    Delay_ms(100);
   
    //tmp2=0;
    //INTCON2=0x0001;
                }

             }

           }

          }


Esta hecho en MikroC para dspic.


 

anything