TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: aitorsp en 05 de Junio de 2011, 08:45:53

Título: Configuracion del oscilador interno en CCS
Publicado por: aitorsp en 05 de Junio de 2011, 08:45:53
Hola:

Una duda acerca de la configuracion del oscilador interno en CCS.

Segun el manual si ponemos #use delay(internal=8M) dice que configura el INTOSC_IO para funcionar a 8 Mhz. Entonces la pregunta es:

Seria necesario configurar el fuse INTRC_IO y el setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF); ?

Un saludo

Aitor
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: samshiel_pic en 05 de Junio de 2011, 10:18:44
Hola buenas! Hombre yo siempre lo he hecho de la segunda forma primero declarando el fuse luego poniendo el #use_delay(clock=8000000) y luego configurando el setup en el main().
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: rivale en 05 de Junio de 2011, 10:32:02
yo lo declaro asi:

Fuses intrc_io

#use delay(clock=8000000)

y con eso queda, si ya le dijiste en los fuses que es con osc interno no necesitas decircelo por software, ose, no necesitar poner el setup_oscollator.
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: Suky en 05 de Junio de 2011, 11:24:10
Dependiendo del microcontrolador con declarar mediante fuses la utilización del oscilador interno no alcanza, ya que se pueden seleccionar varias opciones de velocidad (PIC18F). Para configurarlo se utiliza setup_oscillator(), por lo menos en CCS.


Saludos!
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: aitorsp en 05 de Junio de 2011, 11:40:19
Dependiendo del microcontrolador con declarar mediante fuses la utilización del oscilador interno no alcanza, ya que se pueden seleccionar varias opciones de velocidad (PIC18F). Para configurarlo se utiliza setup_oscillator(), por lo menos en CCS.


Saludos!

Hola suky:

utilizo el PIC18F4550 a 8 Mhz de oscilador interno con lo que segun dices habria que hacer:

#fuses INTRC_IO

#use delay(internal=8M)

setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF);

Es asi?

un saludo

Aitor
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: bmb en 05 de Junio de 2011, 11:42:43
Hola, en realidad como dice rivale tambien es correcto.  Del manual de CCS para setup_oscillator():

Citar
Note that if INTRC or INTRC_IO is specified in #fuses and a #USE DELAY is
used for a valid speed option, then the compiler will do this setup automatically
at the start of main().

Es suficiente con declarar el fuse y una velocidad válida en #use delay()

Saludos!
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: rivale en 05 de Junio de 2011, 11:52:35

#fuses INTRC_IO

#use delay(internal=8M)

setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF);

Es asi?

un saludo

Aitor


ponlo asi:

setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_PLL_OFF);

la parte en rojo no va
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: aitorsp en 05 de Junio de 2011, 12:05:59
Hola:

Pongo en codigo completo porque no me funciona.

Código: [Seleccionar]
#include <18F4550.h>

#fuses NOWDT,INTRC_IO,NOPROTECT,NOBROWNOUT,NOPUT,NOCPD,NOSTVREN,NODEBUG
#fuses NOLVP,NOWRT,NOWRTD,NOFCMEN,NOPBADEN,NOWRTC,NOWRTB,NOEBTR,NOCPB
#fuses NOMCLR
#use delay(internal=8M)
#define LCD_DB4   PIN_A3
#define LCD_DB5   PIN_A5
#define LCD_DB6   PIN_E0
#define LCD_DB7   PIN_E1

#define LCD_RS    PIN_A0
#define LCD_RW    PIN_A1
#define LCD_E     PIN_A2

#define  sig         6     //0x06
#define  clear       1     //0x01
#define  cursor_no   12    //0x0C
#define  cursor_si   14    //0x0E
#define  cur_blink   15    //0x0F
#define  desp_izq    24   //comandos de desplazamiento
#define  desp_der    28
#define  gen_car     64
#define  lin1        133   //0x85
#define  ren1        128   //0x80
#define  ren2        192   //0xC0


#include   "flex_lcd.c"

int pos;

void main()
{
   setup_adc_Ports(NO_ANALOGS);
   setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_PLL_OFF);
   set_tris_a(0x00);
   set_tris_e(0x00);
   set_tris_d(0x00);
   lcd_init();
   pos=16;
   lcd_init();
     while(true){
     output_high(PIN_D2);
     delay_ms(1000);
     output_low(PIN_D2);
     if(pos!=1){
     lcd_gotoxy(pos,1);
     lcd_putc("Hola");
     lcd_gotoxy(pos,2);
     lcd_putc("Todopic");
     delay_ms(300);
     lcd_send_byte(0,desp_der);
     }
     pos=16;
}
}


Un saludo

Aitor
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: MLO__ en 05 de Junio de 2011, 12:10:53
Hola

Verifica que tu programador soporte el NOMCLR y INTRC_IO al mismo tiempo .... el ICD2, por ejemplo, no deja programar con esa configuración en los #fuses.

Saludos
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: rivale en 05 de Junio de 2011, 12:14:13
que es lo que no te funciona, si lo compila bien?, cual es el error?
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: aitorsp en 05 de Junio de 2011, 12:16:13
que es lo que no te funciona, si lo compila bien?, cual es el error?

Hola:

Compilar si que compila pero al probar el hardware no funciona. revisaré por si es fallo de hardware.

un saludo

Aitor
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: rivale en 05 de Junio de 2011, 12:23:28

en tus fuses te falta ponerle que PLL y que postescalkador usas, tal vez por eso no te funciona



Código: [Seleccionar]
#include <18f4550.h>//pic a utilizar

#include <stdlib.h>

#fuses HSPLL,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP,NOCPD,NOMCLR,PLL1,CPUDIV1,NOVREGEN//configuraciones del pic
#use DELAY(clock=8000000)//frecuencia del oscilador en Hz



yo uso esta configuracion para el 4550, y funciona bien, pruebalo y me dices
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: aitorsp en 05 de Junio de 2011, 12:43:16

en tus fuses te falta ponerle que PLL y que postescalkador usas, tal vez por eso no te funciona



Código: [Seleccionar]
#include <18f4550.h>//pic a utilizar

#include <stdlib.h>

#fuses HSPLL,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP,NOCPD,NOMCLR,PLL1,CPUDIV1,NOVREGEN//configuraciones del pic
#use DELAY(clock=8000000)//frecuencia del oscilador en Hz



yo uso esta configuracion para el 4550, y funciona bien, pruebalo y me dices


Hola:

Con los cambios que comentas no me funciona:

Código: [Seleccionar]
#include <18F4550.h>
#include <stdlib.h>

#fuses HSPLL,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP,NOCPD,NOMCLR,PLL1,CPUDIV1,NOVREGEN
#use delay(clock=8M)
#define LCD_DB4   PIN_A3
#define LCD_DB5   PIN_A5
#define LCD_DB6   PIN_E0
#define LCD_DB7   PIN_E1

#define LCD_RS    PIN_A0
#define LCD_RW    PIN_A1
#define LCD_E     PIN_A2

#define  sig         6     //0x06
#define  clear       1     //0x01
#define  cursor_no   12    //0x0C
#define  cursor_si   14    //0x0E
#define  cur_blink   15    //0x0F
#define  desp_izq    24   //comandos de desplazamiento
#define  desp_der    28
#define  gen_car     64
#define  lin1        133   //0x85
#define  ren1        128   //0x80
#define  ren2        192   //0xC0


#include   "flex_lcd.c"

int pos;

void main()
{
   setup_adc_Ports(NO_ANALOGS);
   setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_PLL_OFF);
   set_tris_a(0x00);
   set_tris_e(0x00);
   set_tris_d(0x00);
   lcd_init();
   pos=16;
   lcd_init();
     while(true){
     output_high(PIN_D2);
     delay_ms(1000);
     output_low(PIN_D2);
     if(pos!=1){
     lcd_gotoxy(pos,1);
     lcd_putc("Hola");
     lcd_gotoxy(pos,2);
     lcd_putc("Todopic");
     delay_ms(300);
     lcd_send_byte(0,desp_der);
     }
     pos=16;
}
}


Tiene que ser problema del codigo porque en C18 he hecho una prueba y funciona bien.

Un saludo

Aitor
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: rivale en 05 de Junio de 2011, 12:44:33
como estas probando tu programa para saber si esta corriendo a la velocidad correcta?
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: Suky en 05 de Junio de 2011, 13:00:34

en tus fuses te falta ponerle que PLL y que postescalkador usas, tal vez por eso no te funciona

#fuses HSPLL,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP,NOCPD,NOMCLR,PLL1,CPUDIV1,NOVREGEN//configuraciones del pic
#use DELAY(clock=8000000)//frecuencia del oscilador en Hz

yo uso esta configuracion para el 4550, y funciona bien, pruebalo y me dices

Pero al final va usar oscilador interno o cristal externo? Esa configuración no cierra por ningún lado  :z)



Entre las opciones de fuses para oscilador interno se tiene INTHS, INTXT, INTRC_IO,INTRC. Ello corresponde según a datasheet a:

Citar
9. INTHS Internal Oscillator used as
microcontroller clock source, HS
Oscillator used as USB clock source
10. INTXT Internal Oscillator used as
microcontroller clock source, XT
Oscillator used as USB clock source
11. INTIO Internal Oscillator used as
microcontroller clock source, EC
Oscillator used as USB clock source,
digital I/O on RA6
12. INTCKO Internal Oscillator used as
microcontroller clock source, EC
Oscillator used as USB clock source,
FOSC/4 output on RA6

Después hay que trabajar sobre el registro OSCCON para seleccionar correctamente la frecuencia, que en CCS en teoría se haría con setup_oscillator()  :?  Creería que colocando setup_oscillator(OSC_8MHZ|OSC_INTRC) debería de funcionar. Se podria revisar si CCS lo configura adecuadamente.


Saludos!

Título: Re: Configuracion del oscilador interno en CCS
Publicado por: aitorsp en 05 de Junio de 2011, 13:05:17

en tus fuses te falta ponerle que PLL y que postescalkador usas, tal vez por eso no te funciona

#fuses HSPLL,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP,NOCPD,NOMCLR,PLL1,CPUDIV1,NOVREGEN//configuraciones del pic
#use DELAY(clock=8000000)//frecuencia del oscilador en Hz

yo uso esta configuracion para el 4550, y funciona bien, pruebalo y me dices

Pero al final va usar oscilador interno o cristal externo? Esa configuración no cierra por ningún lado  :z)



Entre las opciones de fuses para oscilador interno se tiene INTHS, INTXT, INTRC_IO,INTRC. Ello corresponde según a datasheet a:

Citar
9. INTHS Internal Oscillator used as
microcontroller clock source, HS
Oscillator used as USB clock source
10. INTXT Internal Oscillator used as
microcontroller clock source, XT
Oscillator used as USB clock source
11. INTIO Internal Oscillator used as
microcontroller clock source, EC
Oscillator used as USB clock source,
digital I/O on RA6
12. INTCKO Internal Oscillator used as
microcontroller clock source, EC
Oscillator used as USB clock source,
FOSC/4 output on RA6

Después hay que trabajar sobre el registro OSCCON para seleccionar correctamente la frecuencia, que en CCS en teoría se haría con setup_oscillator()  :?  Creería que colocando setup_oscillator(OSC_8MHZ|OSC_INTRC) debería de funcionar. Se podria revisar si CCS lo configura adecuadamente.


Saludos!



Hola Suky:

Lo que quiero es usar el oscilador interno a 8 Mhz en el PIC18f4550 pero de momento solo lo consigo en C18 pero no en CCS.

Un saludo

Aitor
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: rivale en 05 de Junio de 2011, 13:07:28
tienes razon Suky, la configuracion que puse es para un reloj externo,  :oops: espero no haberte causado conflicto aitor, los 18 casi no los ocupo con el cristal interno, para poder llegar a su maxima velocidad de 48MHz. :mrgreen:

deberia funcionar con solo porner intrc_io y el delay con oxc de 8MHz.

segun el manual del ccs no se necesitaria el setup_osc. pero habria que ver si esto es cierto :shock:

Título: Re: Configuracion del oscilador interno en CCS
Publicado por: bmb en 05 de Junio de 2011, 13:08:52
Hola, como dice Suky, si vas a usar el oscilador interno con #fuses HSPLL no te va a funcionar, porque ese fuse es para cristal o resonador externo con el PLL habilitado.  Si usas el oscilador interno, te sugiero esta configuración:

Código: C
  1. #include <18F4550.h>
  2.  
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  5. #FUSES PLL1                     //No PLL PreScaler
  6. #FUSES CPUDIV1                  //No System Clock Postscaler
  7. #FUSES NOUSBDIV                 //USB clock source comes from primary oscillator
  8. #FUSES INTEC_IO                 //Internal Clock, EC used by USB, I/O on RA6
  9. #FUSES NOFCMEN                  //Fail-safe clock monitor disabled
  10. #FUSES NOIESO                   //Internal External Switch Over mode disabled
  11. #FUSES NOBROWNOUT               //No brownout reset
  12. #FUSES NOVREGEN                 //USB voltage regulator disabled
  13. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  14. #FUSES NOLPT1OSC                //Timer1 configured for higher power operation
  15. #FUSES NOMCLR                   //Master Clear pin used for I/O
  16. #FUSES NOSTVREN                 //Stack full/underflow will not cause reset
  17. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  18. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  19.  
  20. #use delay(clock=8000000)
  21.  
  22.  
  23. void main()
  24. {
  25.  
  26.    setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_PLL_OFF);
  27.  
  28.  
  29. }

Saludos!

Título: Re: Configuracion del oscilador interno en CCS
Publicado por: aitorsp en 05 de Junio de 2011, 18:20:55
Hola:

Muchas gracias a todos. ya funciona   :-/   :-/   :-/

Un saludo

Aitor
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: bmb en 05 de Junio de 2011, 18:50:17
Hola aitorsp, me alegra mucho que puedas seguir adelante con tu programa!

Saludos!
Título: ayuda con interrupciones
Publicado por: shadow721 en 27 de Junio de 2013, 03:42:40
hola compile este codigo en ccs:

#include <16f876a.h>
#include <math.h>
//, NOPROTECT, PUT, NOWRT
#use delay(clock=4000000)
#fuses XT, NOWDT
#BYTE TRISA = 0x85
#BYTE PORTA = 0x05
//#use standard_io(B)
//long int cont = 0;
#int_TIMER1
void TIMER1_ISR(void)
{
   bit_set(PORTA,3);
   //output_toggle(PIN_A3);
   set_timer1(7036);
   

}

void main()
{
   bit_clear(TRISA,3);
   bit_clear(PORTA,3);
//   bit_set(PORTA,3);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_2);
   set_timer1(28035);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(global);
   while(1);

}


pues resulta que lo simulo en proteus y funciona de maravilla pero cuando lo hago fisicamente no funciona, si solo prendo un led en la funcion main() si prende, pero si lo hago dentro de la interrupcion no prende

pueden ayudarme a solucionar este probelama y si uso osc de cristal no se declara en el codigo
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: isfan en 27 de Junio de 2013, 04:53:36
cuando grabaste el pic le diste a las opciones del fuses?

o si no inserta las opciones manualmente en su codigo

#fuses NOWDT         //Deshabilita Watchdog
//#fuses INTXT            //Cristal Externo
//#fuses RC                //Oscilador RC (Resistencia Capacitor Externos)
//#fuses HS                //Modo Full Power de alta Velocidad, hasta 10MHZ, más depende el micro
//#fuses LP                //Modo Bajo Consumo hasta 200KHZ
#fuses INTRC         //Cristal Interno RC
#use delay(clock=4000000)

Si usas un cristal de cuarzo, tienes la opción de no declararlo en el codigo, pero a la hora de grabarlo tiene que decirlo en el programa.
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: vicsestrada en 12 de Septiembre de 2013, 00:08:55
hola,
Como le hiciste amigo a mi tampoco me queda :(
Título: Re: Configuracion del oscilador interno en CCS
Publicado por: mdvymdv en 14 de Diciembre de 2014, 21:59:54
Estuve renegando con el oscilador interno de un PIC 18F2550, pero logre solucionarlo.
este es el código para un oscilador a 8MHz

Código: [Seleccionar]
// VERSION SOFT: " PCWHD CCS C Compiler 5.010 "

#include <18F2550.h>
#FUSES NOWDT                 //No Watch Dog Timer
#FUSES INTRC_IO              //OSCILADOR INTERNO SIN SALIDA DE CLOCK OUT
#FUSES NOPUT                 //No Power Up Timer
#FUSES NOMCLR                //Master Clear pin Un-enabled
#FUSES PROTECT               //Code not protected from reading
#FUSES CPD                   //No EE protection
#FUSES NOBROWNOUT            //Reset when brownout detected
#FUSES NOLVP                 //No Low Voltage Programming
#FUSES NODEBUG               //No Debug mode for ICD

#use delay (clock=8000000)

//#define OSC_8MHZ    0x70    // no es necesario definirlo, esta incluido en la cabecera del pic.

#include <D:\MARIO\- ELECTRONICA -\- PROYECTOS EN CCS TERMINADOS -\PROYECTOS CON TONES\Melodias TONES completo\XTONES.c>  // buzzer=RB3
#include <D:\MARIO\- ELECTRONICA -\- PROYECTOS EN CCS TERMINADOS -\PROYECTOS CON TONES\Melodias TONES completo\XLCD.c>    //RC0=E,RC1=RS,RC3=RW; data=RB4,RB5,RB6,RB7.

//------------------- INTRO SE HA TOMADO TODO EL VINO  -----------------------
void MONA()
      {
      generate_tone(A_NOTE[1], 185.2); 
      generate_tone(C_NOTE[2], 185.2); 
      generate_tone(E_NOTE[2], 375); 
      generate_tone(A_NOTE[1], 185.2); 
      generate_tone(C_NOTE[2], 185.2); 
      generate_tone(E_NOTE[2], 375);   
      generate_tone(A_NOTE[1], 185.2); 
      generate_tone(C_NOTE[2], 185.2); 
      generate_tone(E_NOTE[2], 185.2); 
      generate_tone(D_NOTE[2], 185.2); 
      generate_tone(C_NOTE[2], 185.2); 
      generate_tone(B_NOTE[1], 185.2); 
      generate_tone(A_NOTE[1], 185.2); 
      generate_tone(G_NOTE[1], 185.2);
      generate_tone(G_NOTE[1], 185.2);
      generate_tone(B_NOTE[1], 185.2); 
      generate_tone(D_NOTE[2], 375);   
      generate_tone(G_NOTE[1], 185.2); 
      generate_tone(B_NOTE[1], 185.2); 
      generate_tone(D_NOTE[2], 375);
      }   
void F1()      // FIN 1 MONA
      {
      generate_tone(G_NOTE[1], 185.2); 
      generate_tone(B_NOTE[1], 185.2); 
      generate_tone(D_NOTE[2], 185.2); 
      generate_tone(C_NOTE[2], 185.2); 
      generate_tone(D_NOTE[2], 375);   
      generate_tone(E_NOTE[2], 1000);   
      delay_ms(185);
      }                   
void F2()    //  FIN 2 MONA
      {       
      generate_tone(G_NOTE[1], 185.2); 
      generate_tone(B_NOTE[1], 185.2); 
      generate_tone(D_NOTE[2], 185.2); 
      generate_tone(C_NOTE[2], 185.2); 
      generate_tone(B_NOTE[1], 375);   
      generate_tone(A_NOTE[1], 990);   
      }
///////////////////////  FIN INTRO LA MONA  /////////////////////////////

void main()
{
   setup_oscillator (OSC_8MHZ|OSC_INTRC);  // Lo "PRIMERO QUE HAGO" en el Main es configurar el oscilador, salvo la declaración de variables si hubiese.
   lcd_init();
     
   printf (lcd_putc, "\f  SE HA TOMADO  ");
   printf (lcd_putc, "\n  TODO EL VINO  ");
     
   while(true)
         {
          MONA();
          F1();
          MONA();
          F2();
          }
}
Título: Re:Configuracion del oscilador interno en CCS
Publicado por: Mago_Opamp en 15 de Abril de 2016, 20:44:40
Sabiendo que INTXT permite que usemos el crystal externo para el modulo usb y oscilador interno  para el resto de los perifericos del pic, como seria la configuracion de los fuses o del setup_oscilador().. me pueden ayudar??
Título: Re:Configuracion del oscilador interno en CCS
Publicado por: KILLERJC en 15 de Abril de 2016, 21:44:56
Sabiendo que INTXT permite que usemos el crystal externo para el modulo usb y oscilador interno  para el resto de los perifericos del pic, como seria la configuracion de los fuses o del setup_oscilador().. me pueden ayudar??

Primera busqueda por internet:


Citar
The syntax to use the external oscillator for USB, and the internal for the CPU, is just:

INTRC,PLL1,USBDIV

The external oscillator block, is _not_ turned off by selecting the internal oscillator for the CPU. Look at the oscillator diagram for the chip, and the names against the oscillator paths in this.

Best Wishes