Go Down

Topic: ATmega328PB (Read 103215 times) previous topic - next topic

astrobeed

Io ingloberei tutto nella funzione e poi far ritornare solo l id già tutto intero.
Sono nove byte, puoi gestirli solo tramite un array e gli array non si passano tra funzioni, si possono passare solo i puntatori.
Diciamo che si può gestire il tutto tramite un singolo file .h dove ci sono le definizioni dei registri e una macro che li legge, però sempre con i puntatori dovrai litigare. :)

p.s.
Non esiste il software Arduino like, esiste solo il software scritto bene e quello scritto male. :)
Scientia potentia est

gpb01

#541
Mar 21, 2016, 03:06 pm Last Edit: Mar 21, 2016, 03:07 pm by gpb01
In modo da chiamarlo con un semplice int mcuIDnumber();
E vedersi ritornato il dato
... aggiungo che non servirebbe a nulla, non c'è mica scritto nulla di stampabile, sono 9 bytes con valore da 0x00 a 0xFF che messi assieme fanno un codice univoco utilizzabile in ben poche applicazioni NON certo per "iniziandi" (...tipicamente chiavi crittografiche) ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

testato

Dai esiste, arduino ha come merito proprio questo, quello di aver inventsto l'arduino like.

Certo sempre con puntatori, non dico di fare diversamente, d'altronde un array cos'e' ?  :)

Dico che si deve inglobare il tutto e lasciare allo user solo l'onere di richiamare una funzione.
Dopo la scrivo, ma non posdo provarla  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

astrobeed

Scientia potentia est

PaoloP

#544
Mar 21, 2016, 04:17 pm Last Edit: Mar 21, 2016, 04:17 pm by PaoloP
Quindi il nostro caro 328, P o PB, non può più andare a 20Mhz  :smiley-cry:  :smiley-cry:
--> https://forum.arduino.cc/index.php?topic=360407.msg2674159#msg2674159

astrobeed

Quindi il nostro caro 328, P o PB, non può più andare a 20Mhz  :smiley-cry:  :smiley-cry:
Il datasheet dice l'esatto contrario :)

Code: [Select]
Up to 20 MIPS Throughput at 20MHz

La questione del full swing non ha nulla a che vedere con la frequenza massima, serve solo per migliorare l'affidabilità dell'oscillatore in ambienti molto rumorosi, per contro aumenta il consumo di energia.
Altro dettaglio, la questione quarzo da usare col micro è molto importante, tutti i produttori rilasciano AN specifiche e consigliano specifici modelli di quarzo, non si può avere la pretesa di usare quarzacci cineseria low cost e pretendere che tutto funziona sempre.
Giusto per curiosità ho appena fatto un test collegando al clock della Xplained il mio generatore di segnali con out a 20 MHz, il micro funziona perfettamente. :)

Scientia potentia est

speedyant

Io arriverei al massimo a 10MHz, peccato...

testato

#547
Mar 21, 2016, 05:55 pm Last Edit: Mar 21, 2016, 05:57 pm by Testato
Raffredato ?  :smiley-mr-green:
Scorrettore automatico  :)

sembrava piu' facile, ma non riesco ad arduinizzare facilmente il fatto dell'ID
si potrebbe convertire l'array di byte in una String e ritornarla al chiamante.

Voi vedete altre soluzioni ? Intendo per poter fare, senza dover dichiarare nulla lato sketch

Code: [Select]
Serial.print(get_mcuSerialNumber());  
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

gpb01

#548
Mar 21, 2016, 06:03 pm Last Edit: Mar 21, 2016, 06:04 pm by gpb01
Testato, sei disattento ... :smiley-evil:

... t'ho già spiegato QUI che è inutile e non si può fare; NON contiene caratteri stampabili, ma un numero binario di 9 byte che identifica univocamente il chip.

Se uno proprio vuole vederlo, l'unica è stampare carattere a carattere in HEX ... come ti ho già scritto ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

testato

#549
Mar 21, 2016, 07:33 pm Last Edit: Mar 21, 2016, 07:35 pm by Testato
distratto no, testa si  :)

l'ho letto il top post, ma volevo vedere come poter fare un
Code: [Select]
Serial.print(get_mcuSerialNumber());
 

in modo da stampare la sequenza del seriale convertito in decimale, quindi facendo tutto internamente alla funzione.
Ma mi sembra che l'unica strada sia usare String internamente sempre alla funzione e ritornare appunto la stringa. Un qualcosa di copiosamente grosso per una cosa del genere.

Per sfizio, non perche' sia utile o obbligatorio  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

gpb01

Quella funzione accede direttamente all'array che gli viene passato e NON torna nulla, ma mette i valori direttamente nell'array, quindi, in quel modo, NON la puoi usare.

O te ne scrivi un'altra (che fa un lavoro inutile  :smiley-twist:) e che ritorna il pointer ad una stringa dove metti quello che ti pare o, con quella che ho messo io, non lo fai.

Guglielmo
Search is Your friend ... or I am Your enemy !

testato

Si l'ho riscritta così senza puntatori, riempio un array lo converto in decimale, lo converto in stringa e lo ritorno al chiamante, ma appunto devo mettere in gioco String e poi passare la stringa definitiva al chiamante. Diventa pesante.

Ho notato una cosa sulla tua funzione, se invece di stampare con println stampo solo con print mi stampa tutti zero.
Anche a te fa così ? Perché ? Print vs Println dovrebbe solo stampare tutto attaccato
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

gpb01

#552
Mar 23, 2016, 11:43 am Last Edit: Mar 23, 2016, 11:45 am by gpb01
Ho notato una cosa sulla tua funzione, se invece di stampare con println stampo solo con print mi stampa tutti zero.
Anche a te fa così ? Perché ? Print vs Println dovrebbe solo stampare tutto attaccato
No, a me funziona allo stesso modo (ovviamente, per valori inferiori a 0x10 ... scrive solo UN carattere, ma lo fa sia con la print che con la println) ...

Code: [Select]
void get_mcuSerialNumber(byte* pSerial) {
  for (byte i = 0; i < 9; i++) *(pSerial + i) = _SFR_IO8(0xF0 + i);
}

void setup() {
  // put your setup code here, to run once:
  byte serialNumber[9];
  //
  delay(1000);
  Serial.begin(9600);
  //
  get_mcuSerialNumber(serialNumber);
  for (byte i = 0; i < 9; i++) Serial.print(serialNumber[i], HEX);
  Serial.println();
}

void loop() {
  // put your main code here, to run repeatedly:

}


Risultato : DA06E616E0696E

Se compilo con la pintln() :
D
A
0
6E
61
6E
0
69
6E

Guglielmo

Search is Your friend ... or I am Your enemy !

PaoloP

Con il testo formattato
Code: [Select]
  for (byte i = 0; i < 9; i++){
    if (serialNumber[i] < 16) Serial.print(F("0"));
    Serial.print(serialNumber[i], HEX);
    if (i < 8) Serial.print(F("-"));
  }

testato

Che cosa strana,
Stai usando ide 1.6.8 ?
Lo provi su 328 standard ? Lo so che escono numeri ad minchian ma deve comunque comportarsi uguale tra println e print

Fosse un nuovo bug ?  :)

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Go Up