Topic permanente di programmazione newbie

@ Testato: dal reference del mega328:

If no Boot Loader capability is needed, the entire Flash is available for application code. The Boot Loader has two separate sets of Boot Lock bits which can be set independently. This gives the user a unique flexibility to select different levels of protection.

quindi il margine di manovra c'è, ma riguardo i lock_bit e non l'erase, a quanto pare si può agire sull'area di memoria che viene (via fuse) riservata al bootloader, quindi avrai il tuo margine di divertimento, io ora continuo a cercare di capire come funziona tecnicamente il lock bit e poi decido cosa fare.

EDIT: prime info: I lock bit in realtà sono 4: la coppia 01 e 02 serve per proteggere la sezione degli applicativi (sketch), la coppia 11 e 12 invece agisce sull'area riservata (se c'è) al bootloader. Ovviamente sono possibili per ogni coppia 4 combinazioni: 1 - 1 aree libere 1 - 0 protezione contro la scrittura 0 - 0 protezione contro lettura e scrittura 0 - 1 protezione contro la lettura Questo significa che devo proprio organizzare un menu a parte per questa opzione, per le 4 scelte, inoltre devo implementare sia la lettura che la scrittura. Bel lavoro, forse mi conviene prima iniziare l'articolo visto che entro fine mese devo consegnare la prima parte. Vi aggiorno con altre notizie.

EDIT 2: sbucano fuori altri due lock_bit, quelli “generali”! Sono LB2 e LB1 Tre combinazioni: 1 – 1 memoria libera 1 – 0 protezione in scrittura 0 – 0 protezione in scrittura e lettura Se ho ben capito, una volta bloccati i lock bit generali non è possibile neppure variare i valori dei fuse, oltre che quelli dei lock bit specifici; infatti c’è una nota che dice:

Program the Fuse bits and Boot Lock bits before programming the LB1 and LB2.

Sto imparando a muovermi agevolmente nei reference, grazie a questo progetto che mi ha costretto! Ma potrei sbagliare traduzione, quindi verificate prima di fare eventuali operazioni.

In defrinitiva ci vorrebbe un bel pezzo di programma solo per mettere mano a questa cosa, penso che al massimo mi limiterò ai due lock bit "generali", altrimenti Voi dopo con che vi divertite? ;)

@ BB: cioè? hai il sito ufficiale perché te la sei dovuta recuperare da un sito giapponese? smiley-eek

perchè è diverso, per esempio quell'avrdude ha la modalità auto per l'autoriconoscimento dei micro, più altre cosette interessanti come serjtag, bitbang ecc..

amario57: perché so un po' di giapponese :D ....

Per il Giapponese parlato un minimo di comprensione l'ho raggiunta a furia di guardare anime in versione originale con i sub, adesso qualche parola riesco a capirla anche senza leggere :)

è vero anche nel mio caso naruto docet :stuck_out_tongue_closed_eyes: per lo scritto c'è san google ( o google san :grin:) .

menniti: FUNZIONA! con i fuse settati correttamente per il clock interno a 1Mhz, i tre led del mio ISP Programmer lampeggiano a ritmo di 1 secondo, nessun errore, nessuna difficoltà, GRANDI! Se vi serve qualche altra prova di conferma, fattibile, chiedete tranquillamente. :)

Ottimo, a questo punto tocca scrivere una piccola guida su come effettuare l'upgrade del compilatore all'ultima versione di AvrWin e postarla su un topic dedicato.

astrobeed:

menniti: FUNZIONA! con i fuse settati correttamente per il clock interno a 1Mhz, i tre led del mio ISP Programmer lampeggiano a ritmo di 1 secondo, nessun errore, nessuna difficoltà, GRANDI! Se vi serve qualche altra prova di conferma, fattibile, chiedete tranquillamente. :)

Ottimo, a questo punto tocca scrivere una piccola guida su come effettuare l'upgrade del compilatore all'ultima versione di AvrWin e postarla su un topic dedicato.

Se sono i passaggi che mi hai detto di fare (installazione e sost.ne di cartelle salvando l'etc), e considerando che la parte relativa ad AVRDUDE.CONF ed al core riguarda solo l'uso del 4313, davvero non serve fare una guida; basta aprire un Topic e spiegare in due parole i passaggi; se vuoi ci penso io (citando i diritti d'autore, naturalmente :D $))

menniti: se vuoi ci penso io (citando i diritti d'autore, naturalmente :D $))

Se hai voglia di farlo per me va benissimo, io divento molto pigro quando c'è da preparare documentazione :D

astrobeed:

menniti: se vuoi ci penso io (citando i diritti d'autore, naturalmente :D $))

Se hai voglia di farlo per me va benissimo, io divento molto pigro quando c'è da preparare documentazione :D

Ok, ma ci metto un paio di minuti, semmai poi intervieni per vedere se è il caso di specificare qualcosa..... Sono riuscito a leggere il lock_bit in modalità HVPP, almeno credo, visto che seguendo la procedura mi restituisce in HEX il valore 0xFF che credo corrisponda all'11 che mi aspettavo (lock bit NON programmati); anche la relativa scrittura è abbastanza facile e ormai anche quella in HVSP, ormai che ho capito il meccanismo di qtutto quel bordello di passaggi, tutto sta nello scrivere le righe XD Però ora sono stanco e questo è un lavoro che per me richiede mente freschissima, non voglio mettere in piedi un lager per mcu ATMEL :fearful: Comunque penso di implementare almeno i due lock_bit generali, la sub-gestione di area applicativi e area bootloader davvero mi rompe; però ti chiedo di dare un'occhiata al reference per confermarmi che posso tranquillamente sbloccarli, in un modo (HV) o nell'altro(chip_erase); non vorrei davvero piazzare sta cintura di castità a qualche micro per poi accorgermi di non avere la chiave :cold_sweat:

menniti: Se ho ben capito, una volta bloccati i lock bit generali non è possibile neppure variare i valori dei fuse, oltre che quelli dei lock bit specifici; infatti c’è una

Si, una volta attivati i lock bits non puoi più tornare indietro e non puoi nemmeno modificare i fuse perché il livello minimo è proprio la protezione in scrittura. Per rimuovere i lock bit puoi usare solo il comando erase, non c'è programmazione HV che tenga.

astrobeed:

menniti: Se ho ben capito, una volta bloccati i lock bit generali non è possibile neppure variare i valori dei fuse, oltre che quelli dei lock bit specifici; infatti c’è una

Si, una volta attivati i lock bits non puoi più tornare indietro e non puoi nemmeno modificare i fuse perché il livello minimo è proprio la protezione in scrittura. Per rimuovere i lock bit puoi usare solo il comando erase, non c'è programmazione HV che tenga.

Io le procedure di chip_erase le ho già implementate con successo, spariscono i blink che è una bellezza sia in HVPP che in HVSP, quindi posso stare tranquillo che una volta bloccati i lock_bit se do' un chip erase tornano su 11?

Il Topic sul compilatore è aperto serve il Suo regal imprimatur, Sua Realtà :D

menniti: quindi posso stare tranquillo che una volta bloccati i lock_bit se do' un chip erase tornano su 11?

Yes.

Bene, la notte porta consiglio, poco saggio secondo me, ma ormai è fatta (si fa per dire…).
Allora appena identifico il micro mediante signature leggo anche i fuse ed i lock bit e mostro tutto a video; nel menu principale (ce ne faremo di risate con l’LCD reale :fearful:), oltre al tipico fine lavoro (potrebbero essere sufficienti le info mostrate) ho previsto il ripristino dei fuse di default, la programmazione personalizzata dei fuse, il chip erase ed ora aggiungerò anche la mcu protection (nome temporaneo), che farà apparire una domanda per scegliere tra read_lock e read-write_lock; inutile aggiungere lo sblocco perché tanto non funziona; come chiarito da Astro l’unico modo possibile per sbloccarli è il chip erase.
Però non so quanto tempo mi leva tutta questa cosa, quindi oggi mi metto a scrivere l’articolo della prima parte hw, visto che per settimana prossima devo consegnarlo e poi mi dedicherò nuovamente al firmware.
Intanto se avete idee e suggerimenti scirvete tranquillamente, ovvio che faccio filtro, ma magari c’è qualcosa su quanto già fatto…

Quando devo programmare i fuse scrivo i valori sul serial monitor; ho notato che la procedura è case sensitive e a me non va bene, vorrei poter scrivere i valori dia in minuscolo che in maiuscolo ottenendo che alla fine diventino maiuscoli; ai miei tempi :blush: mi pare che sommavo in basic 32 al minuscolo per ottenere il maiuscolo, poi uscirono comandi specifici come ucase e lcase, ma qui?

EDIT: ho risolto, disponevo di una funzione di conversione da HEX a numero, mi è bastato aggiungere le minuscole :slight_smile:

Se non hanno cambiato il codice ASCII l'altro giorno dovrebbe funzionare allo stesso modo XD

ratto93: Se non hanno cambiato il codice ASCII l'altro giorno dovrebbe funzionare allo stesso modo XD

No, l'ho dovute aggiungere le minuscole e trattarle come le maiuscole, comunque è ok. Invece:

while (Serial.available() == 0);   // aspetta il primo carattere
  
  serbuffer[0] = Serial.read();

tra queste due righe voglio mettere un controllo per rifiutare i caratteri che non rientrano nei range 0÷9 e A/a÷F/f, altrimenti la conversione esadecimale mi dà risultati sconvolgenti. Come posso fare?

In pratica devo poter accettare solo i caratteri con valore decimale tra 48 e 57 (0-9), tra 65 e 70 (A-F) e tra 97 e 102 (a-f); se il carattere rientra in questi range allora esegue la riga successiva, caricando il valore nel buffer, altrimenti dovrebbe restare in attesa del carattere come se non fosse stato premuto alcun tasto.

(spazio permettendo) si poteva anche convertire tutto in striga e usare gli appositi operatori

BrainBooster:
(spazio permettendo) si poteva anche convertire tutto in striga e usare gli appositi operatori
http://arduino.cc/en/Tutorial/StringCaseChanges

Non ho problemi di spazio :grin:; Comunque la funzione che mi risolve il problema di maiuscole/minuscole nella conversione a HEX è:

/************************ conversione di un carattere HEX in un numero *************************/
int hex2dec(byte c) {
  if (c >= '0' && c <= '9') {
    return c - '0';
  }
  // accetta indifferentemente maiuscole o minuscole
  else if (c >= 'A' && c <= 'F') {
    return c - 'A' + 10;
  }
  else if (c >= 'a' && c <= 'f') {
    return c - 'a' + 10;
  }
}

come vedi ho aggiunto il controllo delle minuscole. Invece ora ho il problema di dover ignorare tutti i valori che non rientrano nell’esadecimale.

spiega meglio cosa passa e cosa vuoi filtrare

In pratica devo restare in attesa di un carattere sulla seriale ma devo poter accettare solo i caratteri con valore decimale tra 48 e 57 (0-9), tra 65 e 70 (A-F) e tra 97 e 102 (a-f); se il carattere rientra in questi range allora esegue la riga successiva, caricando il valore nel buffer, altrimenti dovrebbe restare in attesa del carattere come se non fosse stato premuto alcun tasto.

con if potresti fare esattamente quello che hai detto :) mettiamo che il carattere in entrata si chiami c

if (c>=48 ||c<=70 ||c>=65 ||c<=70 || c>=97 || c<=102){
c è un carattere valido
}
else
{
ignoralo
}

ho usato i valori decimali perchè li avevi già scritti :)