Uso MUX analogico!

Salve ragazzi! Vi espongo il problema:

Ho un pic con un ingresso analogico e molti digitali. Dovrei collegare ad esso 8 segnali analogici, come faccio? uso un mux a

8 ingressi direte voi, ok! Usiamo il mux a 8 ingressi, ma come si usa? :) Io ho capito che i segnali analogici devono andare all'ingresso del mux, poi da esso esce un'uscita anche essa analogica e 3 digitali. Collego l'uscita analogica del mux al piedino di ingresso analogico del pic e le tre uscite digitali del mux a 3 piedini di ingresso digitale. OK?

Poi viene la parte tozza: il software del pic! Se volessi ad esempio sapere che valore ha la terza entrata? come devo fare a livello di software? In particolare mi servirebbe un algoritmo che tiene sotto controllo tutte e 8 le entrate (che dovrebbero rimanere costantemente basse) appena una di esse sale sopra una certa soglia dovrebbe accorgersi e mandare un segnale, poi nonappena questa torna bassa come era prima dovrebbe rimandare un altro segnale. Il diagramma a blocchi sarebbe:

1) controlla che tutte le entrate siano basse 2) se un'entrata si alza manda un determinato segnale (in funzione di quale e' l'entrata che si e' alzata) 3) quando l'entrata si riabbassa manda un altro segnale (smpre in funzione dell'entrata) 4) torna a 1

Nel caso di una sola entrata (senza usare il mux quindi) le cose son piu' facili e in C il programmino ha questo aspetto:

void main() { int value=0; setup_adc_ports(AN0); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0); while (TRUE) { while (value128) {value=read_adc();} } }

Come posso generalizzare la cosa con 8 entrate muxate? Grazie

Mic

Reply to
Michelangelo
Loading thread data ...

Michelangelo ha scritto:

mi sono accorto che avevo complificato un po' il codice, questo e' piu' lineare:

void main() { int value=0; setup_adc_ports(AN0); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0); while (TRUE) { while (value128) {value=read_adc();} sendsignallow(); } }

Ho abbozzato un'idea per il caso con piu' ingressi ma mi sa che non e' buona...

void main() { int value=0; int1 a,b,c int8 mask; setup_adc_ports(AN0); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0); while (TRUE) { while (value128) {value=read_adc();} switch (mask) { case 0 : sendsignallow1(); case 1 : sendsignallow2(); case 2 : sendsignallow3(); case 3 : sendsignallow4(); case 4 : sendsignallow5(); case 5 : sendsignallow6(); case 6 : sendsignallow7(); case 7 : sendsignallow8(); } } }

Il problema e' nel mandare il segnale in low, infatti quel while value>128 non e' mica sempre verificato dopo che si e' alzata un'entrata.... ci sono almeno altre 7 entrate per cui e' vera fin da subito.... help!

Reply to
Michelangelo

Michelangelo ha scritto:

Velocemente, direi che la cosa migliore =E8 gestire gli ingressi in polling e farsi una macchina a stati. Ad ogni campionamento aggiorni lo stato, in funzione di una soglia di riferimento, e in base allo stato attuale. Per esempio, se uno dei segnali va alto, poni il corrispondente bit della variabile di stato a 1. Se il segnale va basso (ma lo stato ti dice che precedentemente era alto) puoi mettere a 1 il (bit corrispondente + 8). Come noti, infatti, Status =E8 a 16 bit. Nello switch in fondo, decidi cosa fare in funzione del solo stato, senza preoccuparti del resto.

Inoltre, mi pare che se ne era gi=E0 parlato, esistono Pic con mux interno....

#define Wait_settling_time() (Delay_us(10)) // o qualcosa del genere... unsigned int 16 Status;

while (TRUE) { for (i=3D0;i Michelangelo ha scritto:

Reply to
simone.bern

di quale mux analogico stai parlando ? di norma per i mux i segnali digitali sono ingressi per cui vanno pilotati dal pic

dopo aver configurato l'adc interno ( una volta per tutte ) devi semplicemente dire al mux quale ingresso selezionare , aspettare un pochino perche' l'uscita analogica del mux su stabilizzi ed avviare la conversione.

poiche' sei tu a stabilire quale canale del mux stai usando per quella conversione hai tutte le infirmazioni necessarie per l'algoritmo di controllo successivo.

come ti hanno detto esistono anche pic con il multiplexer analogico interno e quindi con piu' canali , questo semplifica l'hardware.

Reply to
mmm

Parlo del 4067 che e' a 16 canali (avevo detto 8 per scrivere meno codice, in realta' mi servono almeno 10 ingressi se non 12) Essendo del tutto a 0 in questo campo non sapevo questa cosa fondamentale, ovvero che i mux hanno ingressi e non uscite digitali! Cio' mi chiarifica molto le idee!

Io pensavo che il mux mandasse il segnale analogico in uscita e i bit che specificano da quale ingresso viene quel segnale... invece quello che fa e' mandare in uscita il segnale analogico secondo corrispondente all'ingresso specificato dal pic attraverso i bit di controllo, giusto?

In questo caso penso di potermi arrangiare con un po' di codice da solo...

posso usare un algoritmo che mi controlli costantemente tutti gli ingressi e appena ne trova uno alto zack fa quello che deve fare finche' questo e' alto.... sisi ho gia' in mente come fare...

Si ma devo arrivare almeno a 10 se non a 12... non son tantini?

Grazie 1000 mi hai illuminato! :) Grazie anche a chi a simone.bern anche se non ci ho capito gran che nel suo algoritmo...

Reply to
Michelangelo

Michelangelo ha scritto:

PIC16F677 Datasheets Future Product 12 10-Bit PIC16F685 BuyDatasheets In Production 12 10-Bit PIC16F687 BuyDatasheets In Production 12 10-Bit PIC16F689 BuyDatasheets In Production 12 10-Bit PIC16F690 BuyDatasheets In Production 12 10-Bit PIC16F747 BuyDatasheets In Production 14 10-Bit PIC16F777 BuyDatasheets In Production 14 10-Bit PIC16F785 BuyDatasheets In Production 12 10-Bit PIC16F884 Datasheets Future Product 14 10-Bit PIC16F887 Datasheets Future Product 14 10-Bit PIC16HV785 BuyDatasheets In Production 12 10-Bit

formatting link

Reply to
simone.bern

forse leggere i datasheet dei componenti aiuta :-)

diciamo che questa e' la soluzione piu' semplice , il mux e' un oggetto MOLTO stupido

anche perche' spesso lo si tiene fisso in una certa posizione

piuttosto una cosa importante: controlla BENE i tempi di commutazione del mux che non sono istantanei per cui quasi certamente bisognera' introdurre un ritardo tra l'attivazione dei canali e l'avvio della conversione dell'ADC.

buon lavoro.

Reply to
mmm

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.