TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: ashmx en 10 de Marzo de 2008, 03:15:07

Título: rutina de retardo, no trabaja??
Publicado por: ashmx en 10 de Marzo de 2008, 03:15:07
Hola este es el codigo que estoy utilizando:

#include "p30f3010.h"

//Bit's de Configuracion
_FOSC(CSW_FSCM_OFF & XT_PLL8);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & BORV_27 & PWRT_16 & MCLR_EN);
_FGS(CODE_PROT_OFF);


int main(void){

   TRISE = 0x0000;
   PORTE = 0x0000;
      while(1){
         PORTE = ~PORTE;
         delay_us(1000);         
      }   
return 0;
}

//eof


Esta es la rutina de Tiempo que tome de la pagina de http://www.micropic.es/index.php?option=com_content&task=view&id=33&Itemid=58 (Micro PIC):

#define MIPS 24

/*********************************************/
/**  Función para hacer un retardo de x us  **/
/**  generada automáticamente por asistente **/
/**             www.micropic.es           **/
/**              Nocturno - 2006            **/
/**       Válida para MIPS>=16 (>32MHz)     **/
/**        Valores de x: de 0 a 65535       **/
/*********************************************/

void delay_us(unsigned int x) {
  asm ("REPEAT #%0\n NOP" :: "i" (MIPS-16));
  while ((x--)!=1) {
    asm ("REPEAT #%0\n NOP" :: "i" (MIPS-7));
  };
};

/*********************************************/
/**  Función para hacer un retardo de x ms  **/
/**  generada automáticamente por asistente **/
/**             www.micropic.es           **/
/**              Nocturno - 2006            **/
/**      Válida para MIPS>=0.24 (>48KHz)    **/
/**        Valores de x: de 0 a 65535       **/
/*********************************************/

void delay_ms(unsigned int x) {
  asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-5));
  asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-5));
  asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-6));
  asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-6));
  while ((x--)!=1) {
    asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-4));
    asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-3));
    asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-3));
    asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-3));
  };
}


El cristal que utilizo es de 12 Mhz, alguien sabe que estoy haciendo mal??? disculpen las preguntas tan de newbie


Gracias!
Título: Re: rutina de retardo, no trabaja??
Publicado por: Nocturno en 10 de Marzo de 2008, 03:21:58
¿Cómo sabes que no funciona?, ¿estás mirándolo con un frecuencímetro?
Título: Re: rutina de retardo, no trabaja??
Publicado por: ashmx en 10 de Marzo de 2008, 12:25:12
es que ya intente poniendo el retardo de 1 segundo  delay_ms(1000) [en el codigo que corro actualmente tengo esta llamada en vez de delay_us] y se alcanza a ver el cambio en el puerto E, los leds no parpadean.

que podra estar mal?
Título: Re: rutina de retardo, no trabaja??
Publicado por: Nocturno en 10 de Marzo de 2008, 13:11:57
Pues no veo que tengas nada mal; ¿en el simulador de MPLAB se ve funcionar bien?
Título: Re: rutina de retardo, no trabaja??
Publicado por: ashmx en 10 de Marzo de 2008, 13:31:43
Si en el Simulador del MPLAB todo funciona bien pero en el circuito ya no,  los leds se quedan prendidos
Título: Re: rutina de retardo, no trabaja??
Publicado por: ashmx en 10 de Marzo de 2008, 15:24:00
me fije que tenia:

_FOSC(CSW_FSCM_OFF & XT_PLL8);

pero estoy usando un cristal de 12 Mhz lei que lo maximo del cristal era de 10 Mhz para este modo asi que cambie el fuse por HS2_PLL16 para dejar segun yo los mismos 24 MIPS.

Hice el cambio pero sigue igual, alguien tiene alguna otra idea de que pueda ser???
Título: Re: rutina de retardo, no trabaja??
Publicado por: Sispic en 10 de Marzo de 2008, 16:21:43
delay_us(1000);   es muy poca cosa para que veas un parpadeo

ponle delay_ms(500);   
Título: Re: rutina de retardo, no trabaja??
Publicado por: ashmx en 10 de Marzo de 2008, 16:26:25
Tampoco esta funcionando con delay_ms(500), parece que solo se queda en prendido, podria ser algo del hardware?
Título: Re: rutina de retardo, no trabaja??
Publicado por: Sispic en 10 de Marzo de 2008, 17:05:14
    while(1){
         PORTE = 0xFFFF;
         delay_ms(500);         

         PORTE = 0x0000;
         delay_ms(500);       
      }   

y asi
Título: Re: rutina de retardo, no trabaja??
Publicado por: ashmx en 10 de Marzo de 2008, 17:31:04
No no funciona, asi es como luce actualmente el codigo



#include "p30f3010.h"
#define MIPS 24

//Bit's de Configuracion
_FOSC(CSW_FSCM_OFF & HS2_PLL16);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & BORV_27 & PWRT_16 & MCLR_EN);
_FGS(CODE_PROT_OFF);

void delay_ms(unsigned int x);

int main(void){

   TRISE = 0x0000;
   PORTE = 0x0000;
      while(1){
         PORTE = 0x0000;
         delay_ms(500);
         PORTE = 0xFFFF;
         delay_ms(500);
      }   
return 0;
}


void delay_ms(unsigned int x) {
  asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-5));
  asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-5));
  asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-6));
  asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-6));
  while ((x--)!=1) {
    asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-4));
    asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-3));
    asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-3));
    asm ("REPEAT #%0\n NOP" :: "i" (MIPS*250-3));
  }
}
//eof
Título: Re: rutina de retardo, no trabaja??
Publicado por: Nocturno en 10 de Marzo de 2008, 18:09:42
El puerto E se comparte con el periférico que genera PWM en ese micro.
¿Será que tienes activo el generador de PWM?.

Prueba a poner esto antes del TRIS:
PTCONbits.PTEN=0;

Si no funciona así, la única opción que se me ocurre es que escribas en LAT en vez de en PORT
Título: Re: rutina de retardo, no trabaja??
Publicado por: ashmx en 10 de Marzo de 2008, 18:51:34
Hola ya realice PTCONbits.PTEN=0; pero sigue igual y tambien escribiendo en las LAT, si le mando un solo dato como :

PORTE = 0x0010;

o

PORTE = 0x000F;

Funciona correctamente

estoy utilizando el dsPIC 30F3010 con las siguentes conexiones:

PIN

8        GND
9        XT(12 MHZ) C1 (15 pf)
10      XT(12 MHZ) C2 (15 pf)
13      5v

19      GND
20      5v

21 ... 26  LED con resistencia 330 ohms

Algo de eso podra estar mal??

Gracias
Título: Re: rutina de retardo, no trabaja??
Publicado por: ashmx en 11 de Marzo de 2008, 12:52:01
Pues no lo pude hacer funcionar mas que con un timer, me gustaria saber por que no funciona de la otra manera por que ni siquiera con __delay32 lo pude hacer trabajar, bueno por aqui les dejo el codigo de como lo deje trabajando:


#include "p30f3010.h"

//Bit's de Configuracion
_FOSC(CSW_FSCM_OFF & XT_PLL16);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & BORV_27 & PWRT_16 & MCLR_EN);
_FGS(CODE_PROT_OFF);

#define FCY 32000000

int main(void){

   PTCONbits.PTEN=0;
   //LATE = 0xffff;
   TRISE = 0xfff0;
   PORTE = 0x0000;
   T1CON = 0;
   TMR1 = 0;
   PR1 = FCY/256/5;
   T1CON = 0x8030;
      while(1){
         while(!IFS0bits.T1IF){}
            IFS0bits.T1IF = 0;
            PORTE = ~PORTE;
      }   
return 0;
}


//eof
Título: Re: rutina de retardo, no trabaja??
Publicado por: Nocturno en 11 de Marzo de 2008, 13:50:31
La verdad es que no lo sé. Yo ahora mismo ando liado con un proyecto con 30F6014 y utilizo las rutinas de retardo tal y como tú has pegado.
Título: Re: rutina de retardo, no trabaja??
Publicado por: ashmx en 12 de Marzo de 2008, 00:58:50
Bueno tratare de averiguar que paso, muchas gracias por su ayuda y encuanto sepa algo del por que se los hare saber!!

Gracias
Título: Re: rutina de retardo, no trabaja??
Publicado por: manex_1987 en 12 de Marzo de 2008, 19:52:39
-Condensador de 100nF (los amarillos estos) lo mas cercano posible del chip entre VCC y MASA..

Yo he tenido miles de comeduras de cabeza como las tuyas (enplan de que el micro solo funcionaba si tocaba el cristal y miles de tonterias mas) hasta que un dia se me ocurrio poner el dichoso componente. Desde entonces parfait!
Título: Re: rutina de retardo, no trabaja??
Publicado por: ashmx en 13 de Marzo de 2008, 03:10:28
Deja intentarlo muchas gracias por el Tip!!
Título: Re: rutina de retardo, no trabaja??
Publicado por: Sispic en 13 de Marzo de 2008, 12:12:24
PORTE = 0x0010;
o
PORTE = 0x000F;

Funciona correctamente


El PORTE del dsPIC30F3010/3011  no tiene todos los bits , quizas solo puedes utilizar los que existen , recuerdo algun problema que tuve con eso .

(http://www.upload-images.net/imagen/a4a8073e87.jpg) (http://www.upload-images.net)

yo provaria asi


PORTE = 0;
PORTE = 0b0000000100111111; // 0x013F , 319