проект
в CodeWizardAVR V2.04.4a
библиотечка с когота пректа , сырая , неоптимизированная, много лишних телодвижений в плане постояннго опросса микросхемы, самому переписать уже дополяная - нет опыта
кварц часовой 32768Гц
#include <delay.h>
#include <stdio.h>
#include <twi.h>
#define TEA5767_ADR 0xc0 // адрес TEA5767 или TEA5768,+1 на запись
//макросы для вкл/выкл определенных функций TEA (см. даташит)
#define MUTE_ON tea5767_w_data.wr_byte1 |= 0x80 ;tea5767_write(&tea5767_w_data);
#define MUTE_OFF tea5767_w_data.wr_byte1 &= ~0x80 ;tea5767_write(&tea5767_w_data);
#define DTC75 tea5767_w_data.wr_byte5 |= 0x40 ;tea5767_write(&tea5767_w_data);
#define DTC50 tea5767_w_data.wr_byte5 &= ~0x40 ;tea5767_write(&tea5767_w_data);
#define HCC_ON tea5767_w_data.wr_byte4 |= 0x04 ;tea5767_write(&tea5767_w_data);
#define HCC_OFF tea5767_w_data.wr_byte4 &= ~0x04 ;tea5767_write(&tea5767_w_data);
#define SMUTE_ON tea5767_w_data.wr_byte4 |= 0x08 ;tea5767_write(&tea5767_w_data);
#define SMUTE_OFF tea5767_w_data.wr_byte4 &= ~0x08 ;tea5767_write(&tea5767_w_data);
#define STEREO_ON tea5767_w_data.wr_byte3 &=~ 0x80 ;tea5767_write(&tea5767_w_data);
#define STEREO_OFF tea5767_w_data.wr_byte3 |= 0x80 ;tea5767_write(&tea5767_w_data);
typedef unsigned char u8_t;
typedef unsigned int u16_t;
typedef unsigned long int u32_t;
//unsigned char state;
unsigned char StateMachine(char state, unsigned char stimuli);
char Auto_scan_up(char input);
char Auto_scan_up1(char input);
char Manual_search_up(char input);
char Manual_search_down(char input);
char Stereo(char input);
char Mono(char input);
char Noise_on(char input);
char Noise_off(char input);
//
//#define FALSE 0
//#define TRUE (!FALSE)
//#define NULL 0
////
// Menu state machine states
#define ST_AUTOSEARCH 30
#define ST_AUTOSEARCH_SEARCH 31
#define ST_SCAN_UP 32
#define ST_MANUALSEARCH 40
#define ST_MANUALSEARCH_SEARCH 41
#define ST_MANUALSEARCH_SEARCH_UP 42
#define ST_MANUALSEARCH_SEARCH_DOWN 43
#define ST_MANUALSEARCH_UP 44
#define ST_MANUALSEARCH_DOWN 45
#define ST_OPTIONS 50
#define ST_OPTIONS_ST_MN 51
#define ST_STEREO_MONO 52
#define ST_STEREO 53
#define ST_MONO 54
#define ST_OPTIONS_NOISE 55
#define ST_NOISE 56
#define ST_NOISE_ON 57
#define ST_NOISE_OFF 58
/* COMMUNICATION: WRITE MODE
Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 Bit 2 Bit 1 Bit 0
----------------------------------+--------------------+--------------+------------------+--------------+-----------------+--------------+----------------
Data byte 1 | mute | Search mode | PLL13 | PLL12 | PLL11 | PLL10 | PLL9 | PLL8 |
----------------------------------+--------------------+---------------+--------------------------------+-----------------+---------------+----------------|
Data byte 2 | PLL7 | PLL6 | PLL5 | PLL4 | PLL3 | PLL2 | PLL1 | PLL0 |
----------------------------------+-------------------+----------------+------------------+-------------+----------------+----------------+---------------|
Data byte 3 | Search | Search | | HiLo side | | | | |
| up/down | stop level | | injection |Mono/stereo | Mute left | Mute right | SW port1|
----------------------------------+------------------+-----------------+----------------+---------------+-----------------+----------------+--------------|
Data byte 4 | SW port 2| Stand-by |Band limits |xtal | Soft-mute | HCC SNC | Search | |
| | | | | | | indicator | |
------------------+--------------+------------------+----------------+-----------------+----------------+----------------+----------------+--------------|
Data byte 5 | PLL ref | Deemph | Not used | Not used | Not used | Not used | Not used | Not used |
---------------------------------------------------------------------------------------------------------------------------------------------------------------|
*/
float freq; //частота freq,,PLLfreq
u8_t rx_pwr, if_cnt, exit_bit = 0;
u8_t mem_index = 1;
u32_t PLLfreq;
char iii = 0;
//char tea5767_w_data ; u16_t freq_lcd;
char mute_bit,xx,if_count,x_qual;
// начальные данные регистров при первом включении после прошивки чобы не улетала TEA в астрал

eeprom u8_t ee_b1 =0x31; ; //
eeprom u8_t ee_b2 = 0x20; ; //
eeprom u8_t ee_b3 = 0x90; // 90
eeprom u8_t ee_b4 = 0x1E; //0x16 //1e 1E
eeprom u8_t ee_b5 = 0x0; //c0
eeprom u16_t freq_ee = 1070;
eeprom u16_t mem[21];
eeprom u8_t mem_index_ee = 1;
//
struct tea5767wr_data
{ u8_t wr_byte1; //1-ый байт данных для записи
u8_t wr_byte2;
u8_t wr_byte3; //3-ий байт данных для записи
u8_t wr_byte4;
u8_t wr_byte5; //5-ый байт данных для записи
} tea5767_w_data;
struct tea5767rd_data
{ u8_t rd_byte1; //1-ый байт данных для записи
u8_t rd_byte2;
u8_t rd_byte3; //3-ий байт данных для записи
u8_t rd_byte4;
u8_t rd_byte5; //5-ый байт данных для записи
} tea5767_r_data;
////запись регистров в TEA (struct tea5767wr_data *wdata) (struct tea5767wr_data *wdata) (struct tea5767wr_data*wdata)
void tea5767_write (struct tea5767wr_data*wdata)
{ twi_start();
twi_wr_addr(0xc0); // (0xc0); для записи tx
twi_wr(wdata->wr_byte1);
twi_wr(wdata->wr_byte2);
twi_wr(wdata->wr_byte3);
twi_wr(wdata->wr_byte4);
twi_wr(wdata->wr_byte5);
twi_stop();
}; //
////чтение регистров TEA (struct tea5767rd_data *rdata) (struct tea5767rd_data*rdata)
void tea5767_read (struct tea5767rd_data*rdata)
{
twi_start();
twi_wr_addr(0xc1); // (0xc1); для чтения tx
rdata->rd_byte1 = twi_rd(1);
rdata->rd_byte2 = twi_rd(1);
rdata->rd_byte3 = twi_rd(1);
rdata->rd_byte4 = twi_rd(1);
rdata->rd_byte5 = twi_rd(1);
twi_stop();
};
void tea5767_init (void)
{
tea5767_w_data.wr_byte1 = ee_b1; //считывание даных TEA из EEPROM
tea5767_w_data.wr_byte2 = ee_b2;
tea5767_w_data.wr_byte3 = ee_b3;
tea5767_w_data.wr_byte4 = ee_b4;
tea5767_w_data.wr_byte5 = ee_b5;
DTC50;
STEREO_ON;
MUTE_ON; //отключение звукового тракта при включении питания
SMUTE_ON;
tea5767_write(&tea5767_w_data);
delay_ms(1000);
//tea5767_write(&tea5767_w_data);
freq = freq_ee * 100000;
};
//запись регистров TEA в EEPROM для памяти при выкл питания
void write_ee (void)
{
ee_b1 = tea5767_w_data.wr_byte1;
ee_b2 = tea5767_w_data.wr_byte2;
ee_b3 = tea5767_w_data.wr_byte3;
ee_b4 = tea5767_w_data.wr_byte4;
ee_b5 = tea5767_w_data.wr_byte5;
freq_ee = freq / 100000;
mem_index_ee = mem_index;
}
////функция вычисления частоты вверх
////mute_bit - откл/вкл звука при поиске (char mute_bit)
void freq_up (unsigned char mute_bit)
{
freq += 50000; //100000;
if (freq == 108100000)
{
freq = 74000000;
}
PLLfreq =(4 * (freq + 225000))/ 32768; // 32768
tea5767_w_data.wr_byte1 = ((PLLfreq >>

& 0x3f); // 3F ; (PLLfreq & 0x00003F00) >> 8;
tea5767_w_data.wr_byte2 = (PLLfreq & 0xFF); // (PLLfreq & 0x000000FF);
if(mute_bit) MUTE_OFF;
// if(mute_bit) MUTE_ON;
tea5767_write(&tea5767_w_data);
}
//void freq_up(char mute_bit)
//{
// freq += 100000;
// if (freq == 108100000)
// {
// freq = 74000000;
// }
//// PLLfreq = (((freq + 225000) * 4) / 32768);
/// PLLfreq = (((freq - 225000) * 4 ) / 32768);
// PLLfreq = 4 * (freq - 225000) / 32768;
// tea5767_w_data.wr_byte1 = ((PLLfreq >>

& 0x3F);
// tea5767_w_data.wr_byte2 = (PLLfreq & 0xFF);
// if(mute_bit) MUTE_ON;
// if(!mute_bit) MUTE_OFF;
// tea5767_write(&tea5767_w_data);
//}
//функция вычисления частоты вниз и запись в TEA
//mute_bit - откл/вкл звука при поиске 32768L
void freq_down(char mute_bit)
{
freq -= 100000; //100000;
if (freq == 74000000)
{
freq = 108000000;
}
PLLfreq =4 * (freq + 225000L) / 32768L;
tea5767_w_data.wr_byte1 = ((PLLfreq >>

& 0x3f); // 3F
tea5767_w_data.wr_byte2 = (PLLfreq & 0xFF);
if(mute_bit) MUTE_ON;
if(!mute_bit) MUTE_OFF;
tea5767_write(&tea5767_w_data);
}
//
// return x;
//}
//
////считывание счетчика ПЧ из TEA5767
char tea5767_if_count (void)
{
char yyyyy;
tea5767_read(&tea5767_r_data);
yyyyy = tea5767_r_data.rd_byte3 & 0x7F;
delay_ms(10); if_count = yyyyy;
return yyyyy;
}
//функция считывания и отображения стерео/моно
void st_mn(void)
{
tea5767_read(&tea5767_r_data);
if((tea5767_r_data.rd_byte3 & 0x80) == 0x80)
{
lcd_gotoxy(14,0);
lcd_putsf ("ST");
}
else
{
lcd_gotoxy(14,0);
lcd_putsf ("MN");
}
}