Vlad Mihai Postat August 6, 2013 Partajează Postat August 6, 2013 Salut de vreo saptamana ma chinui sa fac un radio digital cu un pic16f876a si un tea5767, am scris in mare parte din cod(nu e chiar scris de mine, e adaptat dupa un cod de pe net--de aicihttp://antoniopolo.wordpress.com/2012/03/06/radio-fm-pll-digital-termometro-relogio-pic16f877a/) problema ca ce e prezent acolo e destul de complex si nu reusesc sa imi extrag codul pentru mine. Pana acum am reusit sa intializez I2c si sa imi fac codul pentru citirea unei tensiuni si a unei temperaturi de la un senzor, am reusit sa initializez oarecum chipul tea5767 imi afiseaza 107.9 MHz nesemnificativ. Mai incerc un pic in seara asta cate ceva ca nu reusesc sa fac sa functieneze butoanele de scanare up si down. // LCD module connections sbit LCD_RS at RB0_bit; sbit LCD_EN at RB1_bit; sbit LCD_D4 at RB2_bit; sbit LCD_D5 at RB3_bit; sbit LCD_D6 at RB4_bit; sbit LCD_D7 at RB5_bit; sbit LCD_RS_Direction at TRISB0_bit; sbit LCD_EN_Direction at TRISB1_bit; sbit LCD_D4_Direction at TRISB2_bit; sbit LCD_D5_Direction at TRISB3_bit; sbit LCD_D6_Direction at TRISB4_bit; sbit LCD_D7_Direction at TRISB5_bit; // End LCD module connections sbit Soft_I2C_Scl at RC3_bit; sbit Soft_I2C_Sda at RC4_bit; sbit Soft_I2C_Scl_Direction at TRISC3_bit; sbit Soft_I2C_Sda_Direction at TRISC4_bit; // End Software I2C connections unsigned char ch;unsigned char txt1[] = " Digital ";unsigned char txt2[] = " Radio "; unsigned int Tensiune,temperatura; unsigned long u,t;//Variabile FM char frequencyH=0; char frequencyL=0; int frequencyB; long int frequency=0; char buffer[5]; float freq_available=0; float freq_available2=0; unsigned int cnt; short int flag_exp; //flag para shift display data x temper short int niv; //nivel do sinal short int st_flag; //informacao de stereo float freq_now; int memoria_fm; int hold_bt; //contador para apertar e segurar o botao - set hora int temp_min; //variaveis temps alarme int temp_hour; //variaveis temps alarme unsigned char txt[15]; //Range de Frequencias Europa #define FREQ_HIGH 108 #define FREQ_LOW 87.5// Botoes de sintonia #define BUTTON_DOWN (PORTC.F0 == 0) //search down #define BUTTON_UP (PORTC.F1== 0) //search up #define nivel_clear Lcd_Chr(1,1,' '); Lcd_Chr(1,2,' '); Lcd_Chr(1,3,' '); Lcd_Chr(1,4,' ') //define functions void Display_Temperature(unsigned int temp2write, unsigned int linha); void Sintoniza_freq(float frequex); //sintoniza frequ fixa void Le_freq(); //ler o chip FM carregando as variaveis void display_freq(float freqrep); //mostra frequencia void display_sinal(); // mostr ao nivel do sinalvoid main() { ADCON1 = 0x80; // configure Vref, and analog channels TRISA = 0xFF; // designate PORTA as input TRISB = 0;Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // Clear display Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off Lcd_Out(1,1,txt1); // Write text in first row Lcd_Out(2,1,txt2); // Write text in second row Delay_ms(1500); Soft_I2C_Init();Delay_ms(50); Lcd_Cmd(_LCD_CLEAR); // Clear display //Lcd_Out(1,5, "FM"); //Lcd_Out(1,13, "MHz"); LCD_Out(2, 1,"Vb:"); LCD_Out(2, 9,"To:"); while (1) { //Temperatura temperatura=ADC_read(1); // citim tensiunea generata de seznor in portul ADC1 t=(temperatura*0.48876); //conversia tensiunii citite in grade celsius ch=t/10; // extract 10.00 U digit if (ch==0) { LCD_Chr(2,12, 32); // write empty space if digit is 0 } else { LCD_Chr(2,12,48+ch); // write ASCII digit at 1st row, 2nd column } ch=(t/1) %10; // extract 01.00 U digit LCD_Chr_CP(48+ch); LCD_Chr_CP('.'); // write '.' at cursor point ch=(t/1/10) %10; // extract 00.10 U digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point // Voltage Vin Tensiune=ADC_read(0); // get ADC value for U from channel 1 u=(long)Tensiune*5600; // covert adc reading to milivolts u=u/1023; // 0..1023 -> 0-3500mV ch=u/1000; // extract 10.00 U digit if (ch==0) { LCD_Chr(2,4, 32); // write empty space if digit is 0 } else { LCD_Chr(2,4,48+ch); // write ASCII digit at 1st row, 2nd column } ch=(u/100) %10; // extract 01.00 U digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point LCD_Chr_CP('.'); // write '.' at cursor point ch=(u/10) %10; // extract 00.10 U digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor pointfreq_now=freq_available2; display_freq(freq_now); //display frequencia Le_freq(); // le frequencia do FM e atualiza variaveis Sintoniza_freq(freq_now); //Scanare UP if(BUTTON_UP) //acresce memoria { frequency=(freq_available/1000000)+0.05; frequencyB=4*(frequency*1000000+225000)/32768+1; frequencyH=frequencyB>>8; frequencyL=frequencyB&0XFF;Soft_I2C_Start(); Soft_I2C_Write(0x60); //endereço do chip FM - write mode Soft_I2C_Write(frequencyH+0x40); //byte1 Soft_I2C_Write(frequencyL); //byte2 Soft_I2C_Write(0xD0); //byte3 Soft_I2C_Write(0x1F); //byte4 Soft_I2C_Write(0x00); //byte5 Soft_I2C_Stop(); Delay_ms(100) ; } //Scanare Dowm if(BUTTON_DOWN) //acresce memoria { frequency=(freq_available/1000000)-0.05; frequencyB=4*(frequency*1000000+225000)/32768+1; frequencyH=frequencyB>>8; frequencyL=frequencyB&0XFF;Soft_I2C_Start(); Soft_I2C_Write(0x60); //endereço do chip FM - write mode Soft_I2C_Write(frequencyH+0x40); //byte1 Soft_I2C_Write(frequencyL); //byte2 Soft_I2C_Write(0x50); //byte3 Soft_I2C_Write(0x1F); //byte4 Soft_I2C_Write(0x00); //byte5 Soft_I2C_Stop(); Delay_ms(100) ; } } }void Sintoniza_freq(float frequex) { // Set frequencia fixa no FMif (frequex < FREQ_LOW) { frequex = FREQ_HIGH; freq_now=FREQ_HIGH; } if (frequex > FREQ_HIGH) { frequex = FREQ_LOW; freq_now=FREQ_LOW; }frequency=frequex*1000000; //starting frequency 89.7 novafm frequencyB=(4*(frequency+225000))/32768; //valor decimal da pll frequencyH=frequencyB>>8; // desloca 8 bytes e pega entao o primeiro byte = 00110010 - decimal 50 frequencyL=frequencyB&0XFF; // pega o 2nd byte faz(AND) com 00000000 11111111 -> resultado 10000010 - dec 130 Soft_I2C_Start(); Soft_I2C_Write(0xC0); //endereço do chip FM - write mode Soft_I2C_Write(frequencyH); //byte1 Soft_I2C_Write(frequencyL); //byte2 Soft_I2C_Write(0xB0); //byte3 Soft_I2C_Write(0x10); //byte4 Soft_I2C_Write(0x00); //byte5 Soft_I2C_Stop();}void Le_Freq() //atualiza variaveis de frequ e variaveis de sinal, fm { Soft_I2C_Start(); Soft_I2C_Write(0xC1); buffer[0] = Soft_I2C_Read(1); buffer[1] = Soft_I2C_Read(1); buffer[2] = Soft_I2C_Read(1); buffer[3] = Soft_I2C_Read(1); buffer[4] = Soft_I2C_Read(1); Soft_I2C_Stop();Delay_ms(50); freq_available=((buffer[0]&0x3F)<4); // valor numerico do nivel do sinal display_sinal(); // mostr anivel do sinal //flag de stereo - acende o led st_flag = buffer[2]>>7; if (st_flag ==0) {Lcd_Chr(1,15,' ');Lcd_Chr(1,16,' ');} else {Lcd_Chr(1,15,'F');Lcd_Chr(1,16,'m');}} void display_freq(float freqrep) { long int i; if (freqrep < FREQ_LOW) { freqrep = FREQ_HIGH; freq_now=FREQ_HIGH; } if (freqrep > FREQ_HIGH) { freqrep = FREQ_LOW; freq_now= FREQ_LOW; }i= (freqrep*1000000)-30000; //soma 50k para acertar arredondamentolongToStr(i, txt);Lcd_Chr(1,7,txt[2]); Lcd_Chr(1,8,txt[3]); Lcd_Chr(1,9,txt[4]); Lcd_Chr(1,10,'.'); Lcd_Chr(1,11,txt[5]); }void display_sinal() //imprime nivel do sinal graficamente { nivel_clear; if (niv=3 /*&& niv4 && niv8 && niv12*/ ) {nivel_clear;Lcd_Chr(1,1,'o');Lcd_Chr(1,2,'o');Lcd_Chr(1,3,'o');Lcd_Chr(1,4,'o');}}Posibil sa fie greseli in cod, nu sunt programator de meserie, prind si eu cate ceva din mers. am gasit un cod realizat in arduino, am si o platforma arduino uno dar vreau sa scap de pic-urile astea am vreo buc. Acesta este codul, daca nu reusesc sa rezolv in seara asta maine ma apuc sa portez codul din arduino in mikroC sa vad ce iese /// Arduino FM receiver with TEA5767 #include <Wire.h>#include <LiquidCrystal.h> unsigned char search_mode=0; int b=0;int c=0; #define Button_next 6 //D6 #define Button_prev 7 //D7 unsigned char frequencyH=0;unsigned char frequencyL=0; unsigned int frequencyB;double frequency=0; double freq_available=0; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { Wire.begin(); lcd.begin(16, 2); /// buttons pinMode(Button_next, INPUT); digitalWrite(Button_next, HIGH); //pull up resistor pinMode(Button_prev, INPUT); digitalWrite(Button_prev, HIGH); //pull up resistor frequency=87.5; //starting frequency frequencyB=4*(frequency*1000000+225000)/32768; //calculating PLL word frequencyH=frequencyB>>8; frequencyL=frequencyB&0XFF; delay(100); Wire.beginTransmission(0x60); //writing TEA5767 Wire.send(frequencyH); Wire.send(frequencyL); Wire.send(0xB0); Wire.send(0x10); Wire.send(0x00); Wire.endTransmission(); delay(100);} void loop(){ unsigned char buffer[5]; lcd.setCursor(0, 0); Wire.requestFrom(0x60,5); //reading TEA5767 if (Wire.available()) { for (int i=0; i<5; i++) { buffer[i]= Wire.receive(); } freq_available=(((buffer[0]&0x3F)<<8)+buffer[1])*32768/4-225000; lcd.print("FM "); lcd.print((freq_available/1000000)); frequencyH=((buffer[0]&0x3F)); frequencyL=buffer[1]; if (search_mode) { if(buffer[0]&0x80) search_mode=0; } if (search_mode==1) lcd.print(" SCAN"); else { lcd.print(" "); } lcd.setCursor(0, 1); lcd.print("Level: "); lcd.print((buffer[3]>>4)); lcd.print("/16 "); if (buffer[2]&0x80) lcd.print("STEREO "); else lcd.print("MONO "); } ///// buttons read //////////// button_next////////// if (!digitalRead(Button_next)&&!b) { frequency=(freq_available/1000000)+0.05; frequencyB=4*(frequency*1000000+225000)/32768+1; frequencyH=frequencyB>>8; frequencyL=frequencyB&0XFF; Wire.beginTransmission(0x60); Wire.send(frequencyH); Wire.send(frequencyL); Wire.send(0xB0); Wire.send(0x1F); Wire.send(0x00); Wire.endTransmission(); ////////////////////// b=100; }; if (!digitalRead(Button_next)&&b==1) { ///scannnn UP search_mode=1; Wire.beginTransmission(0x60); Wire.send(frequencyH+0x40); Wire.send(frequencyL); Wire.send(0xD0); Wire.send(0x1F); Wire.send(0x00); Wire.endTransmission(); ///////////////// b=100; }; if (!b==0) b--; //////////// button_prev////////// if (!digitalRead(Button_prev)&&!c) { frequency=(freq_available/1000000)-0.05; frequencyB=4*(frequency*1000000+225000)/32768+1; frequencyH=frequencyB>>8; frequencyL=frequencyB&0XFF; Wire.beginTransmission(0x60); Wire.send(frequencyH); Wire.send(frequencyL); Wire.send(0xB0); Wire.send(0x1F); Wire.send(0x00); Wire.endTransmission(); c=100; }; if (!digitalRead(Button_prev)&&c==1) { ///scannnn DOWN search_mode=1; Wire.beginTransmission(0x60); Wire.send(frequencyH+0x40); Wire.send(frequencyL); Wire.send(0x50); Wire.send(0x1F); Wire.send(0x00); Wire.endTransmission(); c=100; }; if (!c==0) c--; //////////////////// } Daca s-a jucat cineva cu asa ceva il rog sa imi dea un sfat, si ii multumesc de pe acum. Nu cred ca mai e nevoie de schema sau alte imagini. Link spre comentariu
Vlad Mihai Postat August 7, 2013 Autor Partajează Postat August 7, 2013 Am reusit in sfarsit sa il pornesc cu arduino dar sunt dezamagit de receptie, i-am pus si antena si la fel , e foarte proasta receptia. m-am chinuit mult la el pentru nimic. nu cred ca prind mai mult de 3-4 posturi cat de cat clare cu acest chip. nu e de mirare ca e asa de ieftin. Link spre comentariu
Depanatoru Postat August 7, 2013 Partajează Postat August 7, 2013 Pai e facut pentru jucarii portabile de tip telefoane , mp3 playere , n-are sensibilitate prea stralucita . Trebuie antena buna la bloc sau pentru posturi departate . Integratele radio cu totul inauntru niciodata n-au fost prea bune . Link spre comentariu
Kreator Postat Decembrie 13, 2013 Partajează Postat Decembrie 13, 2013 Eu tocmai sunt spre finalul unui proiect cu acest integrat. Prind toate posturile din oras la calitate buna si foarte buna iar ca antena folosesc un fir de aprox 60 cm. Obtin la receptie intre 12 si 15 la bitul Level Volum iar bitul IIF intre 52 si 59. Daca folosesc functia lui de search nu merge OK, sau prinde postul bine doar daca pleaca cautarea de la un ecart de max 1 MHz. Asa ca am implementat un agoritm de cautare a posturilor prin soft, bazat pe modul preset. Vad ca sunt doua modele de module. Unul mi se pare a nu are toate componentele necesare functionarii montate. Daca mai este de actualitate iti pot spune mai multe din ce am observat la el. Materialele cele mai bune gasite sunt: http://www.rockbox.org/wiki/pub/Main/Da ... 5767-8.pdf http://ssihla.wordpress.com/2012/07/17/ ... e-tea5767/ https://www.sparkfun.com/datasheets/Wir ... EA5767.pdf Link spre comentariu
Vlad Mihai Postat Decembrie 14, 2013 Autor Partajează Postat Decembrie 14, 2013 Salut, l-am facut si eu pana la urma cu alt chip cu arduino si a mers foarte bine, am personalizat softul si l-am vazut. inca merge bine, e foarte misto. multumesc. Link spre comentariu
mirceacra Postat Decembrie 20, 2013 Partajează Postat Decembrie 20, 2013 Salut, l-am facut si eu pana la urma cu alt chip cu arduino si a mers foarte bine, am personalizat softul si l-am vazut. inca merge bine, e foarte misto. multumesc.Poate puneti infomatii detaliate despre realizare undeva la rubrica diy proiecte, pe mine unul ma interseaza as dori sa il fac si eu si unt convins ca mai sunt persoane interesate. Multumim ! Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum