Rome
Offline
God Member
Karma: 1
Posts: 564
La mia prima bromografata!!
|
 |
« Reply #15 on: April 11, 2012, 05:28:15 am » |
mi sa che l'errore è l'utilizzo di = per comparare. devi usare ==.
E' vero, non ci avevo fatto caso neanch'io  a questo punto, visto che Do e tutte le altre sono dei valori boolean (o Vero o Falso), è uno spreco usare le 'int'. dichiarali come boolean (
Oppure un byte, tanto anche il boolean occupa comunque 1 byte in memoria. ma dai! questa non la sapevo, pensavo stupidamente che potesse occupare solo un bit.. quindi è così perchè non si può indirizzare un solo bit, o perchè insieme al bit del valore viene registrato dell'altro?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16431
Don't know what I do
|
 |
« Reply #16 on: April 11, 2012, 05:46:51 am » |
Oppure un byte, tanto anche il boolean occupa comunque 1 byte in memoria.
ma dai! questa non la sapevo, pensavo stupidamente che potesse occupare solo un bit.. quindi è così perchè non si può indirizzare un solo bit, o perchè insieme al bit del valore viene registrato dell'altro? Il resto del byte è inutilizzato. Per questo spesso si consiglia di utilizzare gli operatori sui bit se si devono memorizzare più flag che devono avere solo il valore 1 o 0.
|
|
|
|
|
Logged
|
|
|
|
|
Rome
Offline
God Member
Karma: 1
Posts: 564
La mia prima bromografata!!
|
 |
« Reply #17 on: April 11, 2012, 06:08:53 am » |
Oppure un byte, tanto anche il boolean occupa comunque 1 byte in memoria.
ma dai! questa non la sapevo, pensavo stupidamente che potesse occupare solo un bit.. quindi è così perchè non si può indirizzare un solo bit, o perchè insieme al bit del valore viene registrato dell'altro? Il resto del byte è inutilizzato. Per questo spesso si consiglia di utilizzare gli operatori sui bit se si devono memorizzare più flag che devono avere solo il valore 1 o 0. Giusto, così non si spreca spazio.. Francesco, potrebbe essere l'occasione per imparare una cosa nuova! registri le 7 note come sette bit di un byte, e controlli i singoli valori dei byte. non cambia niente come risultato, ma utilizzi un metodo molto più elegante. io ci proverei.
|
|
|
|
|
Logged
|
|
|
|
|
Firenze, Italy
Offline
Full Member
Karma: 0
Posts: 102
Dislessia portami via
|
 |
« Reply #18 on: April 11, 2012, 06:39:39 am » |
Interessante lo sviluppo che ha preso la discussione. Bravo dab77 per aver beccato l'errore sul while!
|
|
|
|
|
Logged
|
The brightest flame burns quickest
|
|
|
|
Padova, Italy
Offline
Newbie
Karma: 0
Posts: 14
|
 |
« Reply #19 on: April 11, 2012, 09:19:44 am » |
Allora... Ho sostituito gli = con == e adesso suona  Però la nota non torna mai bassa. Se premo il Do questo suona finchè non premo un'altra nota che a sua volta farà lo stesso. Ho prova a mettere dopo ogni nota: else { noTone(Buzzer); } ...ma peggio che prima. Ho ottenuto delle frequenze altissime senza spiegarmi il perchè. Per quanto riguarda quello che ha detto dab77, come faccio a registrare le note come bit?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16431
Don't know what I do
|
 |
« Reply #20 on: April 11, 2012, 09:47:03 am » |
Francesco, potrebbe essere l'occasione per imparare una cosa nuova! registri le 7 note come sette bit di un byte, e controlli i singoli valori dei byte. non cambia niente come risultato, ma utilizzi un metodo molto più elegante. io ci proverei.
Un passo alla volta. Per ora non gli serve questo, gli serve come imparare a gestire i pulsanti  Anche perché ha già dei byte che contengono i livelli logici dei pin accessibili a singoli bit, sono i registri del microcontrollore. Le porte sono infatti mappate in alcuni registri e leggere un registro equivale a leggere un gruppo di 8 porte tutte insieme. http://www.arduino.cc/en/Reference/PortManipulationMa qui si entra in un livello più elevato di programmazione, mentre ora deve imparare a programmare correttamente.
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16431
Don't know what I do
|
 |
« Reply #21 on: April 11, 2012, 09:50:40 am » |
Allora... Ho sostituito gli = con == e adesso suona  Però la nota non torna mai bassa. Se premo il Do questo suona finchè non premo un'altra nota che a sua volta farà lo stesso. Ho prova a mettere dopo ogni nota: else { noTone(Buzzer); } ...ma peggio che prima. Ho ottenuto delle frequenze altissime senza spiegarmi il perchè. Forse perché si sommano più frequenze insieme. Oppure perché fai un'alternanza superveloce fra nota/no nota.... Un altro problema che nessuno ha sollevato è il debounce dei pulsanti. Ogni pulsante dà dei "rimbalzi" elettrici, che possono essere letti come false pressioni. Anche questo tema è da sviluppare. Poi secondo me dovresti provare un altro approccio. Semplifica il programma e fai suonare una singola nota per un determinato lasso di tempo, metti cioè un flag per verificare che non sia già in esecuzione la riproduzione di una nota. Poi il secondo passo potrebbe essere quello di far suonare una nota finché il tasto è premuto.
|
|
|
|
|
Logged
|
|
|
|
|
Rome
Offline
God Member
Karma: 1
Posts: 564
La mia prima bromografata!!
|
 |
« Reply #22 on: April 11, 2012, 10:36:42 am » |
Allora... Ho sostituito gli = con == e adesso suona  Però la nota non torna mai bassa. Se premo il Do questo suona finchè non premo un'altra nota che a sua volta farà lo stesso. Ho prova a mettere dopo ogni nota: else { noTone(Buzzer); } ...ma peggio che prima. Ho ottenuto delle frequenze altissime senza spiegarmi il perchè. Forse perché si sommano più frequenze insieme. Oppure perché fai un'alternanza superveloce fra nota/no nota.... Un altro problema che nessuno ha sollevato è il debounce dei pulsanti. Ogni pulsante dà dei "rimbalzi" elettrici, che possono essere letti come false pressioni. Anche questo tema è da sviluppare. Poi secondo me dovresti provare un altro approccio. Semplifica il programma e fai suonare una singola nota per un determinato lasso di tempo, metti cioè un flag per verificare che non sia già in esecuzione la riproduzione di una nota. Poi il secondo passo potrebbe essere quello di far suonare una nota finché il tasto è premuto. Si, si hai perfettamente ragione, lo suggerivo solo per dopo, cioè quando hai fatto funzionare tutto e vuoi migliorare. Secondo me però aveva colto il punto col 'while', e non capisco perchè non si può usare. in fondo finchè è 'Vero' deve suonare, poi manca la condizione di uscita, ovvero quando il pin è falso. Non è così?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16431
Don't know what I do
|
 |
« Reply #23 on: April 11, 2012, 11:41:55 am » |
Esistono 2 modi per intendere il "finché è vero deve suonare": 1) finché non stacca il pulsante, deve suonare 2) finché non viene premuto un altro tasto, deve suonare
Nel 1° caso può usare il while (e va messo appunto il controllo del cambio di stato del pin per l'uscita), nel secondo caso, non può usare il while ma deve usare un ciclo per cambiare nota solo quando viene premuto un altro pulsante.
|
|
|
|
|
Logged
|
|
|
|
|
Firenze, Italy
Offline
Full Member
Karma: 0
Posts: 102
Dislessia portami via
|
 |
« Reply #24 on: April 11, 2012, 01:18:45 pm » |
Allora... Ho sostituito gli = con == e adesso suona  Però la nota non torna mai bassa. Se premo il Do questo suona finchè non premo un'altra nota che a sua volta farà lo stesso. Ho prova a mettere dopo ogni nota: else { noTone(Buzzer); } ...ma peggio che prima. Ho ottenuto delle frequenze altissime senza spiegarmi il perchè. hai provato a mettere una roba del genere? if(digitalRead(Do) == HIGH){ tone(Buzer, 262, duration); // suona il DO per duration ms (duration lo dichiari come const int ) delay(duration); //attende che il do abbia finito di suonare noTone(Buzer); //smette di far suonare il Buzer } [\code]
|
|
|
|
|
Logged
|
The brightest flame burns quickest
|
|
|
|
Padova, Italy
Offline
Newbie
Karma: 0
Posts: 14
|
 |
« Reply #25 on: April 11, 2012, 02:15:56 pm » |
x IngHooch Se ho capito bene però "duration" ha valore fisso e la nota rimane attiva per un lasso di tempo predefinito, nel caso volessi prolungare la nota tenendo premuto il pulsante non posso farlo...
x leo72 Da quello che dici capisco che è più corretto usare i while... Usando gli if ottengo appunto quello che ho ottenuto; ogni nota suona finchè non ne premo un'altra.
|
|
|
|
|
Logged
|
|
|
|
|
Firenze, Italy
Offline
Full Member
Karma: 0
Posts: 102
Dislessia portami via
|
 |
« Reply #26 on: April 11, 2012, 02:30:28 pm » |
x IngHooch Se ho capito bene però "duration" ha valore fisso e la nota rimane attiva per un lasso di tempo predefinito, nel caso volessi prolungare la nota tenendo premuto il pulsante non posso farlo...
Nì, perché se il codice è fatto così void loop(){
if(digitalRead(Do) == HIGH){ tone(Buzer, 262, duration); // suona il DO per duration ms (duration lo dichiari come const int ) delay(duration); //attende che il do abbia finito di suonare noTone(Buzer); //smette di far suonare il Buzer }
}
Se tu tiene premuto il bottone ogni volete che passa dall'if trova i bottone premuto e continua a suonare la stessa nota, nel momento in cui lo lasci questo continua a suonare per duration e poi smette
|
|
|
|
|
Logged
|
The brightest flame burns quickest
|
|
|
|
Padova, Italy
Offline
Newbie
Karma: 0
Posts: 14
|
 |
« Reply #27 on: April 11, 2012, 02:45:41 pm » |
mmm... qualcosa non mi torna... tutto quello che dici però accade se il tasto è premuto. Supponiamo che imposto il delay a 10ms... Appena premo il tasto suona il do per 20ms (10ms per la funzione tone + 10ms per il delay successivo) e poi si spegne... Indipendentemente che io rilascio o meno il pulsante... Corretto?
|
|
|
|
|
Logged
|
|
|
|
|
Padova, Italy
Offline
Newbie
Karma: 0
Posts: 14
|
 |
« Reply #28 on: April 11, 2012, 02:53:07 pm » |
Funziona facendo così!!! if(ValueDo==HIGH) { tone(Buzzer,262); delay(10); noTone(Buzzer); } IngHooch come dici tu però senza impostare il tempo alla funzione tone. Però ora si tratta solo di trovare il delay giusto perchè a 10 è troppo basso e distorce... Però a 100 si sente il buzzer staccare e attaccare velocemente.
|
|
|
|
|
Logged
|
|
|
|
|
Firenze, Italy
Offline
Full Member
Karma: 0
Posts: 102
Dislessia portami via
|
 |
« Reply #29 on: April 11, 2012, 02:53:33 pm » |
No l'istruzione if(digitalRead(Do) == HIGH){ tone(Buzer, 262, duration); delay(duration); noTone(Buzer); }
if(digitalRead(La) == HIGH){ //codice LA }
da il via al Buzer per duration, ma non aspetta che finisce! Passa subito all'istruzione successiva, che nel nostro caso è un delay di duration. Quindi le due righe di codice forzano il programma ad aspettare che il do abbia finito di suonare prima di procedere ad altri controlli (nel nostro caso controllare se il La è premuto ed eventualmente farlo suonare)
|
|
|
|
|
Logged
|
The brightest flame burns quickest
|
|
|
|
|