Topic permanente di programmazione newbie

è 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 :)

Perfetto, ma credo di dover mettere tutto in un while; la logica è: aspetto un carattere leggo il carattere e lo confronto con i codici se è ok carico il carattere nel buffer se non è ok aspetto un nuovo carattere

quindi ora il mio problema è come fargli rifare la lettura se il carattere è sbagliato, provo a "studiare" :D

perchè deve rileggere un carattere sbagliato?

Mi spiego meglio, io devo fornire al firmware due caratteri validi per programmare il fuse; allo stato attuale accetta qualsiasi schifezza e la riconverte a modo suo in un valore HEX; voglio fare in modo di poter scrivere solo valori HEX; se scrivo "X" lui deve ignorarlo ed aspettare un nuovo carattere che rientri tra quelli richiesti. Ho fatto così:

do {
    while (Serial.available() == 0);   // aspetta il primo carattere
    r = Serial.read();
  } while (r>=48 || r<=70 || r>=65 || r<=70 || r>=97 || r<=102);
  serbuffer[0] = Serial.read();      // lo imposta come HIGH byte del fuse

ma come faccio a trasformare il carattere letto nel suo valore ascii? la riga r = Serial.read(); dovrebbe essere qualcosa tipo r = ASC(Serial.read()); c'è un comando di conversione?

EDIT: penso che così vada bene:

do {
    while (Serial.available() == 0);   // aspetta il primo carattere
    r = Serial.read();
  } while (r>=0 || r<=9 || r>='a' || r<='f' || r>='A' || r<='F');

ora a cena e poi provo