PIC: TEA5767
O circuito integrado TEA5767 é um rádio FM estéreo em um único chip. Possui um baixo consumo de energia e não requer nenhum tipo de ajuste no circuito. Sintoniza bandas FM Japonesas( 76 - 91 MHz ) ou Europeias ( 87.5 - 108 MHz ). Comunica-se com o microcontrolador através de um barramento I2C.
O módulo possui 10 pinos. O pino BUS MODE quando em nível baixo habilita a comunicação via I2C. Para habilitar a comunicação 3-Wire apenas coloque o pino em nível alto. Os pinos SDA ( dados ) e SCL ( clock ) são os pinos da interface I2C. É alimentado com tensão entre 2.5V até 5V. Possui duas saídas para o áudio estéreo ( LEFT e RIGHT ). O pino 10 é para a ligação de uma antena.
BIBLIOTECA
MikroC PRO PIC
#define TEA5767_ADDRESS 0xC0 static char WriteBytes[5] = { 0x00, 0x00, 0xD0, 0x10, 0x00 }; struct { union { char FREQUENCIA_H : 6; char SEARCH_MODE : 1; char MUTE : 1; }; char FREQUENCIA_L; union { char SWP1 : 1; char MUTE_LEFT : 1; char MUTE_RIGHT : 1; char MONO_TO_STEREO : 1; char HLSI : 1; char SEARCH_STOP_LEVEL : 2; char SEARCH_UP_DOWN : 1; }; union { char : 5; char BAND_LIMIT : 1; //1 = Japan FM Band, 0 = US/Europe FM Band char STANDY_BY_ON : 1; char SWP2 : 1; }; } TEA5767 at WriteBytes; void TEA5767_Write() { Soft_I2C_Start(); Soft_I2C_Write( TEA5767_ADDRESS ); Soft_I2C_Write( WriteBytes[0] ); Soft_I2C_Write( WriteBytes[1] ); Soft_I2C_Write( WriteBytes[2] ); Soft_I2C_Write( WriteBytes[3] ); Soft_I2C_Write( WriteBytes[4] ); Soft_I2C_Stop(); } void TEA5767_Read( unsigned long *freq_hz, char *flags, char *sinal ) { unsigned long Freq_Tmp = 0; char ReadBytes[5]; //Faz a leitura de 4 bytes Soft_I2C_Start(); Soft_I2C_Write( TEA5767_ADDRESS | 1 ); ReadBytes[0] = Soft_I2C_Read( 1 ); ReadBytes[1] = Soft_I2C_Read( 1 ); ReadBytes[2] = Soft_I2C_Read( 1 ); ReadBytes[3] = Soft_I2C_Read( 1 ); ReadBytes[4] = Soft_I2C_Read( 0 ); Soft_I2C_Stop(); //Calcula a frequencia em hz ((char*)&Freq_Tmp)[1] = ReadBytes[0] & 0x3F; ((char*)&Freq_Tmp)[0] = ReadBytes[1]; Freq_Tmp <<= 13; if( TEA5767.HLSI ) Freq_Tmp -= 225000; else Freq_Tmp += 225000; *freq_hz = Freq_Tmp; //Nivel do sinal recebido *sinal = ReadBytes[3] >> 4; //flags (*flags).B0 = ReadBytes[2].B7; //mono ou stereo (*flags).B1 = ReadBytes[0].B7; //estacao foi encontrada, caso o scan estiver ativado (*flags).B2 = ReadBytes[0].B6; //atingiu o limite de banda } void TEA5767_Sintonizar( unsigned long freq_hz ) { //Formula = 4 * ( FREQ + 225000 ) / 32768 if( TEA5767.HLSI ) freq_hz += 225000; else freq_hz -= 225000; freq_hz >>= 13; TEA5767.FREQUENCIA_H = ((char*)&freq_hz)[1]; TEA5767.FREQUENCIA_L = ((char*)&freq_hz)[0]; TEA5767.SEARCH_STOP_LEVEL = 1; TEA5767_Write(); } void TEA5767_Scan( char direcao ) { TEA5767.SEARCH_MODE = 1; TEA5767.SEARCH_UP_DOWN = direcao.B0; TEA5767.SEARCH_STOP_LEVEL = 2; TEA5767_Write(); }
EXEMPLO
No exemplo, há dois botões, que são utilizados para sintonizar a frequência e, também para procura automática das estações de rádio. A procura das estações ocorre quando o botão é pressionado por mais de 1 segundo. Para sintonizar, basta pressionar o botão, que a frequência irá decrementar ou incrementar em 100KHz ( 0.1MHz ).
O Display de LCD exibirá a frequência da rádio, o tipo da saída de áudio ( Stereo ou Mono ) e também o nível do sínal recebido.
MikroC PRO PIC//Projeto: Radio FM com TEA5767 //MCU: PIC18F4550 //CLOCK: 48MHz ( 20MHz + PLL ) //Autor: Tiago Henrique //Compilador: MikroC PRO PIC //Habilitar as seguintes bibliotecas: // - Conversions // - Software_I2C // - LCD //copie e cole o código da biblioteca aqui!!! sbit Soft_I2C_Scl at RD1_bit; sbit Soft_I2C_Sda at RD0_bit; sbit Soft_I2C_Scl_Direction at TRISD1_bit; sbit Soft_I2C_Sda_Direction at TRISD0_bit; sbit LCD_RS at RD2_bit; sbit LCD_EN at RD3_bit; sbit LCD_D4 at RD4_bit; sbit LCD_D5 at RD5_bit; sbit LCD_D6 at RD6_bit; sbit LCD_D7 at RD7_bit; sbit LCD_RS_Direction at TRISD2_bit; sbit LCD_EN_Direction at TRISD3_bit; sbit LCD_D4_Direction at TRISD4_bit; sbit LCD_D5_Direction at TRISD5_bit; sbit LCD_D6_Direction at TRISD6_bit; sbit LCD_D7_Direction at TRISD7_bit; sbit ButtonUp at PORTB.B2; sbit ButtonDown at PORTB.B3; unsigned long frequencia = 103500000; //frequencia de uma rádio em Hz char nivel; char radio_flags = 0; char texto[12]; char tempo = 0; void main() { ADCON1 = 0x0F; //desativa o canal analogico CMCON = 7; //desativa o comparador analogico NOT_RBPU_Bit = 0; //habilita os resistores de pull-up da PORTB Soft_I2C_Init(); //inicializa a comunicacao I2C Lcd_Init(); //iniciliaza o display lcd Lcd_Cmd( _LCD_CURSOR_OFF ); Lcd_Cmd( _LCD_CLEAR ); TRISB.B3 = 1; //botao de sintonia ( - ), botao de procura ( down ) TRISB.B2 = 1; //botao de sintonia ( + ), botao de procura ( up ) TEA5767_Sintonizar( frequencia ); //Sintoniza o radio while( 1 ) { if( !ButtonUp ) { tempo = 0; while( !ButtonUp )//enquanto o botao estiver pressionado { tempo++; if( tempo >= 200 ) break; Delay_ms( 5 ); } frequencia += 100000; TEA5767_Sintonizar( frequencia ); if( tempo >= 200 ) //1 segundo pressionado? { TEA5767_Scan( 1 ); Lcd_Out( 2, 8, "SCAN" ); } } else if( !ButtonDown ) { tempo = 0; while( !ButtonDown )//enquanto o botao estiver pressionado { tempo++; if( tempo >= 200 ) break; Delay_ms( 5 ); } frequencia -= 100000; TEA5767_Sintonizar( frequencia ); if( tempo >= 200 ) //1 segundo pressionado { TEA5767_Scan( 0 ); Lcd_Out( 2, 8, "SCAN" ); } } TEA5767_Read( &frequencia, &radio_flags, &nivel ); //imprime no display lcd Lcd_Out( 1, 1, "FREQ: " ); WordToStr( frequencia / 100000, texto ); Lcd_Chr_CP( texto[1] ); Lcd_Chr_CP( texto[2] ); Lcd_Chr_CP( texto[3] ); Lcd_Chr_CP( '.' ); Lcd_Chr_CP( texto[4] ); Lcd_Out_CP( " MHz" ); ByteToStr( nivel, texto ); Lcd_Out( 2, 12, texto ); if( radio_flags.B0 ) Lcd_Out( 2, 1, "STEREO" ); else Lcd_Out( 2, 1, " MONO " ); if( radio_flags.B1 ) //Estacao encontrada { TEA5767.SEARCH_MODE = 0; Lcd_Out( 2, 8, " " ); } Delay_ms( 50 ); } }
Excelente blog! Obrigado por divulgar seus circuitos e códigos!
ResponderExcluirvocê poderia disponibilizar esse componente para simulação no proteus? obrigado e ótimo blog
ResponderExcluirMito dos Projetos, vc poderia fazer um desse Menu e Submenu com Lcd, estou tentando fazer um mas ta dificil.
ResponderExcluirvoçê tem a programação para pcw!!!
ResponderExcluirComo fazer a programação para controlar o volume para o Arduino? Qual é o código? 0x??
ResponderExcluirpoderia disponibilizar o componente TEA5767 para biblioteca proteus?
ResponderExcluirola colega vc envia o codigo HEX pra gravar no pic
ResponderExcluirola colega vc envia o codigo HEX pra gravar no pic
ResponderExcluirola colega vc envia o HEX caso sim depois de mando meu email
ResponderExcluircan you share with me the library of TEA5756 for the proteus
ResponderExcluir