TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado 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!
-
¿Cómo sabes que no funciona?, ¿estás mirándolo con un frecuencímetro?
-
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?
-
Pues no veo que tengas nada mal; ¿en el simulador de MPLAB se ve funcionar bien?
-
Si en el Simulador del MPLAB todo funciona bien pero en el circuito ya no, los leds se quedan prendidos
-
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???
-
delay_us(1000); es muy poca cosa para que veas un parpadeo
ponle delay_ms(500);
-
Tampoco esta funcionando con delay_ms(500), parece que solo se queda en prendido, podria ser algo del hardware?
-
while(1){
PORTE = 0xFFFF;
delay_ms(500);
PORTE = 0x0000;
delay_ms(500);
}
y asi
-
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
-
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
-
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
-
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
-
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.
-
Bueno tratare de averiguar que paso, muchas gracias por su ayuda y encuanto sepa algo del por que se los hare saber!!
Gracias
-
-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!
-
Deja intentarlo muchas gracias por el Tip!!
-
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