Чт май 09, 2019 08:08:22
Чт май 09, 2019 14:07:27
Пн ноя 11, 2019 17:35:21
Пн ноя 11, 2019 23:18:05
Вт ноя 19, 2019 13:34:26
Чт ноя 21, 2019 17:34:20
Пт ноя 22, 2019 02:10:39
Пт ноя 22, 2019 09:26:11
Пт ноя 22, 2019 11:19:24
Вт янв 07, 2020 02:10:33
#include <tiny13a.h>
#include <delay.h>
// I2C Bus functions
#asm
.equ __i2c_port=0x18 ;PORTB
.equ __sda_bit=3
.equ __scl_bit=4
#endasm
#include <i2c.h>
unsigned char high_byte,low_byte,key,;
unsigned int data_radio1,data_radio2;
eeprom char canel;
eeprom char volume;
unsigned char test;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
ADCSRA.6=1;
}
#define ADC_VREF_TYPE 0b01000001 // для ацп задействуем адс1
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
adc_data=ADCW;
test=adc_data>>6;
}
void SET_LAMP(void){
PORTB.0=1;
delay_ms(100);
PORTB.0=0;
delay_ms(100);
}
void SET (char chislo){
char s;
for( s = chislo;s>0;s--){
SET_LAMP();
}
}
void RDA5807M_init (void) {
//отправка данных в модуль
i2c_start();
i2c_write(0x20); // адресный байт
i2c_write(0b11110000); // байт 02H
i2c_write(0b10001101); // байт 02L
i2c_write(0x00); // байт 03H
i2c_write(0x00); // байт O3L
i2c_write(0b00000010); // байт 04H
i2c_write(0b00000000); // 04L
i2c_write(0b00001000); // 05H
i2c_write( 0x80 | volume); // 05L(громкость) 0b10000101
i2c_write(0b00000000); // 06H
i2c_stop();
}
void I2C_write_vol (void) {
//отправка данных в модуль
i2c_start();
i2c_write(0x22); // адресный байт
i2c_write(0x05);
i2c_write(0b00001000); // 05H
i2c_write( 0x80 | volume); // 05L(громкость) 0b10000101
i2c_stop();
}
void SetFreq (int freq) {
data_radio1 = (freq - 870);
data_radio2 = data_radio1<<6; // сдвиг влево на 6 битов переменной data_radio1 с присвоением в переменную data_radio2
low_byte=data_radio2; //присвоение младшего байта переменной low_byte
data_radio2=data_radio2>>8;//сдвиг вправо на 8 битов переменной data_radio1 с присвоением в переменную data_radio2
high_byte=data_radio2; //присвоение старшего байта переменной high_byte
low_byte=low_byte+0b00010000;// возведение 4-го бита переменной low_byte в"1"
//отправка данных в модуль
i2c_start();
i2c_write(0x22); // адресный байт
i2c_write(0x03);
i2c_write(high_byte); // байт 03H
i2c_write(low_byte); // байт O3L
i2c_stop();
}
void key_buttons(void)
{
if (test>14){ //когда не нажата кнопку
key=0; //признак нажатия 0
}
if (test==0){ //если нажата первая кнопка
delay_ms(100);
if (test==0){ //проверяем еще раз что ее нажали
key=1; //и присваиваем признаку нажатия кнопки 1
}
}
if (test==7){ //то же для второй кнопки
key=2;
}
if (test==5){ //и для третьей
key=3;
}
}
void SetChannel(){
switch (canel) {
case 1:{ SetFreq (1008);SET(1); break;}
case 2:{ SetFreq (1034);SET(2); break;}
case 3:{ SetFreq (1063);SET(3); break;}
case 4:{ SetFreq (1012);SET(4); break;}
case 5:{ SetFreq (1045);SET(5); break;}
};
}
void main(void)
{
char ii = 1;
if(volume>15){
volume=15;
}
volume=15;
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTB = 4;
DDRB=0x03;
TCCR0A=0x00;
TCCR0B=0x05;
TIMSK0=0x02;
ACSR=0x80;
DIDR0&=0x03;
DIDR0|=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8E;
i2c_init();
delay_ms(500);
RDA5807M_init();
delay_ms(500);
SetFreq(1025);
delay_ms(500);
#asm("sei")
while (1)
{
key_buttons();
if(key==1) {
canel++;
ii=1;
//key = 0;
delay_ms(300);
if(canel>5)//{
canel=1;
}
if ((volume > 0) & (key==2)){
volume--;
delay_ms(100);
I2C_write_vol ();
}
if ((volume < 15) & (key==3)){
volume++;
delay_ms(100);
I2C_write_vol ();
}
if(ii==1){
ii=0;
SetChannel();
}
}
}
Вт янв 07, 2020 10:39:52
Вт янв 07, 2020 14:17:04
Пт фев 07, 2020 09:15:51
low_byte=low_byte+0b00010000;// возведение 4-го бита переменной low_byte в"1"
low_byte |=(1<<4);//
//---Здесь преобразуем расчетную частоту в данные для отправки в RDA5807---------//
void preob_FREQ(void){ //
FREQ.HIG_FREQ = Frequency; // записываем расчетную частоту в старший байт данных частоты
FREQ.LOW_FREQ = 0; // обнуляем младший байт данных частоты
FREQ.FREQ = FREQ.FREQ >> 2; // сдвигаем данные частоты на два бита в право
FREQ.LOW_FREQ |= TUNE_En; // устанавливаем бита TUNE_En для разрешения работы приемника
REG_3H = FREQ.HIG_FREQ; // предаем данные частоты в регистры отправки
REG_3L = FREQ.LOW_FREQ; //
} //
//---Здесь производим ручную перестройку частоты--------------------------------//
void REGULYTOR_FREQ(unsigned char t){ //
if(t==0){Frequency++;if(Frequency==0xD3){Frequency = 0;}} // Проверяем в какую сторону будем менять частоту, если в положительную строну, прибавляем 1 к значению частоты, проверяем если дошли до 0xD3 обнуляем регистр частоты
else{Frequency--;if(Frequency==0){Frequency = 0xD2;}} // если в отрицательную сторону, вычитаем 1 из регистра частоты, проверяем если дошли до 0 устанавливаем значение регистра частоты = 0xD2
//
preob_FREQ(); // преобразовываем значение частоты в данные для отправки в RDA5807
INDIK_FREQ(); // показываем новое значение частоты
//
i2c_start(); // передаем новое значение частоты в RDA5807
i2c_write(WRITE_ADDR_REG); //
i2c_write(0x03); //
i2c_write(REG_3H); //
i2c_write(REG_3L); //
i2c_stop(); //
//
for(char g = 0;g<8;g++){ // Очищаем строку с названием станции
station_name[g] = ' '; //
} //
for(char g = 0;g<64;g++){ // Очищаем строку с радио текстом
radiotext[g] = ' '; //
} //
//
delay(5); // ждем 250 мСек (5*50 мСек)
} //
Пт фев 07, 2020 12:42:21
Пт фев 07, 2020 14:45:33
Пт фев 07, 2020 14:55:27
Пт фев 07, 2020 15:24:11
Пт фев 07, 2020 19:49:07
__EEPROM_DATA(0xC2,0x8D,0x23,0x10,0x00,0x00,0x88,0x83); //REG_2H,REG_2L,REG_3H,REG_3L,REG_4H,REG_4L,REG_5H,REG_5L
Ср фев 12, 2020 09:29:21
Чт фев 13, 2020 19:25:36