Salve, ho ricevuto il mio ArduinoUno alcuni giorni fa ed ho già fatto i primi semplici esperimenti; ora sto realizzando dei circuiti digitali (flip-flop) per il riconoscimento di sequenze binarie; ho bisogno che Arduino mi generi delle sequenze di una trentina di bit (vorrei ottenere la duplice possibilità di farle "scegliere" a lui in modo random o impostarle io manualmente, anche con due code separati), del tipo: 0101110010110100011010011011110.
Da neofita ho creato un array con la sequenza e l'ho usato per ativare un pin HIGH o LOW, il metodo funziona, ma mi sembra (all'oscilloscopio) abbastanza ballerino in frequenza, inoltre non riesco ad andare oltre pochi hertz di frequenza, ho proprio eliminato il delay.
La mia idea è creare un convertitore decimale-binario, in modo da inserire un numero decimale dell'ordine del miliardo (230 che venga trasformato nell'equivalente codice binario da trasmettere ad una delle uscite; in subordine mi va bene anche digitare manualmente le sequenze, direttamente in bit.
Inoltre vorrei poter disporre di un "monitor" software per vedere queste sequenze senza dover ricorrere all'oscilloscopio; ho visto un progetto simulatore di oscilloscopio, ma non ho capito come funziona.
Mi aiutate?
Grazie.
Chiedo scusa per l'insistenza,
nessuno ha idea se si possa risolvere questa cosa con un metodo alternativo al mio? Il problema è che con la semplice assegnazione HIGH/LOW ad un pin a me sembra di ottenere intanto una sequenza instabile in frequenza, inoltre non riesco ad aumentare tale frequenza, ho proprio eliminato il delay.
Qualcuno può dirmi almeno se sto chiedendo qualcosa di NON realizzabile con Arduino?
Grazie a chiunque voglia rispondermi
quanta fretta!!! Se nessuno ha risposto vuol dire che tra quelli che hanno letto nessuno era in grado!
Io mi includo nel gruppo di quelli che non saprebbe darti un aiuto preciso, faccio solo qualche appunto:
- mi sembra strano che ottieni una risposta nell'ordine degli hertz
- chiedi aiuto, ma hai dato scarsissime informazioni, postare il codice con dei commenti sarebbe il minimo per poter chiedere un aiuto concreto
- credo che per delle cose super precise dovresti usare gli interrupt
gli array sono abbastanza lenti nell'estrapolare il dato ma per esperianza ti dico max 60microsec
posta il codice...
Grazie a tutti, mi scuso per qualche errore comportamentale ma sono nuovo... ![]()
Questo è il codice che ho arrabbattato:
int piedino =12;
byte sequenza[] = {
0, 0, 1, 1, 1, 0, 0, 0, 1, 0}; //quando funziona dovranno essere circa 30 valori
void setup() {
pinMode(piedino, OUTPUT);
}
void loop()
{
for(int i=0; i<10; i++)
{
if (sequenza == 1)
- {*
- digitalWrite(piedino, HIGH);*
- }*
- else*
- {*
- digitalWrite(piedino, LOW);*
- }*
- }*
}
è estremamente semplice, funziona ma solo ad una frequenza di circa 30Hz (dovrei arrivare a 10MHz!), inoltre mi sembra instabile, ma forse dipende dal fatto che non so come prelevare un segnale di sync per l'oscilloscopio. Riguardo gli interrupt non ho la èpiù pallida idea di come si possano usare, sono troppo pivello ancora; ho buone conoscenze di elettronica e di programmazione in VB, ma di microcontrollori e C non ne so nulla, l'ho comprato perché voglio imparare ad ogni costo; ricorro al forumper stringere i tempi, visto che non ne ho moltissimo a disposizione. Grazie ancora a tutti voi.
Considerando che l'Atmega lavora a 16 MHz e che mediamente una singola istruzione assembly viene eseguita in 1 ciclo di clock, arrivare a 10 MHz significherebbe che il tuo codice in C++ dovrebbe girare su un micro con valori di clock dell'ordine dei GHz ![]()
ciao menniti
col Arduino a 16Mhz non arrivi mai a un segnale a 10Mhz.
Se mandi una sequenza di 1 e 0 hai sempre delle frequenze diverse anche se un singolo bit é uguale .
La frequenza misurata di un 10101 é divrso da un 11001100 anche se i singoli 1 e 0 hanno la stessa durata.
if (sequenza == 1)
{
digitalWrite(piedino, HIGH);
}
else
{
digitalWrite(piedino, LOW);
}
Puoi cambiare in
digitalWrite(piedino, sequenza);
Se programmi direttamente i registri delle uscite sei piú veloce, ma non arriverai a 10MHz
Devi mandare la sequenza di bit di continuo o solo una o alcune volte?
Puoi arrivare a 10MHz se carichi un shift register a 30 posizioni e poi fai uscire con un clock di 10Mhz i dati.
Se serve ripetuto basta collegare il Out col In.
Ciao Uwe
Ciao UWE,
grazie per la risposta, applicherò subito la variazione di codice (non avevo pensato al fatto che 1 e 0 potessero essere riconosciuti come HIGH e LOW); il discorso sulla frequenza mi è stra-chiaro, sei davvero bravo a spiegare (e detto da me è un complimento vero, te lo assicuro.... ;))
1 - La sequenza deve essere inviata all'infinito, quindi deve andare in loop.
2 - Come faccio a programmare i registri (se c'è qualcosa da leggere e studiare lo faccio ben volentieri)?
3 - Se ho ben capito, per ottenere un segnale di 10MHz, devo realizzare un circuito esterno, p.es. un 74HCxxx con funzione di shift register a 30 posizioni, al cui ingresso invio la sequenza generata con l'Arduino, e cloccato a 10MHz mediante un piccolo oscillatore quarzato, è una cosa che posso fare.
Mi dai qualche ulteriore chiarimento su questi 3 punti? Ti ringrazio in anticipo
P.S: ringrazio ovviamente anche Leo per il chiarimento sulla massima frequenza ottenibile.
sei già in un loop: void loop() {} viene eseguita all'infinito.
per usare i registri, tutte le info le trovi nel datasheet dell'atmega che stai utilizzando, se hai ArduinoUno probabilmente è un atmega328p: http://www.atmel.com/dyn/resources/prod_documents/doc8271.pdf
per la circuiteria sono ignorante, passo ![]()
nel tuo codice c'è:
if (sequenza == 1)
ma non manca l'indice per scorrere l'array?
tipo:
if (sequenza[i] == 1)
@ Federico:
sí manca ma non é importante visto che non si arriva alla frequenza necessaria.
@ menniti
Grazie per il complimento.
Prima 2 domande. La sequenza é sempre uguale o devi cambiarla? e devono essere 30 bit non 32?
Sí hai capito bene i punti.
Se la sequenza é fissa basta prendere un Shift register con carico paralello e collegare le entrata a H e L come necessario.
Se la sequenza deve essere programmabile vedo 2 possibilitá:
- Un shiftregister con entrata seriale e uscita paralella collegato a un shiftregister con entrata paralella e ucita seriale. Cosí carichi la sequenza attraverso il primo registro e la memorizzi nel secondo e da li la shifi fuori col oscilatore esterno.
- hai solo un shiftregister con entrata seriale e uscita seriale. per cricare la sequenta fermi il oscillatore e carichi con arduinio la sequenza. Poi attivi il collegamento del entrata col uscita e l' oscillatore.
Questa versione é piú semplice ma probabilmente ha bisogno di qualche porta logica in piú. Domani ho tempo di pensare e vedo di disegnare uno schema.
Ciao Uwe
si beh ma intanto comincia ad avere un codice che funziona e può misurare una frequenza sensata, qualche kilohertz lo raggiunge di sicuro. Per curiosità la modifichina la farei...anche perchè così il codice non ha senso!!!
#define piedino 12
byte sequenza[] = { 0, 0, 1, 1, 1, 0, 0, 0, 1, 0}; //quando funziona dovranno essere circa 30 valori
void setup() {
pinMode(piedino, OUTPUT);
}
void loop()
{
for(int i=0; i<10; i++)
{
digitalWrite(piedino, sequenza[i]);
}
}
per esperienza personale su array penso che arrivi a 200kHz
il comando :sequenza in un mio programma impiega 50 micros+o-
Ciao a tutti e grazie per l'aiuto. Allora il code modificato da UWE funziona bene, l'oscilloscopio digitale calcola una frequenza media da 40KHz a 115 KHz circa, in base alla sequenza impostata, ovviamente (effettivamente avevo postato un errore
). Invece se metto #include piedino 12 mi dà errore. Resta il problema che il "treno" sembra instabile; ma c'è nell'arduino un'uscita da mandare al sync dell'Oscilloscopio?
Risposte per il circuito:
la sequenza globale devo cambiarla, devo inserirci dentro le mini-sequenze da cercare. Potrei usare la prima soluzione collegando una batteria di dip switch, ma mi capita di variarle molto frequentemente nella stessa occasione, ecco perché vorrei usare l'arduino (potrei crearmi delle "librerie" di sequenze e con sempici copy/paste le cambierei in un istante). Forse l'ultima soluzione potrebbe andare bene, che ci sia qualche porta in più non è affatto un problema.
Mi servono circa 30 bit, dovendo metterci dentro 4-5 sequenze da 4-5 bit ognuna, considerate le sovrapposizioni, potrebbero anche bastarmi 25 bit, se sono 32 è la stessa cosa, nel range 25-32 scegli tranquillamente il valore che semplifica di più lo schema.
La frequenza di uscita è fissa a 10MHz, mi tornerebbe comoda la possibilità di avere anche 1MHz o 100KHz, ma partendo dai 10MHz posso tranquillamente dividerli per 10 e per 100, realizzando una mini base dei tempi switchabile.
Per lesto: grazie del link, mi piace studiare sì ma se iniziassi a leggere quelle 566 pagine vi telefonerei tra vent'anni, come dice il grande Lucio...., ma il mio non è un lavoro bensì un hobby al servizio del lavoro. Grazie!
non devi leggerlo tutto, basta la parte per comandare i registri digitali ![]()
ti pare che io l'abbia letto tutto ? ![]()
comqunque digitalRead duca circa 100microsecondi se non erro, strano che il treno sia instabile...sicuro che come array usi 1010101010... altrimenti ovvio che è instabile se non fai i debiti conti
proverò... ![]()
come detto sequenze ne uso tante, ma anche con quella "perfetta" sull'oscilloscopio analogico il treno lo vedo sdoppiato, sul digitale vedo una sorta di effetto "molla" ma su posizioni casuali, niente di regolare, ma comunque il problema è relativo, col circuito esterno diverrà tutto necessariamente stabile.
Grazie!
Quello é un problema del Trigger del Oscilloscopio.
Non parte sempre nella stessa posizione del segnale.
Devi usare uno con memoria e registrare solo una traccia.
Ciao Uwe
OK, per la verità mi è appena arrivato questo 4 tracce digitale, devo imparare ad usarlo come si deve, ha un mare di funzioni... abituato ai 4 pulsanti e 3 manopole del mio vecchio ma glorioso Hameg 2 tracce, mi sono sconfortato...
Spero proprio che riuscirai a trovare il tempo necessario per questo schema, è una cosa che devo proprio fare.
Grazie ancora.
io ho scritto #define piedino 12 e non #include piedino 12.
Fermo restando che l'array per accedere e leggere gli elementi ha bisogno di un indice, altrimenti quel ciclo for lo fai per niente e tiri fuori solo i numeri del lotto, mi spieghi cosa intendi con frequenza della sequenza di bit e come fai a calcolarla con l'oscilloscopio?
uh mi è tornata sotto mano la pagina per modificare contemporaneamente più uscite digitali con i registri.. non è complicato: