TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: Ricardux 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.
-
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
-
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.
-
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
-
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.
-
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 (http://www.todopic.com.ar/foros/index.php?topic=19454.0).
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
int contador;
#int_timer1
void interrupcion(){
contador++;
if(contador==100){
output_toggle(pin);
contador=0;
}
}
algo así saludos.
-
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
-
Tienes una resistencia de 10 a 47K entre el pin MCLR y VCC ??
-
si, es debido a eso?, adjunto el esquema de mi entrenador , que deberia cambiar?, gracias
(http://s2.subirimagenes.com/imagen/previo/thump_8590509esquema.png)
-
esquema (http://subefotos.com/ver/?a646f409639e3ef0e0e96246c8c9ae45o.png) 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