ทดลองใช้งานโมดูลวิทยุ FM TEA5767 กับ pic

Started by vbaserv, July 17, 2017, 10:01:54 AM

Previous topic - Next topic

vbaserv

เห็นมีในอีเบย์ราคาไม่แรง  เลยซื้อมาลอง  ชิปหลักที่ควบคุมการทำงานคือ TEA5767 เป็นระบบ  FM ที่เล็กจริงๆ ไม่ต้องใช้ทั้ง if transformer,coil,variable C   โค๊ดตัวอย่างก็พอหาได้จาก ccs forum  ผมเพิ่มส่วนรับค่าเพื่อสั่งงานชิปผ่าน  RS232 เหตุที่ทำก็เพราะ register (ที่ควบคุมการทำงานทั้งหมด) ของชิปตัวนี้มี 5 byte   แต่หลายบิทก็ควบคุมไปแต่ละอย่าง  การทดลองเปลี่ยนค่าแต่ละบิทแล้ว compile,upload code  ไม่น่าจะสนุกนัก

ตัว ic TEA5767  ติดต่อได้ทั้งแบบ i2c และ  spi  แต่สำหรับโมดูลนี้เขา fix เป็นแบบ i2c 

หมายเหตุ การซื้อฃองราคาถูกในอีเบย์ คงตั้งความหวังสูงไม่ได้ 
จากที่ซื้อ 4 บอร์ด จาก 2 seller พบว่า 2 บอร์ดใช้งานได้ perfect  1 บอร์ดรับสัญญาณได้น้อยอย่างน่าผิดหวัง  อีก 1 บอร์ดเงียบสนิท


// compiler CCS 4.x
#define onsim 0
#define useintclk 1
#define startf 88
//#define stopf 95
//#define startf 88.25
#define stopf 108
#define incf 0.5
//#define incf 0.25

#define hw 2525
#define swspi 1
#define op1 4 // 3=tst fm 4=tst232
#define op2 2 // printf option 1=\n 2=, in 1line csv
#if onsim==1
#define dl1 2 //1
#else
#define dl1 200 //50 too fast //200 ok op1=1
#endif

#if hw==2525
#include <18F2525.h>
#if useintclk==1
#fuses INTRC_IO, NOFCMEN,NOIESO,NOWDT, NOBROWNOUT, PUT, NOLVP
#fuses NOLPT1OSC,NOPBADEN
#use delay(clock=4000000)
#else
#fuses XT, NOFCMEN,NOIESO,NOWDT, NOBROWNOUT, NOPUT, NOLVP
#fuses NOLPT1OSC,NOPBADEN
#use delay(clock=9600000)
#endif

#if op1==4
#use i2c(master, sda=PIN_C4, scl=PIN_C5,slow)
#else
#use fast_io(c)
#use fast_io(b)
#endif
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //, ERRORS)

#endif

unsigned char frequencyH=0;
unsigned char frequencyL=0,fh,fl,fl0,
dat3,dat4,dat5;
unsigned int16 frequencyB,frb;  //int got 8
double frequency=0,x1; //32bit
int8 i=0,raw_frame[10],index=0, tmp;
int1 immeflg=0, serialflg=0,srchflg=0,srchflgdw=0;

#LOCATE frb=0x30  //

// a-b-c-d order as int32
#byte fh=0x31
#byte fl=0x30

void tea_setup(){
//tst cmnd
i2c_start();
// i2c_write(0x60); //adres om te schrijven
i2c_write(0xC0); //adres om te schrijven
i2c_write(raw_frame[0]); //frequencyH
i2c_write(raw_frame[1]); //frequencyL);
i2c_write(raw_frame[2]); //0xB0);
i2c_write(raw_frame[3]); //0x10);
i2c_write(raw_frame[4]); //0x00);
i2c_stop();
// output_toggle(PIN_C0);
delay_ms(2000);
// rd back
i2c_start();
// i2c_write(0x60); //adres om te schrijven
i2c_write(0xC1); //adres om te schrijven
fh=i2c_read();
fl=i2c_read();
dat3=i2c_read();
dat4=i2c_read();
dat5=i2c_read(0);
i2c_stop();
fh=fh &0b00111111; //requi
dat3=dat3 &0b01111111; // for if cnt
dat4 >>=4;
#if op2==1
//@# xl ok rcv printf("\nx1=%f",x1);
// printf("\nx1=%g",x1); //?dif
printf("\n%2x",fh);
printf("\n%2x",fl);
// printf("\n");
// printf("\n%2x %2x",x1);
printf("\n%2x",dat3);
printf("\n%2x",dat4);
printf("\n__"); //mark end
#endif
}
void tea_wr(int8 srchup,mono,srchlevel){
int8 by3=0,by4;
if (mono==1) by3=by3+0x08;
if (srchup==1) by3=by3+0x90; //hi side inject
// if (srchup==1) by3=by3+0x80; //also lo side inject
if (srchlevel==1) by3=by3+0x20; //as pdf
if (srchlevel==2) by3=by3+0x40;
if (srchlevel==3) by3=by3+0x60;
//for srch up
printf("\n%Lx ",frb);
if (srchup==1)
frb=frb+10; // 10
else
frb=frb-10;
printf(" ; %Lx ",frb);
// @# locate 16bit var
i2c_start();
i2c_write(0xC0); //adres om te schrijven
i2c_write(fh+0x40);
i2c_write(fl);
// if (srchup==1)
// i2c_write(fl+10); //frequencyL);
// else
// i2c_write(fl-10); //frequencyL);
i2c_write(by3);
i2c_write(0x10);
i2c_write(0x00);
i2c_stop();

}
void tea_rd(){
// rd back
fl0=fl; //sav val
i2c_start();
// i2c_write(0x60); //adres om te schrijven
i2c_write(0xC1); //adres om te schrijven
fh=i2c_read();
fl=i2c_read();
dat3=i2c_read();
dat4=i2c_read();
dat5=i2c_read(0);
i2c_stop();
fh=fh &0b00111111;
dat3=dat3 &0b01111111; // for if cnt
dat4 >>=4;
#if op2==1
//@ # xl ok rcv printf("\nx1=%f",x1);
// printf("\nx1=%g",x1); //?dif
printf("\n%2x",fh);
printf("\n%2x",fl);
// printf("\n");
// printf("\n%2x %2x",x1);
printf("\n%2x",dat3);
printf("\n%2x",dat4);
printf("\n__"); //mark end
#endif
#if op2==2
printf("\ncurr f= %2x %2x",fh,fl);
printf(",%2u",dat3);
// printf(",%2x",dat3);
printf(",%2x",dat4);
printf(", dif fl=%x, fl0=%x",fl-fl0,fl0);
#endif
}

#INT_RDA
void serial_isr() {
int8 in_char,i;

restart_wdt();
   in_char =getc();
if (index==0) {
if (in_char==254) {
srchflgdw=1;
goto quit1;
}
if (in_char==255) {
srchflg=1;
goto quit1;
}
}

raw_frame[index]=in_char;
index++;
if (index==5) {
//dump
// for (i=0;i<10;i++) printf(" %c",raw_frame[i]);
for (i=0;i<5;i++) printf(" %x",raw_frame[i]);
printf(" index= %u\n",index);
tmp=0; serialflg=1;
index=0;
goto quit1;
}

quit1:
tmp=0;

}

void main() {
int8 dig7,seg7;
// tmp=0;
delay_ms(10);
setup_adc(adc_off); setup_comparator(NC_NC_NC_NC);
set_tris_c(0b10011110);
clear_interrupt(INT_RDA);
enable_interrupts(INT_RDA);
enable_interrupts(global);
#if op1==4
while(1){
// printf("x");
if (serialflg){
printf("y");
tea_setup();
// delay_ms(100);
serialflg=0; index=0;
}
if (srchflg){
tea_rd();
delay_ms(100);
tea_wr(1,1,1); // int8 srchup,mono,srchlevel
srchflg=0;
}
if (srchflgdw){
tea_rd();
delay_ms(100);
tea_wr(0,1,1);
srchflgdw=0;
}
delay_ms(1000);
}
#endif
#if op1==3
set_tris_c(0b00011110);
// frequency=91.3; //starting frequency
// frequency=102.1*1000000; //starting frequency
x1=startf; //105.5; //93.5;
nx1:
frequency=x1*1000000; //starting frequency
// frequencyB=4*(frequency*1000000+225000)/32768; //calculating PLL word
//t got some
//as goog  if at rx mixer 10.7M
// frequencyB=4*(x1*1000000+225000)/32768; //calculating PLL word
frequencyB=4*(frequency+125000)/32768; //calculating PLL word
frequencyH=frequencyB>>8; // =get b15-b8 store in frequencyH
frequencyL=frequencyB&0XFF;
tmp=0;
//         byteInput[j] >>= 1;
        //shift right 1bit 0 fill in
#if onsim==0
i2c_start();
// i2c_write(0x60); //adres om te schrijven
i2c_write(0xC0); //adres om te schrijven
i2c_write(frequencyH+0x40); // add 40h seem not much good?
i2c_write(frequencyL);
i2c_write(0xB0);
i2c_write(0x10);
i2c_write(0x00);
i2c_stop();
output_toggle(PIN_C0);
delay_ms(2000);
goto nx3c;
// rd back
i2c_start();
// i2c_write(0x60); //adres om te schrijven
i2c_write(0xC1); //adres om te schrijven
fh=i2c_read();
fl=i2c_read();
dat3=i2c_read();
dat4=i2c_read();
dat5=i2c_read(0);
i2c_stop();
nx3c:
fh=fh &0b00111111;
dat3=dat3 &0b01111111; // for if cnt
dat4 >>=4;
        //shift right 1bit 0 fill in
#endif

x1=x1+incf; //0.5;
if(x1>stopf) {
x1=startf;
tmp=0;
}
goto nx1;
while(1){}
#endif
// output_b(0);
set_tris_b(0b01100111);
set_tris_c(0b00000110);
output_high(pin_b3);
i=1;  //tst as led running by 1led ON multi shield bd


delay_ms(2000);
/*
*/
}

boe

module ผมซื้อมาดองไว้เกือบ 2 ปีแล้วเหมือนกันยังไม่มีเวลาเล่นสักที่ เดี๋ยวจะลองหา arduino library มาลองต่อดูก่อน ;D
ไม่มีความยากจน ในหมู่คนขยัน

Chicaa

เป็นข้อมูลที่ผมกำลังต้องการเป็นอย่างมาก


moneyp1000

น่าสนใจมากครับ ตอนนี้แนว arduino น่าจะมาเยอะแล้ว