Чт фев 26, 2015 09:44:28
i2c_start();
i2c_write(0xC6); //адрес микросхемы si4735
i2c_write(0x01);
i2c_write(0x10);
i2c_write(0x05);
i2c_stop();
delay_ms(200);
unsigned int freq;
unsigned char R1, R2, R3, R4, R5, R6, R7, status;
i2c_start();
i2c_write(0xC6);
i2c_write(0x22);
i2c_write(0x03);
i2c_stop();
i2c_start();
i2c_write(0x23);
status=i2c_read(1);
R1=i2c_read(1);
R2=i2c_read(1);
R3=i2c_read(1);
R4=i2c_read(1);
R5=i2c_read(1);
R6=i2c_read(1);
R7=i2c_read(0);
i2c_stop();
freq=R2*256;
freq=freq+R3;
Пт фев 27, 2015 08:39:20
unsigned int freq;
unsigned char R1, R2, R3, R4, R5, R6, R7, status;
i2c_start();
i2c_write(0xC6);
i2c_write(0x22);
i2c_write(0x01);
i2c_stop();
i2c_start();
i2c_write(0xC7); //адрес откуда читать при SEN=1
status=i2c_read(1);
R1=i2c_read(1);
R2=i2c_read(1);
R3=i2c_read(1);
R4=i2c_read(1);
R5=i2c_read(1);
R6=i2c_read(1);
R7=i2c_read(0);
i2c_stop();
freq=R2*256;
freq=freq+R3;
return freq;
Чт мар 05, 2015 08:24:40
Чт мар 05, 2015 08:48:16
#include <mega8.h>
#include <stdio.h>
#include <delay.h>
// I2C Bus functions
#include <i2c.h>
//запрет автоматического распределения регистров
#pragma regalloc-
#define t 50 //продолжительность импульса при передачи данных на жк индикатор
#define radio_adr 0xC6
// Declare your global variables here
unsigned char key;
unsigned char dot[11]; // положения точeк
unsigned char on_dot;
int i, n, p, l, seg;
unsigned char temp_lcd;
unsigned char filter=0x02;
unsigned char band; //диапазон
/*
1 - FM1: 64 - 75 MHz
2 - FM2: 87 - 108 MHz
3 - LW: 153 - 279 kHz
4 - AM: 522 - 1710 kHz
SW:
5 - 90: 3200 - 3400 kHz
6 - 75: 3900 - 4000 kHz
7 - 60: 4750 - 5060 kHz
8 - 49: 5900 - 6200
9 - 41: 7100 - 7400
10- 31: 9500 - 9900
11- 25: 11650 - 12050
12- 22: 13600 - 13800
13- 19: 15100 - 15600
14- 16: 17550 - 17900
15- 13: 21450 - 21850
16- 11: 25650 - 26100
*/
unsigned char band_name[16][2]={
{0, 0},
{12, 1}, //F1
{12, 2}, //F2
{13, 11}, //L
{14, 11}, //A
{9, 0}, //90
{6, 0}, //60
{4, 9}, //49
{4, 1}, //41
{3, 1}, //31
{2, 5}, //25
{2, 2}, //22
{1, 9}, //19
{1, 6}, //16
{1, 3}, //13
{1, 1} //11
};
unsigned int band_freq[16][2]={
{0,0}, // частота начала диапазона, частота конца диапазона
{6400, 7500}, //F1
{8700, 10800}, //F2
{153, 279}, //L
{522, 1710}, //A
{2400, 3400}, //90
{4750, 5060}, //60
{5900, 6200}, //49
{7100, 7400}, //41
{9500, 9900}, //31
{11650, 12050}, //25
{13600, 13800}, //22
{15100, 15600}, //19
{17550, 17900}, //16
{21450, 21850}, //13
{25650, 26100} //11
};
unsigned int tuning_freq[16][2]={ //частоты на которые настраивается в момент включения диапазона
{0,0}, //+шаг перестройки
{7050,5},
{10250,5},
{153,9},
{522,9},
{2400,5},
{4750,5},
{5900,5},
{7100,5},
{9500,5},
{11650,5},
{13600,5},
{15100,5},
{17550,5},
{21450,5},
{25650,5}
};
unsigned char lcd[15]={
// bpcdgeaf
0b10110111, //0
0b10100000, //1
0b10011110, //2
0b10111010, //3
0b10101001, //4
0b00111011, //5
0b00111111, //6
0b10100011, //7
0b10111111, //8
0b10111011, //9
0b01000000, //10 - .
0b00000000, //11 - пробел
0b00001111, //12 - F
0b00010101, //13 - L
0b10101111 //14 - A
};
unsigned char lcd_buffer[13]={ //массив для вывода на индикатор
1, //будет видно только 10 цифр
2,
3,
4,
5,
6,
7,
8,
9,
0,
11,
12,
0
};
char read_key()
{
char k;
if (key != 100){
if (PINB.0==0){
delay_ms(10);
if (PINB.0==0){
k=1;
}
}
if (PINB.1==0){
delay_ms(10);
if (PINB.1==0){
k=2;
}
}
if (PINB.2==0){
delay_ms(50);
if (PINB.2==0){
k=3;
}
}
}
if ((PINB.0==1)&&(PINB.1==1)&&(PINB.2==1)){
k=0;
}
return k;
}
void lcd_clr(){
for (l=0; l<14; l++){
lcd_buffer[l]=11; //заполняем весь буферный массив нулями
}
}
void lcd_print(unsigned char pos, unsigned int data, unsigned char d){
unsigned char s;
if (pos>9) pos=9;
for (s=pos; s<pos+5; s++) dot[s]=0; //убираем точки с видимой части экрана
if (data>9999){
lcd_buffer[pos] = data/10000;
lcd_buffer[pos+1]=(data/1000)%10;
lcd_buffer[pos+2]=(data/100)%10;
lcd_buffer[pos+3]=(data/10)%10;
lcd_buffer[pos+4]=data%10;
dot[pos+5-d]=1; //точка на d символов справа
}
if ((data>999)&&(data<10000)){
lcd_buffer[pos]= data/1000;
lcd_buffer[pos+1]=(data/100)%10;
lcd_buffer[pos+2]=(data/10)%10;
lcd_buffer[pos+3]=data%10;
lcd_buffer[pos+4]=11;
dot[pos+4-d]=1;
}
if ((data>99)&&(data<1000)){
lcd_buffer[pos]= data/100;
lcd_buffer[pos+1]=(data/10)%10;
lcd_buffer[pos+2]=data%10;
lcd_buffer[pos+3]=11;
lcd_buffer[pos+4]=11;
dot[pos+3-d]=1;
}
if ((data>9)&&(data<100)){
lcd_buffer[pos]=data/10;
lcd_buffer[pos+1]=data%10;
lcd_buffer[pos+2]=11;
lcd_buffer[pos+3]=11;
lcd_buffer[pos+4]=11;
dot[pos+2-d]=1;
}
if (data<10){
lcd_buffer[pos]=data%10;
}
}
void lcd_write(){
//передача на ЖК индикатор NJU6432
//PORTC.0 - DN
PORTC.1=0; //CL
PORTC.2=1; //CE
delay_us(10);
seg=1;
for (i=1; i<14; i++){
temp_lcd=lcd[lcd_buffer[i-1]]; //заносим код числа во временную переменную
if (dot[i]==1)temp_lcd=temp_lcd|0b01000000; //если в массиве точек указан текущий разряд - ставим точку
for (n=0; n<8; n++){
PORTC.0=temp_lcd&0b00000001; // выводим в порт крайний бит текущего числа
delay_us(10);
PORTC.1=1; //вколючаем синхроимпульс
delay_us(t);
PORTC.1=0; //выключаем синхроимпульс
delay_us(10);
PORTC.0=0;
delay_us(t);
temp_lcd=temp_lcd>>1; //сдвиг вправо на 1 разряд
seg++;
if (seg==53){ //первая служебная тетрада
for (p=0; p<4; p++){
PORTC.0=0;
delay_us(10);
PORTC.1=1; //вколючаем синхроимпульс
delay_us(t);
PORTC.1=0; //выключаем синхроимпульс
delay_us(10);
PORTC.0=0;
delay_us(t);
seg++;
}
}
}
delay_us(50);
}
for (p=0; p<4; p++){ //вторая служебная тетрада
PORTC.0=1;
delay_us(10);
PORTC.1=1; //вколючаем синхроимпульс
delay_us(t);
PORTC.1=0; //выключаем синхроимпульс
delay_us(10);
PORTC.0=0;
delay_us(t);
}
PORTC.2=0;
}
void radio_poverup(unsigned int b){
if (b<3) { //включаем в ФМ диапазоне
i2c_start();
i2c_write(radio_adr); //адрес микросхемы si4735
i2c_write(0x01);
i2c_write(0x10);
i2c_write(0x05);
i2c_stop();
for (i=0; i<11; i++){
dot[i]=0; //все десятичные точки не видны на экране
}
delay_ms(310);
on_dot=2;
}
else{ //включаем в АМ диапазоне
i2c_start();
i2c_write(radio_adr); //адрес микросхемы si4735
i2c_write(0x01); //power_up
i2c_write(0x11);
i2c_write(0x05);
i2c_stop();
for (i=0; i<11; i++){
dot[i]=0; //все десятичные точки не видны на экране
}
delay_ms(310);
on_dot=0;
}
}
void radio_volume(){
//громкость
i2c_start();
i2c_write(radio_adr);
i2c_write(0x12);
i2c_write(0x00);
i2c_write(0x40);
i2c_write(0x00);
i2c_write(0x00);
i2c_write(0x3F);
i2c_stop();
delay_ms(20);
}
void radio_set_band(unsigned char b){
unsigned int min_freq;
unsigned int max_freq;
min_freq=band_freq[b][0];
max_freq=band_freq[b][1];
lcd_buffer[8]=band_name[b][0];
lcd_buffer[9]=band_name[b][1]; //заносим наименование диапазона в буфер индикатора
if (b<3) { //для ФМ диапазона
//указываем нижнюю границу диапазона
i2c_start();
i2c_write(radio_adr);
i2c_write(0x12);
i2c_write(0x00);
i2c_write(0x14);
i2c_write(0x00);
i2c_write((unsigned char)(min_freq>>8));
i2c_write((unsigned char)min_freq);
i2c_stop();
delay_ms(10);
//указываем верхнюю границу диапазона
i2c_start();
i2c_write(radio_adr);
i2c_write(0x12);
i2c_write(0x00);
i2c_write(0x14);
i2c_write(0x01);
i2c_write((unsigned char)(max_freq>>8));
i2c_write((unsigned char)max_freq);
i2c_stop();
delay_ms(10);
}
else{ //для АМ диапазона
//нижняя граница диапазона
i2c_start();
i2c_write(radio_adr);
i2c_write(0x12);
i2c_write(0x00);
i2c_write(0x34);
i2c_write(0x00);
i2c_write((unsigned char)(min_freq>>8));
i2c_write((unsigned char)min_freq);
i2c_stop();
delay_ms(10);
//верхняя граница диапазона
i2c_start();
i2c_write(radio_adr);
i2c_write(0x12);
i2c_write(0x00);
i2c_write(0x34);
i2c_write(0x01);
i2c_write((unsigned char)(max_freq>>8));
i2c_write((unsigned char)max_freq);
i2c_stop();
delay_ms(10);
}
}
void radio_set_freq(unsigned char b){
unsigned int cur_freq;
cur_freq=tuning_freq[b][0];
if (b<3) { //установка частоты настройки для ФМ диапазона
i2c_start();
i2c_write(radio_adr);
i2c_write(0x20);
i2c_write(0x00);
i2c_write((unsigned char)(cur_freq>>8)); //частота настройки
i2c_write((unsigned char)cur_freq);
i2c_write(0x00);
i2c_stop();
delay_ms(20);
}
else{
i2c_start();
i2c_write(radio_adr);
i2c_write(0x40);
i2c_write(0x00);
i2c_write((unsigned char)(cur_freq>>8)); //частота настройки
i2c_write((unsigned char)cur_freq);
i2c_write(0x00);
i2c_write(0x00);
i2c_stop();
delay_ms(20);
}
}
void radio_am_filter(unsigned char b){
if (b>2){
i2c_start(); //полоса пропускания АМ
i2c_write(radio_adr);
i2c_write(0x12);
i2c_write(0x00);
i2c_write(0x31);
i2c_write(0x02);
i2c_write(0x00);
i2c_write(filter);
i2c_stop();
delay_ms(10);
i2c_start();
i2c_write(radio_adr); // AM_SOFT_MUTE_MAX_ATTENUATION
i2c_write(0x12);
i2c_write(0x00);
i2c_write(0x33);
i2c_write(0x02);
i2c_write(0x00);
i2c_write(0x00);
i2c_stop();
delay_ms(10);
i2c_start();
i2c_write(radio_adr); // AM_AUTOMATIC_VOLUME_CONTROL_MAX_GAIN
i2c_write(0x12);
i2c_write(0x00);
i2c_write(0x31);
i2c_write(0x03);
i2c_write(0x25);
i2c_write(0x00);
i2c_stop();
delay_ms(10);
}
}
void radio_frequency_up(unsigned char b){ //увеличиваем частоту настройки
if (tuning_freq[b][0]<band_freq[b][1]){
tuning_freq[b][0]=tuning_freq[b][0]+tuning_freq[b][1];
}
else{
tuning_freq[b][0]=band_freq[b][0]; //перескакиваем в начало диапазона
}
}
void radio_frequency_down(unsigned char b){ //уменьшаем частоту настройки
if (tuning_freq[b][0]>band_freq[b][0]){
tuning_freq[b][0]=tuning_freq[b][0]-tuning_freq[b][1];
}
else{
tuning_freq[b][0]=band_freq[b][1]; //перескакиваем в конец диапазона
}
}
unsigned int radio_cur_freq(unsigned char b){ //получение текущей астоты на которую настроена микросхема
unsigned int fr;
unsigned char R1, R2, R3, R4, R5, R6, R7, status;
if (b<3) { //для ФМ диапазона
i2c_start();
i2c_write(radio_adr);
i2c_write(0x22);
i2c_write(0x01);
i2c_stop();
i2c_start();
i2c_write(0xC7); //адрес откуда читать при SEN=1
status=i2c_read(1);
R1=i2c_read(1);
R2=i2c_read(1);
R3=i2c_read(1);
R4=i2c_read(1);
R5=i2c_read(1);
R6=i2c_read(1);
R7=i2c_read(0);
i2c_stop();
fr=R2;
fr=fr<<8; //типа умножение на 255
fr=fr+R3;
}
else{
i2c_start();
i2c_write(radio_adr);
i2c_write(0x42);
i2c_write(0x01);
i2c_stop();
i2c_start();
i2c_write(0xC7); //адрес откуда читать при SEN=1
status=i2c_read(1);
R1=i2c_read(1);
R2=i2c_read(1);
R3=i2c_read(1);
R4=i2c_read(1);
R5=i2c_read(1);
R6=i2c_read(1);
R7=i2c_read(0);
i2c_stop();
fr=R2;
fr=fr<<8; //типа умножение на 255
fr=fr+R3;
}
return fr;
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=P State1=P State0=P
PORTB=0x07;
DDRB=0x00;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x07;;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// USART disabled
UCSRB=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// I2C Bus initialization
// I2C Port: PORTC
// I2C SDA bit: 4
// I2C SCL bit: 5
// Bit Rate: 100 kHz
// Note: I2C settings are specified in the
// Project|Configure|C Compiler|Libraries|I2C menu.
band=1; // диапазон при включении
i2c_init();
for (i=0; i<11; i++){
dot[i]=0; //все десятичные точки не видны на экране
}
lcd_clr();
radio_poverup(band); //включаем в нужном диапазоне
radio_volume();
radio_set_band(band); //указываем застоты выбранного диапазона
radio_set_freq(band); //указываем на какую частоту настроить
delay_ms(150);
lcd_print(0, radio_cur_freq(band), 2);
lcd_write();
while (1)
{
// Place your code here
key=read_key();
switch (key) {
case 1:
key=100;
radio_frequency_up(band);
radio_set_freq(band); //указываем на какую частоту настроить
delay_ms(100);
lcd_print(0, radio_cur_freq(band), on_dot);
lcd_write();
break;
case 2:
key=100;
radio_frequency_down(band);
radio_set_freq(band); //указываем на какую частоту настроить
delay_ms(100);
lcd_print(0, radio_cur_freq(band), on_dot);
lcd_write();
break;
case 3:
key=100;
if (band<15){
band++;
}
else band=1;
if ((band==3)||(band==1)){
//выключаем микросхему приемника
//если переход с ФМ диапазона на АМ и обратно
i2c_start();
i2c_write(radio_adr); //адрес микросхемы si4735
i2c_write(0x11); //выключаем
i2c_stop();
delay_ms(5);
radio_poverup(band); //включаем в нужном диапазоне
radio_volume();
}
radio_am_filter(band); //фильтр а АМ диапазоне
radio_set_band(band); //указываем застоты выбранного диапазона
radio_set_freq(band); //указываем на какую частоту настроить
delay_ms(150);
lcd_print(0, radio_cur_freq(band), on_dot);
lcd_write();
break;
default:
};
}
}
Пн мар 09, 2015 15:33:04
Чт мар 12, 2015 20:00:42
Чт мар 12, 2015 20:21:10
Вт апр 14, 2015 21:25:13
Чт апр 16, 2015 22:56:37
Пт июл 17, 2015 12:36:52
dadigor писал(а):Посмотрел/послушал Ваш ролик, заметил - у Вас та же байда при перестройке частоты на УКВ (думаю что и на АМ тоже). Видимо что-то надо настроить в камне, чтобы этого не было, ведь в промышленных приемниках, сделанных на этой микросхеме, такого нет. Ковыряюсь с настройками AVC и SOFT_MUTE, пока безрезультатно.
Ср окт 07, 2015 00:05:54
Вс авг 28, 2016 19:54:37
Пт сен 09, 2016 21:08:13
Ср сен 28, 2016 22:13:55
Ср окт 05, 2016 13:19:35
Сб окт 22, 2016 18:39:12
si47xx_reset();
cmd[0] = POWER_UP;
// The device is being powered up in FM RX mode.
cmd[1] = POWER_UP_IN_CTSIEN|POWER_UP_IN_FUNC_FMRX|0x10 ;
// The opmode needs to be set to analog mode
cmd[2] = POWER_UP_IN_OPMODE_RX_ANALOG;
// Powerup the device
while(!si47xx_waitForCTS());
i2c_Restart();
i2c_SendByte(0xc6);
if(i2c_ReadAcknowledge()) return;
i2c_PutString(cmd,3);
i2c_Stop();
while(!si47xx_waitForCTS());
// If the calling function would like to have results then read them.
DelayMs(POWERUP_TIME); // wait for si47xx to powerup
DelayMs(200);
DelayMs(200);
si47xx_getPartInformation();
si47xx_set_property(GPO_IEN, GPO_IEN_STCIEN_MASK);
si47xx_waitForCTS();
si47xx_set_property(DIGITAL_OUTPUT_FORMAT, 0x0);
si47xx_waitForCTS();
si47xx_set_property(RX_HARD_MUTE, 0);
si47xx_waitForCTS();
si47xx_set_property(FM_SEEK_TUNE_SNR_THRESHOLD, 3);
si47xx_waitForCTS();
si47xx_set_property(FM_SEEK_TUNE_RSSI_THRESHOLD, 20);
while(!si47xx_waitForCTS());
si47xx_set_property(FM_RDS_CONFIG, 0);
si47xx_waitForCTS();
si47xx_set_property(FM_DEEMPHASIS, FM_DEEMPH_50US); // Deemphasis
// Band is already set to 87.5-107.9MHz (Europe)
si47xx_waitForCTS();
si47xx_set_property(FM_SEEK_FREQ_SPACING, 10); // 100 kHz Spacing
si47xx_set_property(REFCLK_FREQ, REFCLK_FREQ);
si47xx_waitForCTS();
si47xx_set_property(REFCLK_PRESCALE, 1);
while(!si47xx_waitForCTS());
frequency =10200;
fmTuneFreq(frequency);
DelayMs(100);
xerr=0;
while(!(xerr&STCINT))
{ si47xx_command(1, GET_INT_STATUS,0, 0);
si47xx_waitForCTS();
xerr=si47xx_readStatus();
}
Вс окт 23, 2016 00:03:24
Вс окт 23, 2016 15:57:41
Пн окт 24, 2016 21:43:05
Пт апр 06, 2018 06:47:24