Autor Tema: Parpadeo de un led con interrupcion interna dspic30f4013 ccs  (Leído 9128 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Ricardux

  • PIC10
  • *
  • Mensajes: 19
Parpadeo de un led con interrupcion interna dspic30f4013 ccs
« en: 02 de Agosto de 2013, 16:28:07 »
Buenas, estoy intentando hacer parpadear un led cada 2 segundos en cualquier puerto de un dspic30f4013, usando una interrupcion interna.

Estoy programando en ccs. el codigo va mas o menos asi.

#include <30F4013.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES CKSFSM                   //Clock Switching is enabled, fail Safe clock monitor is enabled
#FUSES NOBROWNOUT               //No brownout reset

#device ICSP=1
#use delay(clock=32MHz,crystal=8MHz)
#define LED PIN_A11
#bit RB7=0x06.7 //Identificador para el bit RB7

#INT_TIMER1
void  timer1_isr(void)
{
  RB7=~RB7; //Togle RB7
  set_timer1(0x0BDC);//carga del TMR1
 
}



void main()
{
   set_tris_b(0b01111111); //configura RB7 como salida el resto como entrada
   RB7=0;//Inicializo RB7
   setup_timer1(TMR_INTERNAL | TMR_DIV_BY_1, 2);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INTR_GLOBAL);
   set_timer1(0x0BDC);//Carga del TMR1
   while(true);//Bucle infinito hasta interrupción
   

}

Lo he hecho con el wizard y añadiendo ejemplos qu encuentro x la red, pero me quedan muchas dudas ya que soy muy novato. como encontre el ejemplo fue de un pic, nose si estara bien, ya que no logro cambiar al pin que quiero x ejemplo el A11 intente con un define (#define LED PIN_A11) pero me da error a la hora de usarlo, como podria cambiar RB7 por el pin que quiero A11, ya que en el ejemplo viene la direccion es del pin rb7 (#bit RB7=0x06.7 //Identificador para el bit RB7) he buscado en el datasheet del dspic pero no encuentro como saber cual seria la direccion del puerto A11 estoy muy verde. por que no simplemente puedo usar el define  y cambiar RB7 por LED.

Otra pregunta es cual seria la direccion del timer1 en el dspic ya que no la encuentro para poder cambiarla en el codigo ( set_timer1(0x0BDC);//carga del TMR1).

y de donde sacan esta direccion ( set_tris_b(0b01111111); //configura RB7 como salida el resto como entrada) para saber cual debo poner si uso el pin A11.

Cualquier ayuda les agradezco que llevo dias buscando x la web y solo veo ejemplos de pic mas no de dspics. Y debo usar ccs.

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: Parpadeo de un led con interrupcion interna dspic30f4013 ccs
« Respuesta #1 en: 02 de Agosto de 2013, 17:50:28 »
Te hace falta configuración del osc a que velocidad estaras corriendo y cual sera tu fuente de osc si la primaria o sec, si crystal o interno, con PLL o sin PLL, multiplicador de PLL, yo trate de configurar este para 30MIPS pero con ccs no me dejo, tuve que cambiar a XC16 donde realmente lo hice de una manera muy facil te lo recomiendo. saludos

Desconectado Ricardux

  • PIC10
  • *
  • Mensajes: 19
Re: Parpadeo de un led con interrupcion interna dspic30f4013 ccs
« Respuesta #2 en: 02 de Agosto de 2013, 22:06:04 »
yo crei que en esta linea quedaba configuraba ( #use delay(clock=32MHz,crystal=8MHz)), crystal de 8 y multiplicador x 4 y en esta linea setup_timer1(TMR_INTERNAL | TMR_DIV_BY_1, 2); le digo que quiero que lo haga cada 2segundos.

Desconectado Ricardux

  • PIC10
  • *
  • Mensajes: 19
Re: Parpadeo de un led con interrupcion interna dspic30f4013 ccs
« Respuesta #3 en: 13 de Agosto de 2013, 16:08:57 »
Bno, he logrado que encienda el led, por lo menos sopecho que parpadea tan rapido que lo veo siempre encendido. Mi problema es que no lo veo parpadear y no se como calcular el periodo necesario para el timer1 quiero que el led parpadee cada dos segundos y no encuentro la formula para calcular el periodo del timer1 en el datasheet ni en la documetacion, nose si alguien me puede ayudar con eso es el dspic30f4013.

Tb tengo un problema de que el led no prende sino le doy al reset de mi placa entrenadora. Nose xke pasa esto y apongo elpin de salida en high como dice el datasheet.

Adjunto el codigo

#include <30F4013.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES CKSFSM                   //Clock Switching is enabled, fail Safe clock monitor is enabled
#FUSES NOBROWNOUT               //No brownout reset

#device ICSP=1
#use delay(clock=32MHz,crystal=8MHz)
#define LED PIN_A11

#INT_TIMER1
void  timer1_isr(void)
{
  output_toggle(LED); //Toggle A11
   
}



void main()
{
   set_tris_a(0); //configura A11 como salida el resto como entrada
   output_high(LED);
   setup_timer1(TMR_INTERNAL | TMR_DIV_BY_64, 10);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INTR_GLOBAL);
    while(true);//Bucle infinito hasta interrupción
   

}

Gracias x las rtsas de antemano, salu2

Desconectado Ricardux

  • PIC10
  • *
  • Mensajes: 19
Re: Parpadeo de un led con interrupcion interna dspic30f4013 ccs
« Respuesta #4 en: 13 de Agosto de 2013, 16:26:05 »
Bno acabo de comprobar con un osciloscopio que si esta parpadeando solo que muy rapido, he intentando subir el periodo pero lo mismo, y cuando uso el prescaler de 256 ya no prende el led.

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: Parpadeo de un led con interrupcion interna dspic30f4013 ccs
« Respuesta #5 en: 13 de Agosto de 2013, 20:03:39 »
puedes buscar aquí en el foro un calculador de timers es el de redpic buscalo y este te dara las cuentas para cargar el timer y obtener un valor deseado
aqui.

Para generar un pulso cada 2seg tendras que generar un contador si tu interrupción es cada 20ms tendras que contar 100 interrupciones para togglear tu salida

Código: [Seleccionar]
int contador;

#int_timer1
void interrupcion(){
contador++;
if(contador==100){
output_toggle(pin);
contador=0;
}

}


algo así saludos.
« Última modificación: 13 de Agosto de 2013, 20:13:47 por gab163 »

Desconectado Ricardux

  • PIC10
  • *
  • Mensajes: 19
Re: Parpadeo de un led con interrupcion interna dspic30f4013 ccs
« Respuesta #6 en: 21 de Agosto de 2013, 13:50:50 »
el link que posteas lleva a virus, encontre la forma de hacerlo con el wizard que me calcula exaacto el tiempo a la hora de configurar el timer1 y el codigo quedo asi

#include <30F4013.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES CKSFSM                   //Clock Switching is enabled, fail Safe clock monitor is enabled
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NODEBUG
#FUSES MCLR, PUT4 , NOPROTECT, NOWRT
#use delay(clock=32MHz, crystal=8MHz)

#define LED PIN_A11

#INT_TIMER1
void  timer1_isr(void)
{
  output_toggle(LED); //Toggle A11
   
}



void main()
{
   set_tris_a(0); //configura A11 como salida el resto como entrada
   output_high(LED);
   setup_timer1(TMR_INTERNAL | TMR_DIV_BY_256, 65000); //configuro para que la interrupcion se de cada 2 segundos
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INTR_GLOBAL);
   

    while(true); //Bucle infinito hasta interrupción
 
   

}

el problema es que el programa solo funciona cuando oprimo el reset, x eso agregue el put4 pero sigue sin iniciarse solo

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Parpadeo de un led con interrupcion interna dspic30f4013 ccs
« Respuesta #7 en: 21 de Agosto de 2013, 13:55:16 »
Tienes una resistencia de 10 a 47K entre el pin MCLR y VCC ??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Ricardux

  • PIC10
  • *
  • Mensajes: 19
Re: Parpadeo de un led con interrupcion interna dspic30f4013 ccs
« Respuesta #8 en: 23 de Agosto de 2013, 12:42:16 »
si, es debido a eso?, adjunto el esquema de mi entrenador , que deberia cambiar?, gracias


Desconectado Ricardux

  • PIC10
  • *
  • Mensajes: 19
Re: Parpadeo de un led con interrupcion interna dspic30f4013 ccs
« Respuesta #9 en: 27 de Agosto de 2013, 16:28:06 »
esquema oops veoq ue la imagen s eveia muy pequeña subo el link para que se vea mejor gracias.http://subefotos.com/ver/?a646f409639e3ef0e0e96246c8c9ae45o.png
« Última modificación: 27 de Agosto de 2013, 16:38:19 por Ricardux »