Go Down

Topic: Ardutester - Arduino Component Tester (INCOMPLETO) (Read 229889 times) previous topic - next topic

pighixxx

#75
May 03, 2013, 11:54 am Last Edit: May 03, 2013, 11:59 am by pighixxx Reason: 1

ho visto che includi due librerie solo se si vuole usare l'LCD, mi chiedevo se servisse veramente, perche' credo che se le librerie incluse non vengono usate nel codice compuque non vengono compilate giusto ? quindi potresti lasciarle e basta


Non è vero, prova a compilare con e senza #define LCD_PRINT


lo schema elettrico di questo shield ? perche' non lo posti insieme alla scheda nel primo post ? siamo in Megatopic mica bruscolini  :)


A dire la verità lo schema elettrico c'è al primo post  :D
Lo schema elettrico, pcb e quant'altro dello shield li posterò appena pronto.

pighixxx


(cut) dove c'è l'inizializzazione dell'ADC, prova ad inserire:
Code: [Select]
DIDR0 = 0b00111111; //DIDR0 - Digital Input Disable Register 0 - Disable digital input on analog pins
serve per disabilitare gli ingressi digitali collegati ai pin analogici che creano imprecisioni nelle letture.


L'ho inserito. Al momento non mi sembra notare nessuna differenza. Più tardi farò dei test più approfonditi

pighixxx

Sto terminando un altro set di schede ABC.
Stavo pensando di inserire nello shield dell'ArduTester anche un preamplificatore e un comparatore (Ho un'idea malsana  :D)

leo72

@Michele:
mettere il pin in input o output equivale comunque ad impostarne uno stato.
Disattivare il circuito digitale invece toglie proprio l'alimentazione a quel buffer, spengendolo del tutto.
Puoi disattivarlo anche per risparmiare corrente, se usi i pin Ax come analogici.
Datasheet cap 23.9.5

testato


Non è vero, prova a compilare con e senza #define LCD_PRINT


Come funziona di preciso questa storia ? ricordo di aver letto piu' volte che il compilatore scarta la roba che non serve, altrimenti gia' usare 3 o 4 librerie, anche senza fargli fare granche', dovrebbe occupare tutta la memoria.
Grazie degli eventuali chiarimenti

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

menniti


@Michele:
mettere il pin in input o output equivale comunque ad impostarne uno stato.
Disattivare il circuito digitale invece toglie proprio l'alimentazione a quel buffer, spengendolo del tutto.
Puoi disattivarlo anche per risparmiare corrente, se usi i pin Ax come analogici.
Datasheet cap 23.9.5

Il mio problema, nello specifico, non è il risparmio di corrente, visto che lo strumento ha un alimentatore addirittura interno al contenitore, ma solo quello di evitare fastidi all'unico pin ADC funzionante; mi era stato consigliato di mettere i pin in OUTPUT perché, se ho ben capito, questa manovra li avrebbe dissociati dall'ADC, e la cosa mi sembra plausibile; ora se questo è vero il mio problema è già risolto così com'è; se invece non è vero allora posso sempre spegnere i pin con quel comando. Ora la questione è: i pin analogici collegati al digitale subiscono disturbi? Non erano i pin analogici in sé che causavano fastidi ai fratelli utilizzati? Domanda: qal è la situazione migliore per usare un solo pin analogico senza avere disturbi di alcun genere?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

leo72


Domanda: qal è la situazione migliore per usare un solo pin analogico senza avere disturbi di alcun genere?

Mettere il filtro LC sul pin AVCC (fig. 24.9, pag. 250), non mettere il pin in output (curioso, perché il datasheet dice proprio che switchare su un pin analogico messo in output disturba la lettura analogica).

Relativamente al registro DIDR0, leggo che sarebbe consigliabile spengere il buffer digitale del relativo pin.

menniti



Domanda: qal è la situazione migliore per usare un solo pin analogico senza avere disturbi di alcun genere?

Mettere il filtro LC sul pin AVCC (fig. 24.9, pag. 250), non mettere il pin in output (curioso, perché il datasheet dice proprio che switchare su un pin analogico messo in output disturba la lettura analogica).

Relativamente al registro DIDR0, leggo che sarebbe consigliabile spengere il buffer digitale del relativo pin.

mi scuso con pighi, sembrerebbe OT ma in realtà la questione dell'ADC è fondamentale per qualsiasi circuito.... Sul filtro LC siamo d'accordo; la seconda frase, o meglio la parte tra () non l'ho capita; dove leggi la questione del DIDR0??
In conclusione invece di settare i pin A0-A4 (uso il solo A5) come OUTPUT mi basta mettere nello sketch
Code: [Select]
DIDR0 = 0b00111111; per spegnere il buffer ed ottengo il risultato migliore?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

pighixxx

@Michele
Nessun problema. Penso che tutti siano interessati alla cosa.

astrobeed


Come funziona di preciso questa storia ? ricordo di aver letto piu' volte che il compilatore scarta la roba che non serve


Semplicemente il compilatore non compila ciò che non viene usato, anche se metti l'include di una libreria in realtà non hai fatto altro che aggiungere una serie di prototipi e di define, se le varie funzioni previste dalla libreria non vengono esplicitamente usate nel programma il compilatore non le considera e rimangono fuori dall'eseguibile.
Estendendo il concetto, se includi una libreria con 100 funzioni e poi ne usi solo due il compilatore prenderà solo il codice di quelle due e lo inserisce nel tuo programma, tutto il resto rimane fuori.
Se prevedi una compilazione condizionale con gli #ifdef solo il codice contenuto nelle varie sezioni selezionate viene compilato indipendentemente dalle varie include e il reale utilizzo, nel codice, delle funzione in queste definite.

Scientia potentia est

leo72


mi scuso con pighi, sembrerebbe OT ma in realtà la questione dell'ADC è fondamentale per qualsiasi circuito.... Sul filtro LC siamo d'accordo; la seconda frase, o meglio la parte tra () non l'ho capita; dove leggi la questione del DIDR0??

Sul datasheet.
Leggo appunto che switchare su un pin analogico impostato come output digitale crea disturbi sulla conversione dell'ADC.
Ecco perché dico quindi che conviene spengere il buffer digitale, in questo modo su quel pin resta attiva solo la circuiteria del mux analogico.

Quote

In conclusione invece di settare i pin A0-A4 (uso il solo A5) come OUTPUT mi basta mettere nello sketch
Code: [Select]
DIDR0 = 0b00111111; per spegnere il buffer ed ottengo il risultato migliore?

Sì, proprio così.

testato

Grazie astro,
Ma se ho capito quindi stai agfermando la mia stessa cosa. A questo punto come mai i test di pighi vanno in senso opposto ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

pighixxx

#87
May 04, 2013, 08:30 am Last Edit: May 04, 2013, 08:47 am by pighixxx Reason: 1
16.874K contro i 15.094K senza il #define LCD_PRINT.
:D


edit:

0.6l in linea.
- Fix minori
- Digital functions on Analog pins disabled

gpb01


...
Semplicemente il compilatore non compila ciò che non viene usato, anche se metti l'include di una libreria in realtà non hai fatto altro che aggiungere una serie di prototipi e di define, se le varie funzioni previste dalla libreria non vengono esplicitamente usate nel programma il compilatore non le considera e rimangono fuori dall'eseguibile.
...


Astro, ma cosa succede se nella libreria hai dichiarato, al di fuori delle funzioni (che poi non usi), delle variabili statiche o delle costanti (sia in RAM che in PROGMEM) ? Ho idea che quelle il compilatore sia comunque costretto ad allocarle ...
.... il che spiegherebbe la cosa.

Guglielmo
Search is Your friend ... or I am Your enemy !

astrobeed


Astro, ma cosa succede se nella libreria hai dichiarato, al di fuori delle funzioni (che poi non usi), delle variabili statiche o delle costanti (sia in RAM che in PROGMEM) ? Ho idea che  quelle il compilatore sia comunque costretto ad allocarle ...
.... il che spiegherebbe la cosa.


Nelle librerie non si dovrebbero mai allocare delle variabili globali, anche perché il compilatore potrebbe arrabbiarsi, comunque se localmente dichiari delle variabili e/o costanti queste vengono allocate solo se usi realmente la funzione, idem se ci sono delle #define nella libreria, che è la norma, pure queste vengono usate solo se nel programma sono presenti i relativi alias.
Per farla breve, il compilatore, vale per tutti quelli che conosco (non sono pochi :)) , compila e alloca solo il codice, variabili, #define realmente utilizzati, tutto il resto viene ignorato oppure vengono fornite delle warning, non con lo scrauso ide di Arduino, sulle variabili inizializzate (cioè vi è stato caricato un valore) e non utilizzate, sta a te programmatore decidere se eliminarle oppure lasciarle perché serviranno più avanti durante lo sviluppo del software.

Scientia potentia est

Go Up