[quote author=Michele Menniti link=topic=95050.msg761608#msg761608 date=1334525621]
Ottimo! Nel frattempo ho verificato (risp implicita a Testato) che funzionano; se setto uno quasiasi dei due bit a 0 non riesco più a programmare i fuses, è un'altra delle caratteristiche dei lock bits; per poter riprogrammare devo fare prima un chip erase che mi resetta i lock bits su FF. Ho già implementato la sezione di programmazione personalizzata (ora, a richiesta, gli dò io FE o FC, FF è inutile in quanto o lo è già o non si può scrivere).
[/quote]
Sì, va bene. Se ti ricordi quel documento di AvrFreaks che segnalai, i lock bit possono essere impostati solo unidirezionalmente verso un aumento della protezione, non puoi ritornare indietro. Quindi dal livello zero al massimo va bene, viceversa no.
Secondo quesito: non capisco in cosa consiste il write o write/verify locked, riguardo flash e EEPROM; cioè settando 00 io blocco tutto e mi è chiaro che il chip erase cancella tutto e resetta i LB; però anche in condizione 00 io riesco tranquillamente in ISP a programmare il micro "bloccato", e contemporaneamente resetto i LB. Ma allora a che cavolo serve questo LB?
Livello minimo: libero accesso alle memorie sia in lettura che scrittura
Livello intermedio: non puoi più scrivere sulle memorie ma puoi leggerle
Livello massimo: non puoi né scrivere né leggere
I lock bit servono non solo per evitare sovrascritture della memoria ma anche per proteggere il firmware ed evitare che qualcuno faccia il dump della memoria "rubandoti" il firmware.
Terzo quesito: il comando read_lockbits=read_HVSP_command(0x00, HVSP_LOCKB_READ_INSTR3);
legge il valore dei LB, con Serial.print(read_lockbits, HEX) riesco a vedere FF, FE, FC; non riesco però a "leggere" il contenuto ai fini di associargli una descrizione. Cioè se faccio
switch (read_lockbits,HEX) {
case 'FF':
Serial.print("Free");
break;
case 'FE':
Serial.print("Write Lock");
break;
case 'FC':
Serial.print("Write & Verify Lock");
break;
}
non funziona, non mi riconosce mai il contenuto, infatti il comando Serial.print(read_lockbits) mi restituisce blank, però il valore c'è.
Ma perché non usi una maschera a bit per estrarre il valore dei lock bit?
Fai un (VALORE_LOCK && 0b00000011). Come risultato hai appunto la condizione dei 2 lock bit.