Autor Tema: [ayuda] con la interrupción #int_RDA no me guarda el valor que deseo  (Leído 1365 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado pelado1006

  • PIC10
  • *
  • Mensajes: 2
hola gente . necesito que me den una mano , necesito cambiar el valor de mi duty de mi pwm por medio de #int_RDA ........ya tengo casi todo listo pero el problema es que el valor que le envió no me lo guarda en la variable que le asigno. estoy usando el ccs y probando en el proteus..acá les dejo el programa haber si ustedes me pueden dar una mano.

#include "D:\Walter\facu\picc\16Frs232\UART.h"
#include <stdlib.h>


#int_RDA


void  RDA_isr(void) //Interrupción de recepción de dato por la UART

{
unsigned int adc0;  //Declaramos variables a usar.
char ingreso[4];
signed long dato;
signed long dato2;
signed long dato3;
delay_us(200);
dato=getc(); //Recogemos dato recibido.
delay_us(200);
 switch(dato){
 
        case '1': output_toggle(PIN_B1);    //Cambio el estado del LED1             
                  break;
                 
        case '2': output_toggle(PIN_B2);   //Cambio el estado del LED2
                  break;
                 
        case 'a': adc0=read_adc();          //Lemos el ADC0
                  printf("ADC0 %u \n\r",adc0);  //Envío el valor del ADC0
                  printf("Introduce el valor de duty, y pulsa enter:\r ");
                  gets(ingreso);
                  dato2=atol(ingreso);                 
                  if (dato2>0){// sieldato ingresado es mayor a 0 se guarda en dato3
                  dato3=dato2;                 
                  printf("dato3: %ld \n\r",dato3);               
                  }
                  else{
                  printf("dato2: %ld \n\r",dato2);
                  }
                  break;
                 
        default:  break;
                   
      }
     
     
}

#int_EXT
void ext_isr()   //Interrupción RB0
{
 printf("Se ha pulsado el boton\n\r"); //Envía un mensaje cuando se pulsa el botón conectado a RB0
 delay_ms(200);
}


//Programa principal
void main(){
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_2);
setup_timer_2(T2_DIV_BY_16,255,1);
setup_ccp1(ccp_pwm);
enable_interrupts(INT_EXT);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

{
signed long duty=200lu;
signed long dato3;
puts ("bocha conectado");


//Configuracion de puertos E/S
//SET_TRIS_C(0x00);//Configura el puerto B: 0=Salida; 1=Entrada
//output_c(0x00); //Limpia el registro del puerto


while(TRUE){
         //set_adc_channel(0);  //selecciona el canal 1 del adc
           // delay_us(20);
            //duty=read_adc();
            //delay_us(20);
            printf("dato3 vale: %ld \n\r",dato3);
            if (dato3!=duty){ // si el dato3 es dinto a duty este pasa a ser mi nuevo duty
                     duty=dato3;
                     set_pwm1_duty(duty);
                     printf("duty vale: %ld \n\r",duty);
               }
                  else{
            //printf("duty vale: %ld \n\r",duty);
            set_pwm1_duty(duty);
            output_high(pin_c5);//Pone en alto a led
            delay_us(100);
            output_low(pin_c5);//Pone en bajo a led
            delay_us(100);                     
            //printf("el conversor  vale %lu\r",duty);
                  }
      }
   }
}

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: [ayuda] con la interrupción #int_RDA no me guarda el valor que deseo
« Respuesta #1 en: 20 de Junio de 2013, 13:26:06 »
lo primero es, para que:
delay_us(200);
dato=getc(); //Recogemos dato recibido.
delay_us(200);

no tienen sentido esos delays ahi

Lo segundo es que si declaras las variables en una funcion esas variables solo funcionan en esa funcion y no en las demas, aunque les pongas el mismo nombre, para ello debes declarar la variable en el global y solo 1 vez, en este caso seria debajo de #include <stdio.h>

Desconectado pelado1006

  • PIC10
  • *
  • Mensajes: 2
Re: [ayuda] con la interrupción #int_RDA no me guarda el valor que deseo
« Respuesta #2 en: 21 de Junio de 2013, 15:46:48 »
lo primero es, para que:
delay_us(200);
dato=getc(); //Recogemos dato recibido.
delay_us(200);

no tienen sentido esos delays ahi

Lo segundo es que si declaras las variables en una funcion esas variables solo funcionan en esa funcion y no en las demas, aunque les pongas el mismo nombre, para ello debes declarar la variable en el global y solo 1 vez, en este caso seria debajo de #include <stdio.h>




 hola .... primero gracias por responder , si los delay esos están muy al pedos , lo que pasa eran de otra cosa que tenia y quedaron,
y segundo estabas en lo correcto, necesitaba una variable global, y la verdad no lo había tenido en cuenta por falta de experiencia programando....desde ya muchísimas gracias..saludos