Show Posts
Pages: 1 ... 434 435 [436] 437 438 ... 636
6526  International / Generale / Re: Divisione a 64bit on: December 28, 2011, 07:23:17 am
Tra non molto avro bisogno di usare la divisione tra un 64bit e un divisore da 32bit cosa mi suggerite?

Le operazioni a 64 bit non sono supportate dal compilatore di Arduino, unica possibile soluzione è scriversi una propria routine che svolga questo calcolo, se ti basta un valore intero come risultato la cosa è abbastanza semplice da realizzare, se ti serve un float la cosa diventa molto complicata e devi necessariamente gestirla in assembly se vuoi del codice realmente efficiente.
6527  International / Generale / Re: Collegare motori in serie on: December 28, 2011, 05:11:46 am
Lo chiedo perchè non ho mai visto due motori collegati in questo modo..

Non lo hai visto perché è il modo sbagliato di procedere, i motori devono essere alimentati singolarmente tramite driver dedicati o, al massimo, in parallelo sulla stessa sorgente se non hai necessità di variare la velocità individualmente.
6528  International / Generale / Re: Lettura / scrittura digitale con registri on: December 28, 2011, 03:54:16 am
Secondo me no. 1000 hz sono 1 lettura ogni millisecondo. Come ti hanno fatto vedere, una digitalQualcosa impiega 125 us, quindi ben al di sotto.

Grazie Leo. Quindi anche volendo leggere due sensori simultaneamente sono sempre nei tempi, senza dover stare a scrivere tutto con il controllo diretto delle porte... Cioè in pratica, sempre semplificando una cosa del tipo:

Attenzione che la digitalread/digitalwrite impiegano poco meno di 2 us per effettuare la loro operazione.
Una lettura/scrittura diretta sul port richiede solo 62.5 ns o 125 ns (1 o 2 cicli macchina) a seconda di come viene indirizzato il port (in modo diretto oppure indiretto) a cui va aggiunto il tempo (cicli macchina) per l'eventuale read e mascheratura del dato, nel caso serva solo settare un ben preciso bit di un registro macchina del AVR allora si usa la cbi/sbi tramite le macro che ho proposto che impiegano sempre e comunque solo due cicli macchina, ovvero 125 ns.
Non esiste una istruzione assembly (sugli AVR) per leggere uno specifico bit, in questo caso si legge sempre l'intero port/registro e poi si applica una maschera per isolare il bit/bits che ci interessa.
Nel tuo caso specifico è inutile che ti crei problemi, usa tranquillamente la digitalread e la digitalwrite, il ricorrere alla manipolazione diretta dei registri serve solo quando hai necessità di ridurre i tempi di esecuzione per funzioni time critical come può essere il timing di un bit su una trasmissione seriale dove spesso si ragiona in termini di pochi us se non ns.



6529  International / Generale / Re: Lettura / scrittura digitale con registri on: December 28, 2011, 03:40:04 am
Ciao Astrobeed, grazie delle specifiche e dei tuoi test. Non capita spesso su un forum tanta passione e supporto attivo! Grazie mille, anche se non capisco il tono del tuo incipit  smiley-razz

In primis rivendico il diritto di satira,  smiley-grin, poi c'è il fatto che per come hai posto la questione sembrava che il mio "consiglio" fosse sbagliato, ed ecco che è scattata la prova strumentale per dimostrare che la macro define che ho proposto funziona esattamente come ho detto.
Ti avevo anche fatto notare che quasi sicuramente il tuo problema è in ricezione, ma senza vedere il codice è difficile dire cosa non va esattamente, inoltre non è chiaro se attualmente ricevi a 1 kbps oppure a 1 kBps, nel primo casi ricevi solo 100 caratteri al secondo mentre nell'altro caso ne ricevi 1000.
Tenuto conto che stai provando a trasmettere tramite led, e immagino che stai usando led normali, c'è da fare i conti con la banda passante del led che potrebbe essere il vero collo di bottiglia, un normale led ad uso spia non riesce a lampeggiare molto velocemente, si va da pochi kHz a qualche decina di kHz.
6530  International / Generale / Re: Lettura / scrittura digitale con registri on: December 27, 2011, 11:19:30 am
che diavolo di software hai usato per avere l'equivalente codice->assembly?

Memo male che l'ho spiegato nelle ultime righe del mio post  smiley-grin
Si usa AvrStudio 4 per leggere il file .elf generato dall'IDE.
6531  International / Generale / Re: Lettura / scrittura digitale con registri on: December 27, 2011, 10:22:24 am
Giusto per completezza dell'informazione ecco come il compilatore traduce in assembler il nostro programma:

Code:
0:       void loop()
22:         delayMicroseconds(6);
+00000080:   E086        LDI       R24,0x06       Load immediate
+00000081:   E090        LDI       R25,0x00       Load immediate
+00000082:   940E00E0    CALL      0x000000E0     Call subroutine
23:         digitalWrite(13, HIGH);
+00000084:   E08D        LDI       R24,0x0D       Load immediate
+00000085:   E061        LDI       R22,0x01       Load immediate
+00000086:   940E014B    CALL      0x0000014B     Call subroutine
24:         digitalWrite(13, LOW);
+00000088:   E08D        LDI       R24,0x0D       Load immediate
+00000089:   E060        LDI       R22,0x00       Load immediate
+0000008A:   940E014B    CALL      0x0000014B     Call subroutine
25:         sbi(PORTC,0); // setta il bit 5 PORTB (led acceso)
+0000008C:   9A40        SBI       0x08,0         Set bit in I/O register
26:         cbi(PORTC,0); // resetta il bit 5 PORTB (led spento)
+0000008D:   9840        CBI       0x08,0         Clear bit in I/O register
27:       }
+0000008E:   9508        RET                      Subroutine return

Ho inserito solo la parte relativa alla loop che è quella che ci interessa, come si può vedere le macro define sono compilate con una singola riga utilizzando la SBI o la CBI assembly a seconda del caso, la digitalwrite viene compilata caricando due registri con il numero del pin e il valore che deve assumere, e questo richiede quattro cicli macchina, poi viene invocata una subroutine che esegue fisicamente l'operazione, e questo impegna una posizione dello stack, altri registri e molti cicli macchina per fare una operazione per la quale è sufficiente una singola istruzione assembly e nessuna chiamata a subroutine.
Per chi vuole approfondire in dettaglio cosa combina il compilatore, cioè vedere l'assembly generato per ogni riga C dall'ambiente di lavoro di Arduino, è sufficiente aprire il file .elf generato dal compilatore (usare il modo verbose per vedere in quale dir viene creato) tramite AvrStudio e farlo puntare al sorgente dello sketch utilizzando l'emulatore per vedere il sorgente assembly in mix mode con il sorgente C.
6532  International / Generale / Re: Lettura / scrittura digitale con registri on: December 27, 2011, 05:50:45 am
Ho appena deciso di creare la sezione CNF (cit. Totò film "I Ladri",  Sezione C.N.F. = Cà Nisciuno è Fesso)  smiley-mr-green
Ecco la dimostrazione strumentale che CBI e SBI fanno quello che promettono senza alcun dubbio in merito, rammento che gli strumenti di misura non mentono e non dicono mai cavolate se si usano in modo corretto

Questo è il semplicissimo sketch usato per il test:
Code:
/*
 Test tempi scrittura pin con digitawrite e sbi/cbi
 by MdA
*/

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(A0, OUTPUT);
}

void loop()
{
  delayMicroseconds(6);
  digitalWrite(13, HIGH);
  digitalWrite(13, LOW);
  sbi(PORTC,0); // setta il bit 5 PORTB (led acceso)
  cbi(PORTC,0); // resetta il bit 5 PORTB (led spento)
}

Non fa altro che settare il pin 13, quello del led, e il pin 14, noto anche come A0, in output e il loop continua a scrivere sul pin 13 tramite la digitalwrite e sul pin A0 tramite CBI e SBI, il delay di 6 us serve per staccare tra loro i cicli e fornire un riferimento univoco per il trigger del DSO regolato come "impulse width + > 5 uS"

Il canale A del DSO, traccia gialla, è collegato al pin 13 e fa da trigger, il canale B, traccia blu, è collegato al pin 14 (A0).

Le tre schermate allegate rappresentano le seguenti situazioni:

1) Vista generale di due cicli completi dove si vede molto bene che il delay di 6 uS in realtà dura quasi 8 uS, questo è un limite di Arduino che pecca molto nella gestione dei piccoli tempi.

2) Inquadratura full screen di un singolo ciclo, possiamo vedere chiaramente che per eseguire le due digitalwrite occorrono poco più di 3.5 uS, anche se non apprezzabile chiaramente si nota già come il ciclo tramite sbi/cbi dura meno di 200 ns.

3) Tramite delay sul trigger dettaglio dell'azione di sbi/cbi, ora si vede chiaramente che la commutazione da 1 a 0 richiede esattamente 125 ns, due cicli macchina come richiesto dalle istruzioni assembly sbi e cbi che il compilatore utilizza dopo la compilazione della macro.



6533  International / Generale / Re: Lettura / scrittura digitale con registri on: December 24, 2011, 11:51:36 am
Bah, inizio a pensare di desistere e tenermi 1 kb/s...
ricevo solo caratteri errati che vengono scartati e "@"

Ma non è che il problema è dal lato opposto, cioè in ricezione, che magari fai con digitalread che è lenta come la digitalwrite, e con la commutazione veloce del pin non riesci a leggere in tempo lo stato logico.

6534  International / Generale / Re: Lettura / scrittura digitale con registri on: December 24, 2011, 11:16:11 am
   if(VALUE == HIGH) { sbi(PORTC,0); } else { cbi(PORTC,0); }

Sintassi ambigua che porta facilmente ad interpretazioni errate del compilatore anche se non vengono segnalati errori, sicuramente ci sono delle warning che non vedi senza attivare la modalità verbose.
Scrivila così:
Code:
if(VALUE == HIGH)  sbi(PORTC,0);
else  cbi(PORTC,0);
6535  International / Generale / Re: negozio arduino ??!! on: December 24, 2011, 11:05:10 am
caro astro, c'è la metropolitana, 20 minuti e ti sei fatto avanti e indietro al modico prezzo di 3€  smiley-mr-green

Conviene sempre spendere 6.5 di corriere e ti risparmi la tribolazione della metro, il rischio di essere pestato, scippato, rapinato, etc.  smiley
Ma non costava 1 Euro la metro ?
6536  International / Generale / Re: Lettura / scrittura digitale con registri on: December 24, 2011, 10:56:53 am
Sei sicuro? Quindi usando PORTC dovrei scrivere: PORTC = B10000000; ?

Per settare Analog 0 usa sbi (PORTC,0), per resettarlo cbi (PORTC,0), ricordati che prima devi impostare A0 come out digitale altrimenti non puoi scriverci sopra.
6537  International / Generale / Re: comoda alternativa ad arduino ISP on: December 24, 2011, 10:41:07 am
Purtroppo però non funziona con la uno perchè avendo l'atmega8u non vi è l'interfaccia del connenttore x3

Anche con la 2009, o altra scheda con l'FTDI, funziona malissimo, riesci a programmare una volta su cinque quando va bene.

6538  International / Generale / Re: Lettura / scrittura digitale con registri on: December 24, 2011, 10:09:41 am
Non riesco davvero a capire come mai!!

Perché non leggi correttamente lo schema, Analag 0 è PORTC 0, cioè il primo bit  smiley-grin
SBI e CBI funzionano perfettamente, le uso normalmente in quasi tutti i miei programmi per AVR.
6539  International / Generale / Re: Buon Natale e Felice Anno Nuovo! on: December 24, 2011, 04:49:54 am
E speriamo sia l'inizio di arduino due smiley-wink

Ma non l'avete letto l'annuncio ufficiale sul blog ?
Arduino DUE non arriverà mai perché esce prima Arduino TRE  smiley-grin smiley-mr-green smiley-grin
6540  International / Generale / Re: Arduino e ESC - invertire senso di rotazione del motore on: December 24, 2011, 01:10:49 am
Ho provato con un motore brushed, portando ovviamente il motore a 0 e poi invertendo e funzionava!

Se inverti tra loro due fili di un BLDC ottieni l'inversione del senso di rotazione, se fatto a motore fermo con ESC disarmato tramite un relè va bene, da non fare assolutamente col motore in marcia pena la distruzione immediate del ESC, è come mettere in corto due fasi.
Gli ESC leggono la posizione del motore tramite la b.e.m.f. nei motori sensorless oppure tramite gli appositi sensori (encoder a 120°) nei sensored, tutti motori per aereo sono sensorless, solo quelli per auto di ultima generazione sono sensored (molto costosi) con i relativi ESC che prevedono anche la retromarcia.
Pages: 1 ... 434 435 [436] 437 438 ... 636