Home Forum MICROCONTROLLORI pilotaggio ADC7680

Questo argomento contiene 6 risposte, ha 3 partecipanti, ed è stato aggiornato da  divivoma 1 anno, 6 mesi fa.

Stai vedendo 7 articoli - dal 1 a 7 (di 7 totali)
  • Autore
    Articoli
  • #59171

    giazax
    Membro

    Salve a tutti,
    sono alle prese con il pilotaggio di un ADC – l’AD7680, dalla lettura del datasheet ho capito (almeno credo) che per effettuare una lettura ci vogliono 20 cicli di clock….insomma per farvela breve avevo pensato di scrivere un codice di questo tipo (lo riporto qui sotto) per potermi interfacciare (bitbanging)… oppure c’è qualcosa di più “pulito” che posso utilizzare? che cosa ne pensate?

    saluti e grazie

    Codice funzione di lettura dall’ADC

    unsigned short LeggiADC()
    {
    unsigned short app;

    app=0u;

    //Abilitiamo l’ADC
    SPI_SS_ADC_ON

    //i primi 4 bit in uscita sono tutti zero — Rif. Datasheet
    SPI2_SCKw=0; SPI2_SCKw=1;
    SPI2_SCKw=0; SPI2_SCKw=1;
    SPI2_SCKw=0; SPI2_SCKw=1;
    SPI2_SCKw=0; SPI2_SCKw=1;

    //pilotiamo il clock e scriviamo i 16 utili

    //MSB First
    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x8000;
    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x4000;
    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x2000;
    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x1000;

    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x800;
    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x400;
    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x200;
    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x100;
    //LSB
    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x80;
    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x40;
    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x20;
    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x10;

    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x08;
    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x04;
    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x02;
    SPI2_SCKw=0; SPI2_SCKw=1; app|=0x01;

    //Chiudiamo il sensore
    SPI_SS_ADC_OFF

    return app;

    }

    #71841
    Piero Boccadoro
    Piero Boccadoro
    Partecipante

    Sul discorso dei cicli di clock hai capito bene: ne servono 20 per avere un dato valido.
    Infatti dice esplicitamente: “A minimum of 20 serial clock cycles are required to perform the conversion process and to access data from the AD7680″.

    Per quanto riguarda il codice mi sembra abbastanza pulito ma non ho capito l’inizializzazione di app…

    #71843

    giazax
    Membro

    Grazie per le tue osservazioni…per quanto riguarda app è per l’appunto una inzializzazione…perchè dici che è sbagliato?

    un saluto

    #71844
    Piero Boccadoro
    Piero Boccadoro
    Partecipante

    No no, non volevo dire che è sbagliato ma solo capire…
    Dunque, la funzione che tu stai scrivendo restituisce app che immagino poi userai nel main assegnando il suo valore ad una variabile.
    La mia domanda è: ti è più utile avere una variabile locale o non ti sarebbe più comoda una variabile globale da passare alla funzione per assegnarle un valore nello scope?

    Certo, si tratta di una domanda fatta da uno che il tuo codice non lo conosce proprio se non per questa funzione ma era pura curiosità, non una critica :)

    #71845

    giazax
    Membro

    Ciao,
    premetto che non sono un firmwarista (..l’avrai capito :-) ) so per esperienza che e’ meglio non utilizzare variabili globali…sia per questioni di leggibilita’ del codice ma anche perche’ con le variabili globali e’ molto facile incorrere in errori…questo codice fa parte di un codice molto piu’ complesso…..non fatto da me tranne che per alcune funzionalita’…..

    un saluto
    g.

    #71846
    Piero Boccadoro
    Piero Boccadoro
    Partecipante

    Ah ok, se ti devi “inserire” in un codice non tuo allora si :)
    Perchè onestamente io cerco di utilizzare, quando possibile, variabili globali per via del fatto che trovo comodo preallocare tutto in memoria ed utilizzare all’occorrenza variabili che non cambino nome e che rischiano di sporcare il codice…
    Con questa politica anche riprendere in mano un vecchio programma diventa molto semplice.
    Però è sempre una questione di scelte e, forse, anche di abitudine :D

    #73299

    divivoma
    Membro

    Non vedo ritardi tra l’alzare e abbassare il clock…
    Io ci metterei una: delay(T_clk) tra le due funzioni..

Stai vedendo 7 articoli - dal 1 a 7 (di 7 totali)

Devi aver eseguito l’accesso per poter rispondere a questa discussione.