Il mio problema all'epoca (il motivo per il quale avevo aperto il post) era la presenza di rilevazioni strane in assenza di lampeggi. A distanza di anni ho voluto riconsiderare il progetto ma ancora mi trovo di fronte allo stesso "difetto"che vi riassumo in poche parole:
utilizzo il registro contatore di Arduino (sul PIN5) per contare.
Difetto: anche in assenza di impulsi ne rilevo circa una 60-70 all'ora.
Dopo aver eliminato tutta la circuiteria esterna, aver settato in pull_up tutti le uscite digitali ed a 0 tutte quelle analogiche e dopo aver ridotto all'osso il codice (solamente conteggio impulsi) rilevo ancora impulsi inesistenti.
Anche se collego a massa il PIN5 rilevo comunque impulsi che non dovrebbero esserci.
Buongiorno,
visto che il tuo precedente account NON esiste e che quindi questo è, a tutti gli effetti, per noi il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentartiIN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.
... dopo di che, metti il codice (... mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra) che stai utilizzando che ci diamo un'occhiata.
Riporto di seguito il codice utilizzato. Una volta caricato vedrete che ad ogni secondo vengono visualizzati gli impulsi rilevati sul PIN5...ma nel mio caso e credo anche nel vostro vedrete impulsi che non so da dove vengano, per assurdo anche collegando il PIN5 a GND vengono rilevati impulsi.
Scusa ma ... perché tutta questa complicazione con i timer per contare dei banali impulsi? Oltretutto, Timer 1 è, di base, inizializzato per generare un segnale PWM a 488.28125 Hz usato sui pin 9 e 10 ...
Non ti bastava banalmente usare un pin di interrupt e la funzione millis() ?
gpb01:
Non ti bastava banalmente usare un pin di interrupt e la funzione millis() ?
Ecco, esattamente quello che volevo chiedere anche io.
Tra l'altro la cosa potrebbe interessarmi avendo anche io un fotovoltaico, del quale attualmente misuro la produzione con un apparecchio come QUESTO, che ha l'uscita USB per scaricare i dati su PC però non riporta esattamente i kWh misurati da Enel, che invece corrispondono al numero di flash del LED del contatore.
Grazie a tutti per i suggerimenti.
proverò sicuramente ad utilizzare altri metodi.
Però mi piacerebbe sapere da dove arrivano gli impulsi "fantasma" che e' il motivo per cui ho aperto il post.
Se mi dite che e' una cosa normale la accetto e cambio percorso.
... avere impulsi fantasma, e' normale solo se lo script l'ha scritto un fantasma ... mentre invece suppongo tu sia ancora vivo, giusto ? ... (scusa, non ho resistito :D)
Scherzi a parte, non sono un programmatore, quindi magari sto dicendo una cavolata, ma non e' che quei registri sono usati anche da qualcos'altro, per cui magari e' quello che interferisce con il conteggio ?
Etemenanki:
... avere impulsi fantasma, e' normale solo se lo script l'ha scritto un fantasma ... mentre invece suppongo tu sia ancora vivo, giusto ? ... (scusa, non ho resistito :D)
Scherzi a parte, non sono un programmatore, quindi magari sto dicendo una cavolata, ma non e' che quei registri sono usati anche da qualcos'altro, per cui magari e' quello che interferisce con il conteggio ?
Questo le escluderei. Utilizzare questo metodo per il conteggio non e' stata una mia iniziativa.
Contare in questo modo dovrebbe eliminare ritardi e quindi errori introdotti dal software: in altre parole il tuo codice puo' essere macchinoso, complicato e tenere occupato per molto tempo il microprocessore ma l'acquisizione del conteggio sarà sempre disponibile. Almeno cosi mi sembra di aver capito.....
PS da oggi pomeriggio alle 15:00 ho contato 273 impulsi che in realtà non ci sono stati. Il pin5 di ingresso del contatore l'ho addirittura collegato a massa.
hai provato TCCR0B e non TCCR1B ? ovviamente con TCNT0
Ho letto qualcosa molto velocemente e mi piacere capire meglio il tuo discorso, ma poca voglia di provare:)
tonioB:
hai provato TCCR0B e non TCCR1B ? ovviamente con TCNT0
Ho letto qualcosa molto velocemente e mi piacere capire meglio il tuo discorso, ma poca voglia di provare:)
Timer 0 NON può essere usato !!! E' quello usato per millis(), micros(), ecc. quindi NON va toccato, pena NON avere più alcun riferimento temporale.
>paolocovatti: Come ti ho detto, il Timer_1 è già inizializzato per generare il PWM ...
... devi riinizializzare TUTTI i suoi registri o hai dei malfunzionamenti.
Guardati il datasheet da pagina 149 in poi (almeno fino a 185) e vedi le varie impostazioni.
Appena ho un'attimo mi ci metto anche io e butto giù un codice completo ...
>paolocovatti: ... ecco, prova questo, sono svariate ore che sta girando ed il contatore è sempre, giustamente, a zero. Ho messo nache l'interrupt sull'overflow ed un contatore di overflow ... casomai, nel tempo in esame, ci fossero più di 64K impulsi ed il timer si riazzeri ...
Patrick_M:
se non ho sbagliato i conti hai un impulso ogni 72,5 secondi circa
se gli impulsi sono regolari nel tempo...
Gli impulsi non sono regolari: nel mio codice completo misuravo anche i millisecondi tra un impulso ed il successivo per calcolare i W/h istantanei. Gli impulsi "fantasma" rilevati erano casuali.
gpb01: >paolocovatti: ... ecco, prova questo, sono svariate ore che sta girando ed il contatore è sempre, giustamente, a zero. Ho messo nache l'interrupt sull'overflow ed un contatore di overflow ... casomai, nel tempo in esame, ci fossero più di 64K impulsi ed il timer si riazzeri ...
Fammi sapere ...
Guglielmo
P.S.: Ovviamente ... NON lasciare il pin 5 flottante ...
Grazie! lo testo subito!
Volevo precisare a tutti che il codice che ho riportato precedentemente non l'ho scritto io ma l'ho copiato da "Arduino Cookbook" e l'ho considerato come vangelo in quanto non ho abbastanza conoscenze per commentarlo o criticarlo.
leggendo il codice di Guglielmo, e testandolo (sono sufficienti 5 minuti), ho guardato le differenze che c'erano con il mio (copiato dal libro che ho citato). Ed ho scoperto la causa degli impulsi non voluti. Ho scoperto la causa ma non ho capito il motivo in quanto non ho conoscenze cosi profonde dell'argomento. Magari qualcuno di voi riesce a capire esattamente la causa.
Per comodità vi riporto il codice "base" per leggere gli impulsi:
Ecco...se io commento l'istruzione //TCCR1B = 0 non ho gli impulsi indesiderati.
Ho testato la cosa diverse volte sia in un modo che nell'altro con i risultati previsti.