Go Down

Topic: Esistono librerie per TSA5522 ? (Read 9510 times) previous topic - next topic

Etemenanki

Piu nello specifico, c'e' una qualche libreria o modulo che permetta ad Arduino di passare frequenze al TSA5522 in modo diretto ?

E' pilotato via I2C e gestisce un tuner TV fullband (40-860MHz) ... o al limite, un qualsiasi altro tuner con protocolli simili ?

L'IC e' questo http://pdf.datasheetcatalog.com/datasheet/philips/TSA5522_2.pdf
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

Etemenanki

Ok, suppongo che significhi che non ci sono librerie del genere ... quindi provo a cambiare la domanda ...

Avendo il datasheet, nella sezione del protocollo di comunicazione a pagina 6, e' indicato qualcosa sul tipo di dati da mandare al chip ... secondo voi, come potrei fare a mandargli qualcosa e fare degli esperimenti, usando Arduino come pilota ? ... che genere di sketch potrebbe essere utile ?

Se qualcuno risponde, per favore si ricordi che sta parlando ad un "meccanico", non ad un programmatore ... termini semplici, per favore ;)
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

astrobeed

Se qualcuno risponde, per favore si ricordi che sta parlando ad un "meccanico", non ad un programmatore ... termini semplici, per favore ;)
Visto che è I2C puoi usare la libreria TWI per comunicare, però c'è da scrivere tutta la gestione del protocollo.
Qui c'è un programma in C che dovrebbe gestire questo IC, c'è da farne il porting su Arduino, buon divertimento :)
Scientia potentia est

Etemenanki

#3
Oct 29, 2014, 11:44 am Last Edit: Oct 29, 2014, 11:46 am by Etemenanki
Ok, e quali utensili devo usare, per fare 'sto porting ? ... fresa, trapano, rettifica, tornio, alesatrice, lapidello ? ... :P :P :P

Seriamente, Astro, non sono un programmatore ... se devo inviare una stringa di bit, come dice nel datasheet, immagino che ci sia un comando o un modo di "formattare" la stringa prima di inviarla (suppongo che, alla fine, sia proprio questo che fa una libreria, cioe' adattare il formato dei dati al dispositivo che li deve ricevere) ... quindi suppongo che se volessi inviargli una serie di frequenze in scala, dovrei prima scrivermi (parolone :P) una qualche routine che prenda le frequenze che mi serve inviare e le converta in una serie di bit che dicano al sintetizzatore quale divisione usare di volta in volta ...

Accidenti alla modernizzazione, con il vecchio tuner analogico, per testarlo era stato sufficente un potenziometro ed un'alimentatore a 30V, ora bisogna diventare programmatori pure per vedere se qualcosa funziona o no ... :P

EDIT: mi sono appena reso conto che nella confusione non ho neppure accennato a quello che volevo farci, chissa' che magari non esista gia ... analizzatore di spettro "economico" da 40 ad 860MHz (da 0, con un'upconverter in ingresso), con il gruppo sintonia e rampe pilotato da Arduino ed un'oscilloscopio come uscita ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

astrobeed

Ok, e quali utensili devo usare, per fare 'sto porting ? ... fresa, trapano, rettifica, tornio, alesatrice, lapidello ? ... :P :P :P
Basta che disegni il tutto con Inventor e poi lo dai in pasto alla CNC  :smiley-mr-green:

Quote
Accidenti alla modernizzazione, con il vecchio tuner analogico, per testarlo era stato sufficente un potenziometro ed un'alimentatore a 30V, ora bisogna diventare programmatori pure per vedere se qualcosa funziona o no ... :P
L'interfaccia digitale permette un controllo maggiore rispetto a quella analogica dei tempi passati, per contro richiede il lavoro di un programmatore con esperienza specifica.
Vedo se riesco a farti io il porting per Arduino, però non mi mettere fretta  :)
Scientia potentia est

PaoloP

#5
Oct 29, 2014, 12:26 pm Last Edit: Oct 29, 2014, 01:04 pm by PaoloP
C'è ancora molto da lavorare e non so nemmeno se le sostituzioni che ho fatto possano funzionare.

Code: [Select]
#include "Wire.h"

void setup()
{
Wire.begin(66);
}

void loop()
{

}


/* I2C bus the LNB control procedures (PLL chip TSA5522 series) */
// ------------------------------------------------ -------------------------- / /
// Source public / /
// (C) Copyright 2001 - 2003 xuwenjun /
// All Rights Reserved / /
// V1.00 / /
// ------------------------------------------------ -------------------------- / /
// Title: I2C Bus tuner control program (PLL chip TSA5522 series) / /
// File name: xwj_fi1256.c / /
// Version: V1.00 / /
// Modified by: Xu Wenjun E - mail at: xuwenjun@21cn.com / /
// Date: 06 - 02 - 26 Initial Public / /
// Description: I2C Bus tuner control program (PLL chip TSA5522 series) / /
// Declare:
//
// The following code is only provided free of charge to learning purposes, but must be declared in the file referenced or modified Source / /
// For commercial use please contact the author. E - mail: xuwenjun@21cn.com / /
// Please the mailto xuwenjun@21cn.com I welcome the exchange! / /
// ------------------------------------------------ -------------------------- / /
// The old version: no old version of the file name:
//
// Create: Xu Wenjun E - mail: xuwenjun@21cn.com / /
// Date: 06 - 02 - 26 / /
// Description:
//
// ------------------------------------------------ -------------------------- //

/* Frequency for KHz */
/* image of the TV-IF signal of the IF frequency is 38MHz. Audio intermediate frequency signal is 6.5MHz. */
#define FUENCY 38900UL
/* high frequency data bytes */
#define PLLdataH(f) ((f + FUENCY) * 16 / 1000 / 256)
/* low frequency data 2 bytes */
#define PLLdataL(f) ((f + FUENCY) * 16 / 1000 % 256)
/* control word 1 byte */
#define PLLCON1 0x8e

/* Control word 4 bytes */
#define PLLcon2(f) (((f)<(168000UL))?(0xA0):(((f)>(450000UL))?(0x90):(0x30)))
#define PLLdata3(fchan) PLLdataH(fchan), PLLdataL(fchan), PLLcon2(fchan)

unsigned char ucdataTab [] [3] =
{
PLLdata3(49750), /* channel DS1 (VL) */
PLLdata3(57750), /* Channel DS2 */
PLLdata3(65750), /* Channel DS3 */
PLLdata3(77250), /* Channel DS4 */
PLLdata3(85250), /* Channel DS5 */
PLLdata3(112250), /* Channel Z1 */
PLLdata3(120250), /* Channel Z2 */
PLLdata3(128250), /* Channel Z3 */
PLLdata3(136250), /* Channel Z4 */
PLLdata3(144250), /* Channel Z5 */
PLLdata3(152250), /* Channel Z6 */
PLLdata3(160250), /* Channel Z7 */

PLLdata3 (168250), /* Channel DS6 (VH) */
PLLdata3 (176250), /* Channel DS7 */
PLLdata3 (184250), /* Channel DS8 */
PLLdata3 (192250), /* Channel DS9 */
PLLdata3 (200250), /* Channel DS10 */
PLLdata3 (208250), /* Channel DS11 */
PLLdata3 (216250), /* Channel DS12 */
PLLdata3 (224250), /* Channel Z8 */
PLLdata3 (232250), /* Channel Z9 */
PLLdata3 (240250), /* Channel Z10 */
PLLdata3 (248250), /* Channel Z11 */
PLLdata3 (256250), /* Channel Z12 */
PLLdata3 (264250), /* Channel Z13 */
PLLdata3 (272250), /* Channel Z14 */
PLLdata3 (280250), /* Channel Z15 */
PLLdata3 (288250), /* Channel Z16 */
PLLdata3 (296250), /* Channel Z17 paragraphs */
PLLdata3 (304250), /* Channel Z18 */
PLLdata3 (312250), /* Channel Z19 */
PLLdata3 (320250), /* Channel Z20 */
PLLdata3 (328250), /* Channel Z21 */
PLLdata3 (336250), /* Channel Z22 */
PLLdata3 (344250), /* Channel Z23 */
PLLdata3 (352250), /* Channel Z24 */
PLLdata3 (360250), /* Channel Z25 */
PLLdata3 (368250), /* Channel Z26 */
PLLdata3 (376250), /* Channel Z27 */
PLLdata3 (384250), /* Channel Z28 */
PLLdata3 (392250), /* Channel Z29 */
PLLdata3 (400250), /* Channel Z30 */
PLLdata3 (408250), /* Channel Z31 */
PLLdata3 (416250), /* Channel Z32 */
PLLdata3 (424250), /* Channel Z33 */
PLLdata3 (432250), /* Channel Z34 */
PLLdata3 (440250), /* Channel Z35 */
PLLdata3 (448250), /* Channel Z36 */

PLLdata3 (456250), /* Channel Z37 (UHF) */
PLLdata3 (464250), /* Channel Z38 */
PLLdata3 (471250), /* Channel DS13 */
PLLdata3 (479250), /* Channel DS14 */
PLLdata3 (487250), /* Channel DS15 */
PLLdata3 (495250), /* Channel DS16 */
PLLdata3 (503250), /* Channel DS17 */
PLLdata3 (511250), /* Channel DS18 */
PLLdata3 (519250), /* Channel DS19 */
PLLdata3 (527250), /* Channel DS20 */
PLLdata3 (535250), /* Channel DS21 */
PLLdata3 (543250), /* Channel DS22 */
PLLdata3 (551250), /* Channel DS23 */
PLLdata3 (559250), /* Channel DS24 */
PLLdata3 (607250), /* Channel DS25 */
PLLdata3 (615250), /* Channel DS26 */
PLLdata3 (623250), /* Channel DS27 */
PLLdata3 (631250), /* Channel DS28 */
PLLdata3 (639250), /* Channel DS29 */
PLLdata3 (647250), /* Channel DS30 */
PLLdata3 (655250), /* Channel DS31 */
PLLdata3 (663250), /* Channel DS32 */
PLLdata3 (671250), /* Channel DS33 */
PLLdata3 (679250), /* Channel DS34 */
PLLdata3 (687250), /* Channel DS35 */
PLLdata3 (695250), /* Channel DS36 */
PLLdata3 (703250), /* Channel DS37 */
PLLdata3 (711250), /* Channel DS38 */
PLLdata3 (719250), /* Channel DS39 */
PLLdata3 (727250), /* Channel DS40 */
PLLdata3 (735250), /* Channel DS41 */
PLLdata3 (743250), /* Channel DS42 */
PLLdata3 (751250), /* Channel DS43 */
PLLdata3 (759250), /* Channel Measures affecting consumer photographic */
PLLdata3 (767250), /* Channel DS45 */
PLLdata3 (775250), /* Channel DS46 */
PLLdata3 (783250), /* Channel DS47 */
PLLdata3 (791250), /* Channel DS48 */
PLLdata3 (799250), /* Channel DS49 */
PLLdata3 (807250), /* Channel DS50 */
PLLdata3 (815250), /* Channel DS51 */
PLLdata3 (823250), /* Channel DS52 */
PLLdata3 (831250), /* Channel DS53 */
PLLdata3 (839250), /* Channel DS54 */
PLLdata3 (847250), /* Channel DS55 */
PLLdata3 (855250), /* Channel DS56 */
PLLdata3 (863250), /* Channel DS57 */

PLLdata3 (90100 - 6500), /* economic units (FM radio) */
PLLdata3 (91000 - 6500), /* economy */
PLLdata3 (91800 - 6500), /* traffic */
PLLdata3 (97500 - 6500), /* and Taiwan */
PLLdata3 (100300 - 6500), /* traffic */
PLLdata3 (103200 - 6500), /* News Channel */
PLLdata3 (105000 - 6500), /* the Xingsha of sound */
PLLdata3 (106500 - 6500), /* Music */
};

/* I2C variable */
#define AddPllWr 0xc2 /*TSA5522 write address */
#define AddPllRd 0xc3 /*TSA5522 read address */

// sbit SDA = P0 ^ 4; /* Serial Data ---------- - P0 .4 */
// sbit SCL = P0 ^ 5; /* Serial Clock ---------- - P0 .5 */

/* I2C function */
void Start (void);
void Stop (void);
void SendACK (void);
void SendNoACK (void);

unsigned char sendByte (unsigned char d);
unsigned char readByte (void);
void SetChan (unsigned char chan);
unsigned char ReadChan (void);

/* -------- Select the channel -------------------------------------- ------ */
void SetChan (unsigned char chan)
{
Start (); /* Send the I2C bus START condition */
SendByte (AddPllWr); /* Send the controller bus write address */
SendByte (ucdataTab [chan] [0]); /* send high frequency data bytes */
SendByte (ucdataTab [chan] [1]); /* send low frequency data bytes */
SendByte (PLLCON1); /* send control word 1 byte */
SendByte (ucdataTab [chan] [2]); /* send control word 1 byte */
Stop (); /* Send the I2C bus stop condition */
}

/* ---------- - Read Status ---------------------------------- - ---------- - */
unsigned char ReadChan (void)
{
unsigned char i;
Start (); /* Send the I2C bus START condition */
SendByte (AddPllRd); /* Send the controller bus read address */
i = readByte ();
SendNoACK (); /* last byte, send non - response signal */
Stop (); /* Send the I2C bus stop condition */
return (i);
}

/* ------------ Byte data transfer subroutine to send a byte of data or address to the controller -------------- - */
unsigned char SendByte (unsigned char a)
{
Wire.write(byte(a));
return 0;
}

/* ------------------------------------------------ -------------------------- - */
unsigned char ReadByte (void) /* data reception subroutine receives a byte of data from the controller */
{
unsigned char Sin;
Sin = Wire.read();
return Sin;
}

/* ---------- - Send an Acknowledge bit ---------------------------------- ---------------- */
void SendACK ()
{
Wire.write(byte(0x01));
}

/* ------------ Send non - acknowledge bit -------------------------------- -------------- - */
void SendNoACK ()
{
Wire.write(byte(0x00));
}

/* ------------------------------------------------ -------------------------- - */
void Start (void) /* START start the I2C bus subroutine send I2C start condition */
{
Wire.beginTransmission(66);
}

/* ---------- - STOP Stop the I2C bus subroutine to send I2C bus stop condition ------------------ - */
void Stop (void)
{
Wire.endTransmission(66);

}

Etemenanki

Fretta ? ... ma scherziamo, figurati, puoi farlo quando vuoi tu, anche per ieri ... :P :D

Seriamente, ti ringrazio, fretta non ne ho per nulla, la mia e' un'idea che mi e' venuta un paio di mesi fa, e solo adesso ho trovato un tuner decente, quindi e' piu che altro un passatempo ... in sostanza volevo provare a costruirmi uno strumento che fosse un po piu preciso di quello che avevo realizzato una ventina di anni fa in modo totalmente analogico, molto piu semplice da realizzare, ma allo stesso tempo senza precise indicazioni (avevo usato un tuner philips "pre-production sample" U616/256, pilotandolo con una rampa realizzata con un paio di operazionali, con una seconda conversione fatta con il vecchio SO42P ed un finale realizzato con il CA3089, mi sembra ... lui poveraccio funzionava (e probabilmente funzionerebbe ancora, se mi ricordassi in quale scatolone l'ho riposto :P), ma era tutto "a orecchio", perche' non c'era modo di sapere esattamente a quale frequenza era regolato, solo a spanne ...

Fondamentalmente la mia idea attuale era di rifare qualcosa di simile, ma usando uno dei tuner piu "moderni", in modo da poter sia pilotare la "rampa" via I2C, e quindi dargli dei valori precisi, scelti da chi lo usa, ed allo stesso tempo (in seguito, se il tutto funzionasse), visualizzare anche su un display a parte sia la frequenza di centro banda che l'ampiezza della banda esaminata ... sarebbe sempre uno strumento "indicativo", non certo preciso come quelli moderni e professionali, ma sempre piu preciso di uno senza indicazioni, e magari potrebbe essere utile anche a qualcun'altro ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

astrobeed

C'è ancora molto da lavorare e non so nemmeno se le sostituzioni che ho fatto possano funzionare.
Se compila senza errori è già un buon punto di partenza.
Scientia potentia est

Etemenanki

Intanto grazie, mi stampo il tutto e cerco di provare a capire come dovrebbe funzionare ... cosi ad occhio, mi sembra di aver capito che prima crea una tabella di canali, e poi li seleziona dalla tabella, per inviarli al chip, invece di mandargli le frequenze ... credo che sia comunque un punto di partenza per cercare di capire come mandargli dati direttamente (dovrebbe essere la parte dei sendbyte, se non erro), dato che se voglio farlo funzionare come analizzatore di spettro, dovro' poi inviargli delle sequenze dirette di frequenze "in scala", una specie di rampa a salire, che si ripeat ciclicamente, nella quale l'utente dovra' poter selezionare frequenza iniziale e finale ,,, ma per ora sarebbe gia tanto riuscire a mandargli una frequenza e vedere se riceve qualcosa, per me ... non ho ben presente l'utilita' della parte read, quella che dovrebbe leggere dal chip, pero' ... e' per controllare che i sendbyte abbiano scritto correttamente prima ?

Un'altra cosa, vedo che si accenna anche alla portante audio, nello script ... e' indispensabile, o potrebbe essere rimossa ? ... perche' se fosse necessario, potrei anche eliminare fisicamente la parte frontend del tuner (quella che monta il filtro SAW ed il TDA4472) e montarci dentro la seconda conversione nello spazio liberato (in fondo la mia idea e' di farci un'analizzatore di spettro, non una TV ;))

Non sarebbe difficile, perche' all'interno dello scatolotto, le due sezioni sono gia su due stampati separati ... e da quello del tuner vero e proprio escono gia , mi sembra, tutti i possibili segnali necessari, a livello hardware ... AGC, le due uscite filtrate di IF del 5737, piu un paio di segnali che escono dal 5522, anche se non ho ancora scoperto da quale pin, perche' passano sotto a troppa roba (sono marcate "L'/L" , "BG/L" e "AFT", se la Sony ha rispettato le sigle standard, cosa di cui non sono sicuro, accidenti a loro che non pubblicano i datasheet dei tuner, AFT dovrebbe essere "automatic frequency tuning", un feedback che non dovrebbe servirmi a nulla ... gli altri due ancora non so) ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

PaoloP

Quello messo è solo un insieme di funzioni di inizializzazione.
Manca tutta la parte di invio dei dati da scrivere nel loop().

Teoricamente tutte quelle funzioni possono essere spostate in un file .h che poi a sua volta viene incluso nello sketch.
Per la frequenza non ho idea perché non conosco il funzionamento dell'integrato.
Ho solo riscritto il codice un po' a sentimento in modo che fosse compilabile.

PaoloP

#10
Oct 29, 2014, 05:31 pm Last Edit: Oct 29, 2014, 05:38 pm by PaoloP
Ci sto lavorando qui
--> https://codebender.cc/sketch:57584

Edit: Ho diviso il programma in 2 e scritto uno sketch minimale.
Dimmi se da segni di vita. :-)

PaoloP

Puoi collegare il componente e lanciare questo:

--> http://playground.arduino.cc/Main/I2cScanner

Vorrei sapere gli indirizzi corretti.

Etemenanki

Ora non riesco perche' sono al lavoro, domani provo a tirare in piedi tutto e ti so dire ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

elrospo

Ok, suppongo che significhi che non ci sono librerie del genere ... quindi provo a cambiare la domanda ...

Avendo il datasheet, nella sezione del protocollo di comunicazione a pagina 6, e' indicato qualcosa sul tipo di dati da mandare al chip ... secondo voi, come potrei fare a mandargli qualcosa e fare degli esperimenti, usando Arduino come pilota ? ... che genere di sketch potrebbe essere utile ?

Se qualcuno risponde, per favore si ricordi che sta parlando ad un "meccanico", non ad un programmatore ... termini semplici, per favore ;)
"meccanicamente" parlando ....  sei sicuro  che cosa  è questo integrato?
è un pezzo di un sintonizzatore tv
e un PLL 
DA SOLO NON CI FAI NULLA,

ci va l'oscillatore con i varicap  che viene pilotato tramite una tensione su i varicap da questo integrato

anche se c'è scritto sintetizzatore  non sputa nessuna frequenza da solo


astrobeed

meccanicamente" parlando ....  sei sicuro  che cosa  è questo integrato?
Magari ha un modulo sintonizzatore già fatto che monta questo IC.
Scientia potentia est

Go Up