Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

04/05/2014 #1

Avatar de tckjonixx

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
04/05/2014 #2

Avatar de TRILO-BYTE

No me quedó claro cómo declaraste tus interrupciones.

Bueno, yo utilizo la calculadora de pictimercalculator
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.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.