question i2c
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

question i2c



  1. #1
    sat666

    question i2c


    ------

    Bonjour
    Je voudrais commander un tuner tv genre uv916 en i2c avec un pic
    et j'ai utilisé un soft de freddospages.nl en .Hex , l'asm n'est pas disponible
    ces tuners ont 5 registres i2c
    1_ l'adresse
    2_divider byte 1
    3_divider byte 2
    4_control byte 1
    5_control byte 2
    le probleme est qu'il ne commute pas entre les 3 bandes , il reste toujours sur UHF
    ma question :lors de la mise en route de l'ensemble le maitre envoie t'il les 5 bytes de suite ou seulement l'adresse ? et lors d'un changement de frequence
    les 5 bytes sont'ils envoyés ? ou seul les bytes concernés
    si certain ont des softs ou docs pour pic en asm pour commander ces tuners tv à base de tsa5511
    merci d'avance

    -----

  2. #2
    invite035d53c2

    Re : question i2c

    Bonjour,

    Ayant réalisé ce type de communication il y a quelques années avec un PIC16F877a en ASM pour faire de la démodulation FSK (je regarderai si je peux retrouver cela en fin de journée), d'après mes souvenirs, la communication ne doit pas dépasser les 100kHz sinon le tuner ne prend pas en compte les données envoyées (j'avais essayé en 400kHz).

    Je m'étais basé sur les explications du site suivant : http://hem.passagen.se/communication/uv916rec.html ainsi que du datasheet du synthesizer donné en fin de page.

    Cordialement.

  3. #3
    sat666

    Re : question i2c

    Merci Sebastien pour la reponse

    Je connais le site qui est tres interessant mais l'auteur utilise exclusivement le pc pour la commande et non un pic
    si vous retrouver votre projet en asm ça m'aiderai bien
    car come je disais je n'ai que des fichiers Hex et en dessassenblant
    tout ça c'est pas toujours facile à comprendre
    la vitesse du bus doit être bonne car l'adresse et la frequence fonctionnent
    seul la commutation de bandes ne marche pas
    pour info dans le tuner il y a un tsa5511 et un tda 5330
    pour commutter la broche 12 doit prendre les valeur 0-1,1v__1,6-2,4v__3-5v
    chez moi c'est en permanence à 7v donc en UHF

    salutations

  4. #4
    invite035d53c2

    Re : question i2c

    Bonjour,

    Le synthétiseur du tuner est capable de produire une fréquence pouvant varier de 0 à 1,3 GHz et ce, par pas de 62,5 kHz. Il est nécessaire de lui envoyer cinq octets, qui lui permettent :
    - d’être adressé.
    - de sélectionner la fréquence à synthétiser.
    - de choisir le courant de charge.
    - de programmer les huit ports de sortie (choix du filtre d’entrée et du mixer).

    Table 1 :

    Le premier octet sert à définir l’adresse. Il y a quatre choix possibles pour les registres MA1 et MA0, suivant les tensions appliquées au composant (table 4).
    J'ai choisi de laisser le composant toujours actif, soit respectivement 0 et 1 pour MA1 et MA0, indépendamment de la tension à la borne 3 du composant.

    Les deux registres suivants permettent d’obtenir la fréquence désirée, qui sera placée à l’une des entrées du mixer. Pour obtenir la fréquence, il faut donner la valeur adéquate aux bits N0 à N14. Pour connaître les valeurs à envoyer sur le bus I²C, il faut diviser la fréquence désirée successivement par 8 et par 7812,5.

    Pour le troisième registre, quatre bits sont variables : CP, T1, T0 et OS.
    Le bit CP permet de choisir le courant de charge. Si le bit est à zéro, la consommation est de 50µA, permettant d’avoir un bon tuning. La mise à 1 provoque une consommation plus importante, de 220µA, permettant d’avoir un tuning rapide.
    En utilisation normale du tuner, les bits T1, T0 et OS sont mis à l’état bas.

    Le dernier registre sert à définir les sorties du TCA5512, qui permettent de choisir le type de filtre passe-bande qui sera appliqué au signal d’entrée, avant d’être injecté à l’entrée du mixer.
    Filtre 1 : 45 - 180 MHz (60 en hexa)
    Filtre 2 : 160 - 470 MHz (90 en hexa)
    Filtre 3 : 430 - 860 MHz (30 en hexa)
    Je n'ai utilisé que le filtre 1, pour les autres je n'ai pas testé.

    Pour le soft, j'ai utilisé un PIC16F877a cadencé à 8MHz.

    #define LC01ADDR B'11000010' ; Sample value for ADDRESS BYTE
    #define LC01DATA B'00000111' ; Data
    #define LC02DATA B'11101010' ; Data
    #define LC03DATA B'10001110' ; Bon tunning
    #define LC04DATA B'01100000' ; Filtre passe bande bas
    #define FOSC D'8000' ; Oscillator Clock in kHz

    I2C_ON
    ; *** Setup Registers for I2C ***
    ; Configure MSSP module for Master Mode
    BANKSEL SSPCON
    movlw B'00101000' ; Enables MSSP and uses appropriate
    ; PORTC pins for I2C mode (SSPEN set) AND
    ; Enables I2C Master Mode (SSPMx bits)
    movwf SSPCON ; This is loaded into SSPCON


    ; Configure Input Levels and slew rate as I2C Standard Levels
    BANKSEL SSPSTAT
    movlw B'10000000' ; Slew Rate control (SMP) set for 100kHz
    movwf SSPSTAT ; mode and input levels are I2C spec,
    ; loaded in SSPSTAT

    ; Configure Baud Rate
    BANKSEL SSPADD
    movlw (FOSC / (4 * BAUD)) - 1 ; Calculates SSPADD Setting for
    movwf SSPADD

    bcf STATUS, RP1 ; Retour en bank 0
    bcf STATUS, RP0
    return


    ; *** Begin I2C Data Transfer Sequences ***
    I2CWrite

    ; Send START condition and wait for it to complete
    BANKSEL SSPCON2 ; BANK 1
    bsf SSPCON2,SEN ; Generate START Condition
    call WaitMSSP ; Wait for I2C operation to complete

    ;***************************** ****************************** **************************

    movlw LC01ADDR ; Load Address Byte
    call Send_I2C_Byte ; Send Byte
    call WaitMSSP ; Wait for I2C operation to complete

    BANKSEL SSPCON2
    btfsc SSPCON2,ACKSTAT ; Check ACK Status bit to see if I2C
    goto I2CFail ; failed, skipped if successful

    ;***************************** ****************************** ****************************

    bcf STATUS, RP1
    bcf STATUS, RP0
    movf DATA1, 0
    call Send_I2C_Byte ; Send Byte
    call WaitMSSP ; Wait for I2C operation to complete

    BANKSEL SSPCON2
    btfsc SSPCON2,ACKSTAT ; Check ACK Status bit to see if I2C
    goto I2CFail ; failed, skipped if successful

    ;***************************** ****************************** *****************************

    bcf STATUS, RP1
    bcf STATUS, RP0
    movf DATA2, 0
    call Send_I2C_Byte ; Send Byte
    call WaitMSSP ; Wait for I2C operation to complete

    BANKSEL SSPCON2
    btfsc SSPCON2,ACKSTAT ; Check ACK Status bit to see if I2C
    goto I2CFail ; failed, skipped if successful

    ;***************************** ****************************** ******************************

    movlw LC03DATA ; Load Data Byte
    call Send_I2C_Byte ; Send Byte
    call WaitMSSP ; Wait for I2C operation to complete

    BANKSEL SSPCON2
    btfsc SSPCON2,ACKSTAT ; Check ACK Status bit to see if I2C
    goto I2CFail ; failed, skipped if successful

    ;***************************** ****************************** ****************************** **

    movlw LC04DATA ; Load Data Byte
    call Send_I2C_Byte ; Send Byte
    call WaitMSSP ; Wait for I2C operation to complete

    BANKSEL SSPCON2
    btfsc SSPCON2,ACKSTAT ; Check ACK Status bit to see if I2C
    goto I2CFail ; failed, skipped if successful

    ;***************************** ****************************** ****************************

    ; Send and Check the STOP condition, wait for it to complete
    BANKSEL SSPCON2
    bsf SSPCON2,PEN ; Send STOP condition
    call WaitMSSP ; Wait for I2C operation to complete
    bcf STATUS, RP1
    bcf STATUS, RP0
    btfsc PORTB, 1 ; Test Tuner
    call i2c_ok
    return

    ; This routine waits for the last I2C operation to complete.
    ; It does this by polling the SSPIF flag in PIR1.
    WaitMSSP
    BANKSEL PIR1 ; BANK 0
    bsf PORTC, 1
    btfss PIR1,SSPIF ; Check if done with I2C operation
    goto $-1 ; I2C module is not ready yet
    bcf PIR1,SSPIF ; I2C module is ready, clear flag.
    return


    ; This routine sends the W register to SSPBUF, thus transmitting a byte.
    ; Then, the SSPIF flag is checked to ensure the byte has been sent successfully.
    ; When that has completed, the routine exits, and executes normal code.
    Send_I2C_Byte
    BANKSEL SSPBUF ; BANK 0
    movwf SSPBUF ; Get value to send from W, put in SSPBUF
    return

    Les routines de communication sont celles fournies sur le site de Microchip.

    Cordialement

  5. A voir en vidéo sur Futura
  6. #5
    sat666

    Re : question i2c

    bonjour
    merci pour le soft
    J'ai etudié un peu le listing mais j'ai quelques lacunes , j'ai l'impression que le
    prog. n'est pas complet car il y a des renvois qui n'aboutissent nul part
    comme I2Cfail
    les data1 et 2 sont les bytes de frequence je pense ,
    mais la frequence est'elle fixe ?
    pouvez vous me donner le mode de fonctionnnement de votre programme ?

    salutations

  7. #6
    invite035d53c2

    Re : question i2c

    Bonjour,

    Les fonctions i2c_fail et i2c_ok sont des fonctions qui affichent un message sur un écran LCD pour le dépannage de l'application de l'époque.

    Les bouts de code fournis ne sont pas le programme complet, je n'ai donné que des fonctions de base qui servent à faire fonctionner le tuner et la définition des constantes. Dans l'application que j'ai dû réalisé à l'époque, il y a d'autres fonctions propres à des décodages propriétaires de trames modulées en FSK, des mesures de niveaux en dBmV, des commandes de leds en fonctions de certains cas, la commande d'un afficheur LCD, des gestions de TimeOut etc...

    Les constantes DATA1 et DATA2 sont les données pour une seule fréquence en effet. Je devais travailler avec deux fréquences, donc suivant les cas, j'écrivais la fréquence désirée dans les variables DATA1 et DATA2.

    Une petite chose. Les registres utilisés sont ceux d'un PIC16F877a qui a un master i2c hardware, et tous les PIC ne sont pas dotés de ce module, donc si tu travailles avec un modèle différent, tu devras peut-être générer tes trames toi-même.

    Pour le fonctionnement du programme. Tu définis ton modèle de PIC, les constantes avec lesquelles tu vas travailler, la configuration avec la directive __CONFIG (...) et ensuite tes variables. Tout est très bien expliqué dans le premier cours de Bigonoff et l'i2c master est expliqué dans la seconde partie (et sur le site de Microchip également où il y a un pdf explicatif).
    En début de programme, tu lances la fonction i2c_on pour activer l'i2c (ou tu recopies le code tel quel dans ton programme). Ensuite, tu mets ce que tu veux dans les variables DATA1 et DATA2 suivant ton application. N'ayant ni besoin de travailler par interruption ni de changer régulièrement de fréquence en ce qui concerne l'UV916, les routines fournies précédemment me suffisait amplement. A toi d'adapter en fonction de ton cahier des charges.

    Cordialement.

Discussions similaires

  1. Protocole I2C
    Par invite6ab74433 dans le forum Électronique
    Réponses: 1
    Dernier message: 12/04/2008, 18h19
  2. Question bête I2C
    Par invite086a6236 dans le forum Électronique
    Réponses: 15
    Dernier message: 30/01/2008, 15h49
  3. I2c
    Par Olfox dans le forum Électronique
    Réponses: 16
    Dernier message: 03/08/2007, 23h11
  4. i2c
    Par invite83855357 dans le forum Électronique
    Réponses: 15
    Dernier message: 23/01/2007, 13h32
  5. I2c
    Par inviteacb3e291 dans le forum Électronique
    Réponses: 5
    Dernier message: 17/06/2005, 14h03
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...