TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: aitorsp en 22 de Noviembre de 2009, 16:43:10

Título: Duda con CCS
Publicado por: aitorsp en 22 de Noviembre de 2009, 16:43:10
Hola:

Tengo una duda de como usar la funcion setup_timer_2 que es la que permite configurar la frecuencia de la señal. La idea es generar una señal de 100 hz con un duty del 50%. Lo que me gustaria saber es qué formula hay que aplicar para configurar la funcion setup_timer_2 y qué formula aplico para el duty con la funcion set_pwm1_duty
un saludo

aitor
Título: Re: Duda con CCS
Publicado por: Suky en 22 de Noviembre de 2009, 16:58:29
setup_timer_2(Pre-escaler,Valor PR2,Post-escaler);
Donde:
Pre-escaler puede ser, T2_DISABLED, T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16.
Valor PR2, entre 0 y 255.
Post-escaler, entre 1 y 16.

Para hacer los calculos revisa el datasheet del microcontrolador que estas utilizando, también por aquí  (http://www.todopic.com.ar/foros/index.php?topic=24720.msg207737#msg207737)hay una pequeña explicación.

Saludos!
Título: Re: Duda con CCS
Publicado por: AKENAFAB en 22 de Noviembre de 2009, 17:13:21
El Post-scaler no se usa para el modulo PWM , hace caso omiso del valor planteado.

Aunque no entiendo bien lo segundo

Note: The Timer2 postscaler (see Section 8.0
“Timer2 Module”) is not used in the determination
of the PWM frequency. The
postscaler could be used to have a servo
update rate at a different frequency than
the PWM output.


Saludos!
Título: Re: Duda con CCS
Publicado por: Suky en 22 de Noviembre de 2009, 17:35:00
El Post-scaler no se usa para el modulo PWM , hace caso omiso del valor planteado.

Ups! Es cierto, me olvide  :mrgreen: Y lo otro que mencionas, ni idea  :undecided:

Saludos!
Título: Re: Duda con CCS
Publicado por: aitorsp en 23 de Noviembre de 2009, 06:19:21
Hola:

Gracias por las respuestas. Una cuestion mas, el Proteus se ha de configurar de alguna manera en especial para que funcionen bien las interrupciones?. He probado un ejemplo sencillo y no me funciona.

un saludo

aitor
Título: Re: Duda con CCS
Publicado por: Suky en 23 de Noviembre de 2009, 09:24:59
No, ninguno! Capaz estés mal el código....


Saludos!
Título: Re: Duda con CCS
Publicado por: aitorsp en 23 de Noviembre de 2009, 09:37:40
No, ninguno! Capaz estés mal el código....


Saludos!

Hola:

adjunto el codigo para que lo veas:

#include <16F877.h>
#use delay(clock=4000000)
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#int_EXT
 int_exterior(){
 output_high(PIN_B1);
 delay_ms(300);
 output_low(PIN_B1);
}

void main( void )
{
   set_tris_b(0b00000001);
   enable_interrupts(INT_EXT);
   ext_int_edge (L_TO_H);
   enable_interrupts(global);
   while(1){
   output_b(0x00);}
}
Título: Re: Duda con CCS
Publicado por: Suky en 23 de Noviembre de 2009, 09:43:34
Dos cosas para tener en cuenta, la configuración del evento (ext_int_edge (L_TO_H)) se debe hacer antes de habilitarlo, sino puede generar una interrupción que no es deseada.

Luego estás trabajando con la configuración de puertos standar, esto quiere decir que cada vez que se actué sobre un puerto se configurará el tris para ello, y tu haces un output_b() que establece todos los pines como salida y debe estar inhabilitando la interrupción.

Para fijar la configuración del TRIS debes utilizar: #use fast_io(b), de esa manera el tris queda como tu lo hayas configurado.


Saludos!
Título: Re: Duda con CCS
Publicado por: aitorsp en 23 de Noviembre de 2009, 09:51:08
Dos cosas para tener en cuenta, la configuración del evento (ext_int_edge (L_TO_H)) se debe hacer antes de habilitarlo, sino puede generar una interrupción que no es deseada.

Luego estás trabajando con la configuración de puertos standar, esto quiere decir que cada vez que se actué sobre un puerto se configurará el tris para ello, y tu haces un output_b() que establece todos los pines como salida y debe estar inhabilitando la interrupción.

Para fijar la configuración del TRIS debes utilizar: #use fast_io(b), de esa manera el tris queda como tu lo hayas configurado.


Saludos!

Hola:

gracias,ahora funciona con el siguiente codigo:

#include <16F877.h>
#use delay(clock=4000000)
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#use fast_io(b)
#int_EXT
 int_exterior(){
 output_high(PIN_B1);
 delay_ms(300);
 output_low(PIN_B1);
}

void main( void )
{
   set_tris_b(0b00000001);
   enable_interrupts(INT_EXT);
   ext_int_edge (L_TO_H);
   enable_interrupts(global);
   while(1){
   output_b(0x00);}
}

lo del ext_int_edge (L_TO_H) dices que tendria que configurarlo en otra parte del codigo? antes del main?

gracias y saludos

aitor
Título: Re: Duda con CCS
Publicado por: Suky en 23 de Noviembre de 2009, 10:30:11
No, con enable_interrupts(INT_EXT) ya estas habilitando la interrupción por flanco, y al hacer ext_int_edge (L_TO_H) después de ella puede setear el flag de interrupción, que al habilitarla con la global la generé. Lo único que debe hacerse es cambiar de posición estas dos instrucciones.


Saludos!
Título: Re: Duda con CCS
Publicado por: aitorsp en 23 de Noviembre de 2009, 11:01:24
No, con enable_interrupts(INT_EXT) ya estas habilitando la interrupción por flanco, y al hacer ext_int_edge (L_TO_H) después de ella puede setear el flag de interrupción, que al habilitarla con la global la generé. Lo único que debe hacerse es cambiar de posición estas dos instrucciones.


Saludos!

Hola:

A ver si lo entiendo, seria asi:

#include <16F877.h>
#use delay(clock=4000000)
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#use fast_io(b)
#int_EXT
 int_exterior(){
 output_high(PIN_B1);
 delay_ms(300);
 output_low(PIN_B1);
}

void main( void )
{
   set_tris_b(0b00000001);
   ext_int_edge (L_TO_H);
   enable_interrupts(INT_EXT);
   enable_interrupts(global);
   while(1){
   output_b(0x00);}
}

primero habilito el evento por flanco de subida y luego habilito la interrupcion exterior. Entonces si no pongo ext_int_edge (L_TO_H) que tipo de flanco aplica por defecto?

saludos

aitor
Título: Re: Duda con CCS
Publicado por: Suky en 23 de Noviembre de 2009, 11:18:28
Si, es lo correcto. Pasa saber que aplica por defecto hay que ir a la base de esto, el datasheet del microcontrolador.


Saludos!