Go Down

Topic: Topic permanente di programmazione newbie (Read 123368 times) previous topic - next topic

menniti



anzi un ritardo è introdotto da un delay che Astro non mi ha spiegato, subito dopo la dichiarazione delle variabili.


Il delay è solo per non bombardare la seriale con una marea di dati, dato che per l'esempio ho inserito tutto nella loop giusto per non farti vedere una marea di righe correre a velocità luce sul serial monitor ho messo quel ritardo.


Allora lo posso togliere, visto che la seriale l'attivo solo dopo che ho tutti i dati e non mentre li leggo. Grazie.
Ora vorrei solo un paio di chiarimenti sulla funzione:
Code: [Select]
temp1 = (unsigned int)(byte2 << 8) + byte3; in temp1 metti la somma o l'unione dei bue byte? A che serve "<<8"?
Il resto mi è chiaro, fai ciclicamente la stessa cosa con temp2 prendendo i dati dall'array e confrontandoli con quelli di temp1, quando coincidono esci e riporti l'indice.
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

astrobeed


tutti i dati e non mentre li leggo. Grazie.
Ora vorrei solo un paio di chiarimenti sulla funzione:
temp1 = (unsigned int)(byte2 << 8) + byte3;


Spiegazione estesa di cosa fa questa riga in C:
Code: [Select]
temp1 = (unsigned int)(byte2 << 8) + byte3;
Temp1 è definita come variabile di tipo unsigned int, cioè un intero senza segno in grado di rappresentare un numero compreso tra 0 e 65535.
byte2 e byte3 sono due variabili unsigned char, aka byte in wiring, la riga altro non fa che sommare assieme i due valori per ottenere un numero intero a 16 bit, per farlo è necessario moltiplicare per 256 il primo valore in modo da spostarlo 8 bit avanti, il modo più semplice, e rapido, per farlo è utilizzare l'operatore shift verso sinistra, il "<< 8".
In pratica byte2 viene letteralmente spostato di 8 bit trasformandolo da un valore unsigned char in un unsigned int, p.e. se byte2 vale 0xAA dopo l'operazione di shift vale 0xAA00, però dato che il dato è definito come unsigned char, cioè solo otto bit, è indispensabile dire al linguaggio che la variabile viene promossa a unsigned int e questo si fa tramite il casting, cioè il "(unsigned int)" prima di byte2.
Un volta che byte2 è diventato un 16bit possiamo sommargli byte3 per ottenere un valore a 16 bit univoco che rappresenta i due byte, p.e. se byte2 = 0xAA e byte3 = 0x25 dopo lo shift e il casting abbiamo 0xAA00 e dopo la somma di byte3 abbiamo 0xAA25.
La stessa cosa viene fatta durante il confronto utilizzando i dati della matrice comparandoli con il valore precedentemente calcolato.
Scientia potentia est

menniti

Azz, m'hai appena regalato un quarto di pagina d'articolo XD no, scherzo, però visto che devo fare didattica credo non sia male soffermarsi su qualche tecnica particolare dello sketch; sei stato chiarissimo, grazie!
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

menniti

Leggo il byte FLAGS dall'array con il comando  FLAGS = fuses[indice] [3];
ogni byte per me significano due variabili distinte in combinazione, pensavo che il seguente codice le assegnasse regolarmente, invece su serial non mi esce altro che un quadratino bianco, sia per l'una che per l'altra variabile (sono globali tipo "BYTE"):
Code: [Select]
switch (FLAGS) {
  case 0x00:
    BURN_EFUSE = 0;
    mode = HVSP;
    break;
  case 0x01:
    BURN_EFUSE = 0;
    mode = HVPP;
    break;
  case 0x02:
    BURN_EFUSE = 0;
    mode = HVP13;
    break;
  case 0x03:
    BURN_EFUSE = 1;
    mode = HVSP;
    break;
  case 0x04:
    BURN_EFUSE = 1;
    mode = HVPP;
    break;
  case 0x05:
    BURN_EFUSE = 1;
    mode = HVP13;
    break;
  }
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

astrobeed


Leggo il byte FLAGS dall'array con il comando  FLAGS = fuses[indice] [3];
ogni byte per me significano due variabili distinte in combinazione, pensavo che il seguente codice le assegnasse regolarmente, invece su serial non mi esce altro che un quadratino bianco, sia per l'una che per l'altra variabile (sono globali tipo "BYTE"):


Dipende da come le fai visualizzare, usa l'estensione HEX nella serial print cosi vedi esattamente il contenuto in formato esadecimale.
Scientia potentia est

menniti

Hai ragione, in esadecimale BURN_EFUSE mi dà 0 o 1 correttamente; mode invece mi dà 0,1 o 2, cioè le differenze corrispondono ma da dove li prende questi tre valori numerici che io non ho dato da nessuna parte? per vedere i valori testuali attribuiti come devo fare?
Anche perché dopo visualizzati li devo usare per decidere quali routine lanciare per le varie fasi della programmazione.
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

astrobeed


Hai ragione, in esadecimale BURN_EFUSE mi dà 0 o 1 correttamente; mode invece mi dà 0,1 o 2, cioè le differenze corrispondono ma da dove li prende questi tre valori numerici che io non ho dato da nessuna parte?


???
Sei tu che assegni un valore a mode, "mode = HVP13;", da qualche parte avrai predefinito HVP13, HVPP, HVSP e in base a queste definizioni mode viene inizializzato di conseguenza.
Scientia potentia est

menniti

è questo vero.....
enum modelist { HVSP, HVPP, HVP13 };
che assegna 1, 2, 3?
ma ora ti chiedo, nella prosecuzione dello sketch li ritiene equivalenti 1/HVSP, ecc.?
Cioè se io dopo aver caricato un flags in cui mode = 1 (quindi = HVSP), faccio una cosa del genere:
if mode = HVSP
me lo dà come "vero"? altrimenti sono fott.....
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

astrobeed


Cioè se io dopo aver caricato un flags in cui mode = 1 (quindi = HVSP), faccio una cosa del genere:
if mode = HVSP
me lo dà come "vero"? altrimenti sono fott.....


Se in mode hai caricato HVSP, precedentemente predefinito con un certo valore, p.e. #define HVSP 1, e poi fai "if (mode == HVSP)" ovviamente ottieni un match.
Scientia potentia est

menniti

#129
Mar 09, 2012, 07:02 pm Last Edit: Mar 09, 2012, 07:06 pm by menniti Reason: 1
mi sono spiegato male, io non ho usato alcuna define per quei tre valori, la prima volta che sono nello sketch è in quella enum modelist, da quel punto in poi ci sono solo cose tipo
mode = HVPP
oppure
If mode = HVSP
non c'è, garantito, alcun punto dello sketch in cui HVSP=0, HVPP=1, HVP13=2, nemmeno separati, quindi credo che sia l'enum modelist che assegna un valore numerico in base alla posizione tra le { }, faccio prima a fare qualche prova, a dopo :)

INFATTI: se trasformo enum modelist { HVSP, HVPP, HVP13 }; in enum modelist { HVPP, HVSP, HVP13 }; è HVPP ora che vale 0 e HVSP che vale 1, quindi è proprio questo comando, che peraltro non conosco e non trovo che fa questa cosa, quindi presumo che funzioni tutto, continuo con le prove

Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

astrobeed


INFATTI: se trasformo enum modelist { HVSP, HVPP, HVP13 }; in enum modelist { HVPP, HVSP, HVP13 }; è HVPP ora che vale 0 e HVSP che vale 1, quindi è proprio questo comando, che peraltro non conosco e non trovo che fa questa cosa, quindi presumo che funzioni tutto, continuo con le prove


Ma perché sei andata ad usare una enum invece delle #define ?
La enum assegna un valore numerico,a salire, per ogni nome inserito l'elenco.
Scientia potentia est

menniti



INFATTI: se trasformo enum modelist { HVSP, HVPP, HVP13 }; in enum modelist { HVPP, HVSP, HVP13 }; è HVPP ora che vale 0 e HVSP che vale 1, quindi è proprio questo comando, che peraltro non conosco e non trovo che fa questa cosa, quindi presumo che funzioni tutto, continuo con le prove


Ma perché sei andata ad usare una enum invece delle #define ?
La enum assegna un valore numerico,a salire, per ogni nome inserito l'elenco.

maschietto garantito :smiley-mr-green:
è un comando che ho "ereditato" e che ora ho capito XD infatti nelle "if" i tre valori sono usati senza " " come dovrei fare se fossero testi; in pratica se faccio sparire quel comando lascio "byte mode" come definizione e di volta in volta gli attribuisco il valore che mi serve:
mode = "HVPP" per poi fare if mode == "HVPP"
giusto? ma a questo punto mi torna comoda questa cosa; nella seriale )che non so nemmeno se poi mostrerò questi valori di flags), al più metto un "if mode=0 s.p("HVSP") e sono a posto lo stesso, no?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

menniti

Buongiorno, tutti i problemi precedenti sono risolti, ma ogni gradino è una tragedia :smiley-sweat: :smiley-sweat:
Problemi a trasferire pezzi di codice in funzioni/routine.
Dopo questa riga:
for(i=0;i<20;i++) modello = atmel[indice] ;
io mi ritrovo una variabile che chiamo solo "modello" che contiene il nome del micro
che visualizzo con
Serial.println(modello); (ovviamente preceduto da begin…)

se creo una
void data_display(void){
Serial.println(modello); (ovviamente preceduto da begin…)
}
E la richiamo con
data_display();

il campo mi resta vuoto; non posso dichiarare questa variabile come globale perché si riempie di sporcizia; come faccio a portarla nella void? Ho usato una void in quanto devo solo visualizzare valori e non deve restituirmi nulla.
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

brainbooster

ma il datadisplay cosa ritorna?
e perchè non
void data_display()
?

menniti

#134
Mar 10, 2012, 09:15 am Last Edit: Mar 10, 2012, 09:29 am by menniti Reason: 1

ma il datadisplay cosa ritorna?
e perchè non
void data_display()
?

Ciao BB, con l'occasione spiegami la differenza tra "void name()" e "void name(void)" perché sto lavorando con alcuni pezzi di codice ereditati, quindi alcune cose non mi sono chiare per niente.
comunque anche togliendo il void tra le ( ) il risultato è modello = vuoto, o meglio un quadratino, che indica comunque un carattere.

EDIT: ho risolto, mettendo la dichiarazione della variabile nelle globali, stranamente non escono più quei caratteri strani, probabilmente giorni fa, quando mi diede il problema, lasciavo aperta la seriale da qualche parte; comuqnue ora testo meglio.
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

Go Up