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!
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().
#fuses INTRC_IO
#use delay(internal=8M)
setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF);
Es asi?
un saludo
Aitor
#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;
}
} que es lo que no te funciona, si lo compila bien?, cual es el error?
#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
en tus fuses te falta ponerle que PLL y que postescalkador usas, tal vez por eso no te funcionaCó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
#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;
}
}
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
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
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:Citar9. 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!
// 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();
}
}
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??
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