Fuse low byte, high byte.

Prendiamo in considerazione L'atmega8, questo ha due byte fuse, divisi in fuse low byte e high byte, dal datasheet si vede che questi due byte sono inizializzati di default dal produttore, quindi comprando un atmega vergine il valore del fuse basso è il seguente:

Tabella 88 pag 224.
Low byte default value = 1 1 1 0 0 0 0 1 (0xE1)

Guardando la tabbella si deduce che i bit meno significativo è posto in fondo la tabbella in questo caso è il fuse bit chiamato CKSEL0, poco più su c'è CKSEL1 e così via fino a CKSEL3, questi li possiamo considerare un nible, cioè mezzo byte.

Il programma avrdude vuole il valore dei fuse in esadecimale, fusecalc (AVR® Fuse Calculator – The Engbedded Blog) mostra il valore di default per la mcu scelta, ed in fondo è possibile vedere la riga di comando di avrdude, -U lfuse:w:0xe1:m -U hfuse:w:0xd9:m.

Non ho indagato sul sugnificato di :w: e :m, ma per il resto si capisce che il lfuse (low byte) è proprio 0xe1 e 0xd9 per high byte.

Ogni bit deve essere considerato programmato se il suo valore è 0 (low, false) e non programmato se il suo valore è 1 (high, true).

Chi volesse provare a calcolare da se i fuse trovi il modo di usare la calcolatrice gcalctool presente in gnome pigiando Ctrl+P, viene visualizzata una calcolatrice dove è possibile fare operazioni con i bit.

Prima che mi diciate "e allore, che devi fare?", rispondo che non ho necessità di programmare i fuse, ma dovevo solo capire come funzionano i fuse ed avrdude per realizzare un GUI simile ad fusecalc, con tanto di tooltip che descrive ogni fuse.

Tutta sta tiritera perchè ho avuto modo di studiare il file xml di atmel che BrainBooster mi ha spedito.
Su http://www.gioblu.com/home nella sezione repositor c'è un progetto di una GUI per avrdude la quale dovra leggere un file xml e con il contenuto di questa popolerà i widget.
La gui è disegnata con QtDesigner ed è ancora da definire, modificare aggiungere secondo le funzionalità richieste anche considerando la semplicità d'uso. Chi fosse interessato a collaborare può contattarmi in PM, rispondere a questo topic. La collaborazione può anche consistere nel:

  1. io farei così, colì.
  2. quel widget mettiamolo in basso.
  3. ho modificato la gui con QtDesigner che ne pensi.

Le modifiche non sono volte a rendere più bella la gui ma solo per definire le funzionalità, es manca un widget con il quale selezionare il programmatore.

Definita la gui con tutti i widget disposti, si completano le funzionalità scrivendo codice C++, ma la gui può anche essere usata con tutti i linguaggi per i quali sia disponibile un binging per Qt, es Python, Ruby, Java, javascript, e chi più nè ha ne metta.

Grazie per l'attenzione.
Ciao

MauroTec:
Non ho indagato sul sugnificato di :w: e :m, ma per il resto si capisce che il lfuse (low byte) è proprio 0xe1 e 0xd9 per high byte.

Da questa guida di avrdude (AVRDUDE: 2.2 Programmers accepting extended parameters parte finale della pagina) se si da il comando -U memtype:op:filename[:format]

w sta per read the specified file and write it to the specified device memory
ed
m immediate mode; actual byte values specified on the command line, separated by commas or spaces in place of the filename field of the ‘-U’ option. This is useful for programming fuse bytes without having to create a single-byte file or enter terminal mode. If the number specified begins with 0x, it is treated as a hex value. If the number otherwise begins with a leading zero (0) it is treated as octal. Otherwise, the value is treated as decimal.

quindi riassumendo in italiano terra-terra :slight_smile: "w" scrive e "m" dice che il valore del fuse non lo prendi da un file testuale ma so stai specificando di seguito nella stessa linea di comando.
in contrappunto "r" legge il valore del fuse e lo salva in un file di testo cha avrà un nome di default tipo highfuse.txt lowfuse.txt ecc... molto comodo prima di fare esperimenti con i fuse dare una lettura generale e salvare i fuse di default :wink:
(questo almeno su windows)

Veramente i fuse sarebbero 3, c'è anche l'efuse, o extended fuse che controlla il brown-out.

Come ti hanno già spiegato, w ed r servono per scrivere e leggere. Un appunto sulla lettura e successiva scrittura su file. Io ho sempre dei grossi problemi a fare questa operazione e mi pare che l'unico file che realmente sia supportato sia quello in formato intel .hex, che però rende un pò più problematica la lettura del dato salvato perché bisogna ricordarsi che è appunto in formato.
Altri formati (tipo .txt) non sono riuscito ad usarli.

Veramente i fuse sarebbero 3, c'è anche l'efuse, o extended fuse che controlla il brown-out.

L'atmega8 non c'è l'ha l'extended fuse, il 328 si, questa diversità potrebbe essere molto marcate in altri micro, nel senso che ci protrebbe essere un micro che in totale ha 4 byte riservati ai fuse.

molto comodo prima di fare esperimenti con i fuse dare una lettura generale e salvare i fuse di default smiley-wink

Penso che questo ha senso solo se non hai scritto da qualche parte il valore di default per quel micro, rimanendo comunque utile poter salvare in modo testo il valore dei fuse, come consultazione per l'utente.

Se non è così allora devo studiare ancora.

Ciao.

In effetti è proprio quello l'uso che ne faccio... come backup per non stare a scrivermi a penna i vari valori :stuck_out_tongue: prima di zappare i micro.

MauroTec:
L'atmega8 non c'è l'ha l'extended fuse, il 328 s

Argh.... ho inteso Atmega8 per la serie x8, scusa... non pensavo proprio all'Atmega8.. ce ne sono talmente tanti che tutti non te li ricordi... :*