Show Posts
Pages: 1 2 [3] 4 5 ... 188
31  Community / Bar Sport / Re: [OT] PIC, 8051, MCU e CPU varie on: April 07, 2014, 08:17:12 am
@lock
Chi ti obbliga ad usare linux e chi ti impedisce di usare WxWorks?
Si sa che si risparmia sulla licenza linux ma si paga di più lo sviluppo.
Se ti fai pagare allo stesso modo sia per linux che per WxWorks certo che ti girano.

Ciao.
32  International / Software / Re: Interrupt contemporanei on: April 07, 2014, 07:58:13 am
@psoftware
I dettagli li puoi cogliere studiando il datasheet del microcontroller, tutti gli ATmega di base si comportano allo stesso modo.
Quote
- considerando che l'esecuzione di una ISR disabilita durante l'esecuzione altri interrupt... questi altri vengono accodati in qualche modo oppure l'esecuzione della ISR a cui sono legati viene inibita temporaneamente?
Anche se ci fosse un buffer che tiene conto di IRQ non soddisfatte, il problema rimane. Prima che la ISR del timer venga eseguita deve terminare la ISR corrente e se questa monopolizza il micro per 100ms, la ISR del timer sarebbe eseguita con un ritardo di almeno 100ms.
Si pensa che un IRQ non possa essere persa e che comunque sarà eseguita prima o poi, invece ciò può accadere più spesso di quanto non si pensi.

Se ci illustri per cosa usi il timer e come forse si può trovare una soluzione.
Ricorda che il PWM una volta impostato viene generato dal timer in modo indipendente dalle altre operazioni
eseguite. La tua applicazione potrebbe rientrare tra quelle dette mission-critical o soft-realtime o altro, riuscire a categorizzare la tua applicazione ti permette di decidere se ti serve un RTOS e il tipo di scheduler ecc.

Esempio, cosa accade se c'è uno slittamento dei tempi occasionale, se dei vincoli temporali occasionalmente
non vengono rispettati?
lo puoi accettare o e un disastro di proporzioni bibliche? smiley-grin

Ciao.
33  International / Software / Re: Interrupt contemporanei on: April 06, 2014, 08:07:55 pm
1) L'esecuzione di codice interno a una ISR avviene per default con gli interrupt globali disabilitati.
Terminata la ISR vengono riabilitati gli interrupt.
In sostanza e come eseguire cli() all'ingresso e sei() alla fine della ISR.

2) Si

3) No

Per la (3) se scrivessi del codice per gestire la seriale senza interrupt dovresti anche verificare se gli interrupt della seriale sono disabilitati e se non lo sono provare a vedere cosa succede disabilitandoli.
Temo però che si incasinino un bel poco di cose, ma per saperlo con certezza bisognerebbe analizzare il codice
di Arduino core oppure provare e vedere cosa accade.

Ciao.


34  International / Software / Re: Problema con struttura dati on: April 06, 2014, 07:57:38 pm
Ti ho suggerito una inizializzazione non supportata dallo standard usato da Arduino, ciò è solo possibile con C++11.
Quindi inizializza Matrix nel modo convensionale da dentro la funzione.
Code:
Matrix[0][0] = LOW;
    Matrix[0][1] = LOW;
    Matrix[0][2] = LOW;
    // ecc


Se anche così non va cerca altri problemi, perché ho provato e funziona.

PS: l'inizializzazione che hai usato è valida per inizializzare array e strutture a compile-time
e non a run-time. A partire da C++11 è valida in entrambe i casi.

Ciao.
35  International / Software / Re: Problema con struttura dati on: April 06, 2014, 08:05:26 am
Ora che sono più sveglio, capisco di che si tratta.
Il problema è nella inizializzazione della array Matrix che non viene accettata.
Risolvi inizializzando la matrice sul posto in cui la dichiari.

Code:
struct Zone_t {
  int AnalogPin;
  int pinMatrix[3];
  int firstRead[8];
  int AnalogRead[8];

  int Matrix[8][3] = {
                          {LOW,LOW,LOW}
                        , {LOW,LOW,HIGH}
                        , {LOW,HIGH,LOW}
                        , {LOW,HIGH,HIGH}
                        , {HIGH,LOW,LOW}
                        , {HIGH,LOW,HIGH}
                        , {HIGH,HIGH,LOW}
                        , {HIGH,HIGH,HIGH}
                    };



In merito a _t non è che funziona se c'è o meno il _t, si tratta di una convenzione adottata dai programmatori,
per leggere e comprendere facilmente il codice. Il rischio è per me che continuando a visionare codice
che non adatta le convenzione mi imbastardisco, cioè come si dice praticando lo zoppo...

Ciao.
36  International / Software / Re: Problema con struttura dati on: April 05, 2014, 08:05:13 pm
Stavo per andare a dormire quando ho visto il tuo post, quindi.... smiley-sleep
Non è che si capisce molto quello che vuoi fare, cioè ci sono altri errori che spunteranno fuori
anche sistemando la struct.

Comunque:
struct newtypename {
       type membername;
       type membername;
       type membername;
       ecc...
};

La parentesi { apre un  blocco di codice che devi chiudere con } e struct in particolare richiede il punto e virgola
alla fine.

Crei variabile di tipo Zone_t con
Code:
Zone_t zone0;

Accedi ai membri di zone0 così:
Code:
zone0.AnalogPin = 2;
zone0.AnalogRead[0] = -10;

Poi si tratta di C++ non di C, quindi: Zone anziché Zone_t.
I membri della struct sono variabili e li chiami con la iniziale minuscola ecc, insomma in camelCase, analogPin ecc

Spero di averti illuminato.
Ciao.
37  International / Generale / Re: Segnalazione di problemi legati al forum on: April 05, 2014, 12:29:26 pm
A me capita che uno script impegna CPU0 al 100%, il disco macina e tutto è molto lento, questo accade
quando c'è arduino forum aperto nel browser e sono disconnesso da internet.

Come se lo script non si accorgesse che la connessione non c'è e continua a volere dialogare con il server.

Poi fresca fresca, dopo il reply l'opzione "quote" dei post non si vede e devo scorrere la pagina a destra.

Ciao.
38  International / Hardware / Re: Spiegazione sulle resistenze di pull-up e piccola precisazione on: April 05, 2014, 12:17:44 pm
Mi pare di ricordare che su una scheda Arduino in particolare il pin 13 fosse dotato di resistenza interna e quindi si può evitare di usare quella esterna, ma ciò vale solo per il pin 13 e quella particolare scheda.

Nel dubbio puoi scaricare lo schema teorico della tua scheda e analizzarlo.
In ogni caso una resistenza aggiuntiva fa accendere comunque il led e non compromette i fini didattici,
nel caso di un ATmega montato standalone la resistenza ci va sempre.

Ciao.
39  International / Software / Re: variabile non si incrementa on: April 05, 2014, 12:03:56 pm
se tolgo quelle stringhe di codice prosegue senza che io passi il badge, e va direttamente a stampare sullo schermo lcd la variabile che si incrementa ogni volta che premo il pulsante, però ora la variabile si incrementa smiley  ma io voglio far incrementare la variabile dopo che legge i dati di un badge...

Il mancato conteggio dipende proprio dalla if(...  return;
Si può usare return per impedire la prosecuzione di una funzione e infatti loop è proprio una funzione,
e il mancato funzionamento dipende proprio dal fatto che return ritorna al chiamante, il quale chiama nuovamente
la funzione loop e così via fino a che card.available() ritorna false, la conseguenza è che tutto il codice dopo l'istruzione return viene eseguito solo se card.available() ritorna true.

Ciao.


40  International / Software / Re: variabile non si incrementa on: April 02, 2014, 08:38:52 pm
Ho notato solo un errore banale che è la causa del malfunzionamento
ma non ho analizzato il codice nel dettaglio.

Code:
  d=digitalRead(in);
  if ( in== 1){a=a+1;delay(500);}

La variabile 'd' contiene lo stato del pin letto con digitalRead(), mentre pin è una costante numerica che identifica il numero assegnato al pin di arduino.

Se non è chiaro il controllo if (... deve essere fatto sulla variabile 'd', cioè:
Code:
if ( d == 1) {
    a = a + 1;   // oppure a++; o ++a; in questo contesto sono validi entrambe
   delay(500);
}

Ciao.
41  Community / Bar Sport / Re: [OT] PIC, 8051, MCU e CPU varie on: April 02, 2014, 07:59:06 pm
Io ti insegno gratis le cose sbagliate. smiley-twist
Se vuoi che ti insegni le cose giuste comincia a firmare un assegno in bianco.

Comunque da qui non mi muovo per meno di 10.000 € mese.  smiley-mr-green

Ciao.
42  International / Software / Re: Trasmissione dati in my serial con schede a delay dfferenti on: March 26, 2014, 10:43:37 am
La notifica è legata al protocollo e sei tu che crei il protocollo di comunicazione.
Esempio stabilisci che il carattere # è una notifica, si ma di che tipo?

Chi riceve # vuole sapere di che tipo è la notifica e se c'è ne sono più di una messe in coda e quindi chiede
?#, cioè invia al trasmittente ?# e si mette in ascolto per ricevere la risposta.

Se la risposta è previsto sia composta da più byte si leggono n byte previsti, se invece la risposta può essere più o meno lunga si deve spedire la lunghezza e poi i singoli byte. Con lunghezza di dati variabile il codice da scrivere aumenta e si complica un poco, ma è fattibile.

Master out -> '#' : spedisce una notifica generica e si mette a fare altro, oltre ad ascoltare su seriale.
Slave in -< '#' : Ricevuto un notifica, in conseguenza
Slave out -> '?#' : Chiede informazioni sulla notifica, in conseguenza si mette in ascolto
Master -< '?#' : Lo slave chiede informazioni sul tipo di notifica
Master out -> 'u' : invia informazioni sul tipo di notifica
Slave -< 'u' : Dal protocollo 'u' significa che ci sono nuovi dati elaborati
Slave -> '?u' : Richiede i dati
Master -< '?u' : Dal protocollo slave richiede i dati
Master -> '@, byte, byte, ...ecc
ecc...

Non quali sono gli attori e cosa devono fare, quindi quella suggerita potrebbe essere la strategia sbagliata,
comunque ti è sempre utile per creare un protocollo, spero.

Ciao.
43  International / Software / Re: Trasmissione dati in my serial con schede a delay dfferenti on: March 25, 2014, 05:00:19 pm
Chi prepara i dati da inviare potrebbe inviare solo una notifica del tipo; ci sono nuovi dati.
Chi legge sapendo che ci sono nuovi dati, richiede l'invio e li attende in loop, ricevuti si mette a fare altro tra cui verificare se c'è notifica di nuovi dati.

Ciao.
44  International / Software / Re: Creare Librerie on: March 25, 2014, 04:44:53 pm
@lock
Anche in asm puoi usare una cella di memoria al cui interno ci scrivi un indirizzo di memoria, che equivale a creare puntatori, ma in quel caso ricavi il contenuto della prima cella e lo usi per accedere alla cella di memoria che risiede a quell'indirizzo. Quindi non credo che si tratti di C, C++ o pascal o modula ecc, semplicemente la ram è fatta così. Ma poi che mi fai scrivere che lo sai meglio di me  smiley-yell

Quote
Rimango 'ingannato' dal fatto che l'esito sembra lo stesso, ma sicuramente c'è un motivo perché si usa uno o l'altro modo.

Nella tua testa c'è una grande confusione, che diminuirà solo dopo che sperimenti in prima persona come funzionano il C/C++, e l'unico modo è quello di usare un compilatore per PC o (IDE). Crei alcune variabili e stampi i loro indirizzo, crei funzioni e passi i parametri in tutti i modi conosciuti, nessuna variante esclusa. Sperimentare con il C/C++ su un dispositivo embedded non è pratico nè comodo, se ti convinci di ciò ti renderai conto come stanno le cose e alla fine considererai anche banale l'argomento che comunque non mancherà di fregarti quando meno te lo aspetti.

readBytes prende un puntatore ad tipo unsigned char, quindi il puntatore sarà grande 16 bit ma la cella a cui punta è grande 8 bit. Nella chiamata puoi passare un puntatore o un array (vedi cosa dice lesto).

Nel caso specifico di readBytes la funzione è pensata per gestire l'array passatogli attraverso il puntatore "values", infatti il parametro seguente si chiama length, cioè lunghezza di che ? dell'array.

readUInt prende due argomenti, il primo passato per valore e il secondo passato per riferimento.

Se vuoi puoi scrivere dei pezzi di programma piccoli a cui aggiungi i commenti (chiari chiari) che poi noi qui li correggiamo.

char *charPtr; // Un puntatore non ha segno quindi unsigned char al posto di char, ma non è un obbligo
charPtr prende 2 celle di memoria in quanto il puntatore in AVR è grande 16 bit.
Il dato a cui punta invece è grande 8 bit (lo specifica char).
Per ricavare il dato (valore) a cui punta charPtr si antepone *, es: char myChar = *charPtr; // ricavo il valore e lo salvo in myChar, il valore può avere segno negativo o positivo.

charPtr++; incrementa il puntatore di 1 cella, questo mi da accesso alla cella seguente charPtr.
*(charPtr++) incremento e ricavo il valore.

Sono un poco maligno perché voglio che ti convinci a sperimentare il C/C++ su un pc, sarò ancora più maligno
(se prima non lo fa lesto) la prossima volta con i puntatori a puntatori (che mi procurano mal di testa). 

Ciao.
45  International / Software / Re: Creare Librerie on: March 25, 2014, 09:28:47 am
Quote
'chiedere' &value permette di utilizzare value come se fosse la mia variabile che passo, quindi modificando value modifico anche la mia variabile. Però non posso leggerla perché ne ho solo l'indirizzo, se non tramite il 'giochetto' di prima passando per un puntatore.
Se ho necessita di leggere e modificare la richiedo tramite *value?

Non è chiaro, fai un esempio di codice, così evitiamo fraintendimenti.
Il termine 'chiedere' &value, non è comprensibile.

Vuoi potere accedere ad una variabile da dentro una funzione nello stesso modo in cui la usi da fuori la funzione, ma senza usare puntatori? Nella lista di parametri della funzione usa & prima del nome della variabile, da dentro la funzione la userai nel modo consueto. Questo ovviamente modifica la variabile, in quanto non viene fatta copia locale come per il passaggio per valore.

ops ho dimenticato di chiarire una cosa.

Nella dichiarazione della funzione, i parametri sono da considerarsi essi stessi una dichiarazione, per cui
int &myAlias è una dichiarazione, che potrebbe anche essere detta in questi termini:
hei tu C myAlias è un argomento da passare per riferimento, capito!!
Mentre quando ricavi l'indirizzo di una variabile tramite &, l'indirizzo deve essere ricavato a tempo di esecuzione, qua la cosa si complica un pò a causa della allocazione dinamica della memoria, comunque il compilatore se conosce l'indirizzo di una variabile durante la compilazione risolve in modo statico, diversamente ricava il valore a tempo di esecuzione, cioè durante l'esecuzione del programma.

Ciao.
Pages: 1 2 [3] 4 5 ... 188