Problemas con interrupciones pic18f4550

hola gente.
he estado trabajando con el movimiento de 3 servos a la misma vez y con angulo diferente
por medio de interrupciones y transmision serial.estoy recibiendo un 1 por la transmision, pero ningun servo se mueve ni nada ocurre,mientras si decido moverlos uno por uno(main) si se mueven este es el codigo...agradesco sus opiniones
Código:
#include<p18f4550.h>
#include<delays.h>
//#include <xlcd.h>
int aaa,bbb,a1,a2;
/*void DelayFor18TCY(){Delay10TCYx(2);}
void DelayPORXLCD(){Delay1KTCYx(15);}
void DelayXLCD(){Delay1KTCYx(5);}*/
void interrupcion1(void);
void interrupcion2(void);

#pragma code intalta=0x08
void intalta(void){
_asm goto interrupcion1 _endasm
}
#pragma code
#pragma interrupt interrupcion1
void interrupcion1(void){
RCREG=aaa;
if (aaa=1){
    for(a1=0; a1<100; a1++){
if (a1==1){
a1=a1+1;

} else {
a1=a1;
}

      PORTDbits.RD0=1;Delay10TCYx(100+a1);
      PORTDbits.RD0=0;Delay100TCYx(200-a1);
     // Delay10KTCYx(500);
  }

}
INTCONbits.RBIF=0;
}
#pragma code intbaja=0x18
void intbaja(void){
_asm goto interrupcion2 _endasm
}
#pragma code
#pragma interrupt interrupcion2
void interrupcion2(void){
RCREG==bbb;
if (bbb=1){
    for( a2=0; a2<50; a2++){
if (a2==1){
a2=a2+1;

} else {
a2=a2;
}

      PORTDbits.RD0=1;Delay10TCYx(100+a2);
      PORTDbits.RD0=0;Delay100TCYx(200-a2);
     // Delay10KTCYx(500);
  }

}
PIR1bits.ADIF=0;
}
/*void lcd1(int);
void lcd2(int);
void lcd3(int);*/


int x=0,y=0,z=0;

void main()
{
	int a0=0,b0=0,c0=0;
	double a=0.0,b=0.0,c=0.0;
	int aa=0.0,bb=0.0,cc=0.0;

	TRISB=0;
	TRISC=128;//128 192
	TRISD=0;
	PORTD=0;

	TXSTA=36;
	RCSTA=176;
	BAUDCON=0;//8
	SPBRG=25;//103

    RCONbits.IPEN = 1;
    IPR1bits.ADIP=0;
    PIE1bits.ADIE=1;
    INTCON=200;
    INTCON2bits.RBIP = 1;
    INTCON2bits.RBPU = 0;


	/*OpenXLCD(FOUR_BIT & LINES_5X7);
	WriteCmdXLCD(1);
	SetDDRamAddr(0x00);
	putrsXLCD(" Te1:");
	SetDDRamAddr(0x40);
	putrsXLCD(" Te2:");
	SetDDRamAddr(0x4A);
*/
	while(1)
	{
		//PORTDbits.RD4=1;
		//Delay1KTCYx(1);
		//PORTDbits.RD4=0;
		//Delay1KTCYx(1);

		if(RCREG==200)
		{
		Delay1KTCYx(50);//50mseg
		a0=RCREG;
		a=(a0/18.0)*10.0;
		aa=(100+a);
		PORTDbits.RD0=1;
		Delay10TCYx(aa);
		PORTDbits.RD0=0;
		Delay100TCYx(200.0-aa);
		//lcd1(a0);
		}

		if(RCREG==220)
		{
		Delay1KTCYx(50);//50mseg
		b0=RCREG;
		b=(b0/18.0)*10.0;
		bb=(100+b);
		PORTDbits.RD1=1;
		Delay10TCYx(bb);
		PORTDbits.RD1=0;
		Delay100TCYx(200.0-bb);
		//lcd2(b0);
		}

		if(RCREG==240)
		{
		Delay1KTCYx(50);//50mseg
		c0=RCREG;
		c=(c0/18.0)*10.0;
		cc=(100+c);
		PORTDbits.RD2=1;
		Delay10TCYx(cc);
		PORTDbits.RD2=0;
		Delay100TCYx(200.0-cc);
		//lcd3(c0);
		}

	}
}

/*void lcd1(int n)
	{
		x=n/100;
		y=(n/10)%10;
		z=n%10;
		SetDDRamAddr(0x05);
		WriteDataXLCD(0x30+x);
		WriteDataXLCD(0x30+y);
		WriteDataXLCD(0x30+z);
	}
void lcd2(int n)
	{
		x=n/100;
		y=(n/10)%10;
		z=n%10;
		SetDDRamAddr(0x45);
		WriteDataXLCD(0x30+x);
		WriteDataXLCD(0x30+y);
		WriteDataXLCD(0x30+z);
	}
void lcd3(int n)
	{
		x=n/100;
		y=(n/10)%10;
		z=n%10;
		SetDDRamAddr(0x4D);
		WriteDataXLCD(0x30+x);
		WriteDataXLCD(0x30+y);
		WriteDataXLCD(0x30+z);
	}

*/
gracias
 
No me quedó claro cómo declaraste tus interrupciones.

Bueno, yo utilizo la calculadora de pictimercalculator
Ver el archivo adjunto PIC Timer Calculator.zip

Ahora lo que hay que hacer, es esto:

Código:
#include <p18cxxx.h>

#pragma config PLLDIV   = 5         // (20 MHz crystal on PICDEM FS USB board)
#pragma config CPUDIV   = OSC1_PLL2   
#pragma config USBDIV   = 2         // Clock source from 96MHz PLL/2
#pragma config FOSC     = HSPLL_HS
#pragma config FCMEN    = OFF
#pragma config IESO     = OFF
#pragma config PWRT     = OFF
#pragma config BOR      = ON
#pragma config BORV     = 3
#pragma config VREGEN   = ON      //USB Voltage Regulator
#pragma config WDT      = OFF
#pragma config WDTPS    = 32768
#pragma config MCLRE    = ON
#pragma config LPT1OSC  = OFF
#pragma config PBADEN   = OFF
#pragma config CCP2MX   = ON
#pragma config STVREN   = ON
#pragma config LVP      = OFF
#pragma config EBTR3    = OFF
#pragma config EBTRB    = OFF


/************************* V A R I A B L E S *********************************************/
#pragma udata


/************* DEFINICON DE ALGUNAS CONSTANTES *************************************/
#define TIMER0L_VAL         0x84 //esto lo genera el pictimer calculator
#define TIMER0H_VAL         0x6D

int inc=0;

#define PWM1         LATBbits.LATB0
#define PWM2         LATBbits.LATB1


void interrumpe(void);
void configTimer0(void);
void configInterrupts(void);





#pragma code prioridad_nomal = 0X0008

void interrupcion_normal (void)
{
_asm goto interrumpe _endasm
}

#pragma code    //fin de la interrupcion (retfie en el ASM)

////******************************************************//
//    Rutina de Interrupcion
//******************************************************//

#pragma interrupt interrumpe

void interrumpe(void)
{
   if (INTCONbits.TMR0IE==1 && INTCONbits.TMR0IF==1)
              {
   
                inc++;
                INTCONbits.TMR0IF = 0;   // se limpia la bandera para que se vuelva a activar la //interrupcion
                TMR0H = TIMER0H_VAL;
                TMR0L = TIMER0L_VAL;
              }
}



void main(void)

{

int mi_pwm1=50;

int mi_pwm1=200;

 ADCON1 = 0x0F;                 // Todos los pines en modo digital
 
configInterrupts();
configTimer0();



for(;;)
      {
   


if(inc>=255)                                        // cada 255 pulsos regreso para hacer 1 periodo 
      {
         inc=0;         
      }


if(inc<=mi_pwm1)                   //cambio el  ancho del subida en led_rojo
      {   
         PWM1=1;
      }
   else
      {
         PWM1=0;
      } 

if(inc<=mi_pwm2)                   //cambio el  ancho del subida en led_verde
      {   
         PWM2=1;
      }
   else
      {
         PWM2=0;
      } 


      }
}



















/************ Funcion de retardo **************/

void configInterrupts(void)
{

INTCONbits.GIE=1;            // global interrupts
//RCON = 0X00;  //IPEN = 0
//INTCON2bits.INTEDG1=1;   //flanco de subida para la interrupcion en RB1
                     //flanco de bajada para la interrupcion en RB2

INTCON3bits.INT1IE=1; //configuramos la interrupcion externa del RB1
INTCON3bits.INT2IE=1; //configuramos la interrupcion externa del RB2

INTCONbits.TMR0IE=1;        //timer enable
INTCONbits.TMR0IF=0;        //  timer overflow   

}


void configTimer0(void)
  {   

T0CONbits.TMR0ON = 1;  // Timer0 On/Off Control bit: 1=Enables Timer0 / 0=Stops Timer0
T0CONbits.T08BIT = 0;  // Timer0 8-bit/16-bit Control bit: 1=8-bit timer/counter / 0=16-bit timer/counter
T0CONbits.T0CS   = 0;  // TMR0 Clock Source Select bit: 0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
T0CONbits.T0SE   = 0;  // TMR0 Source Edge Select bit: 0=low/high / 1=high/low
T0CONbits.PSA    = 0;  // Prescaler Assignment bit: 0=Prescaler is assigned; 1=NOT assigned/bypassed
T0CONbits.T0PS2  = 1;  // bits 2-0  PS2:PS0: Prescaler Select bits
T0CONbits.T0PS1  = 0;
T0CONbits.T0PS0  = 0;


    
    TMR0H=TIMER0H_VAL;            //Carga a los registros TMR0H Y TMR0L
    TMR0L=TIMER0L_VAL;            //
  }
Así más o menos, cualquier error que tenga o dudas, ahí estamos.
 
Última edición por un moderador:
Atrás
Arriba