Always error,
i am newbie,just showing someone doing this project,
need to build,but can't compiling.
full codes below
#include <Rotary.h>
#include <si5351.h>
#include "Wire.h"
#include <LiquidCrystal.h>
#define OLED_RESET 4
#define ENCODER_A 3 // Encoder pin A
#define ENCODER_B 2 // Encoder pin B
#define ENCODER_BTN 11
#define LCD_RS 5
#define LCD_E 6
#define LCD_D4 7
#define LCD_D5 8
#define LCD_D6 9
#define LCD_D7 10
LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7); // LCD - pin assignement in
Si5351 si5351;
Rotary r = Rotary(ENCODER_A, ENCODER_B);
volatile uint32_t frequency0 = 144e8L / SI5351_FREQ_MULT; //10Mhz - change to suit your needs
//just take care to count the right number of zeros.
// volatile uint32_t frequency1 = 9000000L;
// volatile uint32_t frequency2 = 10000000L;
volatile uint32_t radix = 1e6;
boolean changed_f = 0;
//
/* Interrupt service routine for /
/ encoder frequency change */
//
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result == DIR_CW)
set_frequency(1);
else if (result == DIR_CCW)
set_frequency(-1);
}
//
/* Change the frequency /
/ dir = 1 Increment /
/ dir = -1 Decrement */
//
void set_frequency(short dir)
{
if(dir == 1)
frequency0 += radix;
if(dir == -1)
frequency0 -= radix;
changed_f = 1;
}
//
/* Read the button with debouncing */
//
boolean get_button()
{
if(!digitalRead(ENCODER_BTN))
{
delay(20);
if(!digitalRead(ENCODER_BTN))
{
while(!digitalRead(ENCODER_BTN));
return 1;
}
}
return 0;
}
//
/* Displays the frequency */
//
void display_frequency()
{
uint16_t f, g;
lcd.setCursor(3, 0);
f = frequency0 / 1000000;
if(f<10)
lcd.print(' ');
lcd.print(f);
lcd.print('.');
f = (frequency0 % 1000000)/1000;
if(f<100)
lcd.print('0');
if(f<10)
lcd.print('0');
lcd.print(f);
lcd.print('.');
f = frequency0 % 1000;
if(f<100)
lcd.print('0');
if(f<10)
lcd.print('0');
lcd.print(f);
lcd.print("Hz");
}
//
/* Displays the frequency change step */
//
void display_radix()
{
lcd.setCursor(9, 1);
switch(radix)
{
case 10:
lcd.print(" 10");
break;
case 100:
lcd.print(" 100");
break;
case 1000:
lcd.print(" 1K");
break;
case 10000:
lcd.print(" 10K");
break;
case 100000:
lcd.print(" 100K");
break;
case 1000000:
lcd.setCursor(9, 1);
lcd.print("1000K"); //1MHz increments
break;
}
lcd.print("Hz");
}
void setup()
{
lcd.begin(16, 2); // Initialize and clear the LCD
lcd.clear();
Wire.begin();
// Start serial and initialize the Si5351 with load capacitance and crystal freq
//0 will provide default freq of 25Mhz. If you have a 27MHz crystal put in 27000000
si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0); //you could measure your crystal and put it here to correct for errors.
// Set CLK0 to output 10 MHz with a fixed PLL frequency
si5351.set_pll(SI5351_PLL_FIXED, SI5351_PLLA);
//set frequency with 1 Hz resolution
si5351.set_freq(frequency0* SI5351_FREQ_MULT, SI5351_PLL_FIXED, SI5351_CLK0);
//si5351.drive_strength(SI5351_CLK0,SI5351_DRIVE_6MA);
pinMode(ENCODER_BTN, INPUT_PULLUP);
PCICR |= (1 << PCIE2); // Enable pin change interrupt for the encoder
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
changed_f = 1; //added to initialize si5351
display_frequency(); // Update the display
display_radix();
}
void loop()
{
// Update the display if the frequency has been changed
if(changed_f)
{
display_frequency();
si5351.set_freq(frequency0 * SI5351_FREQ_MULT, 0, SI5351_CLK0);
changed_f = 0;
}
// Button press changes the frequency change step
if(get_button())
{
switch(radix)
{
case 10:
radix = 100;
break;
case 100:
radix = 1000;
break;
case 1000:
radix = 10000;
break;
case 10000:
radix = 100000;
break;
case 100000: //change these lines to tune in 1MHz increments
radix = 1000000;
break;
case 1000000:
radix = 10;
break;
}
display_radix();
}
}
when compiling, the problems always show at unsigned char for this line
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result == DIR_CW)
set_frequency(1);
else if (result == DIR_CCW)
set_frequency(-1);
}
thank you for help