Arduino Forum

International => Italiano => Generale => Topic started by: menniti on Mar 04, 2012, 09:50 pm

Title: Topic permanente di programmazione newbie
Post by: menniti on Mar 04, 2012, 09:50 pm
Sto lavorando ad un firmware piuttosto complesso nella struttura, lo devo praticamente stravolgere, alla fine ho deciso di riscriverlo, troppo disordine. Chiaramente ora vorrei rifarlo secondo le mie esigenze ma le mie conoscenze in C sono prossime allo 0 (partendo da negativo!); fondamentalmente riorganizzerò i blocchi del software precedente più altri usciti dai preziosi suggerimenti di Astrobeed e di Leo72, ma il "contorno" me lo devo riceare e lì sono usciti subito i primi problemi; ho scaricato tempo fa da un link il language reference di Arduino ma le mie scarne conscenze non mi permettono di superare ciò che lì è dato per scontato. Ho pensato allora di aprire questo Topic per porre domande che per me sono importanti e per molti di voi saranno banali, man mano che usciranno le mie esigenze. Ciò vale anche per i messaggi di errore che a volte escono e che mi fanno impazzire per trovare la soluzione. Il mio tempo è scarso quindi il vostro aiuto diventa per me prezioso. Naturalmente questo Topic potrebbe diventare un serbatoio di richieste di chiunque abbia un qualsiasi dubbio di programmazione.
Chiudo questo post qui come premessa e nel successivo pongo la prima domanda. Grazie a chiunque collaborerà.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 04, 2012, 09:56 pm
;)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 04, 2012, 09:59 pm
Ed ecco il primo quesito :
Ho necessità di creare uno switch case in cui le risposte siano "S" e "N" e non 1 e 2. Ho scritto questo
Quote
byte response = NULL;// variabile globale messa prima del setup
//il seguito si trova in loop
Serial.println("Vuoi riprogrammare i fuse di questo micro? S/N");
  while(response == NULL) {
      while (Serial.available() == 0);   // aspetta un carattere
      response = Serial.read();  // legge la risposta dell'utente
   
  switch(response) {
      case 'S':
      case 's':
        mode = ATMEGA;
        break;
      case 'N':
      case 'n':
        Serial.println("Togli il micro dallo zoccolo e premi il pulsante RESET");
        end_programming();
        break;
      default:
        Serial.println("Per favore premi S o N");
        response = NULL;  // reset response so we go thru the while loop again
        break;

se premo s, S, n o N comunque mi esce il messaggio d'errore. Perché?

EDIT: falso problema, funziona, non chiedetemi cosa ho fatto, non lo so :(
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 04, 2012, 10:03 pm
Perché non puoi confrontare un tipo byte con un carattere, devi usare il tipo char.
http://arduino.cc/en/Reference/Char

http://www.java2s.com/Code/C/Language-Basics/Howtouseswitchchar.htm
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 04, 2012, 10:09 pm

Perché non puoi confrontare un tipo byte con un carattere, devi usare il tipo char.
http://arduino.cc/en/Reference/Char

http://www.java2s.com/Code/C/Language-Basics/Howtouseswitchchar.htm

Ma quella del tipo char era la strada che avevo tentato di seguire creando una global:
char yesno = "" (o anche = NULL) ma mi ha preso a parolacce già su questa definizione, invece ora col tipo byte riconosce le quattro modalità e risponde correttamente, boh!?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 04, 2012, 10:20 pm
Non mi prende a parolacce:
Code: [Select]

void loop() {
char stringa='a';
switch(stringa) {
    case 'a':
        break;
    }
}


byte è un tipo di dati di arduino che altro non è se non un unsigned char. Ma se devi fare confronti con le lettere mi pare più corretto usare il tipo di dati appropriato, cioè char, dato che byte è stato "inventato" proprio per trattare numeri.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 04, 2012, 10:20 pm

Perché non puoi confrontare un tipo byte con un carattere, devi usare il tipo char.


char e unsigned char (byte) sono la stessa cosa per il C, cambia solo il modo di trattarli nei calcoli, ma su i confronti non cambia nulla, un carattere ascii altro non è che un valore numerico.

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 04, 2012, 10:34 pm

Non mi prende a parolacce:
Code: [Select]

void loop() {
char stringa='a';
switch(stringa) {
    case 'a':
        break;
    }
}


byte è un tipo di dati di arduino che altro non è se non un unsigned char. Ma se devi fare confronti con le lettere mi pare più corretto usare il tipo di dati appropriato, cioè char, dato che byte è stato "inventato" proprio per trattare numeri.

come a parolacce? ma ti sto chiedendo aiuto! Comunque, il chiarimento di Astro mi sta bene, per ora devo andare avanti, alle finezze penseremo in un secondo momento ;)
Altro problema, solo di carattere estetico: il gruppo:
Quote
Serial.print("SIGNATURE: ");
    #if (read_signature1 < 10) //serve per mostrare lo 0 iniziale per valori <16 = 10
        Serial.print("0");
    #endif
  Serial.print(read_signature1, HEX);
nelle mie misere intenzioni doveva aggiungere uno 0 quando ho un esadecimale <16, per evitare di vedere F o A invece di 0F o 0A, invece lo zero esce inesorabilmente sempre, l'errore è nel fatto che read_signature1 contiene un valore HEX ed io lo confronto con una banale 10, avevo provato $10 ma anche qui fiumi di imprecazioni dell'IDE :smiley-red:
Title: Re: Topic permanente di programmazione newbie
Post by: ratto93 on Mar 04, 2012, 10:41 pm


Perché non puoi confrontare un tipo byte con un carattere, devi usare il tipo char.


char e unsigned char (byte) sono la stessa cosa per il C, cambia solo il modo di trattarli nei calcoli, ma su i confronti non cambia nulla, un carattere ascii altro non è che un valore numerico.


+1



Non mi prende a parolacce:
Code: [Select]

void loop() {
char stringa='a';
switch(stringa) {
    case 'a':
        break;
    }
}


byte è un tipo di dati di arduino che altro non è se non un unsigned char. Ma se devi fare confronti con le lettere mi pare più corretto usare il tipo di dati appropriato, cioè char, dato che byte è stato "inventato" proprio per trattare numeri.

come a parolacce? ma ti sto chiedendo aiuto! Comunque, il chiarimento di Astro mi sta bene, per ora devo andare avanti, alle finezze penseremo in un secondo momento ;)
Altro problema, solo di carattere estetico: il gruppo:
Quote
Serial.print("SIGNATURE: ");
    #if (read_signature1 < 10) //serve per mostrare lo 0 iniziale per valori <16 = 10
        Serial.print("0");
    #endif
  Serial.print(read_signature1, HEX);
nelle mie misere intenzioni doveva aggiungere uno 0 quando ho un esadecimale <16, per evitare di vedere F o A invece di 0F o 0A, invece lo zero esce inesorabilmente sempre, l'errore è nel fatto che read_signature1 contiene un valore HEX ed io lo confronto con una banale 10, avevo provato $10 ma anche qui fiumi di imprecazioni dell'IDE :smiley-red:

Scusa, fatti una #define che ti contiene il numero esadecimale da confrontare no ?
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 04, 2012, 10:53 pm
Scusa ma se faccio
define cfr 10
no mi assegna la sigla cfr al pin 10? Non devo comunque dirgli che 10 è un valore HEX, ma nei tipi di dati non lo vedo.
Title: Re: Topic permanente di programmazione newbie
Post by: ratto93 on Mar 04, 2012, 11:01 pm
Perchè dovrebbe assegnarti il pin 10 alla sigla CRF ?
alla fine, se nel setup non metti che crf è un pin con il solito pinMode, crf resta una variabile come tante altre..
spero di essermi spiegato in maniera chiara  :smiley-roll-sweat:


poi se proprio vuoi te la inizializzi solo all'interno della funzione in cui la usi così eviti altri problemi, senza contare che così facendo al termine della funzione la ram che veniva occupata dalla varibile, viene liberata.
Title: Re: Topic permanente di programmazione newbie
Post by: ratto93 on Mar 04, 2012, 11:04 pm

Perchè dovrebbe assegnarti il pin 10 alla sigla CRF ?
alla fine, se nel setup non metti che crf è un pin con il solito pinMode, crf resta una variabile come tante altre..
spero di essermi spiegato in maniera chiara  :smiley-roll-sweat:


poi se proprio vuoi te la inizializzi solo all'interno della funzione in cui la usi così eviti altri problemi, senza contare che così facendo al termine della funzione la ram che veniva occupata dalla varibile, viene liberata.

Edit:
L'ho appena provato così:
Code: [Select]
#define crf = 0x10;
e compila senza problemi, alla fine è solo un numero :P

stacco perchè mi aspetta una brutta giornata a scuola domani..
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 04, 2012, 11:05 pm

Perchè dovrebbe assegnarti il pin 10 alla sigla CRF ?
alla fine, se nel setup non metti che crf è un pin con il solito pinMode, crf resta una variabile come tante altre..
spero di essermi spiegato in maniera chiara  :smiley-roll-sweat:


poi se proprio vuoi te la inizializzi solo all'interno della funzione in cui la usi così eviti altri problemi, senza contare che così facendo al termine della funzione la ram che veniva occupata dalla varibile, viene liberata.

Sì, hai ragione, sei stato chiarissimo, solo non capisco perché facendo il confronto diretto con 10 non va ed invece dovrebbe andare facendolo con una variabile che contiene 10, senza specificargli che è un valore hex.
Ok, provo come hai fatto tu, buonanotte e grazie.
Title: Re: Topic permanente di programmazione newbie
Post by: lucadentella on Mar 04, 2012, 11:28 pm

L'ho appena provato così:
Code: [Select]
#define crf = 0x10;


mmm ci sono alcuni errori in quella define, vedi http://arduino.cc/en/Reference/Define
Define non fa altro che sostituire la stringa prima della compilazione, quindi niente = o ;
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 04, 2012, 11:33 pm


L'ho appena provato così:
Code: [Select]
#define crf = 0x10;


mmm ci sono alcuni errori in quella define, vedi http://arduino.cc/en/Reference/Define
Define non fa altro che sostituire la stringa prima della compilazione, quindi niente = o ;

infatti "=" non ci vuole, comunque anche confrontantolo così non va.
Title: Re: Topic permanente di programmazione newbie
Post by: Maurotec on Mar 05, 2012, 12:30 am
Occhio che 0x10 equivale a 16 decimale se vuoi scrivere il 10 decimale in formato esa devi scrivere 0xa.

Le #define e in genere tutto quello che comincia con il simbolo # (cancelletto) riceve l'attenzione di un programma chiamato preprocessore C, che opera delle sostituzioni prima della compilazione. Per esempio:

#define crf 0x10

int somma = crf + 0x4

Viene trasformato dal preprocessore così:

int somma = 0x10 + 0x4;

Al posto del numero esa 0x10 puoi scrivere ciò che vuoi, anche F_CPU/16, il prepocessore sostituisce il segnaposto crf con quello che segue.

int somma = 16000000/16 + 0x4;

Nota però che la rappresentazione del numero in formato è da considerare cosa differente dal numero stesso, anche un'intero può essere rappresentato in esadecimale ma ciò che appare sul display o a video non è il numero reale utilizzabile ma appunto una solo rappresentazione, tanto che il calcolo viene fatto in binario.

La possibilità che il C offre è, che non importa se assegni il valore ad una variabile in formato esa oct o decimale, tanto il C trasforma tutto in binario.
La funzione della libreria avr-libc offre una printf & company che permette la formattazione tramite le stringhe di formato, se hai intenzione di usare questa fa sapere che trovo la giusta stringa di formattazione e la posto. L'unico motivo per rinunciare a queste funzione è legata all'incremento
della dimensione del programma in modo diciamo corposo, diomensione che cresce ancora se vuoi anche stampare numeri in formato float o double, ma per questo è necessario inserire un flag nella fase di linking.

Ciao.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 05, 2012, 07:48 am
Lasciate perdere il discorso che ho fatto tra byte e char, ci ho pensato dopo che infatti byte altro non è che un unsigned char  :P

Sulle define, la notazione di ratto è errata, non ci vuole l'uguale. Il define non è un'assegnazione come nelle variabili, ma una direttiva per il compilatore per fare ciò che dice Mauro: sostituisce all'alias indicato tutto ciò che segue.

Con #define crf = 0x10; il compilatore ogni volta che trova crf mette "= 0x10;" quindi anche l'uguale ed il punto e virgola.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 05, 2012, 08:52 am
Allora, se uno dei byte della signature ha un valore decimale inferiore a 16 lo 0 iniziale viene omesso nella notazione esadecimale, quindi 0F mi appare come F, quindi in sola fase di visualizzazione voglio aggiungere uno 0.
Avevo pensato a:
Serial.print("SIGNATURE: ");
    #if (read_signature1 < 0x10) //serve per mostrare lo 0 iniziale per valori <16 = 10
        Serial.print("0");
    #endif
  Serial.print(read_signature1, HEX);
ma non funziona, lo 0 esce sempre, il primo byte che è il produttore e per ATMEL è 1E mi esce come 01E.
read_signature1 contiene un dato che viene letto direttamente da un indirizzo del micro.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 05, 2012, 09:36 am
Ma così non funziona?
Code: [Select]

if (read_signature1 < 16) { Serial.print("0"); }

(16 è uguale a 0x10)
Poi non capisco: perché hai messo i  "#" davanti all'if?
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 05, 2012, 10:11 am

Avevo pensato a:
Serial.print("SIGNATURE: ");
    #if (read_signature1 < 0x10) //serve per mostrare lo 0 iniziale per valori <16 = 10
        Serial.print("0");
    #endif
  Serial.print(read_signature1, HEX);
ma non funziona, lo 0 esce sempre, il primo byte che è il produttore e per ATMEL è 1E mi esce come 01E.
read_signature1 contiene un dato che viene letto direttamente da un indirizzo del micro.


Non ti funziona, ma non dovrebbe nemmeno compilarlo, perché gli "#" non ci devono essere e tantomeno ci deve essere la endif

Code: [Select]

Serial.print("SIGNATURE: ");
   if (read_signature1 < 0x10) Serial.print("0");

 Serial.print(read_signature1, HEX);

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 05, 2012, 10:41 am
Ora sono al lavoro ma nelklo sketch originale questa cosa del # è spiegata, infatti la usano davanti a tutte le define, p.es., e la usando anche negli if/endif del setup (in setup svolgono la prima parte ma io la sto cambiando radicalmente per non dover resettare ogni fine operazione) e del loop ; io credo che attivi una sorta di compatibilità perché in effetti se tolgo # endif non lo accetta invece con # lo compila e lo esegue. Proverò il tuo codice al rientro
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 05, 2012, 10:47 am

Ora sono al lavoro ma nelklo sketch originale questa cosa del # è spiegata, infatti la usano davanti a tutte le define, p.es., e la usando anche negli if/endif del setup (in setup


Stavolta ti rimando a Settembre in programmazione  :smiley-mr-green:
Il carattere # è un tag per il preprocessore che svolge vari aggiustamenti al sorgente in base alle operazioni richieste, #if e #endif servono per compilazione condizionale, ovvero se la condizione espressa nella if, solitamente legata ad una #define o un valore fornito dalla riga di comando del compilatore, è vera il codice che segue viene incluso e compilato, in caso contrario viene escluso dal programma.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 05, 2012, 11:00 am


Ora sono al lavoro ma nelklo sketch originale questa cosa del # è spiegata, infatti la usano davanti a tutte le define, p.es., e la usando anche negli if/endif del setup (in setup


Stavolta ti rimando a Settembre in programmazione  :smiley-mr-green:
Il carattere # è un tag per il preprocessore che svolge vari aggiustamenti al sorgente in base alle operazioni richieste, #if e #endif servono per compilazione condizionale, ovvero se la condizione espressa nella if, solitamente legata ad una #define o un valore fornito dalla riga di comando del compilatore, è vera il codice che segue viene incluso e compilato, in caso contrario viene escluso dal programma.

:smiley-red:, beh, del resto se leggi il titolo del Topic non puoi meravigliarti più di tanto; però, caro Prof XD, sulla base di questa tua lezioncina vedrò di capire a che servono tutti quegli # che ci sono. Tanto per cominciare: poiché ci sono una ventina di #include all'inizio e servono tutte (perché quelle inutili le ho levate io di crudo), ho un qualche vantaggio dal lasciarli?

@ Leo: non lo so, ho sempre pensato che trattandosi di hex andasse scritto 10 e non 16, può essere allora che stia funzionando ma che i valori in decimale siano sempre > 10 (0A se non sbaglio...); però ho provato 0x10 senza successo, vero è che la forma era quella #, quindi quando torno verifico.
Dopo verrà il "bello".. Siccome l'editor di questo Forum mi fa incazz a morte scrivo un altro post perintrodurre l'argomento.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 05, 2012, 11:13 am
Appena avrò completato la parte di lettura della signature, con l'HVSP, sempre col prezioso aiuto di Astro, dovrò caricvare nello sketch una notevole tabella dei micro, che ho già (grazie UWE!), ma che devo implementare. Alla fine otterrò qualcosa del tipo (i valori sono inventati!)

1e950f  ATmega328P 62dff9 P
1e93ff   ATtiny85      62dfff S

Cioè per ogni micro devo memorizzare sia la signature che i fuse di default che la tecnica di programmazione necessaria (hvPp o hvSp).
Le domande che mi vengono sono queste:
Che tipo di array devo usare?
Mi creerà problemi di memoria ram (ad occhio sono un centinaio di righe, ma alla fine potrei accontentarmi delle 25 relative ai processori che ho provato)?
Se ho problemi potrei creare una tabella in forma di file (sarebbe anche meglio, più facilmente aggiornabile nel tempo)? Ma sarebbe accessibile dal firmware
Una volta che ottengo i tre valori di signature dal micro come faccio a farli diventare una stringa unica?
Che tecnica mi conviene usare per confrontare questa stringa con l'array per estrapolare le altre info?
Così una volta letta la signature posso chiedere all'utente se vuole leggere i fuse, se li vuole scrivere o se vuole ripristinare quelli di fabbrica (caso bricked), ed in automatico scelgo la procedura da seguire.
Che ne dite? sarebbe un bel lavoro no? Consigli?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 05, 2012, 11:35 am

Ora sono al lavoro ma nelklo sketch originale questa cosa del # è spiegata, infatti la usano davanti a tutte le define, p.es., e la usando anche negli if/endif del setup

Sono casi differenti, però. Le direttive per il compilatore sono istruzioni particolari che servono a creare il sorgente originale. Ad esempio, tu puoi mettere una porzione di codice dipendente dal micro.
Faccio un esempio più concreto. Mettiamo che devi scegliere un registro in base al micro, Atmega328 o Attiny85. Se tu metti un semplice if il tuo sketch conterrà sia la porzione di codice per il primo che per il secondo. Se metti un #if allora il compilatore includerà nello sketch solo la parte che occorre, salvando spazio. Questo è un caso stupido, ma rende l'idea.

Quote

ci sono una ventina di #include all'inizio e servono tutte (perché quelle inutili le ho levate io di crudo), ho un qualche vantaggio dal lasciarli?

Dipende.

Quote

@ Leo: non lo so, ho sempre pensato che trattandosi di hex andasse scritto 10 e non 16, può essere allora che stia funzionando ma che i valori in decimale siano sempre > 10 (0A se non sbaglio...); però ho provato 0x10 senza successo, vero è che la forma era quella #, quindi quando torno verifico.

Sono 2 forme differenti per rappresentare lo stesso numero. Scrivere 0x10 o 16 sono indifferenti. E' sempre un valore di 0b00010000  :P
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 05, 2012, 12:17 pm
Quando hai un po' di tempo pensa all'altra problematica  :)
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 05, 2012, 12:22 pm

Quando hai un po' di tempo pensa all'altra problematica  :)

Ehm... non ricordo...  :smiley-sweat:
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 05, 2012, 12:31 pm
:smiley-eek-blue: sta storia del pollo al sale ti ha ferito profondamente :P
ma è il post prima della tua ultima risposta :smiley-fat:
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 05, 2012, 12:44 pm

Appena avrò completato la parte di lettura della signature, con l'HVSP, sempre col prezioso aiuto di Astro, dovrò caricvare nello sketch una notevole tabella dei micro, che ho già (grazie UWE!), ma che devo implementare. Alla fine otterrò qualcosa del tipo (i valori sono inventati!)

1e950f  ATmega328P 62dff9 P
1e93ff   ATtiny85      62dfff S

Cioè per ogni micro devo memorizzare sia la signature che i fuse di default che la tecnica di programmazione necessaria (hvPp o hvSp).
Le domande che mi vengono sono queste:
Che tipo di array devo usare?
Mi creerà problemi di memoria ram (ad occhio sono un centinaio di righe, ma alla fine potrei accontentarmi delle 25 relative ai processori che ho provato)?
Se ho problemi potrei creare una tabella in forma di file (sarebbe anche meglio, più facilmente aggiornabile nel tempo)? Ma sarebbe accessibile dal firmware
Una volta che ottengo i tre valori di signature dal micro come faccio a farli diventare una stringa unica?
Che tecnica mi conviene usare per confrontare questa stringa con l'array per estrapolare le altre info?
Così una volta letta la signature posso chiedere all'utente se vuole leggere i fuse, se li vuole scrivere o se vuole ripristinare quelli di fabbrica (caso bricked), ed in automatico scelgo la procedura da seguire.
Che ne dite? sarebbe un bel lavoro no? Consigli?

Uhm... E' un bel blocco di dati.
Facciamo un calcolo. Se ogni voce deve contenere questi dati:
1e950f  ATmega328P 62dff9 P
abbiamo (senza gli spazi) più di 20 caratteri, ma devi stare largo perché potresti avere qualcosa tipo ATmega1284P nel nome. Quindi diciamo una media di 25 caratteri. Se li salvi come stringa di caratteri, sei nella cacc...  ;)
25*100=2500! Impossibile in RAM. Magari nella flash con PROGMEM.

Oppure... la signature la devi salvare in 3 byte, così come la leggi. Il nome devi salvarlo in formato intero. L'altro codice alfanumerico (i fuse, immagino) devi salvarli come byte anch'essi. L'ultimo come char.

Puoi usare anche un file su SD ma lo sketch cresce enormemente: aggiungi 10/12 kB solo per includere la libreria SD.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 05, 2012, 01:07 pm
Ora che ci penso alla fine lavorerò in stand-alone e quindi niente file "esterni", né posso implementare un lettore SD, progettazione hw chiusa. E con l'eeprom potrei fare qualcosa? altrimenti mi rassegno e metto solo la trentina di micro noti sui quali ho fatto le prove, però mi piacerebbe avere la possibilità di identificare un bel numero di micro.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 05, 2012, 01:10 pm
Con la EEPROM peggio perché sono solo 1024 byte.
Usa la Flash con PROGMEM, è l'unica soluzione praticabile. Non puoi crearti 1,5 kB di tabella in memoria, devi pensare che nella RAM ci stanno poi anche tutte le variabili create a runtime dal tuo sketch per cui se va in carenza di risorse poi il programma potrebbe avere comportamenti strani come variabili con valori strani od altro. E non mi pare il caso visto che devi flashare dei fuse.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 05, 2012, 01:15 pm

Con la EEPROM peggio perché sono solo 1024 byte.
Usa la Flash con PROGMEM, è l'unica soluzione praticabile. Non puoi crearti 1,5 kB di tabella in memoria, devi pensare che nella RAM ci stanno poi anche tutte le variabili create a runtime dal tuo sketch per cui se va in carenza di risorse poi il programma potrebbe avere comportamenti strani come variabili con valori strani od altro. E non mi pare il caso visto che devi flashare dei fuse.

OK studierò questo comando e gli array, insomma prima sbatto un po' la testa e poi chiederò aiuto, mi pare più giusto, anche perché così si impara sul serio, lo sto vedendo con Astro con la storia delle signature, essere riuscito a leggere il primo bye sia in P che in S è un ottimo risultato e mi ha aiutato a capire i passaggi che mi ha poi suggerito Astro. Ora con l'S devo ancora tentare, perché penso di aver capito il meccanismo, in questo modo ho imparato le tecniche ed il modo in cui vanno lette ed applicate quelle tabelle, un bel risultato per usi futuri!
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 05, 2012, 07:08 pm
Posso farti una domanda? Ma perché implementare le firme di 100 micro se poi sui tuoi zoccolini ce ne andranno qualche decina, non di più? Tutti i micro non DIP nonché quelli non supportati dall'IDE sono tagliati fuori dalle mani dell'hobbista medio, dall'utente di Arduino per intendersi. Penso potresti ridimensionare il progetto e circoscrivere i dati ai soli chip che poi possono essere manipolati.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 05, 2012, 07:41 pm

Posso farti una domanda? Ma perché implementare le firme di 100 micro se poi sui tuoi zoccolini ce ne andranno qualche decina, non di più? Tutti i micro non DIP nonché quelli non supportati dall'IDE sono tagliati fuori dalle mani dell'hobbista medio, dall'utente di Arduino per intendersi. Penso potresti ridimensionare il progetto e circoscrivere i dati ai soli chip che poi possono essere manipolati.

Infatti è quello che alla fine farò; l'idea è che uno strumento di questo tipo ha delle belle potenzialità anche al di fuori del campo hobbystico, quindi prevedere tutti i tipi di PDIP potrebbe avere una sua valenza. La cosa che mi stimola, ma non è momento, ora devo pensare solo alla pubblicazione e ho tempi abbastanza stretti, è il fatto che a forza di leggere quel DS mi sono fatto l'idea che forse è possibile programmare un micro con la modalità HVPP o HVSP, e non mi riferisco solo ai fuse, però non ho approfondito, ma se fosse vera questa cosa, con l'opportuno software diventerebbe un vero e proprio programmatore AVR $) $) $), sarebbe bello no?
Ma siccome tutto dipenderebbe dal firmware, inutile prevedere qualcosa che per ora non posso fare, quindi mi limito ai 25 modelli che ho descritto nella Tabella che allegherò, più qualche altro (p.es. le varianti ATmega328 noP e similari, le varianti V, A, AP), alla fine penso saranno una quarantina, penso di potercela fare.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 05, 2012, 07:43 pm
Beh, si tratta tutto di firmware alla fine.
L'USBtinyISP usa un Tiny2313 per programmare i micro, l'USBasp usa un ATmega8, l'Arduino usa un Atmega8U2. Cambiano i direttori d'orchestra ma la musica è la stessa.
Title: Re: Topic permanente di programmazione newbie
Post by: ratto93 on Mar 05, 2012, 08:08 pm
Mike , sei riuscito a fare il confronto alla fine ? mi son poi reso conto che la define era sbagliata  :smiley-mr-green:
Scusate ma non ho avuto il tempo di rileggere tutto il topic ...

P.s. Il mio USBasp usa un ATmega 48  ;)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 05, 2012, 08:29 pm

Beh, si tratta tutto di firmware alla fine.
L'USBtinyISP usa un Tiny2313 per programmare i micro, l'USBasp usa un ATmega8, l'Arduino usa un Atmega8U2. Cambiano i direttori d'orchestra ma la musica è la stessa.

Quindi, come vedi, le sue potenzialità vanno MOLTO ben oltre l'idea da cui è nato il progetto ma, come detto, questa è un'altra storia...

@ ratto93: ancora non ho fatto la prova, purtroppo sono alle prese con oltre 200 pagine di compiti scritti da valutare ed io sono uno molto scrupoloso, così quando boccio nessuno osa fare questioni come invece avviene tante volte con più di qualche collega che riesce a fare in due ore il lavoro che io faccio in 3-4 giorni, mi capisci vero?  ;)
Title: Re: Topic permanente di programmazione newbie
Post by: ratto93 on Mar 05, 2012, 08:34 pm

@ ratto93: ancora non ho fatto la prova, purtroppo sono alle prese con oltre 200 pagine di compiti scritti da valutare ed io sono uno molto scrupoloso, così quando boccio nessuno osa fare questioni come invece avviene tante volte con più di qualche collega che riesce a fare in due ore il lavoro che io faccio in 3-4 giorni, mi capisci vero?  ;)

Tenendo conto che solitamente sono dall'altra parte del manico del coltello  :smiley-roll-sweat:
Si  :smiley-mr-green:
io sono alle prese con le simulazioni degli esami e non son di grande aiuto aimè   :smiley-red:
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 06, 2012, 09:26 am

Non ti funziona, ma non dovrebbe nemmeno compilarlo, perché gli "#" non ci devono essere e tantomeno ci deve essere la endif

Code: [Select]

Serial.print("SIGNATURE: ");
   if (read_signature1 < 0x10) Serial.print("0");

 Serial.print(read_signature1, HEX);



OK, funziona sia con 16 che con 0x10, era proprio un problema di sintassi del comando; problema risolto. XD
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 06, 2012, 02:24 pm
Allora riprendo la problematica dell'array perché non capisco come impostarlo e comunque vorrei una soluzione ottimale.
Devo memorizzare, per ogni micro:
signature, modello, fuse, tipo programazione
1e950f  ATmega328P 62dff9 P
1e93ff   ATtiny85      62dfff S
Ho inoltre necessità di inserire un'ulteriore info, cioè se il micro ha/non ha l'EFuse, non tanto per la lettura, che mi darebbe sempre FF quanto per l'eventuale scrittura per errore (devo pensare all'utente hobbysta), non credo possa succedere qualcosa ma l'utente, vedendo invariato quell'FF penserebbe ad un malfunzionamento.
Cosa mi conviene fare, tenendo conto che per ora memorizzo solo una quarantina di micro e certamente uso il PROGMEM per scrivere in flash, in previsione di un elenco molto più lungo?
Ho pensato alla stringa unica:
1e950f62dff9PATmega328P
1e93ff62dfXXSATtiny85
in questo modo avrei: i primi 6 car per la sign, i secondi 4 per L/Hfuse, quindi 2 per l'Efuse o XX per noEfuse, 1 car per la modalità di programmazione, tutto il resto, che è l'unico dato a lunghezza variabile, a partire dal 14° car fino alla lunghezza della stringa.
Che ne pensate? So che questo è molto dispendioso in termini di memoria, ci sono soluzioni che mi permettono comunque una facile estrapolazione dei parametri e minor occupazione di memoria?
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 06, 2012, 03:00 pm

Allora riprendo la problematica dell'array perché non capisco come impostarlo e comunque vorrei una soluzione ottimale.


Io al tuo posto procederei inizializzando tre array multidimensionali, ovviamente posti nella flash, in questo modo:

Code: [Select]

char Stringa[20] [20] = { {"ATmega328p"},
                         {"ATMEGA644"},
                         {"ATMEGA2560"}
                       };
                       
byte signature [20] [3] = { {0x1E,0x1C,0x1D},
                                {0x1E,0x1C,0x1E},
                                {0x1E,0x1C,0x1F}
                              };  

byte fuses [20] [4] = { {0xff,0xff,0xff,0xff},
                            {0xff,0xff,0xff,oxff},
                            {0xff,0xff,0xff,oxff}
                          };  


Premesso che i valori numerici li ho messi a caso, poi tocca mettere quelli corretti, abbiamo tre array composti da 20 righe di tot colonne, il numero della riga è l'indice univoco (quante righe dipendono dal numero di micro che vuoi inserire), ricavato dalla signature, che ti permette di trovare tutti gli altri parametri.
In pratica hai un array di stringhe che contiene la descrizione del micro, 20 caratteri dovrebbero bastare e sono pari ad una singola riga del display così hai meno problemi di formattazione dei messaggi, poi hai due array di valori unsigned int che contengono le signature, 3 colonne per tot righe, e la stessa cosa per i valori dei fuse posti in un terzo array composto da 4 colonne e tot righe.
Non appena hai trovato i tre byte della signature non devi fare altro che scorrere il relativo array per righe leggendo i tre byte delle colonne, confronti i valori e se corrispondono hai trovato l'indice per accedere agli altri due array per avere la descrizione e i fuse.
Lo so che detto a parole sembra complicato, ma in realtà è semplicissimo da implementare, se hai problemi questa parte di codice te la scrivo io.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 06, 2012, 03:13 pm
Non sembra complicato, certo ci devo ragionare per comprenderlo bene, faccio delle prove (ora sono al lavoro, se ne parla in serata al rientro) e ti saprò dire. Alcune info:
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 06, 2012, 03:17 pm

  • a che serve il 4° byte sui fuse?



Per eventuali informazioni accessorie, vedilo come un 8 bit flag, p.e. esempio per sapere se usare il modo P o S etc.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 06, 2012, 03:27 pm


  • a che serve il 4° byte sui fuse?



Per eventuali informazioni accessorie, vedilo come un 8 bit flag, p.e. esempio per sapere se usare il modo P o S etc.


Ottima idea, mi creo delle combinazioni sia per l'Efuse che per P/S, alla fine sono 4 in tutto.
Grazie e a stasera!
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 06, 2012, 03:37 pm
Perchè non memorizzi il catalogo dei micro in una eeprom esterna ,così ti puoi allargare con il numero dei micro supportati a tutti i pdip.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 06, 2012, 03:40 pm

Perchè non memorizzi il catalogo dei micro in una eeprom esterna ,così ti puoi allargare con il numero dei micro supportati a tutti i pdip.


Ma perché deve complicarsi la vita quando ha 32k di flash a disposizione, hai voglia a memorizzare micro  :D
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 06, 2012, 03:47 pm
:smiley-roll-sweat: dici che bastano per tutti i micro a 8 bit pdip?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 06, 2012, 03:50 pm

Perchè non memorizzi il catalogo dei micro in una eeprom esterna ,così ti puoi allargare con il numero dei micro supportati a tutti i pdip.

Perché ormai l'HW è definito e non può usare componenti aggiuntivi. Inoltre avere tutto in un unico firmware è per lui molto vantaggioso, dato che il firmware sarà disponibile per il download dal sito della rivista. Quindi la gente dovrà flashare 1 sola cosa. (così ho capito)
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 06, 2012, 03:53 pm
ok, capito.
Ma per espansioni future... ;)
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 06, 2012, 04:56 pm

:smiley-roll-sweat: dici che bastano per tutti i micro a 8 bit pdip?


Facciamo due conti utilizzando le matrici che ho consigliato a Michele, ipotizzando di memorizzare i dati di 100 micro abbiamo quanto segue:

20*100 = 2000 byte  per le descrizioni
3*100   = 300 byte   per le signature
4*100   = 400 byte   per i fuse e i dati accessori
--------------------
Totale    2700 byte

Direi che volendo ci entra pure tutto il catalogo Atmel delle mcu a 8 bit e avanza molto spazio  :D


Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 06, 2012, 05:47 pm
Noto con piacere che Leo e BB si passano la palla, BB!!!! ]:D dopo tutta la questione di ieri ancora parliamo di modifiche hardware?
:smiley-eek-blue:
Leo, hai capito benissimo XD, in realtà i firmware da flashare saranno tre:
micro master PC
micro master stand-alone
micro key+lcd
i primi due sono alternativi, cioè metto l'uno o l'altro, perché non credo di riuscire a tirare fuori un unico firmware in grado di riconoscere la presenza dell'altro micro e gestire i messaggi seriali di conseguenza. Ricordo a tutti che TUTTE LE LINEE sono occupate e non potevo usare la comunicazione I2C quindi li ho collegati tramite seriale standard; in pratica sul pcb master ho un connettore seriale che all'occorrenza mi serve come presa per un convertitore usb-seriale esterno (per collegamento al PC) oppure per il dialogo col PCB keypad+LCD20x4, gestiti da un altro 328P che ovviamente avrà il suo firmware.
Tutto sarà gratuitamente scaricabile dal sito di Elettronica In, a questo punto mi pare che la soluzione di Astro sia perfetta, non penso nemmeno che si arrivi ad un centinaio, e comunque una parte sarebbero incompatibili con i segnali, credo, quindi perdere un paio di K di flash è qualcosa di fattibilissimo, addirittura mi verrebbe la tentazione di usare la ram a questo punto ;) che ne dite?
Comunque fra poco mi metto al lavoro, ho altri dubbi da levarmi:
ho letto che il tiny2313 usa un HVSP un po' "potenziato", con un paio di segnali in più, no problem, ma voglio capire ora cosa succede col riconoscimento automatico; inoltre sono curiosissimo di provare un ATmega8 che avevo fatto fuori a suo tempo, proprio morto, non bricked :smiley-red:, ma che qualche segno di vita forse lo dava, vediamo che succede anche qui.

A dopo  :)
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 06, 2012, 05:55 pm

credo, quindi perdere un paio di K di flash è qualcosa di fattibilissimo, addirittura mi verrebbe la tentazione di usare la ram a questo punto ;) che ne dite?


In realtà non credo che metterai più di 20 modelli diversi di micro, anche perché puoi inserire solo quelli disponibili in case dip il che esclude molti modelli di micro, p.e. il MEGA2560.
Rifacendo i conti per 20 modelli abbiamo :

20x20 = 400
20x3  =  60
20x4  =  80
------------
Totale  540 byte.

Sicuramente entrano senza problemi nella ram visto che te ne serve poca per far funzionare lo sketch, però a mio avviso i dati statitici è sempre bene caricarli nella flash piuttosto che nella ram o nella EEPROM.


Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 06, 2012, 11:37 pm
La riga dell'array della signature mi dà errore di compilazione:

41: error: hexadecimal floating constants require an exponent
42: error: expected initializer before 'signature'

l'istruzione è questa:
Quote
char byte signature [3] [20] = { {0x1E,0x95,0x0F},
                                 {0x1E,0x93,0x0D},
                                 {0x1E,0x91,0x0A},
                                 {0x1E,0x93,0x0C}
                               };
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 07, 2012, 07:06 am
Beh, il compilatore ha ragione. O char o byte, mica puoi dichiararlo di 2 tipi diversi  XD
E poi hai invertito le dimensioni dell'array, nel tuo modo vuoi creare un array di 3 elementi da 20 caratteri l'uno, a te serve l'opposto, quindi:

Quote

byte signature [20] [3] = { {0x1E,0x95,0x0F},
                                 {0x1E,0x93,0x0D},
                                 {0x1E,0x91,0x0A},
                                 {0x1E,0x93,0x0C}
                               };
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 07, 2012, 07:13 am

Beh, il compilatore ha ragione. O char o byte, mica puoi dichiararlo di 2 tipi diversi  XD


Questo è colpa mia, quando ho fatto copia e incolla è successo un casino del quale non mi sono accorto, ci va solo byte, adesso correggo l'esempio originale.

Quote

E poi hai invertito le dimensioni dell'array, nel tuo modo vuoi creare un array di 3 elementi da 20 caratteri l'uno, a te serve l'opposto, quindi:


No queste sono giuste, 3x20 e non 20x3, visto che è la signature.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 07, 2012, 07:19 am
Compila con 3x20 e vedi se non ti da errore.  :P
3 elementi da 20 caratteri l'uno, qui abbiamo invece il caso inverso: dobbiamo memorizzare tanti elementi da 3 caratteri l'uno, serve una matrice x*3, con x che è il numero di signature da contenere
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 07, 2012, 07:26 am

Compila con 3x20 e vedi se non ti da errore.  :P


Mi sa che stamattina sto ancora dormendo, hai ragione anche i due valori dell'inizializzazione sono invertiti tra loro, questo è quello che succede quando si scrive al volo del codice senza provarlo.  =(
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 07, 2012, 07:47 am

Mi sa che stamattina sto ancora dormendo, hai ragione anche i due valori dell'inizializzazione sono invertiti tra loro, questo è quello che succede quando si scrive al volo del codice senza provarlo.  =(

Dalle mie parti si dice che "sbaglia anche il prete all'altare" ;)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 07, 2012, 09:03 am
Diciamo che la mia dichiarata in Topic fatale ignoranza non mi ci ha fatto capire nulla, al solo comando "byte" ero arrivato ma non capivo l'errore successivo, evidentemente quello dell'inversione, ed il fatto che la prima istruzione avesse 20, 20 non mi ha aiutato a capire.
COmunque ieri sera ho messo a punto grosso modo l'impostazione del 4° byte dell'array signature, mi servono 6 valori per le possibili combinazioni di EFuse e Tipo di Programmazione; sono state fondamentali le prove hw che ho descritto nell'altro Topic. Grazie a tutti, oggi altra giornataccia, ci sentiamo appena possibile.
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Mar 07, 2012, 09:51 am
io cambierei l'hardware  :)
(battuta per iscrizione)
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 07, 2012, 10:07 am

mi servono 6 valori per le possibili combinazioni di EFuse e Tipo di Programmazione;


Per gestire in modo semplice il quarto byte che fa da bit flag ti consiglio l'uso di una unione contenente una variabile unsigned char e una struttura bit fields di otto elementi.
In pratica carichi sulla variabile unsigned char il quarto byte dopo di che puoi accedere direttamente ai singoli flag tramite nomi mnemonici, ti allego un semplice sketch di esempio dove viene creata la struttura che ti dico, i vari nomi li puoi cambiare come ti pare, e dopo aver caricato sulla variabile principale un valore binario vengono stampati sul serial monitor i singoli bit che lo costituiscono:

Code: [Select]

struct Bit_Fields {
        unsigned char dato1:1;
        unsigned char dato2:1;
        unsigned char dato3:1;
        unsigned char dato4:1;
        unsigned char dato5:1;
        unsigned char dato6:1;
        unsigned char dato7:1;
        unsigned char dato8:1;
                  };

union bit_fields {
       unsigned char AllBits;
       struct Bit_Fields BtF;
                 } AuxData;


void setup()
{

  Serial.begin(9600);

  AuxData.AllBits = 0b11001100;

  Serial.print("Bit 1 = "); 
  Serial.println(AuxData.BtF.dato1, DEC);

  Serial.print("Bit 2 = "); 
  Serial.println(AuxData.BtF.dato2, DEC);

  Serial.print("Bit 3 = "); 
  Serial.println(AuxData.BtF.dato3, DEC);

  Serial.print("Bit 4 = "); 
  Serial.println(AuxData.BtF.dato4, DEC);

  Serial.print("Bit 5 = "); 
  Serial.println(AuxData.BtF.dato5, DEC);

  Serial.print("Bit 6 = "); 
  Serial.println(AuxData.BtF.dato6, DEC);

  Serial.print("Bit 7 = "); 
  Serial.println(AuxData.BtF.dato7, DEC);

  Serial.print("Bit 8 = "); 
  Serial.println(AuxData.BtF.dato8, DEC);

  Serial.print("AllBits "); 
  Serial.println(AuxData.AllBits, HEX);

}


void loop()
{

}
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 07, 2012, 11:02 am
:smiley-eek: Forse se lo provo in uno sketch da solo ci capisco qualcosa, ciò che non riesco proprio ad immaginare è come collegare tutto ciò al 4° byte del terzo array :smiley-red: comunque facciamo un passo per volta, stasera provo, una volta che mi sono fatta l'idea certa del funzionamento vedremo di capire come collegare un valore del 4° bytre al corrispondente valore di questa struttura. Grazie!
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 07, 2012, 11:07 am

:smiley-eek: Forse se lo provo in uno sketch da solo ci capisco qualcosa, ciò che non riesco proprio ad immaginare è come collegare tutto ciò al 4° byte del terzo array :smiley-red:


Semplicemente caricando il suo valore in "AuxData.AllBits", p.e. "AuxData.AllBits = Fuses [11] [4]", cioè carichi il 4 byte dell'undicesimo modello di micro nella varabile AllBits, da questo momento in poi puoi accedere a i singoli flag con i loro nomi mnemonici, p.e. per verificare il terzo flag:

"if (AuxData.BtF.dato3 == 1) quellochedevifare();"

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 07, 2012, 11:16 am


:smiley-eek: Forse se lo provo in uno sketch da solo ci capisco qualcosa, ciò che non riesco proprio ad immaginare è come collegare tutto ciò al 4° byte del terzo array :smiley-red:


Semplicemente caricando il suo valore in "AuxData.AllBits", p.e. "AuxData.AllBits = Fuses [11] [4]", cioè carichi il 4 byte dell'undicesimo modello di micro nella varabile AllBits, da questo momento in poi puoi accedere a i singoli flag con i loro nomi mnemonici, p.e. per verificare il terzo flag:

"if (AuxData.BtF.dato3 == 1) quellochedevifare();"

Fantastico! questa tecnica mi evita di dover mettere un bordello di "if" per convertire gli 8 valori del 4° byte (anche se per ora ne uso solo 6) in una coppia di valori che rappresentano il tipo di programmazione e lo status dell'EFuse. Un approfondimento: ma io posso estrapolare dal byte due valori invece di uno? Spiego:
0x01 per me significa EFuse = "No" e mode = "HVSP"
0x02 EFuse="No" e mode = "HVPP"
ecc.
come faccio ad assegnare due variabili distinte con questa tecnica?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 07, 2012, 11:29 am
Io avrei fatto diversamente. Bastava usare la funzione predefinita di Arduino bitRead:
Per accedere ad un singolo bit basta fare
Code: [Select]
bitRead(dato, num_bit).

Quindi
Code: [Select]
for (byte i=0; i<8; i++) {
  Serial.print("Bit ");
  Serial.print(i, DEC);
  Serial.print(": ");
  Serial.println(bitRead(dato,i), DEC);
}



Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 07, 2012, 11:55 am

Io avrei fatto diversamente. Bastava usare la funzione predefinita di Arduino bitRead:


Corretto, però la BitRead in realtà è questo:

Code: [Select]

#define bitRead(value, bit) (((value) >> (bit)) & 0x01)


Ogni volta che la vai ad usare in realtà viene eseguito uno shift della variabile e una mascheratura, inoltre anche se ti crei delle #define con nomi mnemonici dei vari campi assegnandoli al relativo bit, p.e. #define HVPP 3, quando vai scrivere il software il tutto diventa meno leggibile dell'uso diretto di un nome mnemonico.
Non ultimo il modo con cui vengono trattati i dati dalle strutture e unioni è decisamente più efficace del fare uno shift e una maschera, in pratica il codice compilato risulta più compatto e impiega meno cicli macchina, che poi queste sono finezze da programmazione avanzata è vero, nel nostro caso non cambia nulla se per accedere al dato ci vogliono solo tre cicli macchina invece di cinque, però non è male se si impara ad usare tutti gli strumenti del C e unioni/strutture sono tra quelli più potenti che ci vengono messi a disposizione.

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 07, 2012, 11:56 am
forse è meglio se chiarisco il mio intento; nel 4° byte memorizzo un valore da 0x01 a 0x06 in base alle 6 possibili combinazioni tra EFuse presente/non presente e modo di programmazione: HVPP, HVSP, HVP13.
Quando identifico la signature estrapolo e mostro il nome del micro, ed io nella mia ignoranza avrei fatto una void con una Select Case tipo (non badare alla sintassi):

void datimicro()
read.... 4 byte dell'array
select case 4byte
   case 0x01:
      EFUSE = 0 // non presente
      mode = "HVSP"
   case 0x02:
ecc...
Così il seguito del programma procede in base a queste due variabili già previste....
Ciò che mi state consigliando fa la stessa cosa e migliora la tecnica di esecuzione o no?
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 07, 2012, 12:01 pm

forse è meglio se chiarisco il mio intento; nel 4° byte memorizzo un valore da 0x01 a 0x06 in base alle 6 possibili combinazioni tra EFuse presente/non


Quello che ti sto suggerendo io è di usare i singoli bit del byte come singoli flag, p.e. bit 0 eFuse, bit 1 HVPP, bit 2 HVSP, bit 3 HVP13, dopo di che li hai sotto forma di nomi mnemonici come variabili a booleane (1 bit) grazie all'unione, p.e. AuxData.BtF.eFUSE, i nomi della unione e struttura puoi metterli a tuo piacere, anche di una sola lettera, p.e. U.S.eFuse .
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 07, 2012, 12:27 pm


forse è meglio se chiarisco il mio intento; nel 4° byte memorizzo un valore da 0x01 a 0x06 in base alle 6 possibili combinazioni tra EFuse presente/non


Quello che ti sto suggerendo io è di usare i singoli bit del byte come singoli flag, p.e. bit 0 eFuse, bit 1 HVPP, bit 2 HVSP, bit 3 HVP13, dopo di che li hai sotto forma di nomi mnemonici come variabili a booleane (1 bit) grazie all'unione, p.e. AuxData.BtF.eFUSE, i nomi della unione e struttura puoi metterli a tuo piacere, anche di una sola lettera, p.e. U.S.eFuse .


OK, quindi dovrei impostare il bit meno significativo (p.es.) per il mode e quello più significativo per l'EFuse?
0x01 EFuse=0 mode = HVPP
0x02 EFuse=0 mode = HVSP
0x13 EFuse=1 mode = HVP13
intendi questo?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 07, 2012, 12:29 pm


Io avrei fatto diversamente. Bastava usare la funzione predefinita di Arduino bitRead:


Corretto, però la BitRead in realtà è questo:

Sì, è vero. Però suggerisco un metodo più semplice da comprendere ed usare da uno la cui prima attività non è la programmazione. Usando la funzione predefinita hai al costo di un leggero aumento del peso computazionale una semplicità di gestione dei dati.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 07, 2012, 12:35 pm

Sì, è vero. Però suggerisco un metodo più semplice da comprendere ed usare da uno la cui prima attività non è la programmazione. Usando la funzione predefinita hai al costo di un leggero aumento del peso computazionale una semplicità di gestione dei dati.


Per la come la vedo io è più semplice scrivere, e anche più leggibile, "if(U.S.eFuse == 1)" invece di " if(bitRead(dato,eFuse) == 1)".
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 07, 2012, 12:37 pm
Io ho intenzione di provare ogni suggerimento, questa per me deve essere anche occasione di studio, altrimenti torniamo alle pappe pronte, con l'HW e i datasheet, l'avete visto, me la cavo un po' di più, ma il sw... :~
La BitRead dovrei usarla due volte per leggere prima uno e poi l'altro bit oppure in questo caso uso solo il bit meno significativo, dando valori da 01 a 06?

Poi ciò che userò sarà quella con cui riuscirò a prendere più dimestichezza, devo comunque avere la padronanza totale del firmware
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 07, 2012, 12:44 pm

La BitRead dovrei usarla due volte per leggere prima uno e poi l'altro bit oppure in questo caso uso solo il bit meno significativo, dando valori da 01 a 06?

Con la bitRead leggi un solo bit alla volta. Se vuoi leggere più bit insieme potresti usare una bitmask. Ad esempio
Code: [Select]
if (dato && 0b11000000) { ... }

faresti una certa azione solo nel caso in cui i 2 bit più significativi di un byte fossero ad 1.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 07, 2012, 03:49 pm
NO, mi conviene leggere solo il bit meno significativo con valore da 1 a 6.
Quando finisco di lavorare provo le due tecniche, vediamo che ne esce  :~
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 07, 2012, 06:34 pm

NO, mi conviene leggere solo il bit meno significativo con valore da 1 a 6.

Non ho capito.... il bit meno significativo è lo 0.


La BitRead dovrei usarla due volte per leggere prima uno e poi l'altro bit oppure in questo caso uso solo il bit meno significativo, dando valori da 01 a 06?

Uhm.. Ma te volevi memorizzare un numero da 1 a 6. Per fare ciò bastano 3 bit.
000=0 001=1 010=2 011=3 100=4 101=5 110=6
Quindi basta uno switch..case su questi 3 bit:
switch (dato && 0b00000111) {
  case 0:
  ecc...
}

In pratica usi una bitmask con valore 7 o, se preferisci, 0b00000111, così isoli solo i primi 3 bit e poi controlli agisci
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 07, 2012, 06:42 pm
No, Leo, mi sono espresso male, io uso, come suggerito da Astro un valore tipo 0x00 per memorizzare dei flag, vorrei usare l'ultima cifra per leggere solo quella, cioè 0x01, 0x02, 0x03 ecc., quindi faccio qualcosa del tipo
se = 1 EFUSE=0 e mode=HVPP
se = 2 EFUSE=0 e mode=HVSP
è più chiaro ora?
Sono appena rientrato, ora mi comincio a mettere al lavoro, se hai suggerimenti immediati spara! :P
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 07, 2012, 06:55 pm
Ok. Ora è chiaro. Comunque ricorda che in un byte ci sono 8 bit per cui puoi avere fino a 8 flag differenti.
Se ragioni in termini di "cifre" perdi dei bit per futuri usi. Pensando in termini di notazioni numeriche, in notazione esadecimale ogni cifra contiene un valore che prende 4 bit. Ragionando in termini di notazione binaria, invece, per memorizzare dei valori decimali da 0 a 6, usi solo 3 bit, salvando quelli dal 4°all'8°(quindi 5 flag) per futuri usi.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 07, 2012, 07:06 pm

Ok. Ora è chiaro. Comunque ricorda che in un byte ci sono 8 bit per cui puoi avere fino a 8 flag differenti.
Se ragioni in termini di "cifre" perdi dei bit per futuri usi. Pensando in termini di notazioni numeriche, in notazione esadecimale ogni cifra contiene un valore che prende 4 bit. Ragionando in termini di notazione binaria, invece, per memorizzare dei valori decimali da 0 a 6, usi solo 3 bit, salvando quelli dal 4°all'8°(quindi 5 flag) per futuri usi.

Scusa, ma usando un valore esadecimale io mi predispongo per 32 combinazioni, da 0x00 a 0xFF, giusto? usando da 0x01 a 0x06 non sto semplicemente usando i primi 6 bit preservandomi i successivi 26 oppure non c'ho capito una mazza?
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 07, 2012, 07:13 pm

Scusa, ma usando un valore esadecimale io mi predispongo per 32 combinazioni, da 0x00 a 0xFF, giusto?


Da 0x00 a 0xFF sono 256 possibili valori.

Quote

usando da 0x01 a 0x06 non sto semplicemente usando i primi 6 bit preservandomi i successivi 26 oppure non c'ho capito una mazza?


Se usi da 0x00 a 0x06 sono sette possibili valori e impegni 3 bit, la stessa cosa che ottieni impegnando ogni singolo bit per un flag a due stati, se applichi la matematica binaria sempre 256 valori totali ottieni, cambia solo il modo di rappresentare le cose.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 07, 2012, 07:39 pm
Sì, sì, che figura di m, scusate ma sto dormendo da seduto, infatti chiudo, sono proprio scoppiato :smiley-eek-blue:
Praticamente 0xFF è la rappresentazione esadecimale di 0b11111111, quindi 4+4=8 bit=2^8=256 combinazioni, di cui ne uso solo 6, hai voglia di "usi futuri"......per la tecnica da adottare vedremo, prima di tutto devo riorganizzare il firmware perché la problematica dei tiny 2313 e 861 mi ha imbordellito la vita, il problema l'ho risolto con 3 sole righe ma vanno messe all'inizio e l'unico modi di leggere le signature di tutte le famiglie è quello HVSP che non funziona se attivo quelle tre righe, quindi ora dvo organizzare tutto in "void" e in loop devo creare una specie di main che ogni volta esegua la giusta routine, lavoro da fare a mente fresca, ora non c'è. :smiley-sleep:
Speravo di avere energie ma ho proprio l'abbiocco, cerco di ricominciare domattina dopo una sana dormitissima, troppo lavoro in questi giorni. Grazie ragazzi e scusatemi.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 07, 2012, 11:20 pm

Se usi da 0x00 a 0x06 sono sette possibili valori e impegni 3 bit, la stessa cosa che ottieni impegnando ogni singolo bit per un flag a due stati, se applichi la matematica binaria sempre 256 valori totali ottieni, cambia solo il modo di rappresentare le cose.



Si parlava di "cifra", una cifra esadecimale occupa 4 bit. Se parliamo di "valore" allora si torna al discorso che avevo fatto e che hai ripreso, che cioè dentro a 3 bit ci stanno 8 valori, 2^3=8.


Praticamente 0xFF è la rappresentazione esadecimale di 0b11111111, quindi 4+4=8 bit=2^8=256 combinazioni, di cui ne uso solo 6, hai voglia di "usi futuri"......

Scusa Mike se insisto ma non è proprio così  :smiley-sweat:
Se ragioniamo in termini di flag, abbiamo 8 flag, ognuno che può assumere il valore 0 o 1, quindi le combinazioni sono 256 ma in realtà riguardano sempre 8 impostazioni. Immagina 8 interruttori della luce: ogni interruttore può essere "su" (acceso o 1) o "giù" (spento o 0). Nel quadro elettrico potrai sì vedere 256 combinazioni dello stato dei singoli interruttori ma in realtà tu starai considerando lo stato binario di 8 interruttori. Mettiamo che gli interruttori siano:
0=cucina
1=bagno
2=corridoio
3=camera
4=salotto
5=ripostiglio
6=ingresso
7=terrazza
e vuoi dire a tua moglie di accendere la cucina e la camera, non andrai a dirgli "accendimi la combinazione" (1*2^0)+(1*2^3)=9 ma gli dirai di accendere l'interruttore 0 e l'interruttore 3.

Tornando ai tuoi flag, l'informazione "globale" è contenuta in un byte, quindi tu hai quel dato memorizzato, ma non tratti il numero nella sua completezza ma per singoli bit.
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Mar 08, 2012, 01:24 am
leo tu hai ragione ed anche io preferisco ragionare in termini binari specialmente se si tratta di sfruttare un byte in termini di singoli flag. Pero lastrada del menny funziona ugualmente quindi se per lui e' piu facile ragionare in termini di byte singolo va bene cosi. Meglio avere uno sketch che capisci che uno migliore ma di cui non hai padronanza. Mio parere :)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 08, 2012, 08:26 am
Dopo una sana dormita di 10 ore stamattina mi sento in condizioni di poter riaffrontare la cosa, sia dal punto di vista teorico che da quello pratico, che poi, come dice giustamente Test, è quello che mi interessa di più: se non in grado di tirare fuori 1,2,....6 da quel valore memorizzato non mi serve altro, se devo farlo considerando che 6=1100 mi rompe un po' di più ma alla fine è la stessa cosa, l'importante è capire ed implementare il meccanismo, ma prima ho da affrontare due problemi più importanti:
1 - la frammentazione del mio firmware in void, mentre prima potevo fare una procedura unica perché l'informazione sul micro la davo io da menu e tutto il resto veniva da sé, ora devo prima riconoscere il micro in automatico, quindi devo eseguire gran parte del firmware per poi rieseguirlo quasi tutto in funzione del micro inserito, chiaro che non posso "ricopiare" un intero firmware togliendo poche cose, quindi ogni spezzone funzionante lo metto in una void e nel loop mi lascio un main semplice semplice che esegua le varie void all'occorrenza.
2 - Letta la signature devo confrontare i suoi tre byte con quelli prememorizzati, io direi di semplificare confrontanto solo secondo e terzo, il primo mi serve come controllo della validità della signature, deve essere infatti sempre 1E (=Atmel), sopno il secondo e terzo che cambiano in funzione della memoria e del modello del micro. A tale proposito ho imparato che:
1° byte = produttore = 1E = Atmel
2° byte = memoria del micro -> 91=2K, 92=4K, 93=8k, ecc.ecc.  ;)
3° byte =modello del micro ma in coppia col secondo byte -> 950F = 328P (da approfondire quando avrò la tabella completa da studiare)
scrivete gente, scrivete....
Allora la mia idea di confronto della signature è:
un ciclo for di due passi all'interno di un while (flag); logica:
fino a che il flag = 0
leggo il secondo byte del secondo array, se è uguale leggo il terzo, se è uguale fine.
se non è uguale (o primo o secondo byte) passo alla riga successiva dell'array
se arrivo a fine array gli dico : guagliò che tieni inta a capa? mietti o micro giusto  XD
idee migliori? (di sicuro ne avete!)
a più tardi e grazie.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 08, 2012, 09:09 am

leggo il secondo byte del secondo array, se è uguale leggo il terzo, se è uguale fine.
se non è uguale (o primo o secondo byte) passo alla riga successiva dell'array
se arrivo a fine array gli dico : guagliò che tieni inta a capa? mietti o micro giusto  XD
idee migliori? (di sicuro ne avete!)
a più tardi e grazie.


Io procederei così, prima di tutto verifichi se il primo byte della signature è 0x1E, se è così continui in caso contrario il processo termina e visualizzi sul display un idoneo messaggio di errore.
Se il confronto sul primo byte da esito positivo inizializzi una for con tante iterazioni quanti sono i modelli di micro supportati, in due variabili locali unsigned int sommi i due byte rimanenti della signature e i due byte della riga matrice in uso, confronti tra loro i due valori, se sono identici hai finito e hai l'indice per accedere agli altri arry, se non trovi nessuna corrispondenza alla fine della for termini con un messaggio di modello non supportato.
Ti allego la relativa funzione così ci capiamo meglio, tiene presente che la sto scrivendo al volo direttamente sul forum senza provare nulla quindi è possibile che contenga qualche errore, quello che conta è il concetto.

Code: [Select]

/* funzione controllo signature invocata dopo il controllo del primo byte,
    la invochi fornendo gli altri due byte della signature, ti ritorna il valore
   dell'indice se viene trovata corrispondenza oppure 0xff in caso di errore.

*/

unsigned char Controllo_signature(unsigned char byte2, unsigned char byte3)
{
char i;
unsigned int temp1, temp2;

temp1 = (unsigned inte) byte2 << 8 + byte1;

for (i=0;i<20;i++)
{
  temp2 = (unsigned char) Signature[i] [1] <<8 + Signature[i] [2];
  if (temp1 == temp2) return i; // esce dalla funzione con il valore dell'indice
}

return 0xff; // corrispondenza non trovata.
}


Piccola nota aggiuntiva, il codice è composta da funzioni e non da void, questo è solo un attributo che indica "nulla", ovvero la funzione non ritorna nessun valore, infatti nel nostro caso la funzione è identificata come "unsigned char Controllo_signature(unsigned char, unsigned char)", vuol dire che accetta in ingresso due valori compresi tra 0 e 255 e ritorna un valore compreso tra 0 e 255.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 08, 2012, 09:16 am

leo tu hai ragione ed anche io preferisco ragionare in termini binari specialmente se si tratta di sfruttare un byte in termini di singoli flag. Pero lastrada del menny funziona ugualmente quindi se per lui e' piu facile ragionare in termini di byte singolo va bene cosi. Meglio avere uno sketch che capisci che uno migliore ma di cui non hai padronanza. Mio parere :)

O sono io che non mi so spiegare oppure ho disimparato a leggere... ma la questione iniziale era usare un byte come contenitore di impostazioni aggiuntive, quindi flag.  :P Così infatti è stato detto e suggerito di usare il 4° byte. Usarlo in formato numerico porta ad un gran casino perché se il byte ha il valore, ad esempio, di 195 a me dice poco ma sapere che i suoi bit sono 11000011 mi fa capire che ho 4 flag ad 1 che mi indicheranno determinate opzioni o configurazioni. Proprio l'uso dei singoli bit permette di immagazzinare informazioni più "specifiche".
Se poi in quel 4° byte non ci deve stare altro che un valore da 0 a 6 allora è un altro discorso però è stato detto che era possibile usarlo anche per scopi futuri: strutturare il codice bene fin da subito in questo modo permette in seguito di non dover cambiare tutti i dati memorizzati e la logica del programma perché si è deciso di aggiungere dei dati a quel byte.


Dopo una sana dormita di 10 ore stamattina mi sento in condizioni di poter riaffrontare la cosa, sia dal punto di vista teorico che da quello pratico, che poi, come dice giustamente Test, è quello che mi interessa di più: se non in grado di tirare fuori 1,2,....6 da quel valore memorizzato non mi serve altro, se devo farlo considerando che 6=1100 mi rompe un po' di più ma alla fine è la stessa cosa, l'importante è capire ed implementare il meccanismo, ma prima ho da affrontare due problemi più importanti:

Leggi sopra. Se vuoi metterci solo 0..6 usalo come vuoi, se in futuro pensi di usarlo per altri scopi, usalo nei singoli bit.

Quote

1 - la frammentazione del mio firmware in void, mentre prima potevo fare una procedura unica perché l'informazione sul micro la davo io da menu e tutto il resto veniva da sé, ora devo prima riconoscere il micro in automatico, quindi devo eseguire gran parte del firmware per poi rieseguirlo quasi tutto in funzione del micro inserito, chiaro che non posso "ricopiare" un intero firmware togliendo poche cose, quindi ogni spezzone funzionante lo metto in una void e nel loop mi lascio un main semplice semplice che esegua le varie void all'occorrenza.

Una piccola correzione. void indica al compilatore che una funzione restituisce un valore nullo, non è una parola chiave che indica al compilatore una funzione. Cioè, void non indica che si sta scrivendo una sub-routine ma il suo valore. Esempi:
Code: [Select]
void mario() {
 ... codice ...
}

Questo codice indica al compilatore che esiste una funzione o sub-routine, chiamala come vuoi, che non restituisce nessun valore. La dichiarazione di funzione è implicita, è come se esistesse una parola chiave "function" omessa.

Questo:
Code: [Select]
byte beppe() {
 byte dato;
 ... codice ...
 return dato;
}

Crea invece una funzione di nome beppe che restituisce un tipo di dati byte.
Quindi, non è corretto indicare una funzione con il termine "void". Ti faccio questa precisazione perché se nell'articolo scrivi che hai creato una void per fare una certa operazione, poi ricevi 100 lettere da programmatori C incacchiati che ti vogliono ardere in piazza tipo Savonarola  ;)

Quote

2 - Letta la signature devo confrontare i suoi tre byte con quelli prememorizzati, io direi di semplificare confrontanto solo secondo e terzo, il primo mi serve come controllo della validità della signature, deve essere infatti sempre 1E (=Atmel), sopno il secondo e terzo che cambiano in funzione della memoria e del modello del micro. A tale proposito ho imparato che:
1° byte = produttore = 1E = Atmel
2° byte = memoria del micro -> 91=2K, 92=4K, 93=8k, ecc.ecc.  ;)
3° byte =modello del micro ma in coppia col secondo byte -> 950F = 328P (da approfondire quando avrò la tabella completa da studiare)
scrivete gente, scrivete....
Allora la mia idea di confronto della signature è:
un ciclo for di due passi all'interno di un while (flag); logica:
fino a che il flag = 0
leggo il secondo byte del secondo array, se è uguale leggo il terzo, se è uguale fine.
se non è uguale (o primo o secondo byte) passo alla riga successiva dell'array
se arrivo a fine array gli dico : guagliò che tieni inta a capa? mietti o micro giusto  XD
idee migliori? (di sicuro ne avete!)
a più tardi e grazie.

Basta un if con un triplo controllo all'interno di un for. Mettiamo che firma[..] contenga la firma digitale letta dal micro e archivioFirme[..][..] le firme memorizzate:
Code: [Select]
boolean trovato=false;
for (byte i=0; i<num_firme; i++) {
 if ((firma[0]==archivioFirme[i][0]) && (firma[1]==archivioFirme[i][1]) && (firma[2]==archivioFirme[i][2])) {
   .....codice per firma trovata....
   trovato=true;
   break;
 }
}
if (!trovato) {
 ....micro non riconosciuto...
}

"trovato" è false all'uscita del ciclo for se non è stato trovato nessun corrispondente modello nell'archivio
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 08, 2012, 10:25 am
Leo, ma sei chiarissimo, solo che io nella mia beata ignoranza tento di rispiegare a parole mie e dico czz; grazie per il chiarimento void/funzione, ci sto proprio litigando ora. HELP!
Se metto in loop

Code: [Select]
byte read_signature1;
read_signature1=SIGN_S_read(0x00, SIGN_READ_INSTR4);

con questa funzione messa nella "zona" delle routine:
byte SIGN_S_read(byte data, byte instr) { // leggo un byte col protocollo HVSP
byte response = 0x00;
.
.
return response;
}

funziona correttamente.

Se sposto il comando di lettura in una sua funzione, così:

Code: [Select]
byte read_signature1;
sign_HVSP_read();

e quindi ora ho due funzioni:

void sign_HVSP_read(void) {
read_signature1=SIGN_S_read(0x00, SIGN_READ_INSTR4);
}

byte SIGN_S_read(byte data, byte instr) { // leggo un byte col protocollo HVSP
byte response = 0x00;
.
.
return response;
}


Mi dà questo errore:
HV_Programmer_MAIN.cpp: In function 'byte signt_SP_read()':
HV_Programmer_MAIN:489: error: 'read_signature1' was not declared in this scope

Perché? Devo risolvere con qualcosa del genere altrimenti non ho la possibilità di leggere la signature in modo sequenziale nelle tre diverse modalità.
Cioè io da sign_HVSP_read(); mi aspetto di rientrare in main avendo a disposizione il valore di signature1
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 08, 2012, 10:31 am
Si chiama spazio dei nomi, ed indica la visibilità di una variabile. Se una variabile la dichiari in una funzione, non la puoi usare al di fuori di essa.
Per poterla usare in tutte le funzioni del tuo programma, devi dichiararla come variabile globale: per far ciò basta mettere la sua dichiarazione in cima allo sketch:

Code: [Select]
byte read_signature1;
....
void setup() {
....
}

void loop() {
...
}

void sign_HVSP_read(void) {
read_signature1=SIGN_S_read(0x00, SIGN_READ_INSTR4);
}
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 08, 2012, 10:31 am

HV_Programmer_MAIN.cpp: In function 'byte signt_SP_read()':
HV_Programmer_MAIN:489: error: 'read_signature1' was not declared in this scope


Vuol dire che "read_signature1" non viene trovata come variabile locale o globale, se l'hai dichiarata nella loop è normale che non la trova, devi dichiararla esternamente come variabile globale se vuoi che sia disponibile per tutte le funzioni senza doverla passare esplicitamente.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 08, 2012, 10:35 am


HV_Programmer_MAIN.cpp: In function 'byte signt_SP_read()':
HV_Programmer_MAIN:489: error: 'read_signature1' was not declared in this scope


Vuol dire che "read_signature1" non viene trovata come variabile locale o globale, se l'hai dichiarata nella loop è normale che non la trova, devi dichiararla esternamente come variabile globale se vuoi che sia disponibile per tutte le funzioni senza doverla passare esplicitamente.

Infatti stavo provando e mettendola direttamente nella funzione come
byte read_signature1;
l'errore è sparito
In effetti era dichiarata in loop, allora mi basta spostarla nelle variabili globali per risolvere in modo anche più elegante.
Grazie e a dopo, oggi sarà dura con questa storia della main  :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 08, 2012, 10:56 am
Ora che funziona la prima parte ho fatto una scoperta interessante: la tecnica HVPP mi permette di leggere TUTTI i tipi di signature, anche quelle dei micro che normalmente programmo in HVSP, quindi come prima manovra leggo la signature a colpo sicuro, poi differenzio invece la lettura e la scrittura dei fuse  :)

EDIT: ma mi viene un dubbio e devo fare una controverifica...
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 08, 2012, 11:00 am

EDIT: ma mi viene un dubbio e devo fare una controverifica...


Nel frattempo guardati pure la soluzione che ti ho scritto qualche post sopra per il controllo della signature.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 08, 2012, 11:10 am
Scusami Astro, ho visto il lunghissimo post di risposta che il povero Leo si è massacrato a scrivere e non havevo proprio visto il tuo post, dove peraltro mi chiarivi già la questione funzione/void; la soluzione che mi prospetti è semplice ed efficace, la metto subito in atto.
Però non posso basarmi immediatamente sul controllo 1E, perché devi considerare che io "non so" a priori che micro ho messo e quindi la modalità che uso potrebbe non essere compatibile.
Intanto ho avuto conferma del sospetto che avevo, devo proprio iniziare a leggere con la modalità HVSP, in tal modo ho:
1E se il micro è HVSP compatibile
FF se non lo è ma se comunque c'è un micro
00 se non c'è alcun micro e ho premuto per errore
quindi la tua routine la eseguo solo quando riesco ad ottenere un 1E, fra poco devo andare all'UNI, per oggi mi sa che ho finito, però mi pare di essere sulla buona strada.... Grazie a tutti! XD
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 08, 2012, 11:22 am

quindi la tua routine la eseguo solo quando riesco ad ottenere un 1E, fra poco devo andare all'UNI, per oggi mi sa che ho finito, però mi pare di essere sulla buona strada.... Grazie a tutti! XD


Ovviamente la mia routine di controllo la esegui solo dopo aver ottenuto una signature valida.
Attenzione al fatto che 0x1e per il momento è vero che ti indica un micro AVR di Atmel, ma non è detto che in futuro rimane sempre solo questo valore, per come è organizzata la signature è possibile specificare solo 255 diversi modelli di micro più le loro varianti come quantità di memoria.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 08, 2012, 11:45 am


quindi la tua routine la eseguo solo quando riesco ad ottenere un 1E, fra poco devo andare all'UNI, per oggi mi sa che ho finito, però mi pare di essere sulla buona strada.... Grazie a tutti! XD


Ovviamente la mia routine di controllo la esegui solo dopo aver ottenuto una signature valida.
Attenzione al fatto che 0x1e per il momento è vero che ti indica un micro AVR di Atmel, ma non è detto che in futuro rimane sempre solo questo valore, per come è organizzata la signature è possibile specificare solo 255 diversi modelli di micro più le loro varianti come quantità di memoria.


Sì, ci riflettevo su, d'altra parte che posso farci? posso mettere una define all'inizio del firmware col valore 1E, per semplificare la variazione, ma per aumentare il numero devono almeno raddoppiare i byte, posso tentare di "anticipare" la possibile applicazione di due byte con un define ATMEL 0xFF1E e trasformare ogni primo byte in un doppio byte, ma dici che vale la pena? però considera che io rilascio il firmware libero, e se ciò dovesse accadere sarei il primo ad apportare le dovute correzioni e ridarlo alla Rivista e comunque ognuno potrebbe fare la correzione.
Comunque accetto suggerimenti, ovviamente, della tua esperienza mi fido ciecamente.
Intanto la routine di check della signature ora è perfetta, mi dice perfino se il micro non è nello zoccolo o se è danneggiato (ho un atmega8 morto che avevo conservato per usi futuri.... :smiley-mr-green:)
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 08, 2012, 11:58 am

Sì, ci riflettevo su, d'altra parte che posso farci? posso mettere una define all'inizio del firmware col valore 1E, per semplificare la variazione, ma per aumentare il numero devono almeno raddoppiare i byte, posso tentare di "anticipare" la possibile applicazione di due byte con un define ATMEL 0xFF1E e


Ma no, semplicemente in futuro avranno come primo byte non solo 0x1e, ma un secondo valore che potrebbe essere 0x1f, questa non è una convenzione mondiale di tutti i produttori, è solo uno standard usato da Atmel, tutti gli altri fanno come gli pare.
Per esempio Microchip usa solo due byte per il device ID, l'equivalente della signature di Atmel, i vari bit indicano sia il modello esatto del micro che la revisione hardware, quest'ultima informazione, molto importante, è totalmente assente nella signature di Atmel.
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 08, 2012, 12:07 pm
@Menniti oltre alle possibilità che elencavi prima, hai pensato alla eventualità di mettere i micro al contrario?
in teoria dovrebbe rientrare nel caso "nessun micro" ma siamo sicuri che per qualche strana ragione non si legga qualcosa (di sicuramente errato) comunque?
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 08, 2012, 02:56 pm


Sì, ci riflettevo su, d'altra parte che posso farci? posso mettere una define all'inizio del firmware col valore 1E, per semplificare la variazione, ma per aumentare il numero devono almeno raddoppiare i byte, posso tentare di "anticipare" la possibile applicazione di due byte con un define ATMEL 0xFF1E e


Ma no, semplicemente in futuro avranno come primo byte non solo 0x1e, ma un secondo valore che potrebbe essere 0x1f, questa non è una convenzione mondiale di tutti i produttori, è solo uno standard usato da Atmel, tutti gli altri fanno come gli pare.
Per esempio Microchip usa solo due byte per il device ID, l'equivalente della signature di Atmel, i vari bit indicano sia il modello esatto del micro che la revisione hardware, quest'ultima informazione, molto importante, è totalmente assente nella signature di Atmel.


Pensavo fosse uno standard per tutti i micro, a questo punto lascio com'è, non avendo idea di cosa possa diventare, quando sarà se ne parlerà....

@Menniti oltre alle possibilità che elencavi prima, hai pensato alla eventualità di mettere i micro al contrario?
in teoria dovrebbe rientrare nel caso "nessun micro" ma siamo sicuri che per qualche strana ragione non si legga qualcosa (di sicuramente errato) comunque?

BB, ti rispondo con una prova da fare: prepara uno schema per un tiny85 e poi mettilo al contrario, ma PRIMA guardati le piedinature ok? Non scherziamo, ci manca solo che devo calcolarmi come prevedere il chip a rovescia (il tiny85 scoppierebbe) o magari quello che lascia i primi o gli ultimi due pin fuori dallo zoccolo :smiley-fat:
La logica che ho usato è chiara e lampante, sono previsti i casi 00 (chip assente), FF (modo di programmazione sbagliato), 1E (chip e modo corretti), qualsiasi altro valore verrà dato come chip spacciato, cosa possibile se lo metti al contario o con i pin sfasati. Non lo scriverei nell'articolo come possibilità nemmeno sotto tortura, al principiante puoi dire che deve far corrispondere la tacca del chip col pin 1 serigrafato accanto allo zoccolo, non puoi trattarlo come un deficiente ;)
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 08, 2012, 03:24 pm
chiaro... come solo un (bravo) insegnante puo essere ;)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 08, 2012, 05:29 pm

chiaro... come solo un (bravo) insegnante puo essere ;)

Beh, grazie, ma anche tu come "studente" non sei niente male XD

Giovani, sono rientrato (è una specie di minaccia :D), ho già litigato col code di Astro che lui giustamente aveva definito buttato al volo e non esente da errori; ora vediamo se facciamo pace da soli o se deve intervenire il suo papà  ;) a tra poco.......
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 08, 2012, 05:52 pm
Un problemino per la tabella dati: ho diversi elenchi con le signature ma nemmeno uno con i fusebit di default, non è che posso mettermi col FuseCalc a tirarli fuori tutti, sai che sbatts, per non dire che non è detto che combaci la mia idea con quella di Atmel, specialmente per i tipi poco noti.

Queste dovrebbe essere una ricerca per BB, il LINKBUSTER :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 08, 2012, 05:59 pm
hai qualcosa per leggere un'enciclopedia di avr in xml ? se si mandami un mp ;)
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 08, 2012, 06:02 pm

Giovani, sono rientrato (è una specie di minaccia :D), ho già litigato col code di Astro che lui giustamente aveva definito buttato al volo e non esente da errori; ora vediamo se facciamo pace da soli o se deve intervenire il suo papà  ;) a tra poco.......


Infatti ci stava qualche errore di battitura, un unsigned char al posto di un unsigned int e due coppie di parentesi mancanti, ti allego uno sketch completo funzionante  (provato) che illustra il senso generale della cosa:
Code: [Select]



char Stringa[20] [20] = { {"ATmega328p"},
                          {"ATMEGA644"},
                          {"ATMEGA2560"}
                        };
                       
byte signature [20] [3] = { {0x1E,0x1C,0x1D},
                            {0x1E,0x1C,0x1E},
                            {0x1E,0x1C,0x1F}
                          }; 

byte fuses [20] [4] = { {0xff,0xff,0xff,0xff},
                        {0xff,0xff,0xff,0xff},
                        {0xff,0xff,0xff,0xff}
                       }; 
char modello[20];

void setup()
{
  Serial.begin(9600);
}

void loop()
{
unsigned char indice;
char modello[20],i;

delay(500);
indice = Controllo_signature(0x1c,0x1e);
if (indice < 20)
  {
   
     Serial.print("Trovato : ");
     for(i=0;i<20;i++) modello[i] =  Stringa[indice] [i];
     Serial.println (modello);
  } 
else Serial.print("Nessun micro trovato");

}

/* funzione controllo signature invocata dopo il controllo del primo byte,
    la invochi fornendo gli altri due byte della signature, ti ritorna il valore
   dell'indice se viene trovata corrispondenza oppure 0xff in caso di errore.

*/

unsigned char Controllo_signature(unsigned char byte2, unsigned char byte3)
{
char i;
unsigned int temp1, temp2;

temp1 = (unsigned int)(byte2 << 8) + byte3;

for (i=0;i<20;i++)
{
  temp2 = (unsigned int) (signature[i] [1] <<8) + signature[i] [2];
  if (temp1 == temp2) return i; // esce dalla funzione con il valore dell'indice
}

return 0xff; // corrispondenza non trovata.
}
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 08, 2012, 06:06 pm

hai qualcosa per leggere un'enciclopedia di avr in xml ? se si mandami un mp ;)

se è questo (http://home.ustc.edu.cn/~zuoyuan/download/paperrobot/progisp168/eng/) mi sa che proprio tu mi avevi mandato il link, ma così è illeggibile, ci vuole un programma specifico?


@ Astro: sei un gioiello impagabile :D ora provo....
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 08, 2012, 06:09 pm
... quello è un riassuntino a confronto :)
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 08, 2012, 06:22 pm

non è che posso mettermi col FuseCalc a tirarli fuori tutti, sai che sbatts, per non dire che non è detto che combaci la mia idea con quella di Atmel, specialmente per i tipi poco noti.


Con fusecalc ci metti un attimo, selezioni il modello che ti interessa e automaticamente hai i valori di defaults, al limite clicca sul tasto "defaults" per sicurezza, copia e incolla e in 10 minuti hai i fuse di almeno 30 modelli diversi, anche senza controllare il catalogo Atmel sono già di più di quelli che puoi inserire sugli zoccoli del programmatore HV vista la limitata scelta di AVR in case pdip.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 08, 2012, 06:48 pm
Si nel frattempo ho visto che c'è il contrassegno default anche se mi pare che mi manchi l'attiny88 a prima vista, poi guardo meglio, al limite li leggo da uno vergine, ne ho più di qualcuno ancora nel contenitore.

chiarimenti: mi pare di ricordare che non necessariamente devo fissare il numero di righe per l'array, se è così potrei aggiungere di volta in volta i micro senza dover stare lì a variare quel "20", ricordo male? ci sono controindicazioni? se posso usarlo come faccio poi a sapere cosa devo mettere qui al posto del 20?
Quote
for(i=0;i<20;i++) modello = atmel[indice] ;


Inoltre se dal ritorno della funzione ho l'indice perché devo rileggere tutto per estrapolarmi il modello?

Infine (si fa per dire...) come faccio a leggere i 4 byte dell'array fuse? con qualcosa tipo indice, 1; indice,2 ecc?

Aggiugno quesito: perché leggo da qualche parte che NON tutti i micro ATMEL hanno il 3 fuse (p.es. il TINY85) quando invece il FuseCalc ha un campo "SELFPRGEN" che se flaggato agisce proprio sul 3° fuse di TUTTI i micro che ho visto finora?
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 08, 2012, 07:04 pm

chiarimenti: mi pare di ricordare che non necessariamente devo fissare il numero di righe per l'array, se è così potrei aggiungere di volta in volta i micro senza dover stare lì a variare quel "20", ricordo male?


Dato che parliamo di dati statici è vitale che siano predefiniti come dimensioni, non sei obbligato ad inizializzare tutto l'array, ma le dimensioni massime devono essere inserite, ovviamente le puoi variare quando ti pare aggiornando il sorgente.

Quote

Inoltre se dal ritorno della funzione ho l'indice perché devo rileggere tutto per estrapolarmi il modello?


Leggi solo la riga, 20 caratteri nel mio esempio, che contiene il modello e la copi in una stringa che poi usi per inviarla sulla seriale, come faccio io, oppure per scrivere sul display, in realtà per questo puoi scrivere direttamente i caratteri all'interno della for senza usare un ulteriore array.

Quote

Infine
(si fa per dire...) come faccio a leggere i 4 byte dell'array fuse? con qualcosa tipo indice, 1; indice,2 ecc?


Esattamente come leggi la riga del modello, o li usi direttamente sotto forma di array, quindi "fuse[indice]
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 08, 2012, 10:47 pm

chiarimenti: mi pare di ricordare che non necessariamente devo fissare il numero di righe per l'array, se è così potrei aggiungere di volta in volta i micro senza dover stare lì a variare quel "20", ricordo male? ci sono controindicazioni? se posso usarlo come faccio poi a sapere cosa devo mettere qui al posto del 20?
Quote
for(i=0;i<20;i++) modello = atmel[indice] ;


Inoltre se dal ritorno della funzione ho l'indice perché devo rileggere tutto per estrapolarmi il modello?

Infine (si fa per dire...) come faccio a leggere i 4 byte dell'array fuse? con qualcosa tipo indice, 1; indice,2 ecc?

Ma non puoi usare la bozza di codice che ti avevo passato qualche post fa?
Confronta la firma con quella dell'archivio ed esce non appena ha trovato il modello giusto. Una volta uscita, conservati l'indice (dichiaralo fuori dal for) e poi quello ti indica il micro in tutte le altre tabelle.

Quote

Aggiugno quesito: perché leggo da qualche parte che NON tutti i micro ATMEL hanno il 3 fuse (p.es. il TINY85) quando invece il FuseCalc ha un campo "SELFPRGEN" che se flaggato agisce proprio sul 3° fuse di TUTTI i micro che ho visto finora?


I Tiny ce l'hanno. Un micro che non ce l'ha è l'Atmega32, per esempio
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 08, 2012, 11:44 pm
uffff, ho fatto tutto, cose da ignoranti fatali :smiley-red:
Comunque tutto perfetto, metto il micro nel suo zoccolo (non posso andare alla cieca solo nel caso dei micro a 20 pin visto che ho dovuto prevedere due diversi zoccoli) e mi tira fuori in automatico: modello, signature e fuse di default.
Ora ho a disposizione il 4° byte (che ho definito FLAGS) che mi servirà per leggere, con la giusta modalità i due o tre fuse (anche il tiny13 ne ha 2, ora ho visto che è vero...), ed eventualmente per riprogrammarli.
Anche oggi, GRAZIE AL VOSTRO PREZIOSO AIUTO (E TANTA PAZIENZA :*), è stata una giornata molto fruttuosa.
Qualche minuto per inserire qualche altro micro nella tabella e poi smetto, sono stanchissimo.

Una sola nota, Astro, nei casi di non presenza in tabella aveva inserito un messaggio in seriale (ma chiaramente era per farmi capire la problematica), poiché in quella fase non uso la seriale e piché non sono riuscito in alcun modo ad assegnare un testo a modello, per incompatibilità di tipi, mi è parso di aver capito, ho fatto una cosa che ha una sua logica, secondo me: nell'ultima posizione del solo array "atmel" (quello che contiene le descrizioni dei modelli), ho messo in ultima posizione (la ventesima o quel che sarà) una descrizione "NON IN TABELLA"; in tal modo se metto un micro compatibile in uno zoccolo ma che non è in tabella, la procedura mi legge la signature e mi avvisa che non è in tabella e che quindi non conosce i fuses di default, ma a quel punto lo posso programmare senza problemi. Inoltre non mi piaceva molto il fatto di dare un valore fisso numerico ai tre array; visto che tale valore è usato in 6-7 punti del firmware, ad ogni variazione in aumento avrei dovuto modificare 6-7 valori col rischio di dimenticare qualcosa, allora ho definito una costante TOT a cui assegno il valore 20 (per ora) e che sarà l'unica che dovrò variare quando aumenteranno i micro definiti. Non va bene?
Ah, una nota: avevo messo la
Quote
char modello[TOT],i;
nelle variabili globali, l'ho dovuta rimettere dov'era perché in fase di visualizzazione dei dati si infilavano caratteri strani, non ho capito perché ma l'importante è che ora funzioni.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 09, 2012, 06:39 am
Nel mio lunghissimo post avevo anche messo:

Basta un if con un triplo controllo all'interno di un for. Mettiamo che firma[..] contenga la firma digitale letta dal micro e archivioFirme[..][..] le firme memorizzate:
Code: [Select]
boolean trovato=false;
for (byte i=0; i<num_firme; i++) {
 if ((firma[0]==archivioFirme[i][0]) && (firma[1]==archivioFirme[i][1]) && (firma[2]==archivioFirme[i][2])) {
   .....codice per firma trovata....
   trovato=true;
   break;
 }
}
if (!trovato) {
 ....micro non riconosciuto...
}

"trovato" è false all'uscita del ciclo for se non è stato trovato nessun corrispondente modello nell'archivio

Quindi un semplice flag per verificare che l'uscita dal ciclo di controllo delle signature sia avvenuto recuperando un modello oppure no.
Se ora tu estrai la definizione di "byte i" dal for e la metti come variabile esterna, all'uscita del ciclo for, "i" contiene l'indice del modello che puoi poi usare per estrarre i dati dalle altre tabelle.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 09, 2012, 07:02 am

Nel mio lunghissimo post avevo anche messo:


Scusa Leo, ma in questo caso dissento totalmente dalla tua soluzione.
Prima di tutto scansioni tutto l'array sempre, tempo cpu sprecato, e poi a Michele serve un indice per trovare tutti i parametri, la mia soluzione non solo è più elegante, più compatta ed efficiente, si ferma non appena trova il modello di micro e ritorna il relativo indice.

Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 09, 2012, 07:16 am

Prima di tutto scansioni tutto l'array sempre, tempo cpu sprecato

a Michele serve un indice per trovare tutti i parametri, la mia soluzione non solo è più elegante, più compatta ed efficiente, si ferma non appena trova il modello di micro e ritorna il relativo indice.


Questo è un discorso relativo perché si hanno da passare in rassegna 10/20 modelli non di più. Si sprecano risorse ma parliamo di un ciclo che non sempre arriverà fino alle ultime posizioni dell'array dei micro. Inoltre non scansiono l'intero array ma mi fermo quando trovo una corrispondenza. Lo stesso fa il tuo ciclo for, perché esce solo nel momento in cui trova il micro, non prima.

Se la variabile viene messa fuori dal ciclo, nel momento in cui esce dal for conserva la posizione del micro trovato, quindi l'indice della corrispondenza trovata.

Poi è ovvio: ogni scarrafone è bello a mamma sua  ;)
Title: Re: Topic permanente di programmazione newbie
Post by: ratto93 on Mar 09, 2012, 08:18 am
Non vorrei dire una boiata, ma la Ricerca Dicotomica vi dice niente ?  :smiley-mr-green:
Credo che non darebbe nessun problema durante l'implementazione ne durante il funzionamento..
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 09, 2012, 08:32 am
Buongiorno, è doverosa la premessa che dovete sempre tener presente leggendo il titolo del Topic :smiley-red:
Quindi io accetto e rispetto ogni suggerimento e davvero ringrazio di cuore chiunque mi dia una mano, poi ho due priorità: "comprendere" il suggerimento in quanto lo dovrò poi spiegare, ed "impossessarmi" di esso in quanto certamente devo manipolarlo; inoltre i tempi sono stretti quindi magari capita che prendo una soluzione tecnicamente meno favorevole di un'altra, ma se la capisco e funziona per me è un grande balzo avanti come state comprendendo; ancora, ovvio che se oltre a spiegarmi mi postate un code copia/incolla mi ci butto a pesce, salvo poi a chiedere spiegazioni. Ieri con grande fatica :smiley-sweat: sono riuscito ad arrivare al punto che ho scritto nell'ultimo post, ora mi sembra giusto, prima di andare al lavoro (ma spero di sbrigarmi presto) postare la soluzione adottata, che mi sembra semplice e chiara, e che ora non so nemmeno più di chi è figlia, avendola perlatro "snaturata" tutta con interventi da newbie, che ora vi faranno imprecare, ma che funzionano, e per me, almeno per ora, tanto basta. Il prossimo passaggio consiste secondo me nel creare un 4° array con 6 righe e tre colonne nel quale memorizzo i sei valori del 4° byte dell'array "fuses" ed i corrispondenti valori di EFUSE si/no e programming mode HVSP/HVPP/HVP13; oppure con un semplice select case, da aggiungere alla base del code che vi sto postando, ottengo lo stesso risultato, ditemi Voi; una volta in possesso dei dati per la programmazione devo passare all'ultimo stadio, che è quello della scrittura dei fuses e poi ho finito; resta da immplementare l'erase, ma mi verrà semplice una volta ristrutturato il software, come sto facendo, man mano che procedo.
Code: [Select]
#define  TOT            4
char atmel [TOT] [20] = {      {"ATtiny13"},
                               {"ATtiny25"},
                               {"ATtiny45"}
          {"NON IN TABELLA"}   
};

byte signature [TOT] [3] = {   {0x1E,0x90,0x07},
                               {""},
                               {""}
};

byte fuses [TOT] [4] =    {    {0x6A,0xFF,0xFF,0x00},
{0x62,0xD9,0xFF,0x04},
                               {0x62,0xDF,0xFF,0x05}
};

IN LOOP:

// arrivati a questo punto sono in possesso della sola signature del micro

unsigned char indice;
    unsigned char LFUSE;
    unsigned char HFUSE;
    unsigned char EFUSE;
    unsigned char FLAGS;
    char modello[TOT],i;
    delay(500);
    indice = cfr_signature(read_signature2,read_signature3);
    if (indice < TOT)
      {
       for(i=0;i<20;i++) modello[i] = atmel[indice] [i];
       LFUSE = fuses[indice] [0];
       HFUSE = fuses[indice] [1];
       EFUSE = fuses[indice] [2];
       FLAGS = fuses[indice] [3];
      } 
    else for(i=0;i<20;i++) modello[TOT] = atmel[indice] [i];


NELLA SEZIONE FUNCTIONS & VOIDS

unsigned char cfr_signature(unsigned char byte2, unsigned char byte3)
{
char i;
unsigned int temp1, temp2;

temp1 = (unsigned int)(byte2 << 8) + byte3;

for (i=0;i<TOT;i++)
{
  temp2 = (unsigned int) (signature[i] [1] <<8) + signature[i] [2];
  if (temp1 == temp2) return i; // esce dalla funzione con il valore dell'indice
}
i = TOT-1; // corrispondenza non trovata, i assume l'ultimo valore dell'array "NON IN TABELLA"
return i;
}


@ ratto93: per quanto mi riguarda non so di che parli  :~
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 09, 2012, 08:32 am
,Non vorrei dire una boiata,  :smiley-mr-green:


Si l'hai detta   :)
La ricerca dicotomica è applicabile solo se hai una lista ordinata, in senso crescente o decrescente, il che implica l'uso di un sort oppure obbligare Michele ad un lavoraccio per mettere tutte le signature in ordine, se gli fai questa proposta come minimo telefona alla tua scuola e ti fa bocciare in anticipo  :smiley-mr-green:
Dato che parliamo di array di piccole dimensioni, non penso andrà mai oltre i cento elementi, non è che ci sono tutti questi grandi vantaggi nell'applicare algoritmi di ricerca particolari, la banale scansione con stop sul match va più che bene.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 09, 2012, 09:25 am

, ma la Ricerca Dicotomica vi dice niente ?  :smiley-mr-green:


Si l'hai detta   :)
La ricerca dicotomica è applicabile solo se hai una lista ordinata, in senso crescente o decrescente, il che implica l'uso di un sort oppure obbligare Michele ad un lavoraccio per mettere tutte le signature in ordine, se gli fai questa proposta come minimo telefona alla tua scuola e ti fa bocciare in anticipo  :smiley-mr-green:
Dato che parliamo di array di piccole dimensioni, non penso andrà mai oltre i cento elementi, non è che ci sono tutti questi grandi vantaggi nell'applicare algoritmi di ricerca particolari, la banale scansione con stop sul match va più che bene.

Allora usiamo lo Gnome sort (http://it.wikipedia.org/wiki/Gnome_sort) per ordinare la lista  :P
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 09, 2012, 12:30 pm

,Non vorrei dire una boiata,  :smiley-mr-green:


Si l'hai detta   :)
La ricerca dicotomica è applicabile solo se hai una lista ordinata, in senso crescente o decrescente, il che implica l'uso di un sort oppure obbligare Michele ad un lavoraccio per mettere tutte le signature in ordine, se gli fai questa proposta come minimo telefona alla tua scuola e ti fa bocciare in anticipo  :smiley-mr-green:
Dato che parliamo di array di piccole dimensioni, non penso andrà mai oltre i cento elementi, non è che ci sono tutti questi grandi vantaggi nell'applicare algoritmi di ricerca particolari, la banale scansione con stop sul match va più che bene.

Ratto, puoi smettere di lavorare alla tua tesina, non serve più, almeno per quest'anno ]:D
Scherzi a parte io li sto già inserendo in ordine, ma in base alla Tabella che ho preparato circa i 25 controllori programmabili con certezza, con questo strumento. I successivi in serimenti saranno fatti in coda agli array.

Sì, concordo col fatto che è inutile cercare algoritmi particolari, perché VI confermo che la ricerca è immediata, anzi un ritardo è introdotto da un delay che Astro non mi ha spiegato, subito dopo la dichiarazione delle variabili.

@ Leo buono per quando implementerò le zoccolature qfn & co e programmeremo qualche migliaio di micro :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: ratto93 on Mar 09, 2012, 02:00 pm
Ragazzi, non faccio programmazione strutturata da 2 anni e ne abbiamo fatta anche poca quindi non prendetevela più di tanto  :*

Per di più se sono già in ordine, può funzionare  :smiley-zipper:
Mi riservo comunque il beneficio di dire boiate  :smiley-yell:
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 09, 2012, 03:31 pm

anzi un ritardo è introdotto da un delay che Astro non mi ha spiegato, subito dopo la dichiarazione delle variabili.


Il delay è solo per non bombardare la seriale con una marea di dati, dato che per l'esempio ho inserito tutto nella loop giusto per non farti vedere una marea di righe correre a velocità luce sul serial monitor ho messo quel ritardo.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 09, 2012, 03:32 pm

Mi riservo comunque il beneficio di dire boiate  :smiley-yell:


E noi quello di cazziarti  quando le dici  :D :smiley-mr-green: :D
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 09, 2012, 03:59 pm


anzi un ritardo è introdotto da un delay che Astro non mi ha spiegato, subito dopo la dichiarazione delle variabili.


Il delay è solo per non bombardare la seriale con una marea di dati, dato che per l'esempio ho inserito tutto nella loop giusto per non farti vedere una marea di righe correre a velocità luce sul serial monitor ho messo quel ritardo.


Allora lo posso togliere, visto che la seriale l'attivo solo dopo che ho tutti i dati e non mentre li leggo. Grazie.
Ora vorrei solo un paio di chiarimenti sulla funzione:
Code: [Select]
temp1 = (unsigned int)(byte2 << 8) + byte3; in temp1 metti la somma o l'unione dei bue byte? A che serve "<<8"?
Il resto mi è chiaro, fai ciclicamente la stessa cosa con temp2 prendendo i dati dall'array e confrontandoli con quelli di temp1, quando coincidono esci e riporti l'indice.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 09, 2012, 04:16 pm

tutti i dati e non mentre li leggo. Grazie.
Ora vorrei solo un paio di chiarimenti sulla funzione:
temp1 = (unsigned int)(byte2 << 8) + byte3;


Spiegazione estesa di cosa fa questa riga in C:
Code: [Select]
temp1 = (unsigned int)(byte2 << 8) + byte3;
Temp1 è definita come variabile di tipo unsigned int, cioè un intero senza segno in grado di rappresentare un numero compreso tra 0 e 65535.
byte2 e byte3 sono due variabili unsigned char, aka byte in wiring, la riga altro non fa che sommare assieme i due valori per ottenere un numero intero a 16 bit, per farlo è necessario moltiplicare per 256 il primo valore in modo da spostarlo 8 bit avanti, il modo più semplice, e rapido, per farlo è utilizzare l'operatore shift verso sinistra, il "<< 8".
In pratica byte2 viene letteralmente spostato di 8 bit trasformandolo da un valore unsigned char in un unsigned int, p.e. se byte2 vale 0xAA dopo l'operazione di shift vale 0xAA00, però dato che il dato è definito come unsigned char, cioè solo otto bit, è indispensabile dire al linguaggio che la variabile viene promossa a unsigned int e questo si fa tramite il casting, cioè il "(unsigned int)" prima di byte2.
Un volta che byte2 è diventato un 16bit possiamo sommargli byte3 per ottenere un valore a 16 bit univoco che rappresenta i due byte, p.e. se byte2 = 0xAA e byte3 = 0x25 dopo lo shift e il casting abbiamo 0xAA00 e dopo la somma di byte3 abbiamo 0xAA25.
La stessa cosa viene fatta durante il confronto utilizzando i dati della matrice comparandoli con il valore precedentemente calcolato.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 09, 2012, 04:26 pm
Azz, m'hai appena regalato un quarto di pagina d'articolo XD no, scherzo, però visto che devo fare didattica credo non sia male soffermarsi su qualche tecnica particolare dello sketch; sei stato chiarissimo, grazie!
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 09, 2012, 06:15 pm
Leggo il byte FLAGS dall'array con il comando  FLAGS = fuses[indice] [3];
ogni byte per me significano due variabili distinte in combinazione, pensavo che il seguente codice le assegnasse regolarmente, invece su serial non mi esce altro che un quadratino bianco, sia per l'una che per l'altra variabile (sono globali tipo "BYTE"):
Code: [Select]
switch (FLAGS) {
  case 0x00:
    BURN_EFUSE = 0;
    mode = HVSP;
    break;
  case 0x01:
    BURN_EFUSE = 0;
    mode = HVPP;
    break;
  case 0x02:
    BURN_EFUSE = 0;
    mode = HVP13;
    break;
  case 0x03:
    BURN_EFUSE = 1;
    mode = HVSP;
    break;
  case 0x04:
    BURN_EFUSE = 1;
    mode = HVPP;
    break;
  case 0x05:
    BURN_EFUSE = 1;
    mode = HVP13;
    break;
  }
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 09, 2012, 06:19 pm

Leggo il byte FLAGS dall'array con il comando  FLAGS = fuses[indice] [3];
ogni byte per me significano due variabili distinte in combinazione, pensavo che il seguente codice le assegnasse regolarmente, invece su serial non mi esce altro che un quadratino bianco, sia per l'una che per l'altra variabile (sono globali tipo "BYTE"):


Dipende da come le fai visualizzare, usa l'estensione HEX nella serial print cosi vedi esattamente il contenuto in formato esadecimale.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 09, 2012, 06:29 pm
Hai ragione, in esadecimale BURN_EFUSE mi dà 0 o 1 correttamente; mode invece mi dà 0,1 o 2, cioè le differenze corrispondono ma da dove li prende questi tre valori numerici che io non ho dato da nessuna parte? per vedere i valori testuali attribuiti come devo fare?
Anche perché dopo visualizzati li devo usare per decidere quali routine lanciare per le varie fasi della programmazione.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 09, 2012, 06:37 pm

Hai ragione, in esadecimale BURN_EFUSE mi dà 0 o 1 correttamente; mode invece mi dà 0,1 o 2, cioè le differenze corrispondono ma da dove li prende questi tre valori numerici che io non ho dato da nessuna parte?


???
Sei tu che assegni un valore a mode, "mode = HVP13;", da qualche parte avrai predefinito HVP13, HVPP, HVSP e in base a queste definizioni mode viene inizializzato di conseguenza.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 09, 2012, 06:46 pm
è questo vero.....
enum modelist { HVSP, HVPP, HVP13 };
che assegna 1, 2, 3?
ma ora ti chiedo, nella prosecuzione dello sketch li ritiene equivalenti 1/HVSP, ecc.?
Cioè se io dopo aver caricato un flags in cui mode = 1 (quindi = HVSP), faccio una cosa del genere:
if mode = HVSP
me lo dà come "vero"? altrimenti sono fott.....
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 09, 2012, 06:53 pm

Cioè se io dopo aver caricato un flags in cui mode = 1 (quindi = HVSP), faccio una cosa del genere:
if mode = HVSP
me lo dà come "vero"? altrimenti sono fott.....


Se in mode hai caricato HVSP, precedentemente predefinito con un certo valore, p.e. #define HVSP 1, e poi fai "if (mode == HVSP)" ovviamente ottieni un match.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 09, 2012, 07:02 pm
mi sono spiegato male, io non ho usato alcuna define per quei tre valori, la prima volta che sono nello sketch è in quella enum modelist, da quel punto in poi ci sono solo cose tipo
mode = HVPP
oppure
If mode = HVSP
non c'è, garantito, alcun punto dello sketch in cui HVSP=0, HVPP=1, HVP13=2, nemmeno separati, quindi credo che sia l'enum modelist che assegna un valore numerico in base alla posizione tra le { }, faccio prima a fare qualche prova, a dopo :)

INFATTI: se trasformo enum modelist { HVSP, HVPP, HVP13 }; in enum modelist { HVPP, HVSP, HVP13 }; è HVPP ora che vale 0 e HVSP che vale 1, quindi è proprio questo comando, che peraltro non conosco e non trovo che fa questa cosa, quindi presumo che funzioni tutto, continuo con le prove

Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 09, 2012, 07:10 pm

INFATTI: se trasformo enum modelist { HVSP, HVPP, HVP13 }; in enum modelist { HVPP, HVSP, HVP13 }; è HVPP ora che vale 0 e HVSP che vale 1, quindi è proprio questo comando, che peraltro non conosco e non trovo che fa questa cosa, quindi presumo che funzioni tutto, continuo con le prove


Ma perché sei andata ad usare una enum invece delle #define ?
La enum assegna un valore numerico,a salire, per ogni nome inserito l'elenco.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 09, 2012, 07:20 pm


INFATTI: se trasformo enum modelist { HVSP, HVPP, HVP13 }; in enum modelist { HVPP, HVSP, HVP13 }; è HVPP ora che vale 0 e HVSP che vale 1, quindi è proprio questo comando, che peraltro non conosco e non trovo che fa questa cosa, quindi presumo che funzioni tutto, continuo con le prove


Ma perché sei andata ad usare una enum invece delle #define ?
La enum assegna un valore numerico,a salire, per ogni nome inserito l'elenco.

maschietto garantito :smiley-mr-green:
è un comando che ho "ereditato" e che ora ho capito XD infatti nelle "if" i tre valori sono usati senza " " come dovrei fare se fossero testi; in pratica se faccio sparire quel comando lascio "byte mode" come definizione e di volta in volta gli attribuisco il valore che mi serve:
mode = "HVPP" per poi fare if mode == "HVPP"
giusto? ma a questo punto mi torna comoda questa cosa; nella seriale )che non so nemmeno se poi mostrerò questi valori di flags), al più metto un "if mode=0 s.p("HVSP") e sono a posto lo stesso, no?
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 10, 2012, 08:59 am
Buongiorno, tutti i problemi precedenti sono risolti, ma ogni gradino è una tragedia :smiley-sweat: :smiley-sweat:
Problemi a trasferire pezzi di codice in funzioni/routine.
Dopo questa riga:
for(i=0;i<20;i++) modello = atmel[indice] ;
io mi ritrovo una variabile che chiamo solo "modello" che contiene il nome del micro
che visualizzo con
Serial.println(modello); (ovviamente preceduto da begin…)

se creo una
void data_display(void){
Serial.println(modello); (ovviamente preceduto da begin…)
}
E la richiamo con
data_display();

il campo mi resta vuoto; non posso dichiarare questa variabile come globale perché si riempie di sporcizia; come faccio a portarla nella void? Ho usato una void in quanto devo solo visualizzare valori e non deve restituirmi nulla.
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 10, 2012, 09:07 am
ma il datadisplay cosa ritorna?
e perchè non
void data_display()
?
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 10, 2012, 09:15 am

ma il datadisplay cosa ritorna?
e perchè non
void data_display()
?

Ciao BB, con l'occasione spiegami la differenza tra "void name()" e "void name(void)" perché sto lavorando con alcuni pezzi di codice ereditati, quindi alcune cose non mi sono chiare per niente.
comunque anche togliendo il void tra le ( ) il risultato è modello = vuoto, o meglio un quadratino, che indica comunque un carattere.

EDIT: ho risolto, mettendo la dichiarazione della variabile nelle globali, stranamente non escono più quei caratteri strani, probabilmente giorni fa, quando mi diede il problema, lasciavo aperta la seriale da qualche parte; comuqnue ora testo meglio.
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 10, 2012, 09:30 am
sicuramente astro mi correggerà, ma ci provo  :. , con "void name()" dichiari una funzione che non ritorna alcun valore (tranne quello passabile dal "return") e non si aspetta nessun parametro in entrata con "void name(void)" dovrebbe essere un pò la stessa cosa.
per riassumere:
"tipo di dato ritornato inuscita" "nome funzione" (lista e tipi di parametri in entrata)
void=vuoto/nullo
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 10, 2012, 09:31 am

il campo mi resta vuoto; non posso dichiarare questa variabile come globale perché si riempie di sporcizia; come faccio a portarla nella void? Ho usato una void in quanto devo solo visualizzare valori e non deve restituirmi nulla.


Qui tocca fare un vero e proprio corso di programmazione in C  :smiley-mr-green:
Se non dichiari "char modello[20]" come variabile globale non puoi vederla all'interno delle altre funzioni, i casi sono due o è una variabile globale, e non esiste che si sporca se non ci scrivi sopra, oppure la passi alla funzione sotto forma di puntatore.
Personalmente preferisco sempre l'uso di variabili globali di servizio, cioè la stessa variabile può essere usata per diverse cose, piuttosto che passare puntatori e valori perché a livello assembly il tutto è molto più efficiente dato che l'accesso è diretto alle relative locazioni di memoria, ovviamente non sempre è possibile usare solo variabili globali, ma questo non è il tuo caso.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 10, 2012, 09:36 am

(tranne quello passabile dal "return")


Se dichiari una funzione come void non ritorna nulla, il return lo puoi usare solo come comando di uscita anticipata, p.e. dopo un confronto, ma non puoi abbinargli nessun valore.
Solo se dichiari la funzione con un ben definito tipo di dato, p.e. int pippo(), con la return ritorni un valore intero, da notare che è possibile ritornare un solo valore, cioè non puoi scrivere una cosa del genere " return A,B;", nel caso servono più valori è indispensabile usare un puntatore ad un array che li contiene.
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Mar 10, 2012, 09:36 am

Dopo questa riga:
for(i=0;i<20;i++) modello = atmel[indice] ;
io mi ritrovo una variabile che chiamo solo "modello" che contiene il nome del micro
che visualizzo con
Serial.println(modello); (ovviamente preceduto da begin…)

se creo una
void data_display(void){
Serial.println(modello); (ovviamente preceduto da begin…)
}
E la richiamo con
data_display();

il campo mi resta vuoto; non posso dichiarare questa variabile come globale perché si riempie di sporcizia; come faccio a portarla nella void? Ho usato una void in quanto devo solo visualizzare valori e non deve restituirmi nulla.


Alla funzione data_display devi passare il parametro modello per la Serial.printnl(modello) cioè
void data_display(tipo_di_dato modello) dove con tipo_di_dato indichi che tipo di parametro è (int, char, byte dipende da come hai dichiarato modello).

Ciao
QP

EDIT: non è obbligatorio che il parametro si chiami modello puoi anche chiamarlo dataout e la funzione diventa
Code: [Select]
void data_display(tipo_di_dato dataout){
Serial.println(dataout);
}

Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 10, 2012, 09:41 am
grazie astrobeed, era un pò quello che volevo dire io, anche se avevo dimenticato di mettere in quale caso return ritorna un valore :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 10, 2012, 10:29 am
Grazie a tutti, in realtà, come scritto nell'EDIT del mio post precedente, alla fine avevo risolto dichiarandola come variabile globale, la "sporcizia" penso dipendesse dalla seriale aperta, devo farvi presente che i due pin di comunicazione seriale sono anch'essi coinvolti nelle operazioni di read/write della programmazione, quindi devo stare attentissimo a usarli per la comunicazione SOLO quando NON sono in programmazione.
Con queste ultime operazioni, grazie al vostro prezioso aiuto, ho completato la parte di identificazione automatica del micro e di visualizzazione di tutte le sue caratteristiche, quindi ora mi basta inserire un micro nel suo zoccolo, premere un pulsante e istantaneamente esce la maschera che vi posto, figo no? almeno per me che con l'occasione sto muovendo i primi passi nella programmazione e nello studio serio dei datasheet. XD
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Mar 10, 2012, 10:59 am
COM75 ??
ci lavori parecchiocon le seriali  :)

cmq bravo per i risultati in cosi' breve tempo
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 10, 2012, 11:10 am

la "sporcizia" penso dipendesse dalla seriale aperta, devo farvi presente che i due pin di comunicazione seriale sono anch'essi coinvolti nelle operazioni di read/write della programmazione, quindi devo stare attentissimo a usarli per la comunicazione SOLO quando NON sono in programmazione.


Certamente, se usi Tx e Rx come I/O generici con un qualche flusso dati e tieni aperto il monitor seriale è normale che vedi arrivare cose strane perché l'MCP2200 qualcosa riesce a "carpire" come dato UART valido e lo trasmette verso il pc.

Quote

quindi ora mi basta inserire un micro nel suo zoccolo, premere un pulsante e istantaneamente esce la maschera che vi posto, figo no? almeno per me che con l'occasione sto muovendo i primi passi nella programmazione e nello studio serio dei datasheet. XD


Mi pare stia venendo bene, il prossimo step è una GUI dedicata  :)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 10, 2012, 11:45 am

Quote

quindi ora mi basta inserire un micro nel suo zoccolo, premere un pulsante e istantaneamente esce la maschera che vi posto, figo no? almeno per me che con l'occasione sto muovendo i primi passi nella programmazione e nello studio serio dei datasheet. XD


Mi pare stia venendo bene, il prossimo step è una GUI dedicata  :)

Sììììììììììì, buonanotte :smiley-eek-blue: perdo un giorno per ogni variabile che sposto di un cm, figuriamoci se mi metto ad imparare la programmazione delle GUI; tanto per curiosità, con che si dovrebbe fare?
ma poi considera che questa è l'opzione base del mio HW, quella che prevede il master collegato al PC; in realtà l'idea che si proporrà è l'HW completo in stand-alone, con tastiera esadecimale e display 20x4, e lì mi voglio, a far entrare tutta sta roba  :smiley-fat:
Grazie!
ci aggiorniamo a più tardi, ho appena completato la prima voce di menu (lettura dei fuse attuali), ora passo alla scrittura dei valori di default (anti-bricked), e poi alla scrittura dei valori personalizzati; a quel punto avrò finito la "pulizia" del firmware e ci incastono dentro l'operazione di ERASE che mi hai suggerito  XD
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 10, 2012, 11:51 am

programmazione delle GUI; tanto per curiosità, con che si dovrebbe fare?
(...)
ma poi considera che questa è l'opzione base del mio HW, quella che prevede il master collegato al PC; in realtà l'idea che si proporrà è l'HW completo in stand-alone, con tastiera esadecimale e display 20x4, e lì mi voglio, a far entrare tutta sta roba  :smiley-fat:

Infatti a te la GUI non serve, non è un dispositivo che dialogherà col PC ma sarà indipendente.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 10, 2012, 11:52 am

Figuriamoci se mi metto ad imparare la programmazione delle GUI; tanto per curiosità, con che si dovrebbe fare?


Con quello che ti pare, puoi usare qualunque linguaggio di programmazione per pc che ti permette di creare form con i relativi elementi.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 10, 2012, 11:57 am

Sììììììììììì, buonanotte :smiley-eek-blue: perdo un giorno per ogni variabile che sposto di un cm, figuriamoci se mi metto ad imparare la programmazione delle GUI; tanto per curiosità, con che si dovrebbe fare?


Mi è appena venuta un'idea simpatica, che ne dici di un display lcd virtuale sul pc, configurabile a piacere con varie geometrie, con il quale dialoghi tramite seriale, in modo trasparente, utilizzando gli stessi comandi della libreria LiquidCrystal ?

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 10, 2012, 12:50 pm


Sììììììììììì, buonanotte :smiley-eek-blue: perdo un giorno per ogni variabile che sposto di un cm, figuriamoci se mi metto ad imparare la programmazione delle GUI; tanto per curiosità, con che si dovrebbe fare?


Mi è appena venuta un'idea simpatica, che ne dici di un display lcd virtuale sul pc, configurabile a piacere con varie geometrie, con il quale dialoghi tramite seriale, in modo trasparente, utilizzando gli stessi comandi della libreria LiquidCrystal ?


Se fa quello che ho capito, sarebbe una manna scesa direttamente dalle alte sfere celesti; considerando la mia fatalgnuranza il micro del master in questi giorni lo avrò programmato 1000 volte; infatti ho il terrore di quando dovrò adeguare lo sketch all'LCD, anche se Leo mi ha dato delle dritte eccellenti so già che dovrò fare altre migliaia di programmazioni, ma mentre ora invio lo sketch e basta, poi mi toccherà ogni volta scollegare i due dispositivi e programmarli singolarmente :smiley-sweat: :smiley-sweat:
Invece questo LCD virtuale mi darebbe un duplice immenso vantaggio: quello di poter risolvere il problema (o almeno quello delle impostazioni video) senza usare inizialmente l'altra scheda, mi basterebbe poi scrivere solo il firmware per il display vero e sarei a posto; inoltre avrei la "stessa" interfaccia sia per la modalità PC che per quella stand-alone. Sarebbe bellissimo XD ma come si tramuta l'idea in realtà? :D

@ Leo: a proposito, ormai ci siamo quasi  ;) quindi dovremo dare una "ripassata" alle nozioni sul colloquio micro-master<->micro-lcd; ho conservato un mezzo sketch, ma non mi ricordo più una beneamata :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 10, 2012, 01:08 pm

@ Leo: a proposito, ormai ci siamo quasi  ;) quindi dovremo dare una "ripassata" alle nozioni sul colloquio micro-master<->micro-lcd; ho conservato un mezzo sketch, ma non mi ricordo più una beneamata :smiley-mr-green:

"Protocollo" è la parola magica  ;)
Sono a tua disposizione  XD
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 10, 2012, 01:32 pm


@ Leo: a proposito, ormai ci siamo quasi  ;) quindi dovremo dare una "ripassata" alle nozioni sul colloquio micro-master<->micro-lcd; ho conservato un mezzo sketch, ma non mi ricordo più una beneamata :smiley-mr-green:

"Protocollo" è la parola magica  ;)
Sono a tua disposizione  XD

Ah, pensavo fosse "SIN SALAMIN" :P

Intanto che Astro mi spiega meglio questa sua bella idea continuo a sistemare il firmware, ci fosse un passaggio che non mi fa buttare sudori :smiley-sweat:
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 10, 2012, 01:39 pm

Sarebbe bellissimo XD ma come si tramuta l'idea in realtà? :D


Ci vuole un santo, indovina quale  :) , che realizza la parte pc e la libreria per Arduino.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 10, 2012, 02:01 pm

COM75 ??
ci lavori parecchiocon le seriali  :)
cmq bravo per i risultati in cosi' breve tempo

Scusa non avevo visto prima :smiley-red: in realtà sto pc appena gli avvicini qualcosa si eccita e crea una seriale, non so che czz succederà quando arriva a 128, perché poi nelle periferiche 2-3 ne vedo mica 75! Grazie per i complimenti, considerando che ho nozioni di programmazione ferme a GWBASIC, con ripresa su VB ma per complemento ad Access, effettivamente con la scusa sto imparando molte cose. Ma la verità è che sono stato agevolato dal fatto che sono partito da uno sketch originale da cui ho potuto tirare fuori diverse routine bell'e pronte, invece l'organizzazione faceva schifo, e questo mi ha consentito di metterci mano pesantemente per tirare fuori qualcosa di molto bello; naturalmente considerando la grossissima mano che mi stanno dando Astro e Leo. XD
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 10, 2012, 02:04 pm


Sarebbe bellissimo XD ma come si tramuta l'idea in realtà? :D


Ci vuole un santo, indovina quale  :) , che realizza la parte pc e la libreria per Arduino.


Sant'Astro dei Cieli XD XD XD davvero lo faresti? sarebbe davvero fantastico XD ovviamente tutti i test li farei io e finché non sarà pronto io mi completo il firmware "standard". Fammi sapere se ti ci metti sul serio XD
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 10, 2012, 02:07 pm

Sant'Astro dei Cieli XD XD XD davvero lo faresti?


Ho già iniziato, tra non molto le prime preview  :)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 10, 2012, 02:29 pm


Sant'Astro dei Cieli XD XD XD davvero lo faresti?


Ho già iniziato, tra non molto le prime preview  :)

azz allora finisci sicuro prima di me, qui ogni passo è una tragedia =(
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 10, 2012, 02:32 pm

azz allora finisci sicuro prima di me, qui ogni passo è una tragedia =(


Ecco la prima preview  :)

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 10, 2012, 02:55 pm
Ma daaaai è bellissimo XD azz, certo che sono proprio pochi 20x4, visto che avevo ragione a pensare di dovermi "esercitare"?

Intanto vado avanti...... Ecco il prossimo problema:
Quote

  Serial.begin(BAUD);
  Serial.println("Scegli l'operazione:");
  Serial.println("0: FINE");
  Serial.println("1: Lettura fuse");
  Serial.println("2: Ripristino fuse default");
  Serial.println("3: Scrittura fuse personali");
  Serial.println("4: Erase micro");
   while(response == NULL) {
      
      while (Serial.available() == 0);   // aspetta un carattere
      response = Serial.read();  // legge la risposta dell'utente
      Serial.end();  // chiude la seriale altrimenti crea problemi nelle letture/scritture dei fuse
      
      switch(response) { 
      case '0':  //fine operazione
        Serial.begin(BAUD);


Allo stato attuale eseguo una qualsiasi voce (in realtà per ora solo 0-1-2) e poi termino il programma, a regime mi richiederà di inserire un micro e avviare la procedura.
Ma mi sono reso conto che in alcuni casi potrebbe tornarmi molto utile rieseguire questo menu dopo aver fatto una scelta; p.es. scelgo di leggere i fuse attuali (voce di menu 1) e poi, una volta visti, decido di programmarli (voce 2) o di uscire (voce 0).
Si può fare qualcosa?
Ho pensato di metterlo in una routine ma poi dovrei fare un menu per accedere al menu?
:smiley-eek-blue:
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 10, 2012, 03:00 pm

@menni
se vuoi ti faccio il porting su linux, con interfaccia testuale, cosi' viene un tool moto hackerso e ci regalano anche adesivi geek =P

legacy, parla italiano corrente, non ho capito una mazza di ciò che mi stai gentilmente proponendo :smiley-red:
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Mar 10, 2012, 03:27 pm
credo che la poposta si riferisca al lavoro di Astro, il che include una bella faccia tosta

il caro legacy flameman non si smentisce mai
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Mar 10, 2012, 04:14 pm
io scrivo ai moderatori lettere per bannare gli utenti che ritengo giusto bannare, semplice e lineare 
non mi serve girare attorno alle cose come e' tua abitudine

che e' sta storia del supporto per linux di uno sketch arduinico ?
lo sketch di menny funzionera' su arduino ide per linux x windows x chi vuoi tu, non serve nessun tuo intervento
Title: Re: Topic permanente di programmazione newbie
Post by: igor99480 on Mar 10, 2012, 04:33 pm


azz allora finisci sicuro prima di me, qui ogni passo è una tragedia =(


Ecco la prima preview  :)




Ciao Astro, ma il prog l'hai fatto tu? come funziona? arduino controlla le matrici come se fosse un lcd reale? avevo già intenzione di farlo...
Title: Re: Topic permanente di programmazione newbie
Post by: ratto93 on Mar 10, 2012, 04:41 pm
@Testato, ora mi conosci in quanto scrivo sul forum da un pezzo e non mi pare di aver mai dato inutili noie a nessuno.
detto questo non voglio prendere le difese di nessuno ma stavolta Legacy che bene o male è sempre stato contestato ha proposto di fare un lavoro che potrebbe venire utile all'intera comunità di smanettoni quali siamo noi, non ha senso vivere in questo clima, se vi siete rimbeccati in altri ambiti amen, ha proposto una cosa che ritengo utile, non bocciargliela a priori.
Detto questo, mi metto nei panni del moderatore al posto del Prof. se avete qualche questione risolvetela in privato senza portare via spazio all'interessante topic  :)
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 10, 2012, 05:48 pm
Prima release effettiva del programma, molto in beta e con ancora molte cose da sistemare, giusto per capire di cosa stiamo parlando e avere le prime impressioni e commenti sull'interfaccia.
L'eseguibile lo scaricate qui (http://www.roboteck.it/doc/Vdisp_v0.9beta.rar), non necessità di installazione e non richiede nessuna dipendenza esterna quali runtime, dll, active X, framework vari, a me piace scrivere il software in modo che sia il meno invasivo possibile  :)
Facendo riferimento all'immagine allegat:
Sulla schermata oltre alle righe del display c'è un check box che permette di attivare/disattivare la ricezione sulla seriale, con relativo reset di Arduino quando si apre la Vcom, un campo di selezione della porta com, all'avvio il programma cerca automaticamente tutte le seriali presenti, un tasto CFG che apre il box di configurazione della seriale, quattro tasti che permettono di scegliere la geometria del display.
Una volta lanciato il programma basta scegliere la Vcom di Arduino, eventualmente settare il baud rate, scegliere la geometria del display da emulare tra i valori disponibili, 2x16, 2x20, 4x16, 4x20, attivare la seriale vistando il relativo campo per iniziare a lavorare.
Attualmente il software tutto quello che riceve dalla seriale lo mette in fila sul display senza fare nessuna distinzione e nessuna separazione, le righe attive visualizzano tutte le stessa cosa, è solo per verificare che c'è la ricezione dei dati, il prossimo step è scrivere la libreria per Arduino, con lo stesso stile della Liquid Crystal, e implementare il protocollo di dialogo tra l'emulatore e Arduino.

Title: Re: Topic permanente di programmazione newbie
Post by: igor99480 on Mar 10, 2012, 05:50 pm

Prima release effettiva del programma, molto in beta e con ancora molte cose da sistemare, giusto per capire di cosa stiamo parlando e avere le prime impressioni e commenti sull'interfaccia.
L'eseguibile lo scaricate qui (http://www.roboteck.it/doc/Vdisp_v0.9beta.rar), non necessità di installazione e non richiede nessuna dipendenza esterna quali runtime, dll, active X, framework vari, a me piace scrivere il software in modo che sia il meno invasivo possibile  :)
Facendo riferimento all'immagine allegat:
Sulla schermata oltre alle righe del display c'è un check box che permette di attivare/disattivare la ricezione sulla seriale, con relativo reset di Arduino quando si apre la Vcom, un campo di selezione della porta com, all'avvio il programma cerca automaticamente tutte le seriali presenti, un tasto CFG che apre il box di configurazione della seriale, quattro tasti che permettono di scegliere la geometria del display.
Una volta lanciato il programma basta scegliere la Vcom di Arduino, eventualmente settare il baud rate, scegliere la geometria del display da emulare tra i valori disponibili, 2x16, 2x20, 4x16, 4x20, attivare la seriale vistando il relativo campo per iniziare a lavorare.
Attualmente il software tutto quello che riceve dalla seriale lo mette in fila sul display senza fare nessuna distinzione e nessuna separazione, le righe attive visualizzano tutte le stessa cosa, è solo per verificare che c'è la ricezione dei dati, il prossimo step è scrivere la libreria per Arduino, con lo stesso stile della Liquid Crystal, e implementare il protocollo di dialogo tra l'emulatore e Arduino.




Genialeeee!! ma il sorgente si puo avere?

EDIT: mi sa che c'è un errore, non trova il riferimento alla libreria BORLNDMM.dll
EDIT2: ok servono piu di qualche libreria per farlo funzionare
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 10, 2012, 05:54 pm

Ciao Astro, ma il prog l'hai fatto tu? come funziona? arduino controlla le matrici come se fosse un lcd reale? avevo già intenzione di farlo...


Ovviamente la sto scrivendo io  :)
L'idea è di avere su Arduino una libreria aggiuntiva che implementa le stesse funzioni della liquidcrystal, cambierà solo il nome principale, che ti permette di visualizzare sul pc quello che normalmente mandi al display senza averlo fisicamente, ovvero un display virtuale che può far comodo sia in fase di sviluppo del software per verificare il funzionamento che come semplice GUI universale nei limiti imposti da un piccolo LCD da un massimo di 4 righe da 20 caratteri.
Non escludo di ampliarla in futuro con altre geometrie, p.e. 2x40 e 4x40, e altre funzionalità, dipende molto dall'interesse che ci sarà attorno, una volta pronta la versione 1.0 definitiva aprirò un topic dedicato.
Title: Re: Topic permanente di programmazione newbie
Post by: igor99480 on Mar 10, 2012, 06:01 pm


Ciao Astro, ma il prog l'hai fatto tu? come funziona? arduino controlla le matrici come se fosse un lcd reale? avevo già intenzione di farlo...


Ovviamente la sto scrivendo io  :)
L'idea è di avere su Arduino una libreria aggiuntiva che implementa le stesse funzioni della liquidcrystal, cambierà solo il nome principale, che ti permette di visualizzare sul pc quello che normalmente mandi al display senza averlo fisicamente, ovvero un display virtuale che può far comodo sia in fase di sviluppo del software per verificare il funzionamento che come semplice GUI universale nei limiti imposti da un piccolo LCD da un massimo di 4 righe da 20 caratteri.
Non escludo di ampliarla in futuro con altre geometrie, p.e. 2x40 e 4x40, e altre funzionalità, dipende molto dall'interesse che ci sarà attorno, una volta pronta la versione 1.0 definitiva aprirò un topic dedicato.



:smiley-mr-green: una bellissima idea...
comunque per avviarlo ho dovuto scaricare 2 librerie: CC3260MT.DLL e borlndmm.dll
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 10, 2012, 06:06 pm

EDIT: mi sa che c'è un errore, non trova il riferimento alla libreria BORLNDMM.dll
EDIT2: ok servono piu di qualche libreria per farlo funzionare


Colpa della fretta  :)
Ho compilato in modalità debug e quelle librerie non vengono incluse automaticamente nel sorgente, cinque minuti e aggiorno il file scaricabile in versione release.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 10, 2012, 06:09 pm
Aggiornato l'eseguibile, ora gira senza problemi senza nessuna dll aggiuntiva.
Title: Re: Topic permanente di programmazione newbie
Post by: igor99480 on Mar 10, 2012, 06:23 pm

Aggiornato l'eseguibile, ora gira senza problemi senza nessuna dll aggiuntiva.


ok grazie :D
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 10, 2012, 06:29 pm

Genialeeee!! ma il sorgente si puo avere?


Della libreria per Arduino ovviamente si, idem per la parte PC, lo rilascerò solo a lavoro finito, però è sviluppato in C++ tramite Cbuilder Borland versione professional, è il compilatore che uso per lavoro, senza quello e tutte le sue librerie non è possibile ricompilarlo.
Ulteriore dettaglio per quanto riguarda il lato Arduino, la nuova libreria, che sto scrivendo, si chiama vLcd e qualunque programma scritto per usare la liquidcrsytal potrà utilizzare questo display virtuale su pc senza modificare una sola riga, basterà cambiare l'nizializzazione tipica da:

Code: [Select]

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
 // set up the LCD's number of columns and rows:
 lcd.begin(16,2);



In:

Code: [Select]

#include <vLcd.h>

// initialize the library.
vLcd lcd()

void setup() {
 // set up the LCD's number of columns and rows:
 lcd.begin(16,2);

Title: Re: Topic permanente di programmazione newbie
Post by: igor99480 on Mar 10, 2012, 06:48 pm
beh allora aspetto con ansia il lavoro finito  :smiley-mr-green: :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 10, 2012, 07:27 pm

@Testato, ora mi conosci in quanto scrivo sul forum da un pezzo e non mi pare di aver mai dato inutili noie a nessuno.
detto questo non voglio prendere le difese di nessuno ma stavolta Legacy che bene o male è sempre stato contestato ha proposto di fare un lavoro che potrebbe venire utile all'intera comunità di smanettoni quali siamo noi, non ha senso vivere in questo clima, se vi siete rimbeccati in altri ambiti amen, ha proposto una cosa che ritengo utile, non bocciargliela a priori.
Detto questo, mi metto nei panni del moderatore al posto del Prof. se avete qualche questione risolvetela in privato senza portare via spazio all'interessante topic  :)

Guarda, io non ho capito questa storia del porting su linux perché il firmware si carica sul micro e da PC, linux o Windows che sia, basta un qualsiasi programma di emulazione terminale, nemmeno il serial monitor.
Detto questo inoltro la preghiera a tutti di chiudere qui e non intervenire sugli interventi di altri, accettabili o meno che siano; ho aperto questo Topic per imparare e per chi volesse imparare, quindi smettetela gentilmente; Vi chiedo PER FAVORE di eliminare TUTTI gli interventi che non sono propositivi sul tema del Topic, attacchi o difese che siano o chiedo ad Uwe di farlo lui, e se non lo fa lui lo faccio io bloccando il Topic e buonanotte. E vi prego anche di non commentare il mio commento né per darmi ragione né per darmi torto. Grazie.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 10, 2012, 07:30 pm

beh allora aspetto con ansia il lavoro finito  :smiley-mr-green: :smiley-mr-green:


Per completarlo al 100% ci vorrà un pochino di tempo, non credo prima della fine della prossima settimana, però già domani dovrei avere la prima beta release della libreria per Arduino anche se con funzionalità minimali.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 10, 2012, 07:51 pm


beh allora aspetto con ansia il lavoro finito  :smiley-mr-green: :smiley-mr-green:


Per completarlo al 100% ci vorrà un pochino di tempo, non credo prima della fine della prossima settimana, però già domani dovrei avere la prima beta release della libreria per Arduino anche se con funzionalità minimali.


Astro, sei un grande e lo dico da tempi NON sospetti ;)
Sto continuando col mio lavoro spero entro domani di portarlo a termine; mi serve aiuto su una cosa che ho chiesto qualche post fa prima che iniziasse una delle solite ridicole polemiche a cui sono costretto ad assistere spesso sul Forum, e che spero sia definitivamente chiusa; se la recuperi, ma vale per tutti, mi farebbe piacere trovare una soluzione.
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Mar 10, 2012, 08:15 pm
astro sto' facendo dei test su un 8x2 i2c.
insieme all'autore della libreria liquidcristal i2c stiamo adattando un nuovo controller.

visto che la liquidcristal i2c e' compatibile con i comandi della liquidcristal originale, si puo' usare questo tuo vlcd con i2c ?

e' difficile aggiungerci la geometria 2x8

grazie, sei sempre il piu' grande  :)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 10, 2012, 08:49 pm

astro sto' facendo dei test su un 8x2 i2c.
insieme all'autore della libreria liquidcristal i2c stiamo adattando un nuovo controller.

visto che la liquidcristal i2c e' compatibile con i comandi della liquidcristal originale, si puo' usare questo tuo vlcd con i2c ?

e' difficile aggiungerci la geometria 2x8

grazie, sei sempre il piu' grande  :)

Test, se è quello del polacco tienimi aggiornato, ne ho preso uno tempo fa per usi futuri, ma quando sarà non saprei come usarlo.
Grazie.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 10, 2012, 09:05 pm

visto che la liquidcristal i2c e' compatibile con i comandi della liquidcristal originale, si puo' usare questo tuo vlcd con i2c ?


Se usa gli stessi metodi  della liquidcrystal alla fine non cambia nulla a parte l'include e il setup.

Quote

e' difficile aggiungerci la geometria 2x8


No, consideralo già fatto.
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Mar 10, 2012, 09:56 pm
ottimo,

x menny, yes proprio quello

riesco a scrivere gia' sul lcd in modo diretto, senza librerie, ho spedito il tutto all'autore della libreria i2c e gli interessa aggiungere il supporto. attualmente non c'e' nulla di arduinistico per quel controller. sul playgroud c'e' una libreria che dice "dovrebbe essere compatibile", l'ho testata e non lo e', ho aggiornato della cosa l'autore ma lui non e' interessato per ora a modifiche, poi fortunatamente ho trovato disponibilita' nell'altro programatore, quello della i2c.

logicamente sara' tutto open, sto' preparando anche un po' di documentazione perche' su quel coso non si trova nulla.

se ti serve in anticipo qualche dritta sono comunque a disposizione
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 11, 2012, 12:46 am
No, grazie, per ora ho il problema opposto. Bene, buone notizie  XD
Il firmware è terminato, sono molto soddisfatto, non ho risolto la questione del menu "rieseguibile" ma visto che nessuno mi ha dato risposta, pazienza.
Ora faccio qualche prova con l'AstroDisplay :smiley-mr-green: poi a nanna.
Domani ultimo passaggio: implementazione della funzione "ERASE" per la cancellazione totale del micro.
Poi finalmente inizio l'articolo XD
A domani ;)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 11, 2012, 01:06 am
@ Astro: test sul Virtual  LCD Display:
il campo di attivazione non ha alcun effetto sull'MCP2200, devo resettare manualmente il 328P
Appena parte vedo su ogni riga uno 0, le scritte scorrono velocissimamente ma poi ritornano tutt'e quattro a 0 (o 8 non capisco bene)
Manca un campo per inviare i comandi, p.es. quando devo scrivere i valori dei fuse o scegliere una voce da menu, mi serve, almeno nel primo caso la possibilità di editare (p.es. se sbaglio carattere del fuse).
Si possono implementare queste cose? Ma forse snaturano il progetto, allora dovrei vedere ciò che scrivo nelle 4 righe, non posso editare al buio, mi sa che devo fare un po' di prove col display vero, se no va a finire che dico stronzate. A domani. :)
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Mar 11, 2012, 01:46 am
scusa ma il vlcd si comporta come un lcd vero e basta. Cioe se devi scrivere qualcosa avrai una tastiera o un tastierino sul progetto vero. Se devi selezionare un campo avrai un pulsante vero sul progetto.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 11, 2012, 07:35 am

@ Astro: test sul Virtual  LCD Display:
il campo di attivazione non ha alcun effetto sull'MCP2200, devo resettare manualmente il 328P


In effetti il software è pensato per attivare esplicitamente DTR, devo aggiungere pure RTS.

Quote

Appena parte vedo su ogni riga uno 0, le scritte scorrono velocissimamente ma poi ritornano tutt'e quattro a 0 (o 8 non capisco bene)
Manca un campo per inviare i comandi, p.es. quando devo scrivere i valori dei fuse o scegliere una voce da menu, mi serve, almeno nel primo caso la possibilità di editare (p.es. se sbaglio carattere del fuse).


Non è che manca un comando, mancano tutti i comandi allo stato attuale  :)
Senza la libreria vLcd,che è in fase di scrittura, il programma si limita a visualizzare tutto quello che arriva sulla seriale su tutte quattro le righe.
Eppure ero stato molto chiaro sul fatto che deve essere utilizzato abbinato alla libreria vLcd che emula al 100% la liquidcrystal e permette di utilizzare un programma scritto per andare su un  display lcd senza modificare nemmeno una riga salvo l'include della libreria e quella per l'inizializzazione.
In pratica non dovrai mandare nulla sulla seriale, ci pensa la libreria utilizzando un apposito protocollo, dovrai solo scrivere sul display.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 11, 2012, 08:19 am
Sì, hai perfettamente ragione, concedimi il beneficio delle attenuanti specifiche, ieri praticamente sono stato dalle 7 di mattina ad oltre mezzanotte su quel benedetto firmware :smiley-sweat: in compenso l'ho finito; oggi cerco di introdurre l'erase e così avrò finito la prima parte e posso iniziare a buttare giù l'articolo. L'RTS ovviamente avrà una sua buona utilità su vLCD.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 11, 2012, 08:29 am

Sì, hai perfettamente ragione, concedimi il beneficio delle attenuanti specifiche,


:D

Quote

ieri praticamente sono stato dalle 7 di mattina ad oltre mezzanotte su quel benedetto firmware :smiley-sweat: in compenso l'ho finito; oggi cerco di introdurre l'erase e così avrò finito la prima parte e posso iniziare a buttare giù l'articolo. L'RTS ovviamente avrà una sua buona utilità su vLCD.


Ottimo, in tarda mattinata arriva la versione del software per PC con il supporto della geometria 8x2 e l'attivazione del RTS, nel pomeriggio la release, molto alpha, 0.1 della libreria, avrà solo un paio di funzioni di base attive, giusto per fare le prime prove, e tutte le altre già definite ma inattive.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 11, 2012, 08:39 am

Intanto vado avanti...... Ecco il prossimo problema:

-- cut --

Ho pensato di metterlo in una routine ma poi dovrei fare un menu per accedere al menu?


Il menù dovrebbe essere sempre una funzione, e i sottomenù altre funzioni, in modo che li puoi richiamare quando ti pare.
Per fare le cose fatte bene la prima cosa da inviare è la sequenza di caratteri che cancella lo schermo del terminale, e qui scatta il problema perché a seconda del tipo di emulazione cambia cosa inviare, tocca scoprire se il serial monitor prevede un comando di erase, p.e. con Hyperterminal di windows per cancellare lo schermo va inviato prima 0x27, è l'escape, e poi i caratteri "[2J" .

Title: Re: Topic permanente di programmazione newbie
Post by: amario57 on Mar 11, 2012, 08:53 am
Bravo Astro, appena pubblichi faccio alcune prove di test se vuoi.
Menni, ero anch'io nelle tue condizioni, programmavo anch'io , fino a dieci anni fa, con i linguaggi che hai citato, ma adesso mi è tornata la voglia e piano piano sto reimparando con IDE Arduino e Processing.
Non mollare ...., sono in attesa della tua "opera"   :smiley-eek:
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 11, 2012, 09:26 am
Aggiornato il software per pc, scaricabile qui (http://www.roboteck.it/doc/Vdisp_v0.9.1.beta.rar), con due nuove geometrie, 2x8 e 2x40 (rara ma esiste), e il controllo forzato di RTS, questo serve solo a Michele per il momento, l'ho verificato sia su una com hardware reale che su un FTDI e un MCP2200.
Da notare che il reset di Arduino quando si apre una comunicazione seriale io l'ho sempre ritenuto più una scocciatura, anzi un bug dovuto a come funziona l'autoreset, piuttosto che una cosa utile, infatti sto valutando se inserire un comando per disattivare il reset.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 11, 2012, 09:28 am

appena pubblichi faccio alcune prove di test se vuoi.


Certamente, quando si sviluppa del software i beta tester non bastano mai, è grazie a loro che si trovano tutti i bug e si riesce a migliorare il prodotto  :)
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 11, 2012, 09:30 am
@astro perchè per la cancellazione non fai una funzioncina che scrive tanti spazi quanta la geometria del display, così aggiri il problema della specificità
(soluzione porchereccia alla BB :D )
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 11, 2012, 09:38 am

@astro perchè per la cancellazione non fai una funzioncina che scrive tanti spazi quanta la geometria del display, così aggiri il problema della specificità


Mi sta che stiamo facendo confusione tra il serial monitor e il display lcd, reale o virtuale che sia, attualmente Michele manda un menù sul serial monitor e ha alcuni problemi di gestione, ed è per questa cosa che gli ho consigliato di cancellarlo prima di inviare un nuovo menù, è da verificare se è possibile farlo perché il serial monitore non è una vera emulazione terminale.
Per quanto riguarda il display LCD già esiste un apposito comando per cancellarlo, "lcd.clear()".
Per vedere tutti i comandi e le funzionalità previste per i display LCD dalla liquidcrystal fate riferimento al suo reference (http://arduino.cc/en/Reference/LiquidCrystal?from=Tutorial.LCDLibrary), la libreria vLcd avrà gli stessi comandi e funzionerà allo stesso modo con la differenza che il display è virtuale sullo schermo del pc e l'impegno della seriale hardware, solo Tx, quindi volendo è possibile usare Rx per ricevere da un device esterno, per inviare i vari comandi tramite USB.
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 11, 2012, 09:44 am
Pensavo fosse riferito all'lcd reale.. sorry :)
edit: menniti ma  usi un lcd seriale vero? o ricordo male
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 11, 2012, 09:58 am

edit: menniti ma  usi un lcd seriale vero? o ricordo male


Mi sa tanto di si perché ha tutti i pin impegnati, infatti il suo è un caso particolare e come gestire il display reale dipende molto dal produttore/modello, non esiste uno standard ben definito.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 11, 2012, 10:14 am
Piccolo aggiornamento, nel pomeriggio metto online la versione 0.2 beta della libreria vLcd, per il momento sono supportati i seguenti comandi:

lcd.clear();
lcd.setCursor(colonna, riga);
lcd.print(*stringa);

lcd.clear() esegue un erase di tutte le righe del display.
lcd.setCursor(colonna, riga) sposta il cursore alla posizione desiderata intesa come numero colonna (0-39) e riga (0-3).
lcd.print(*stringa) visualizza a partire dall'attuale posizione del cursore un array di caratteri (stringa) passato come puntatore.

Il nome lcd. dipende solo da come viene inizializzato il display, esempio pratico di utilizzo in base all'esempio hello world della liquidcrystal.

Code: [Select]

// include the library code:
#include <vLcd.h>

// initialize the library
vLcd lcd();  // non serve indicare i pin collegati al display

stringa[20] = "Hello world 2";

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(20, 2); // inizializza la libreria, inclusa la seriale, e la geometria del display

  lcd.clear(); // erase lcd
  lcd.setCursor(0,0); // posiziona il cursore sulla prima riga colonna 0
  lcd.print("hello, world!"); // scrive hello world sul display
  lcd.setCursor(0, 1); // posiziona il cursore sulla seconda riga colonna 0
  lcd.print(stringa); // scrive "hello world 2" sul display
}

void loop()
{
 
}

Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 11, 2012, 10:19 am
in effetti, lato hw sono belli semplici da iplementare, ma io ne ho trovati alcuni con una sintassi assurda (vedi flamingo eda e simili) che dal lato sw incasinano un pò la vita.
complimenti per il lavoro astro, sono curioso di vedere il prodotto finale :)
a quando il vKeypad?  :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: amario57 on Mar 11, 2012, 10:28 am
Ottimo lavoro Astro, cosa dici Brain dell'utilizzo anche come strumento didattico ??
Attendo con "trepidazione" la libreria   :smiley-eek:
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 11, 2012, 10:29 am

in effetti, lato hw sono belli semplici da iplementare, ma io ne ho trovati alcuni con una sintassi assurda (vedi flamingo eda e simili) che dal lato sw incasinano un pò la vita.


Vero, ne so qualcosa perché ho realizzato questo (http://www.robot-italy.com/product_info.php?products_id=1580) display seriale, multinterfaccia con varie funzioni aggiuntive, abbiamo scelto di renderlo compatibile con il set di comandi di Matrix Orbital, sono i più diffusi, e non è stata una passeggiata  :)

video dimostrativo delle capacità della MuInLcd abbinata ad Arduino:
http://www.youtube.com/watch?v=VSnmYT3F2jI (http://www.youtube.com/watch?v=VSnmYT3F2jI)

Quote

a quando il vKeypad?  :smiley-mr-green:


Magari una volta finito vLcd  :)
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 11, 2012, 10:33 am
vero, matrix orbital e crystalfontz sono quasi legge :D meglio quelli...
Bellissimo prodotto il display che hai linkato, ricomplimenti ;)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 11, 2012, 11:46 am
Rispondo a tutti per punto, sperando di non dimenticare nessuno:
@ Astro
Quote
Il menù dovrebbe essere sempre una funzione, e i sottomenù altre funzioni,

ok, ci rimettero mano dopo aver completato il firmware e messo al sicuro, anche se ho risolto facendo direttamente la lettura dei fuse, che esce sotto i valori di default; quindi in menu restano: caricamento anti-bricked, fuse personalizzati, ERASE micro; e dopo ogni operazione obbligo a togliere il micro resettare la board per riavviare. Una complicazione mi è data dal fatto che se avvio la seriale con un micro inserito mi esce bordello, quindi inutile ammazzarmi ad eseguire più comandi
Quote
Hyperterminal di windows per cancellare lo schermo va inviato prima 0x27, è l'escape, e poi i caratteri "[2J"

Spiegami come fare questa cosa, l'articolo prevede lato PC proprio l'uso di Win HyperTerminal, quindi del serial monitor non mi interessa molto.
Quote
controllo forzato di RTS, questo serve solo a Michele per il momento,

vero, e ti ringrazio, ma una volta che si diffonderà l'uso dell'MCP2200 che dopo gli ultimi test di Leo resta ormai l'unica alternativa hobbystica a FT232RL e ATmega8u2, tornerà utile a molti.
Quote
infatti sto valutando se inserire un comando per disattivare il reset.

basta che sia opzionale; nei casi come i miei il reset è indispensabile per lanciare il menu.
@amario57
Quote
Non mollare ...., sono in attesa della tua "opera"

come mollare? :smiley-eek: è un lavoro che sto facendo per Elettronica In che metterà gratuitamente a disposizione sia il firmware che i gerber dei 3 PCB, naturalmente dopo che uscirà l'articolo sulla rivista. Ci sto lavorando notte e giorno ormai :smiley-sweat: grazie per l'incitamento XD. Ti vedo parlare sempre di didattica, siamo colleghi?
@ BB
Quote
ma  usi un lcd seriale vero? o ricordo male

Nel senso stretto del termine sì, in realtà uso un altro mega328 a cui ho collegato la key esadecimale ed un comune LCD parallelo (4 bit); stanno su un PCB specifico ed il 328k&d è collegato al 328master via seriale, quindi comunico in seriale bidirezionale tra i due micro 328.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 11, 2012, 12:05 pm

Spiegami come fare questa cosa, l'articolo prevede lato PC proprio l'uso di Win HyperTerminal, quindi del serial monitor non mi interessa molto.


Se usi Hyperterminal allora la cosa è semplice, aggiungi in testa alle funzioni che visualizzano il menù questa riga:

Code: [Select]

Serial.print("\033[2J");  // erase monitor

Title: Re: Topic permanente di programmazione newbie
Post by: amario57 on Mar 11, 2012, 12:28 pm
OT
@amario57
Quote
Non mollare ...., sono in attesa della tua "opera"

come mollare? :smiley-eek: è un lavoro che sto facendo per Elettronica In che metterà gratuitamente a disposizione sia il firmware che i gerber dei 3 PCB, naturalmente dopo che uscirà l'articolo sulla rivista. Ci sto lavorando notte e giorno ormai :smiley-sweat: grazie per l'incitamento XD. Ti vedo parlare sempre di didattica, siamo colleghi?
[/quote]

In un certo senso si, sono un consulente che si occupa anche di formazione nelle scuole.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 11, 2012, 07:08 pm
Ecco la relase 1.0 beta del tutto, scaricabile qui (http://www.roboteck.it/doc/vDisp_v1.0b.rar).
All'interno del file rar c'è sia la nuova versione dell'eseguibile per pc che la libreria per Arduino, la cartella vLcd va copiata dentro la cartella delle librerie di Arduino.
Nella cartella examples della libreria c'è un semplicissimo sketch di esempio che riporto più sotto.
Alla fine ho optato per gestire tutto quanto dal programma per pc invece che da Arduino perché sarebbe stato necessario creare in ram un buffer da 80 byte per simulare la memoria interna del display, cosa assolutamente inaccettabile viste le limitate risorse del micro.
Visto quanto sopra ho abbandonato l'idea iniziale di clonare le classi della libreria liquidcrystal, anche perché sarei rimasto limitato alle sue funzionalità mentre il display virtuale può fare molto di più, e ho creato una libreria ex novo composta da una collezione di funzioni con nomi molti simili a quelli utilizzati dalla liquidicrystal, ma con il vantaggio di non essere limitato nelle espansioni future e con un impegno veramente minimo di flash e ram, solo pochi byte per quest'ultima.
Attualmente sono disponibili tre funzioni:

vLcdInit(); // inizializza la libreria e la porta seriale a 115200 bps
vLcdClear(); // cancella il display e posiziona il cursore alla prima colonna della prima riga
vLcdSetCursor(riga, colonna); // posiziona il cursore sulla riga (0-3) e colonna (0-39) desiderata

Tutto quello che viene inviato tramite la  Serial.print() viene visualizzato sul display partendo a scrivere dalla posizione corrente del cursore e andando automaticamente a capo alla fine della riga, se si supera l'ultimo carattere dell'ultima riga la scrittura riparte dalla prima posizione andando a sovrascrivere quanto già presente.
Prossimamente nuove funzioni per la libreria come la cancellazione delle singole righe, e non di tutto il display, lo scrolling per righe o per tutto il display, etc.

Code: [Select]

#include "vLcd.h"; // Libreria vLcd

void setup()
{
 vLcdInit();  // inizializza la porta seriale (115200 bps)
 vLcdClear(); // cancella display

 Serial.print("12345678901234567890");
 Serial.print("abcdefeghijklmnopqrs");
 Serial.print("prova prova prova pr");
 Serial.print("test test test");
 
 delay(1000);
 vLcdClear();
 delay(1000);
 vLcdSetCursor (2,3);  // sposta il cursore
 Serial.print("123456789012345678");
 //Serial.print("abcdefeghijklmnopqrs");
 //Serial.print("prova prova prova pr");
 //Serial.print("test test test");
}

void loop()
{

}
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 11, 2012, 07:34 pm
Beh, il lavoro è eccezionale se lo consideriamo come GUI per svariati usi, ma mi viene il dubbio che alcune delle funzioni che hai elencato non siano presenti negli LCD veri, o almeno nella libreria liquid.....
Mi riferisco p.es. al fatto che nomalmente la lib lascia intatto il comportamento della ram dell'LCD (non badare a inesattezze tecniche, cogli il succo :D) per il quale se mandi 80 caratteri, i primi 20 riempiono la prima riga, i secondi vanno a capo ma sulla terza riga, poi la seconda e quindi la quarta; io non ricordo di un autoscorrimento sulla stessa riga, mentre la canbcellazione è un discorso a parte, con la tecnica brutale descritta da BB si fa qualsiasi cosa, a prescindere dall'eleganza software.
In definitiva io adotterò il tuo software, ma poi mi sa che la cosa mi servirà poco (se i miei timori sono fondati) per lo stand-alone, dove dovrò riprogrammare tutto ex-novo in quanto le caratteristiche non sono più quelle di un virtual LCD, come doveva essere, ma di un prodotto finito a tutti gli effetti con proprie eccellenti peculiarità
Ho detto strunzate o ho ragione?
Io oggi non ho combinato nulla, la preparazione degli esami dei prox due giorni mi ha portato via un sacco di tempo, poi sono andato in lab ma solo per sistemare bene la meccanica "volante" dell'HV; inoltre dovendo ora procedere con l'erase ho recuperato un Arduino e il programmatore ISP, altrimenti come faccio a sapere se ho davvero cancellato tutto o se mi sto perndendo per il c da solo, come un deficiente :smiley-sad-blue:? A dopo.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 11, 2012, 07:43 pm

Mi riferisco p.es. al fatto che nomalmente la lib lascia intatto il comportamento della ram dell'LCD (non badare a inesattezze tecniche, cogli il succo :D) per il quale se mandi 80 caratteri, i primi 20 riempiono la prima riga, i secondi vanno a capo ma sulla terza riga, poi la seconda e quindi la quarta;


Quello che fai fare al display dipende solo dal software che lo controlla e non dal display stesso, comunque anche la liquidcrystal ha funzioni per lo scroll delle righe sia destra che a sinistra.
Se invii caratteri di seguito il vLcd continua a scrivere andando a capo in automatico, quindi se parti dalla locazione 0 dopo 80 caratteri è pieno.
Mi sono scordato di scriverlo prima, la libreria funziona sia con l'IDE 0022-0023 che con l'IDE 1.0.
Title: Re: Topic permanente di programmazione newbie
Post by: amario57 on Mar 11, 2012, 07:50 pm
Scaricata e nei prossimi giorni la testo poi riferirò.
Bel lavoro.
Non è meglio creare un topic apposito astro ?.  :smiley-roll:
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 11, 2012, 07:53 pm
Ha detto che l'avrebbe fatto con la versione 1.0 definitiva.
Per ora, visto che appena finito l'erase, sarà la mia prossima implementazione sul software, forse non conviene, ma per me è uguale, chiedere qui o altrove, basta far funzionare tutto :D
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 11, 2012, 08:09 pm

Non è meglio creare un topic apposito astro ?.  :smiley-roll:


Si, non appena ho la versione 1.0 definitiva, per il momento è ancora una beta, apro un topic dedicato, salvo imprevisti sarà tra qualche giorno con la libreria arricchita da nuove funzioni.

Title: Re: Topic permanente di programmazione newbie
Post by: testato on Mar 12, 2012, 12:50 am

logicamente sara' tutto open, sto' preparando anche un po' di documentazione perche' su quel coso non si trova nulla.

Ecco il lavoro promesso, nello zip ci sono i datasheet, lo schema di connessione e molti esempi
:)
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 12, 2012, 06:21 pm
Nuova beta release (1.0.4 beta) del display lcd virtuale scaricabile qui (http://www.roboteck.it/doc/vDisp_v1.0.4.beta.rar).
Oltre ad avere aggiunto tre nuovi comandi alla libreria, vedere sotto il dettaglio, ho rifatto il parser dei comandi rendendolo più affidabile e versatile, inoltre ora è presente il tasto reset, consente di riavviare a piacere Arduino, vengono azionati sia DTR che RTS, e il tasto info che fornisce la versione e altre informazioni.

Elenco dei comandi supportati:

vLcdInit();      // inizializza la libreria e la porta seriale (115200 bps)
vLcdClear();   // cancella il display e posizione il cursore alla prima colonna della prima riga
vLcdSetCursor (Riga, Colonna);  // posizione il cursore sulla desiderata riga e colonna.
vLcdNoDisplay(); // spegnimento del display (sia caratteri che retroilluminazione)
vLcdDisplay();     // accensione del display
vLcdHome();       // posizione il cursore alla prima colonna della prima riga, non viene cancellato il display

La prossima release sarà la 1.0 definitiva e includerà nuovi comandi.

Sketch di esempio, usa tutti i comandi, è allegato nella cartella examples della libreria.
Code: [Select]

#include "vLcd.h"; // Libreria vLcd

void setup()
{
  vLcdInit();  // inizializza la porta seriale (115200 bps)
  vLcdClear(); // cancella display

  Serial.print("12345678901234567890");
  Serial.print("abcdefeghijklmnopqrs");
  Serial.print("prova prova prova pr");
  Serial.print("test test test test");
 
  delay(1000);
  vLcdClear();
  delay(1000);
  vLcdSetCursor (1,3);  // sposta il cursore
  Serial.print("123456789012345678");
  delay(1000);
  vLcdHome();
  Serial.print("test test test test");
  delay(1000);
  vLcdNoDisplay();
  delay(1000);
  vLcdDisplay();
}

void loop()
{

}
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 12, 2012, 06:45 pm
Bene, bene, io purtroppo con gli esami sono piuttosto incasinato, infatti ancora sono in arretrato con l'erase, ma subito dopo farò un po' di test. Grazie Astro!
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 13, 2012, 10:15 am

Bene, bene, io purtroppo con gli esami sono piuttosto incasinato, infatti ancora sono in arretrato con l'erase, ma subito dopo farò un po' di test. Grazie Astro!


Ieri sera stavo riflettendo sulla possibile evoluzione del vLcd per renderlo qualcosa di più di una semplice emulazione di un LCD alfanumerico reale con tutte le relative limitazioni.
Tra i vari widget che ho a disposizione per la realizzazione di GUI, cosa che faccio spesso come complemento ai miei lavori, ne ho uno che simula un pannello lcd grafico senza limiti, salvo le dimensioni del monitor, ai pixel che lo compongono, mi consente di utilizzare vari effetti speciali come il blinking di un gruppo di caratteri e/o colorarli a piacere e altre cosette.
Una volta chiuso il discorso vLcd, e mi manca poco per farlo, vorrei usare il pannello grafico per realizzare una sorta di monitor virtuale a colori sul quale scrivere tramite Arduino utilizzando una serie di funzioni di uso immediato che consentono di posizionare a piacere scritte e dati, con tanto di caratteri speciali presenti nel font in uso, cosa non possibile con il widget per gli lcd alfanumerici, e relativi effetti speciali.
In pratica sarà una cosa con comandi simili a vLcd, ma con molte possibilità in più e senza limiti di dimensioni, p.e. sarà possibile organizzarlo come 20 righe da 40 caratteri direttamente da Arduino tramite un apposito comando, in questo modo dovrebbe diventare molto semplice realizzare GUI generiche per Arduino senza dover scrivere una sola riga di codice sul PC, cosa che a molti crea non pochi problemi.

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 13, 2012, 10:28 am
E chi ti ferma più? :D
Nel mio piccoletto ho una buona notizia ed una un pò meno, ma credo rimediabile.

Sono riuscito ad implementare la nuova routine ed ora riesco a far sparire in un istante il blink dal mio 328P :smiley-mr-green: l'ERASE funziona!!! Ora devo aggiungere il necessario per le altre modalità di programmazione.

invece mi sono accorto che in HVPP il primo fuse che leggo (ho provato ad invertirli, ecco perché sono certo) me lo restituisce in FF anche se in realtà ha un altro valore, che vedo regolarmente se resetto e rileggo; la cosa strana è che la questione è alterna, cioè ad ogni reset una volta lo legge una volta non lo legge; poiché il reset riavvia il firmware ma non cambia i valori memorizzati nel micro ho iniziato una dolorosa ricerca; per ora ho scoperto che se disabilito il comando iniziale (parto per default con la modalità HVSP) SDO=LOW (l'SDO è il RDY in modalità HVSP) il problema svanisce; ho un paio di soluzioni in mente, Vi aggiorno.
Title: Re: Topic permanente di programmazione newbie
Post by: amario57 on Mar 13, 2012, 10:43 am
Eh si, ormai astro non si ferma più, ottima idea sarebbe proprio un grosso aiuto per GUI generiche su PC e per ora fermati qui   :D
Title: Re: Topic permanente di programmazione newbie
Post by: amario57 on Mar 13, 2012, 10:57 am
E osando di più dotare Arduino di un display standalone non virtuale ma reale, usando uno shield tipo questo:
http://microvga.com/arduino
costa circa 30 dollari
in vga ?   per ora ??
dal virtuale al reale
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 13, 2012, 11:18 am

E osando di più dotare Arduino di un display standalone non virtuale ma reale, usando uno shield tipo questo:
http://microvga.com/arduino
costa circa 30 dollari


Bell'oggetto, però utilizza cinque pin di Arduino e la libreria è veramente minimale, non la vedo di semplice utilizzo.

Funzioni supportate:

_cputs
_kbhit
_putch
_getch
clrscr
clreol
textbackground
textcolor
gotoxy

Title: Re: Topic permanente di programmazione newbie
Post by: testato on Mar 13, 2012, 11:36 am
Bell'idea sto coso, peccato non sia open
Cmq si puo' usare anche in seriale, quindi solo 2 pin

Code: [Select]
Q: Can I use MicroVGA in UART mode?
Answer:
Yes, however we highly recommend using SPI mode for two reasons: UART is usually used for bootloader and the MicroVGA Arduino library uses natively SPI mode.

Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 13, 2012, 11:45 am

Bell'idea sto coso, peccato non sia open


Dipende da cosa intendi per open, è un prodotto finito con un suo datasheet e relativi manuali d'uso, come hardware sopra c'è un video controller a bassa risoluzione e un micro di interfaccia, nulla di strano e visto il costo non ha alcun senso tentare di farselo in casa  :)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 13, 2012, 12:00 pm
Ultimo aggiornamento per oggi, poi sedute d'esami ]:D

Problema lettura FUSES: risolto, ho verificato che il problema esisteva anche nel firmware scritto da mightyohm; in pratica loro ritenevano di poter "impunemente" passare dalla modalità HVSP alla HVPP e viceversa, senza chiudere e reinizializzare i comandi di programmazione; nel loro caso, poiché si svolgeva una sola operazione di lettura e scrittura, dopo aver fornito manualmente tutti gli elementi, il problema si poteva verificare più raramente, da un punto di vista statistico.
Invece il mio firmware si basa tutto sull'automatismo del recupero delle informazioni dal micro; ho risolto mettendo, subito dopo la prima lettura del micro, che mi fornisce anche la modalità specifica di programmazione, una reinizializzazione, nel caso si tratti di HVPP o HVP13 (ricordo che questa sigla l'ho inventata io, in realtà è una variante della HVPP per i tiny a 20pin), invece se il micro è un HVSP, che è il mode di default resta tutto com'è; comunque sto commentando praticamente ogni riga, lo sketch ha fini didattici per Elettronica In, quindi devo proprio spiegarlo passo-passo.

TEST ERASE: i passaggi che mi ha dato Astrobeed provengono dal DS del 328, ho scritto la routine e funziona benissimo in HVPP; ho verificato che dovrò implementare un'ulteriore routine per i tiny 84/85, un po' più complessa, ma dovrei farcela, ormai la lettura di quelle tabelle e la loro traduzione in firmware mi è abbastanza familiare  XD. Invece dovrei testare l'ERASE sui tiny 2313 e 861, se non ricordo male il core tiny dovrebbe avere almeno i dati del 2313, non so se ha quelli dell'861, ma la differenza tra i due sta solo nella pinature; ormai ho certezza che se funziona con uno funziona anche con l'altro. C'è ancora da lavorare.... :smiley-sweat:
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 13, 2012, 10:09 pm
Non ha l'861, al momento. Non c'è neanche nella versione 1.0.
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Mar 13, 2012, 10:25 pm
due domande didattiche, scusa se forse le hai gia' risposte

1- ogni micro puo' avere solo un tipo di programmazione hv, oppure ci sono quelli che la supportano entrambe sp-pp ?
2- l'erase cancella anche la eprom ?

Idee al volo:
1- non so se ci hai pensato, ma io farei un sottomenu' di scelta sull'erase
.. cancella solo flash
.. cancella solo eeprom
.. cancella flash+eeprom
.. cancella solo bootloader (questa e' un'idea nuova  :) a scopo puramente didattico, la potresti chiamare quick format, perche' cosi' come sugli HD ti perdi il primo carattere del file ma il file e' presente, sul micro ti perderesti il boot, quindi lo sketch non parte, pur essendo presente il programma)

2- si potrebbe fare un menu' di gestione delle protezioni, non ho studiato la materia quindi magari dico sciocchezze, ma si puo' proteggere un micro in secondo momento (proteggere da lettura per non farsi copiare) dopo il caricamento dello sketch ? oppure lo si deve decidere per forza all'inizio ?
Se si puo' fare, sarebbe bello un menu' Anticopia, in qualsiasi momento prendi un micro gia' programmato e lo passi nel rpogrammatore per la protezione
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 14, 2012, 11:04 am

due domande didattiche, scusa se forse le hai gia' risposte

1- ogni micro puo' avere solo un tipo di programmazione hv, oppure ci sono quelli che la supportano entrambe sp-pp ?

ogni micro richiede un SOLO tipo di programmazione: HVPP o HVSP, poi c'è una variantr dell'HVPP (che io ho ribattezzato HVP13) che serve per i tiny a 20pin

Quote

2- l'erase cancella anche la eprom ?

ovviamente ti riferisci a quella interna, la risposta è: dipende dall'impostazione dei fuse, c'è una combinazione che permette di proteggere l'EPROM durante le operazioni di chip_erase, nei valori di default l'impostazione è Eprom_protected; quindi puoi decidere se cancellare solo la flash o anche l'eprom; le altre modalità che suggerisci come idee sono impraticabili, per quanto ho letto e compreso fino a questo momento.

Quote

ma si puo' proteggere un micro in secondo momento (proteggere da lettura per non farsi copiare) dopo il caricamento dello sketch ? oppure lo si deve decidere per forza all'inizio ?
Se si puo' fare, sarebbe bello un menu' Anticopia, in qualsiasi momento prendi un micro gia' programmato e lo passi nel rpogrammatore per la protezione

non serve un'opzione, tu puoi cambiare il lock bit senza danneggiare il firmware contenuto, quindi credo sia sufficiente caricare il firmware e poi cambiare il lock bit in modo da impostare la protezione dell'area di meomoria flash; il reference spiega che dopo non puoi più riprogrammare  il lock bit, per cambiarlo bisogna fare per forza un chip_erase.
Ho studiato parecchio in questi giorni ;) ma potrei aver scritto qualche inesattezza, considera questa risposta come un chiarimento iniziale da approfondire :)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 14, 2012, 11:11 am
@ Leo: grazie del chiarimento, mi basta il 2313 per le prove.

Stamattina ho dedicato un'oretta al chip_erase HVSP ma il mallitto blink continua a blinkare sine pietatis  =( stasera al rientro altre prove, domani giornata definitiva, devo chiudere assolutamente, sono troppo in ritardo; tutto il resto (erase HVPP compreso) ora funziona a meraviglia, per essere la mia prima vera programmazione sono estremamente soddisfatto, soprattutto perché ho implementato tantissima roba che lo sketch di riferimento iniziale ora sembra davvero banale al confronto; ma naturalmente è stato fondamentale averlo, non a caso ho riportato nelle note iniziali il doveroso ringraziamento alla mightyohm e le loro note riguardo la licenza.
Per non tacere del grandissimo aiuto che mi avete dato, almeno ho approfittato per imparare, non faccio più errori con le "(", ")" e i ";"  :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 14, 2012, 11:38 am
Specifico un paio di cose, approfondendo il discorso cancellazione del micro e protezione.

EEPROM
il bit EESAVE, che protegge la EEPROM funziona solo durante la cancellazione del contenuto del chip ("chip erase") effettuato con la tecnica che sta usando Michele. Puoi sempre forzare da terminale la cancellazione della EEPROM usando l'opzione "-e" di avrdude.

LOCK BIT
ii lock bit si possono modificare senza alterare il contenuto della Flash ma solo in una direzione, ossia si può solo aumentare il fattore di protezione ma non diminuirlo. Quindi se i lock bit sono impostati per permettere la sola lettura ma non la riscrittura (protezione media), è possibile impedire anche la lettura (protezione massima) ma non è possibile disattivare la protezione in scrittura (protezione assente).
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 14, 2012, 11:50 am

Specifico un paio di cose, approfondendo il discorso cancellazione del micro e protezione.

EEPROM
il bit EESAVE, che protegge la EEPROM funziona solo durante la cancellazione del contenuto del chip ("chip erase") effettuato con la tecnica che sta usando Michele. Puoi sempre forzare da terminale la cancellazione della EEPROM usando l'opzione "-e" di avrdude.

lasciando perdere il terminale, è sufficiente cambiare lo stato del bit prima di fare l'operazione di chip_erase, cosa che si fa tranquillamente con l'opzione 2 del mio menu (inserimento fuse personali)

Quote

LOCK BIT
il lock bit si possono modificare senza alterare il contenuto della Flash ma solo in una direzione, ossia si può solo aumentare il fattore di protezione ma non diminuirlo. Quindi se i lock bit sono impostati per permettere la sola lettura ma non la riscrittura (protezione media), è possibile impedire anche la lettura (protezione massima) ma non è possibile disattivare la protezione in scrittura (protezione assente).

grazie per l'approfondimento, il succo quindi resta quello che ho detto, cioè una volta impostato il lock bit per proteggere la flash, l'unico modo per rimbuovere la protezione è fare un chip_erase che rimuove sì la protezione ma contestualmente cancella il contenuto rendendo efficace la protezione.

Invece questa cosa mi ha fatto riflettere sul fatto che mentre l'EESAVE è programmabile via fuse, lo stesso non si può dire del lock bit, mi pare; se è così forse dovrei prevedere l'opzione di variazione del lock bit con una voce tipo "proteggi micro", dite che vale la pena? mannaggia, ste cose sono come le ciliegie, una tira l'altra! :smiley-sweat:
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 14, 2012, 02:52 pm

grazie per l'approfondimento, il succo quindi resta quello che ho detto, cioè una volta impostato il lock bit per proteggere la flash, l'unico modo per rimbuovere la protezione è fare un chip_erase che rimuove sì la protezione ma contestualmente cancella il contenuto rendendo efficace la protezione.

Invece questa cosa mi ha fatto riflettere sul fatto che mentre l'EESAVE è programmabile via fuse, lo stesso non si può dire del lock bit, mi pare; se è così forse dovrei prevedere l'opzione di variazione del lock bit con una voce tipo "proteggi micro", dite che vale la pena? mannaggia, ste cose sono come le ciliegie, una tira l'altra! :smiley-sweat:

Come ho detto, puoi modificare i lock bit solo in un verso, ossia per aumentare il livello di protezione.
Potresti prevedere l'opzione, potrebbe essere carina, ma prima io ti consiglio di terminare la parte che hai ancora in fase di sviluppo, per non mettere troppa carne al fuoco.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 14, 2012, 03:48 pm
Se risolvo rapidamente la questione dell'ERASE provo a dargli un'occhiata, altrimenti abbandono proprio l'idea, una volta che chiudo devo scrivere l'articolo e non posso più fare variazioni, tratto il sw come se fosse hw, altrimenti rischio di fare casini; semmai, con tutto il tempo si potrà pensare di proporre una versione 2 con altre implementazioni, vedremo....
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 14, 2012, 10:34 pm
AGGIORNAMENTI
Al solito buone e cattive notizie, purtroppo la ricerca vuole i suoi morti, ma sono davvero sconvolto =( :smiley-eek-blue:

Nelle varie prove, ma non so come e perché, sono riuscito a cancellare la signature di un 2313 :smiley-sad-blue:
In pratica vedo e riesco a programmare i fuse e perfino a cancellare (ovviamente ha funzionato solo una volta) il micro ma la signature è FFFFFF; se cerco di inserire uno sketch tramite ISP naturalmente mi dà errore di signature.
La prima volta che ho programmato questo 2313 un'anomalia sul programmatore ISP l'avevo notata, una delle tre spie collegate ai segnali MISO, MOSI, SCK era debolmente accesa ed in effetti ho dovuto tentare un paio di volte prima di riuscire a inviare il blink ma poi è andato correttamente; solo che a quel punto l'HV ha iniziato a darmi errore di signature; l'ho bypassato via firmware, eludendo i controlli e ho riscontrato questa lettura FFFFFF, ciò nonostante, ripeto, riesco ancora a programmare i fuse. Secondo Voi è possibile cancellare la signature?

La buona notizia è che sono riuscito a completare finalmente il firmware, ora il chip_erase funziona correttamente anche in modalità HVSP e nell'unica prova fatta, ho visto che va anche in HVP13, quindi vorrei tentare di aggiungere il lock bit, mi sembra abbastanza semplice.

Ma prima devo capire che cavolo è successo, solo che ora mi trovo un 4313 e vorrei provare un piccolo imbroglio sul core tiny, mi basta cambiare la signature al 2313 e raddoppiargli la ram. Dove la trovo la signature? è nei file del core tiny o devo mettere mano ad AVRDUDE.CONF?

EDIT: ho provato a cambiare in AVRDUDE.CONF la signature (tecnica adottata con successo per il 328 noP) in FF FF FF ma niente da fare. Il messaggio " use -F to override this check." significa che posso bypassare il controllo, ma come devo usarlo questo parametro, forse si riferisce alla riga di comando?
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 15, 2012, 06:52 am

Secondo Voi è possibile cancellare la signature?


Non credo sia possibile farlo in nessuno modo normale, però non so se negli AVR questa informazione è scritta sotto forma di celle ROM, quindi non alterabili in nessun modo, oppure in una zona protetta della flash e pertanto potrebbe essere possibile alterare la signature con un qualche procedimento.
Per avere la certezza che hai cancellato la signature prova a leggerlo con l'AVR Dragon, se con questo ti risulta sempre 0xFFFFFF vuol dire che l'hai cancellata sul serio.
Al limite se non hai ne tempo ne modo di fare questo test spediscimi il micro con la prioritaria e te lo analizzo io.



Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 15, 2012, 06:53 am
Si, è possibile che per qualche ragione (falsi contatti o altra roba simile), durante la programmazione icsp venga cancellata la signature, ma questo non dovrebbe impedirti di riscriverla con la programmazione HV.
Guarda qui, anche il video http://translate.google.it/translate?hl=it&sl=pl&u=http://diy.elektroda.eu/atmega-fusebit-doctor-hvpp/&ei=koRhT8PIOYSgOvLNiP0H&sa=X&oi=translate&ct=result&resnum=1&ved=0CCkQ7gEwAA&prev=/search%3Fq%3Dattiny%2Bwriting%2Bsignature%2Bffffff%26hl%3Dit%26client%3Dfirefox-a%26hs%3D7SP%26rls%3Dorg.mozilla:it:official%26biw%3D1024%26bih%3D412%26prmd%3Dimvns
Penso che sia già presente il supporto per i 4313 nel core tiny , ricordo una vecchia discussione sul forum internazionale...
eccola:
http://arduino.cc/forum/index.php/topic,51984.60.html
spero che aiuti :)
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 15, 2012, 07:19 am

Si, è possibile che per qualche ragione (falsi contatti o altra roba simile), durante la programmazione icsp venga cancellata la signature, ma questo non dovrebbe impedirti di riscriverla con la programmazione HV.


Nei due link non ho visto nessun riferimento specifico alla signature, quello polacco illustra un apparato simile a quello che sta realizzando Menniti, il fatto che nel video appare la signature 0xFFFFFF è normale perché è quello che leggi se il micro è brickato e accedi tramite ISP, dopo averlo resettato tramite HV ritorna leggibile da ISP.
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 15, 2012, 07:26 am
astro ma il "coso" costruito dal polacco non credo che faccia icsp, ma solo HVPP e HVSP, quindi l'output che si vede nel video è letto con una di quelle due modalità no?
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 15, 2012, 07:55 am

quindi l'output che si vede nel video è letto con una di quelle due modalità no?


Colpa della traduzione di google, sono andato a leggere il testo originale in Inglese, i link è sempre meglio metterli al sito originale e non tramite traduttore proprio per evitare le cavolate che questo combina vanificando eventuali ricerche nel testo.
In effetti in fondo ci sono due screen capture,  dove fa vedere un ATtiny 13 con signatura 0xFFFFFF, letto tramite HVSP, e brickato viene ripristinato introducendo manualmente il modello, però nella schermata successiva risulta si ripristinato, ma la signature rimane 0xFFFFFF il che crea non pochi problemi quando vai a programmarlo tramite ISP.
Dopo provo a mandare un richiesta all'assistenza tecnica di Atmel per chiedere lumi su questa cosa della signature alterabile e se c'è un modo per ripristinarla.
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 15, 2012, 08:01 am
io ho guardato in giro e credo che il problema sia causato da una cancellazione del registro di calibrazione dell'oscillatore interno e per riscriverlo bisogna applicare un clock con un quarzo esterno o altro di 1MHz.
Ma non ho ancora avuto modo di cercare per bene.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 15, 2012, 10:52 am
Bene ragazzi, grazie di aver preso in cura il problema. Sul datasheet non mi pare si parli di scrittura della signature, i link non li guardo perché l'inglese mi è amico tanto quanto il polacco, quindi sarebbe inutile, però sono pronto ad ogni prova possibile, datemi indicazioni e sarà fatto. Confermo che con l'ISP è impossibile lavorare con ujna signature FF FF FF, ho provato a metterla in AVRDUDE.CONF e l'IDE si incazza come una bestia, segno che controlla prima se c'è un 1E iniziale. Con lo stesso metodo invece ho programmato regolarmente il 4313, ma non riesco ad integrarlo come supporto diretto, posso farlo solo dicendo al CONF che ho un tiny2313 con una signature, flash e fuse diversi; ho provato a duplicare le righe nel conf ma evidentemente l'elenco dei micro va aggiornato in qualche altra parte (ma dove?), comunque il link di BB sul 4313 lo guardo, lì dovrei capire qualcosa in più.
Non credo sia possibile mettere un quarzo, i pin XTAL1 e 2 sono impegnati da segnali di programmazione e comunque ora non posso fare più niente sull'hw, al di là di una prova al volo; se poi il micro è comunque inutilizzabile via ISP non mi serve a niente.
@ Astro: prova a vedere, aspetta la risp di ATMEL, se c'è qualcosa che posso fare io la faccio, anche perché sarebbe spettacolare implementare un recupero del genere; se invece non c'è nulla e vuoi comunque dare un'occhiata te lo spedisco.

Ieri comunque è successo, poi ho ricostruito, che col fatto di usare alternativamente Arduino UNO+ISP per mettere lo sketch e l'HV Programmer per cancellarlo, ad un certo punto ho notato che Win impiegava oltre un minuto per riconoscere l'USB di turno, e siccome deve fare un secondo riconoscimento di conferma mi è capitato di fare operazioni nelle fasi intermedie; dopo il fattaccio ho riavviato (e mi è uscito un errore di sistema di scrittura, stranissimo) e per tutta la sera ho rifatto i giochi col 4313 (non volevo aver costruito uno spara-micro), le USB sono andate benissimo, addirittura manco le ho scollegate a volte, senza avere più problemi.

Oggi pomeriggio implemento il lock bit, intanto datemi tutte le info possibili riguardo il recupero del 2313 e l'implementazione del 4313. Grazie!
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 15, 2012, 11:16 am
Menniti quando dicevo "un quarzo o altro" in verità volevo dire che basta dare un clock stabile da 1 a 4mhz sul pin del clock dell'ic , poi cancellare tutto e provare a riprogrammare il fuse CLSEL.
... tel'avevo messo anche tradotto in italiano il link :D e neanche lo guardi? =(  guarda almeno il video :D
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 15, 2012, 11:24 am

Menniti quando dicevo "un quarzo o altro" in verità volevo dire che basta dare un clock stabile da 1 a 4mhz sul pin del clock dell'ic , poi cancellare tutto e provare a riprogrammare il fuse CLSEL.
... tel'avevo messo anche tradotto in italiano il link :D e neanche lo guardi? =(  guarda almeno il video :D

BB non prendere per il c...., mi sono fidato di quanto commentava Astro, ora al lavoro, pomeriggio mi guardo il filmino :P
Ho scaricato invece il core tiny, ma sei sicuro che si tratti di una versione modificata dell'originale? Ricordo che per diverso tempo Leo fece riferimento ad un core che dava parecchi problemi, non vorrei che si trattasse di quello :smiley-sad-blue:
C'è un modo per capire questa cosa secondo te? comunque pomeriggio faccio qualche prova anche con questo, mi sa che questo pomeriggio durerà fin o alle tre di stanotte :smiley-sweat:
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 15, 2012, 11:32 am
Quella è una versione abbastanza antica (usala solo per il 4313), ricorda che se stai facendo esperimenti con avrdude devi anche modificare avrdude.conf per fargli riconoscere il 4313.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 15, 2012, 11:35 am
Ho la risposta di Atmel, la signature si trova in una zona protetta della flash ed è accessibile esclusivamente tramite le varie modalità di programmazione con gli specifici comandi.
Se durante un erase della flash si verificano rilevanti spike, non mi hanno chiarito cosa intendono con rilevanti, sull'alimentazione del micro per quanto sia un evento rarissimo è possibile che venga cancellata anche la zona della flash dove si trova la signature, il motivo per cui leggi 0xffffff è proprio perché 0xff è il valore tipico di una cella flash appena cancellata.
Non esiste nessun modo per ripristinare il corretto valore della signature, il micro rimane perfettamente funzionante e utilizzabile, però potrebbero esserci problemi con alcuni software e tool hardware per la programmazione perché se leggono il valore 0xffffff lo interpretano come micro non riconosciuto o guasto e non consentono di procedere ad una programmazione forzata.
Morale della favola, non solo gli AVR è possibile brickarli sbagliando i fuse, ma è anche possibile cancellare la signature.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 15, 2012, 11:42 am
BB scusa ma dove lo vedi il problema risolto? in quel video prima mostra degli errori perché non c'è alcun micro, poi mostra la lettura di un attiny45 buono, poi mette un tiny2313 con signature FFFFFF e mostra che riesce a programmare i fusebit, e la novità dov'è? Tutto questo l'ho fatto già ieri sera; nemmeno lui è riuscito a rimettere a posto la signature, infatti se guardi attentamente lui ha tagliato la parte di verifica, ma è rimasto un fotogramma in cui c'è sempre FFFFFF, hai capito il furbo polacco? :smiley-yell:

riguardo il tuo ultimo post, che leggo al volo, come già detto (ma tu mi ignori e poi t'incavoli che non leggo quel che mi dici :P) AVRDUDE.CONF l'ho modificato ma non gliene f... niente, segno che il 4313 lo devo elencare da qualche altra parte; col core sono a posto, va benissimo quello del 2313, l'ho provato, dovete solo insegnarmi come aggiungere un micro all'elenco, ripeto che farlo nel solo AVRDUDE.CONF non basta.

@Astro: ok, grazie, ho spiegato prima i casini che sono successi quindi è tutto giustificato, sono tranquillo perché non è dipeso dal programmatore ma dal casino tra le usb, inoltre un suo problema doveva averlo perché come ho scritto ieri sera appena l'ho messo nell'ISP si è accesa debolmente una delle spie collegate ai MISO, MOSI, SCLK, quindi c'era qualcosa che non andava. Come immaginavo e avevo letto non c'è modo di ripristinarlo, e per usarlo si può solo programmarlo in modalità HV, cosa che ancora non ho fatto, lo conservo per "usi futuri" :) GRAZIE!
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 15, 2012, 11:52 am
:D quella del frame non l'avevo vista...
ma quando parli di inserire nell'elenco, a cosa ti riferisci?
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 15, 2012, 12:01 pm

nemmeno lui è riuscito a rimettere a posto la signature, infatti se guardi attentamente lui ha tagliato la parte di verifica, ma è rimasto un fotogramma in cui c'è sempre FFFFFF, hai capito il furbo polacco? :smiley-yell:


Se guardi in fondo all'articolo, ci sono pure due immagini molto eloquenti dice chiaramente che la signature non viene ripristinata, semplicemente che riesce a riprogrammare i fuse in HV rendendo il micro nuovamente utilizzabile, prima era brickato.

Quote

Come immaginavo e avevo letto non c'è modo di ripristinarlo, e per usarlo si può solo programmarlo in modalità HV, cosa che ancora non ho fatto, lo conservo per "usi futuri" :) GRAZIE!


Forse mi sono spiegato male, il micro puoi riprogrammarlo come ti pare, ISP incluso, solo che non tutti i software, e/o programmatori hardware, lo permettono perché quando leggono 0xffffff sulla signature non consentono di continuare.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 15, 2012, 12:52 pm

Ho scaricato invece il core tiny, ma sei sicuro che si tratti di una versione modificata dell'originale? Ricordo che per diverso tempo Leo fece riferimento ad un core che dava parecchi problemi, non vorrei che si trattasse di quello :smiley-sad-blue:

Il core a cui facevo io riferimento in passato era quello di Saporetti, che consigliavo di non usare perché molto limitato.
Il core Tiny che ha modificato Brain mi pare che sia stato toccato solo nei file pins_arduino.c e pins_arduino.h per inserire il riconoscimento del 4313 ed il setup della piedinatura. Non vedo però le modifiche da apportare ad avrdude.conf per fargli riconoscere il micro.


EDIT: ho provato a cambiare in AVRDUDE.CONF la signature (tecnica adottata con successo per il 328 noP) in FF FF FF ma niente da fare. Il messaggio " use -F to override this check." significa che posso bypassare il controllo, ma come devo usarlo questo parametro, forse si riferisce alla riga di comando?

Sì, questi sono parametri da dare ad avrdude via terminale. Il parametro "-F" forza il programma a saltare i check di verifica di cui parlava astrobeed: alle volte riesci a portare a termine un'operazione di scrittura, ma non sempre con -F risolvi tutto, andrebbe visto che controlli avrdude salta usando quel parametro.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 15, 2012, 01:33 pm
@ BB e Astro: ok, la signature non si ripristina e qui ormai ci siamo arrivati tutti, perfino io…. Riguardo la programmazione ti sei spiegato benissimo, io mi riferivo al fatto che l'IDE è evidentemente uno di quei programmi che NON permette la programmazione del micro e quindi per me l'unica possibilità resta l'HV o il Dragon, quando finalmente troverò il tempo di metterlo in moto (erano questi gli usi futuri a cui mi riferivo)
@ Leo e BB: quindi ora vorrei poter aggiungere una board per programmare correttamente il 4313 (mi basta 1MHz); da quanto ho capito i file da modificare sono tre:
- AVRDUDE.CONF: qui (come feci allora col 328noP) mi limito a fare un copincolla del 2313 ed a modificare nome, descrizione e signature; Vi ricordo che ieri, semplicemente modificando la signature ho programmato il 4313 con la board ed il finto boootloader del 2313, cambiando solo il valore del LFuse che, peraltro, non ha alcuna importanza per gli sketch; quindi la manovra su AVRDUDE in linea di massima va; poi non scordiamo tutto ciò che disse Astro a proposito di questo tipo di operazioni barbariche, ma visto che ieri ho fatto lampeggiare tre led senza questioni, a me basta.
- pins_arduino.c e pins_arduino.h: anche qui posso fare un copincolla del 2313 modificando le sole info varianti, ho già verificato che la pinature è identica e le assegnazioni dei pin sono perfettamente compatibili
-boards.txt: e anche qui una nuova board a partire dalla 2313 in cui modifico i vari attributi, l'LFuse (giusto per esattezza) e il nome dell'mcu, mentre lascio inalterato il bootloader che, a farla sporca, forse potrei copiare e rinominare opportunamente nella cartella specifica.
La questione è: tutto ciò mi evita l'errore dell'IDE che ogni volta mi strapazza le vecchie che mi dice che non conosce il 4313 e mi mostra l'infinito elenco di quelli che dice di conoscere?
A voi l'ardua sentenza.

@ Leo: l'IDE nel messaggio sembra chiaro: usare -F significa non controllare la signature, che altro dovrebbe fare/non fare?
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 15, 2012, 01:49 pm
Menniti, non credo che basti solo cambiare il nome al 2313 in 4313 e incollare, questo è un estratto dal mio avrdude.conf
Code: [Select]

#------------------------------------------------------------
# ATtiny4313
#------------------------------------------------------------

part
     id            = "t4313";
     desc          = "ATtiny4313";
     has_debugwire = yes;
     flash_instr   = 0xB2, 0x0F, 0x1F;
     eeprom_instr  = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D,
             0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC,
             0x99, 0xE1, 0xBB, 0xAC;
     stk500_devcode   = 0x23;
##   Use the ATtiny26 devcode:
     avr910_devcode   = 0x5e;
     signature        = 0x1e 0x92 0x0d;
     pagel            = 0xD4;
     bs2              = 0xD6;
     reset            = io;
     chip_erase_delay = 9000;

     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
                        "x x x x  x x x x    x x x x  x x x x";

     chip_erase       = "1 0 1 0  1 1 0 0    1 0 0 x  x x x x",
                        "x x x x  x x x x    x x x x  x x x x";

    timeout = 200;
    stabdelay = 100;
    cmdexedelay = 25;
    synchloops = 32;
    bytedelay = 0;
    pollindex = 3;
    pollvalue = 0x53;
    predelay = 1;
    postdelay = 1;
    pollmethod = 1;

    pp_controlstack     =
        0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E,
        0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E,
        0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A,
        0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
    hventerstabdelay    = 100;
    progmodedelay       = 0;
    latchcycles         = 5;
    togglevtg           = 1;
    poweroffdelay       = 15;
    resetdelayms        = 1;
    resetdelayus        = 0;
    hvleavestabdelay    = 15;
    chiperasepulsewidth = 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programlockpolltimeout = 5;

     memory "eeprom"
         size            = 256;
        paged           = no;
        page_size       = 4;
         min_write_delay = 4000;
         max_write_delay = 4500;
         readback_p1     = 0xff;
         readback_p2     = 0xff;
         read            = "1   0  1  0   0  0  0  0   0 0 0 x  x x x x",
                           "a7 a6 a5 a4  a3 a2 a1 a0   o o o o  o o o o";

         write           = "1   1  0  0   0  0  0  0   0 0 0 x  x x x x",
                           "a7 a6 a5 a4  a3 a2 a1 a0   i i i i  i i i i";

loadpage_lo = "  1   1   0   0      0   0   0   1",
  "  0   0   0   0      0   0   0   0",
  "  0   0   0   0      0   0  a1  a0",
  "  i   i   i   i      i   i   i   i";

writepage = "  1   1   0   0      0   0   1   0",
  "  0   0   x   x      x   x   x   x",
  " a7  a6  a5  a4     a3  a2   0   0",
  "  x   x   x   x      x   x   x   x";

mode = 0x41;
delay = 6;
blocksize = 4;
readsize = 256;
       ;
     memory "flash"
         paged           = yes;
         size            = 4096;
         page_size       = 64;
         num_pages       = 64;
         min_write_delay = 4500;
         max_write_delay = 4500;
         readback_p1     = 0xff;
         readback_p2     = 0xff;
         read_lo         = "  0   0   1   0    0   0   0   0",
                           "  0   0   0   0    0 a10  a9  a8",
                           " a7  a6  a5  a4   a3  a2  a1  a0",
                           "  o   o   o   o    o   o   o   o";

         read_hi         = "  0   0   1   0    1   0   0   0",
                           "  0   0   0   0    0 a10  a9  a8",
                           " a7  a6  a5  a4   a3  a2  a1  a0",
                           "  o   o   o   o    o   o   o   o";

# The information in the data sheet of April/2004 is wrong, this works:
         loadpage_lo     = "  0   1   0   0    0   0   0   0",
                           "  0   0   0   x    x   x   x   x",
                           "  x   x   x   x   a3  a2  a1  a0",
                           "  i   i   i   i    i   i   i   i";

# The information in the data sheet of April/2004 is wrong, this works:
         loadpage_hi     = "  0   1   0   0    1   0   0   0",
                           "  0   0   0   x    x   x   x   x",
                           "  x   x   x   x   a3  a2  a1  a0",
                           "  i   i   i   i    i   i   i   i";

# The information in the data sheet of April/2004 is wrong, this works:
         writepage       = "  0  1  0  0   1   1  0  0",
                           "  0  0  0  0   0 a10 a9 a8",
                           " a7 a6 a5 a4   x   x  x  x",
                           "  x  x  x  x   x   x  x  x";

mode = 0x41;
delay = 6;
blocksize = 32;
readsize = 256;
       ;
#   ATtiny4313 has Signature Bytes: 0x1E 0x92 0x0D.
     memory "signature"
         size            = 3;
         read            = "0  0  1  1   0  0  0  0   0  0  0  x   x  x  x  x",
                           "x  x  x  x   x  x a1 a0   o  o  o  o   o  o  o  o";
       ;
     memory "lock"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 1 1 x  x x x x",
                           "x x x x  x x x x  1 1 i i  i i i i";
         read           = "0 1 0 1  1 0 0 0  0 0 0 0  0 0 0 0",
                          "x x x x  x x x x  x x o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
       ;

     memory "lfuse"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 0 1 0  0 0 0 0",
                           "x x x x  x x x x  i i i i  i i i i";

         read            = "0 1 0 1  0 0 0 0  0 0 0 0  0 0 0 0",
                           "x x x x  x x x x  o o o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
       ;

     memory "hfuse"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 0 1 0  1 0 0 0",
                           "x x x x  x x x x  i i i i  i i i i";

         read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
                           "x x x x  x x x x  o o o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
       ;

     memory "efuse"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 0 1 0  0 1 0 0",
                           "x x x x  x x x x  x x x x  x x x i";

         read            = "0 1 0 1  0 0 0 0  0 0 0 0  1 0 0 0",
                           "x x x x  x x x x  o o o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
     ;
# The Tiny4313 has calibration data for both 4 MHz and 8 MHz.
# The information in the data sheet of April/2004 is wrong, this works:

     memory "calibration"
         size            = 2;
         read            = "0  0  1  1   1  0  0  0    0 0 0 x  x x x x",
                           "0  0  0  0   0  0  0  a0   o o o o  o o o o";
     ;
  ;


la maggiorparte dei parametri sono uguali,ma non tutti.
Poi basta che ti crei la board per l'ide e hai finito.
L'opzione -F per avrdude potrebbe aiutare se il chip è sbrickato ed ha solo la signature danneggiata e nient'altro.
L'ide richiamando avrdude con i parametri di default (senza -F per esempoi) non può programare un chip con la signature divera da quella attesa (salvo modifiche).
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 15, 2012, 01:54 pm
Io uso la 0022, forse il tuo CONF è più aggiornato, ora provo a copiare questi dati nel mio conf e vediamo che succede. Grazie
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 15, 2012, 02:16 pm
Niente da fare, ho inserito le tue righe in AVRDUDE.CONF, ho aggiornato i files pins.Arduino.h e .c, ho creato la board, appena provo la compilazione mi dice
Quote
mcu attiny4313 supported for assembler only


e

Quote
unknown MCU 'attiny4313' specified
Known MCU names:
   avr2
   at90s2313


che manca? ma tu, bb, l'hai mai provata questa mcu, intendo dire che basta selezionarla e fare un banale compilazione del blick per sapere se ti funziona o meno
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 15, 2012, 02:19 pm

Niente da fare, ho inserito le tue righe in AVRDUDE.CONF, ho aggiornato i files pins.Arduino.h e .c, ho creato la board, appena provo la compilazione mi dice
mcu attiny4313 supported for assembler only


Questo non è un errore di avrdude, è del GCC, ti dice che non riconosce quel micro e che non può compilare.



Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 15, 2012, 02:40 pm


Niente da fare, ho inserito le tue righe in AVRDUDE.CONF, ho aggiornato i files pins.Arduino.h e .c, ho creato la board, appena provo la compilazione mi dice
mcu attiny4313 supported for assembler only


Questo non è un errore di avrdude, è del GCC, ti dice che non riconosce quel micro e che non può compilare.

Dunque io ho solo eseguito il verify, senza tentare di fare upload, per cui dovrei spiegare al GCC che questo micro esiste, secondo te posso farlo e come?
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 15, 2012, 02:44 pm

Dunque io ho solo eseguito il verify, senza tentare di fare upload, per cui dovrei spiegare al GCC che questo micro esiste, secondo te posso farlo e come?


Non puoi farlo, è necessario eseguire l'upgrade del compilatore per risolvere.

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 15, 2012, 02:57 pm


Dunque io ho solo eseguito il verify, senza tentare di fare upload, per cui dovrei spiegare al GCC che questo micro esiste, secondo te posso farlo e come?

Non puoi farlo, è necessario eseguire l'upgrade del compilatore per risolvere.

Ottimo, allora faccio come il vecchio cinese, mi siedo davanti al PC e aspetto, qualcosa accadrà  :) per il momento il 4313 può aspettare anche lui e tornare nel cassetto.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 15, 2012, 03:09 pm

Ottimo, allora faccio come il vecchio cinese, mi siedo davanti al PC e aspetto, qualcosa accadrà  :) per il momento il 4313 può aspettare anche lui e tornare nel cassetto.


Ho verificato, il compilatore  4.3.2 abbinato all'IDE di Arduino non prevede il 4313, è previsto nella 4.3.3 che trovi nell'ultima release di WinAvr.
Possibile soluzione indolore, non è detto che funzioni e adesso non ho tempo per provare, però se ti va di perderci un po di tempo prova a scaricare l'ultima relase di WinAvr, esegui l'installazione, si limita ad espandere i contenuti, dopo di che cancella il contenuto della cartella "..\arduino-0023\hardware\tools\avr" e copiaci dentro tutto quello presente nella cartella WinAvr, dovresti trovarla in "C:\Programmi\Atmel\WinAvr", esclusa la cartella avr32 che non ti serve.
Fatto quanto sopra dovresti avere l'IDE aggiornato al compilatore 4.3.3 che include il 4313.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 15, 2012, 03:21 pm


Ottimo, allora faccio come il vecchio cinese, mi siedo davanti al PC e aspetto, qualcosa accadrà  :) per il momento il 4313 può aspettare anche lui e tornare nel cassetto.


Ho verificato, il compilatore  4.3.2 abbinato all'IDE di Arduino non prevede il 4313, è previsto nella 4.3.3 che trovi nell'ultima release di WinAvr.
Possibile soluzione indolore, non è detto che funzioni e adesso non ho tempo per provare, però se ti va di perderci un po di tempo prova a scaricare l'ultima relase di WinAvr, esegui l'installazione, si limita ad espandere i contenuti, dopo di che cancella il contenuto della cartella "..\arduino-0023\hardware\tools\avr" e copiaci dentro tutto quello presente nella cartella WinAvr, dovresti trovarla in "C:\Programmi\Atmel\WinAvr", esclusa la cartella avr32 che non ti serve.
Fatto quanto sopra dovresti avere l'IDE aggiornato al compilatore 4.3.3 che include il 4313.


grazie, provo subito, sono curioso, anche perché se va a buon fine mi troverò altri possibili micro in elenco
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 15, 2012, 03:37 pm
Possibile che non riesco a trovare WINAVR sul sito Atmel? :smiley-eek-blue:
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Mar 15, 2012, 03:38 pm
http://winavr.sourceforge.net/download.html

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 15, 2012, 03:41 pm

ma hai chiamato il 4313 con il nome giusto nella board?(t4313)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 15, 2012, 03:49 pm


ma hai chiamato il 4313 con il nome giusto nella board?(t4313)

ho provato ora per scrupolo, ma anche l'attiny2313 viene scritto per intero, ecco perché dico che il nome deve essere altrove, come giustamente dice Astro.

@ QP: grazie, me lo dà come primo link ma mi era sembrato un po' sospetto :smiley-eek-blue: oltretutto mi dà in ftp una cartella zeppa di versioni, scarico l'ultima?
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Mar 15, 2012, 03:53 pm
Si. Ossia questa http://sourceforge.net/projects/winavr/files/WinAVR/20100110/ (http://sourceforge.net/projects/winavr/files/WinAVR/20100110/)

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 15, 2012, 04:36 pm
Fatto, ma ho lo stesso errore, forse non è sufficiente questa manovra di sostituzione della cartella avr e comunque nell'AVRDUDE.CONF nuovo il 4313 non c'è, ho visto che aprendo il makefile l'mcu appare, ma davvero non so come integrarlo, ed è un peccato non riuscirci perché ci sono altri micro che mi interessano come gli attyny 88 e 861; gli 861 sono molto simili ai 2313, abbastanza da poter tentare di partire da questi per aagiungere i dati nel core e creare la relativa board.
Per il momento lascio installato il winavr e ripristino la vecchia versione della cartella, poi se mi suggerite idee o se fate qualche tentativo tenetemi aggiornato.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 15, 2012, 05:02 pm

Fatto, ma ho lo stesso errore, forse non è sufficiente questa manovra di sostituzione della cartella avr e comunque nell'AVRDUDE.CONF nuovo il 4313 non c'è


Impossibile che ti da lo stesso errore perché la versione 4.3.3 di AVRGCC prevede il 4313, l'ho verificato.

Queste sono le prime righe del suo file .h di configurazione:

Code: [Select]

/* Copyright (c) 2009 Atmel Corporation
  All rights reserved.

/* $Id: iotn4313.h,v 1.1.2.2 2009/11/02 02:44:17 arcanum Exp $ */

/* avr/iotn4313.h - definitions for ATtiny4313 */

/* This file should only be included from <avr/io.h>, never directly. */

#ifndef _AVR_IO_H_
#  error "Include <avr/io.h> instead of this file."
#endif

#ifndef _AVR_IOXXX_H_
#  define _AVR_IOXXX_H_ "iotn4313.h"
#else
#  error "Attempt to include more than one <avr/ioXXX.h> file."
#endif


#ifndef _AVR_ATtiny4313_H_
#define _AVR_ATtiny4313_H_ 1


edit: forse il problema è nel nome che usi per il micro che non è quello atteso dal compilatore.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 15, 2012, 05:07 pm
sarebbe questo che hai postato tu? _AVR_ATtiny4313_H_ oppure dove lo trovo?
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 15, 2012, 05:22 pm

sarebbe questo che hai postato tu? _AVR_ATtiny4313_H_ oppure dove lo trovo?


No questo è il nome simbolico usato nel file di descrizione, non ha nulla a vedere con quanto atteso dal compilatore sulla riga di comando, mi pare che c'è una opzione che fornisce la lista dei micro supportati e il nome da utilizzare, devo dare un attimo una sbirciatina al manuale del gcc.

Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 15, 2012, 05:59 pm
Ho fatto al volo una prova sostituendo AvrWin con l'ultima versione come ti avevo detto, nome cpu ".mcu=attiny4313" e il compilatore lo accetta, però poi viene fuori una serie di errori perché il core non è adatto per il micro, quindi la questione supporto del compilatore è risolta, ora tocca risolvere il problema core.
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Mar 15, 2012, 08:48 pm
attima la scoperta della signature sbiellabile.
Menny scopri cose interessanti anche quando sbagli  :)

quind l'idea del menu' Proteggi Micro e' accettata ?

qualcuno sa niente del discorso di cancellare solo il bootloader ? giusto per didattica, lo sketch non partirebbe giusto ?
Non basterebbe cancellare solo il primo byte della flash ?
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 15, 2012, 09:14 pm
@ Astro: riprovo, ma sono ragionevolmente sicuro di aver usato proprio quella dicitura: mi confermi di aver sostituito solo la cartella della nuova versione (nel mio caso era in root non in programmi) al posto della vecchia? e poi come hai fatto la prova, hai creato una board qualsiasi con quella mcu?

@ Testato: è stata spettacolare questa cosa :D Guarda io non ho particolari problemi ora a implementare il lock_bit, ormai "possiedo" la tecnica, ci perderò un po' di tempo e sarà fatto; ma devo approfondire un paio di questioni sul datasheet per capire se davvero ne vale la pena; invece quella cosa del no_BL scusa ma "me pare propio na strunzata" ed io sto già litigando moltissimo col tempo quindi lascio l'onore a te, quando avrai il mio sketch sul PC ti potrai sbizzarrire ;) ti ricordo che quando programmiamo con l'ISP il BL non lo mettiamo ed lo sketch parte lo stesso, se devi solo sabotare la flash non ne capisco davvero la necessità :smiley-eek:
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 15, 2012, 09:48 pm

@ Astro: riprovo, ma sono ragionevolmente sicuro di aver usato proprio quella dicitura: mi confermi di aver sostituito solo la cartella della nuova versione (nel mio caso era in root non in programmi) al posto della vecchia? e poi come hai fatto la prova, hai creato una board qualsiasi con quella mcu?


Si ho semplicemente sostituito il contenuto della cartella con quello della nuova versione di WinAvr, poi ho preso una board per Attiny e ho semplicemente cambiato il nome della mcu, giusto per vedere se veniva accettato dal compilatore, e infatti la compilazione parte, però poi vengono fuori vari errori dovuti al mancato supporto del core a questo modello.

Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 15, 2012, 11:03 pm

@ Leo e BB: quindi ora vorrei poter aggiungere una board per programmare correttamente il 4313 (mi basta 1MHz); da quanto ho capito i file da modificare sono tre:
- AVRDUDE.CONF: qui (come feci allora col 328noP) mi limito a fare un copincolla del 2313 ed a modificare nome, descrizione e signature; Vi ricordo che ieri, semplicemente modificando la signature ho programmato il 4313 con la board ed il finto boootloader del 2313, cambiando solo il valore del LFuse che, peraltro, non ha alcuna importanza per gli sketch; quindi la manovra su AVRDUDE in linea di massima va; poi non scordiamo tutto ciò che disse Astro a proposito di questo tipo di operazioni barbariche, ma visto che ieri ho fatto lampeggiare tre led senza questioni, a me basta.
- pins_arduino.c e pins_arduino.h: anche qui posso fare un copincolla del 2313 modificando le sole info varianti, ho già verificato che la pinature è identica e le assegnazioni dei pin sono perfettamente compatibili
-boards.txt: e anche qui una nuova board a partire dalla 2313 in cui modifico i vari attributi, l'LFuse (giusto per esattezza) e il nome dell'mcu, mentre lascio inalterato il bootloader che, a farla sporca, forse potrei copiare e rinominare opportunamente nella cartella specifica.
La questione è: tutto ciò mi evita l'errore dell'IDE che ogni volta mi strapazza le vecchie che mi dice che non conosce il 4313 e mi mostra l'infinito elenco di quelli che dice di conoscere?
A voi l'ardua sentenza.

Ripensando alla cosa, non è così come ti ho detto. Nel senso che quando ho modificato il core Sanguino per i 1284 ho visto che di file ce n'erano anche altri da cambiare, non solo i file pins_arduino: questi servono per la mappatura dei pin, ma poi c'era il discorso dei timer, degli interrupt, del PWM... Insomma, va preso il core Tiny, file per file, e controllato se e dove servono le modifiche.

Quote

@ Leo: l'IDE nel messaggio sembra chiaro: usare -F significa non controllare la signature, che altro dovrebbe fare/non fare?

Tu hai chiesto se bastava aggiungere quell'opzione, io ti ho detto che per alcuni compiti serve, per altri no. Esempio: se hai un chip briccato, signature o non signature, non lo programmerai mai con avrdude anche usando l'opzione -F. Non so se mi sono spiegato.
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Mar 15, 2012, 11:35 pm
yep, attendo l'uscita sulla rivista e poi ci buttiamo nelle modifiche.
sai se sara' possibile comprare la sola pcb ? o cmq tutto il kit, tanto in teoria dovrebbe essere un kit economicissimo, sempre perche' non mi va di mettere mano all'acido.

per il fatto del cancella bootloader (fai bene a non considerarlo per il progetto, e' solo una domanda al forum per capire cose nuove) non e' come il discorso del caricre lo sketch in isp.
se il bootloader e' presente, e' lui che passa allo sketch, quindi rimuovendoplo lo sketch non parte, secondo me  :)
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 15, 2012, 11:44 pm
Il bootloader risiede in un'area di Flash che viene protetta mediante i fuse ed a cui viene passata l'esecuzione del codice all'avvio del micro, se i fuse prevedono quest'area.
Io credo che se riprogrammi i fuse per togliere l'area riservata al bootloader, non hai bisogno di cancellarlo materialmente perché l'esecuzione del codice parte, senza bootloader impostato nei fuse, dalla cella $0000 e non più dall'area riservata.
Title: Re: Topic permanente di programmazione newbie
Post by: Maurotec on Mar 16, 2012, 01:02 am
Quote
No questo è il nome simbolico usato nel file di descrizione, non ha nulla a vedere con quanto atteso dal compilatore sulla riga di comando, mi pare che c'è una opzione che fornisce la lista dei micro supportati e il nome da utilizzare, devo dare un attimo una sbirciatina al manuale del gcc.

Forse ti riferisci a questa?

avr-gcc -dumpspecs

Certo non è chiarissima, almeno a me girano gli oci.

Ciao.
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 16, 2012, 07:00 am
qui c'è in elenco:
http://www.nongnu.org/avr-libc/user-manual/
e gcc può compilare per integrati di quella famiglia (avr25):
http://gcc.gnu.org/onlinedocs/gcc/AVR-Options.html
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 16, 2012, 07:20 am

qui c'è in elenco:
http://www.nongnu.org/avr-libc/user-manual/
e gcc può compilare per integrati di quella famiglia (avr25):
http://gcc.gnu.org/onlinedocs/gcc/AVR-Options.html


Diciamo che per il momento la questione aggiornamento compilatore alla 4.3.3 è risolta.
Ieri sera ho fatto molte prove con tutti programmi che ho per Arduino, sia UNO che MEGA2560, alcuni molto complessi come MultiWii (software per quadricotteri), e non ho riscontrato nessun problema, quindi direi che il trapianto è perfettamente riuscito e il paziente gode di ottima salute  :)
Per quanto riguarda gli ATtiny4313 rimane il problema del core perché sebbene ora viene riconosciuto dal compilatore poi saltano fuori errori dovuti alle differenze hardware tra questi micro e quelli normalmente impiegati su Arduino.
Ho fatto una prova al volo con il core per ATtiny 45-85, sapendo già che non poteva funzionare, solo per verifica se cambiavano gli errori e così è stato confermando ulteriormente che ora è possibile compilare anche per i 4313.
Ho fatto un ulteriore test con una versione sperimentale dell'IDE 1.0 con trapiantata la toolchain di ATmel al posto di WinAvr, ci sto lavorando sopra da diverso tempo per la famosa questione del limite di memoria del ATmega2560, e anche questa riconosce senza problemi i 4313, cosa di cui ero più che certo, e mi fornisce gli stessi errori, dovuti al core, del test con avrgcc 4.3.3.

Salvo imprevisti, ovvero impegni lavorativi, dovrei rilasciare a breve la procedura per sostituire WinAvr con la toolchain di Atmel, che è sempre aggiornatissima e con molti meno bug delle altre release di avrgcc, in modo da mettere la parola fine ai fastidiosi bug e limiti della versione 4.3.2, abbastanza vecchiotta (2009), di WinAvr che è ufficialmente abbinata all'IDE di Arduino, inclusa la 1.0, per Windows.


Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 16, 2012, 08:24 am
Comunque sia ho stabilito per oggi (quasi libero!) questa scaletta:
1 - metto in ordine il firmware (troppo incasinato)
2 - studio e decido se implementare il lock_bit
3 - rifaccio il test winavr, evidentemente ieri mi è sfuggito qualcosa; riguardo il core la prova va fatta con quello per il 2313, che nella libreria tiny c'è; rispondo con l'occasione a Leo:
- penso che essendoci tra i due solo differenze di memoria e del low fuse, non ci dovrebbero essere problemi di timer ecc., infatti dicendo al compilatore che stavo usanto una variante del 2313 lui ha eseguito tutto alla perfezione, quindi qui si tratta solo di fargli riconoscere il nome, vedremo con questo test di Astro; l'unico dubbio mi viene dal fatto che io tengo tutti il materiale extra ide 0022 in una cartella separata rispetto alla hardware originale, quindi mi devo ricordare anche di fare questa prova.

Sempre come chiarimento a Leo: nel frangente del -F si parlava di un micro che ha perso la signature e che io volevo provare a programmarlo, i fuse ovviamente erano a posto, quindi no-bricked, altrimenti a che mi serve l'HV?  ;)

@ Testato: Elettronica In regala tramite sito il firmware e i gerber per farsi i PCB; se poi dovessero decidere di farne un kit (ma ne dubito, dovrebbero avere un bordello di richieste) allora metteranno in vendita anche i soli PCB, di solito fanno così. Comunque ragazzi, a lavoro finito pubblico le caratteristiche, se mi fate sapere di essere interessati realmente alla costruzione, una volta che so quanti siete gli chiedo di farmi stampare "xx" copie dei vari PCB, mi faccio fare un preventivo e ve li giro; oppure (meglio ancora) gli dò i Vostri nominativi e ve li faccio spedire a casa in c/assegno, così ognuno potrà decidere di aggiungere qualche componente che non ha in casa. Ne riparliamo se vi fa piacere.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 16, 2012, 08:32 am

l'unico dubbio mi viene dal fatto che io tengo tutti il materiale extra ide 0022 in una cartella separata rispetto alla hardware originale, quindi mi devo ricordare anche di fare questa prova.


Io la prova l'ho fatta in questo modo, ho copiato in toto l'IDE 0023 in una nuova cartella denominata ide23_test, poi ho cancellato tutto il contenuto della cartella che contiene winavr e ho copiato al suo interno tutto il contenuto, meno avr32 che non serve, di quella del nuovo winavr.
Più tardi provo con il core del 2313, non mi ricordavo che c'era pure questo, e vediamo se compila correttamente.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 16, 2012, 08:44 am
Ora guardo il core Tiny, se con poco è possibile implementare il 4313.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 16, 2012, 09:14 am

Ora guardo il core Tiny, se con poco è possibile implementare il 4313.


Ottimo, allora aspetto il tuo verdetto prima di rifare il test.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 16, 2012, 09:32 am
In allegato trovate il core Tiny 0022 modificato per il supporto al 4313.
Scompattate l'archivio e sostituite la cartella ottenuta a quella presente in /hardware/tiny/cores.

A me compila senza problemi, però ho avr-gcc 4.3.5, tengo a precisare.
Dovete anche creare una board virtuale nel file /hardware/tiny/boards.txt.
Come test io ho usato questa:
Code: [Select]
###########################################################################

attiny4313at1.name=ATtiny4313 @ 1 MHz
attiny4313at1.upload.using=arduino:arduinoisp
#attiny2313at1.upload.using=pololu
attiny4313at1.upload.maximum_size=4096
attiny4313at1.bootloader.low_fuses=0x64
attiny4313at1.bootloader.high_fuses=0x9F
attiny4313at1.bootloader.extended_fuses=0xFF
attiny4313at1.bootloader.path=empty
attiny4313at1.bootloader.file=empty2313at1.hex
attiny4313at1.bootloader.unlock_bits=0x3F
attiny4313at1.bootloader.lock_bits=0x3F
attiny4313at1.build.mcu=attiny4313
attiny4313at1.build.f_cpu=1000000L
attiny4313at1.build.core=tiny
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 16, 2012, 09:37 am
Ottimo Leo e grazie, cambia solo LFuse=0x62, ormai li conosco a memoria :smiley-sweat:
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 16, 2012, 09:51 am

Ottimo Leo e grazie, cambia solo LFuse=0x62, ormai li conosco a memoria :smiley-sweat:

Ecco, quello è da ricontrollare perché ho fatto solo un copia-e-incolla dalla board del 2313 per fare la compilazione. Cmq i fuse sono inutili dato che vengon usati dall'IDE solo quando si programma il bootloader, e sui Tiny il bootloader non si mette per cui...
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 16, 2012, 09:59 am


Ottimo Leo e grazie, cambia solo LFuse=0x62, ormai li conosco a memoria :smiley-sweat:

Ecco, quello è da ricontrollare perché ho fatto solo un copia-e-incolla dalla board del 2313 per fare la compilazione. Cmq i fuse sono inutili dato che vengon usati dall'IDE solo quando si programma il bootloader, e sui Tiny il bootloader non si mette per cui...

Vero, è solo per una questione di "precisione" :)
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 16, 2012, 10:02 am

Ottimo Leo e grazie, cambia solo LFuse=0x62, ormai li conosco a memoria :smiley-sweat:

Per scrupolo ho ricontrollato col FuseCalculator. I fuse che ho messo io sono giusti  :P
$62 si usa per i Tinyx4/x5: per attivare il clock a 1 MHz con i Tinyx313 va bene $64  ;)

Il motivo è presto detto: i Tinyx313 hanno l'oscillatore interno che può andare a 4 o 8 MHz, a differenza degli altri Tiny. Il valore di $62 seleziona il clock a 4MHz/8, per il clock a 8MHz/8 ci vuole $64.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 16, 2012, 10:26 am
Hai ragione Leo, nel mio array ho messo il valore 62 perché l'ho preso da una Tabella che avevo a disposizione; mi sono fidato e ho fatto male, visto che è mia intenzione basarmi sui fuse che risultano come "default" su FuseCalc.
Ora cambio il valore nell'array. tnx :)
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 16, 2012, 10:42 am

In allegato trovate il core Tiny 0022 modificato per il supporto al 4313.
Scompattate l'archivio e sostituite la cartella ottenuta a quella presente in /hardware/tiny/cores.


Provato, adesso con la 0023, ma pure con la 1.0, si compila senza problema anche per i 4313.

Un piccolo aggiornamento relativo al trapianto della 4.3.3, per poter programmare il micro dall'IDE è necessario copiare la cartella etc, che contiene avrdude.conf, nella cartella dove si è copiato il nuovo winavr, o più semplicemente non cancellare quella originale, inoltre è necessario copiare avrdude.exe dalla cartella originale dell'IDE e sostituire quello presente nel nuovo winavr, non è modificato per Arduino e non riconosce le board.

Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 16, 2012, 10:44 am

Provato, adesso con la 0023, ma pure con la 1.0, si compila senza problema anche per i 4313.

L'unica prova da fare è vedere se poi il codice compilato funziona  ;)
Non ho 4313 per cui non ho potuto provare.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 16, 2012, 10:55 am

L'unica prova da fare è vedere se poi il codice compilato funziona  ;)
Non ho 4313 per cui non ho potuto provare.


Idem, al limite posso allegare il file .hex generato e se Michele ha un 4313 funzionante lo prova lui, però a questo punto deve riuscire per forza di cose a compilare per il 4313 se ha scaricato la giusta release di WinAvr.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 16, 2012, 11:03 am


In allegato trovate il core Tiny 0022 modificato per il supporto al 4313.
Scompattate l'archivio e sostituite la cartella ottenuta a quella presente in /hardware/tiny/cores.


Provato, adesso con la 0023, ma pure con la 1.0, si compila senza problema anche per i 4313.

Un piccolo aggiornamento relativo al trapianto della 4.3.3, per poter programmare il micro dall'IDE è necessario copiare la cartella etc, che contiene avrdude.conf, nella cartella dove si è copiato il nuovo winavr, o più semplicemente non cancellare quella originale, inoltre è necessario copiare avrdude.exe dalla cartella originale dell'IDE e sostituire quello presente nel nuovo winavr, non è modificato per Arduino e non riconosce le board.

infatti questa cosa dell'etc l'avevo notata perché non trovavo più l'AVRDUDE.CONF nel quale peraltro (anche il nuovo) non c'è comunque traccia del 4313. Comunque appena finisco il programma faccio un po' di prove :)
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 16, 2012, 11:06 am

infatti questa cosa dell'etc l'avevo notata perché non trovavo più l'AVRDUDE.CONF nel quale peraltro (anche il nuovo) non c'è comunque traccia del 4313. Comunque appena finisco il programma faccio un po' di prove :)


Non c'è traccia perché la versione di avrdude allegata è la stessa di quella precedente, però dovrebbe bastare modificare il file .conf per introdurlo, anche se tocca un attimo vedere con cosa lo vai programmare effettivamente, avrdude è solo un programma che fornisce i comandi ad un programmatore hardware, non è lui che programma fisicamente il micro.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 16, 2012, 11:23 am

infatti questa cosa dell'etc l'avevo notata perché non trovavo più l'AVRDUDE.CONF nel quale peraltro (anche il nuovo) non c'è comunque traccia del 4313.


Ed ecco un bel regalone, avrdude.conf modficato per il 4313, ora non da più nessun errore e cerca di trasferire il programma sul micro, qui mi fermo con un classico "not in sync" perché non avendo il micro non posso fare altri test.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 16, 2012, 11:48 am
XD XD XD pomeriggio faccio le dovute prove, è il minimo che possa fare per quanto impegno state mettendo :smiley-sweat: Grazie!
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 16, 2012, 12:50 pm
Ho provato con successo il comando
Code: [Select]
Serial.print("\033[2J"); (Grazie Astro XD), ma possibile che non esista un comando equivalente per il Serial Monitor dell'IDE? Ho provato un Serial.clear(); ma mi ha preso a ceffoni  :smiley-sad-blue:
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 16, 2012, 12:53 pm

ma possibile che non esista un comando equivalente per il Serial Monitor dell'IDE? Ho provato un Serial.clear(); ma mi ha preso a ceffoni  :smiley-sad-blue:


Pare di no, il serial monitor non è una vera emulazione terminale, p.e. VT100, e non supporta i vari comandi previsti per questi.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 16, 2012, 01:05 pm
Ho dato una sbirciatina al sorgente java del serial monitor, non è previsto nessun comando per cancellare lo schermo e nemmeno uno per riposizionare il cursore.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 16, 2012, 01:21 pm
va bene, pazienza, tanto alla fine userò hypertermial, il tuo vLCD ed un display 20x4  :)
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 16, 2012, 02:12 pm
... ah se qualcuno mi avesse dato un pò di feedback su arduopen per windows :D
se non ricordo male arduopen x windows aveva già il winavr recente, il file avrdude.conf aggiornato e le board già fatte per il 4313, avevo anche cambiato il normale avrdude con un'altra versione in grado di fare bitbang dell'spi conla seriale e che supportava più micro.
A puro titolo inforativo:
Il file avrdude.conf può stare sia nella sua cartella etc sia insieme all'eseguibile avrdude.exe, anzi credo che quando parte, l'eseguibile cerchi il file di cofigurazione prima della sua stesa cartella e poi su etc . (credo che sia ancora così).
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 16, 2012, 02:55 pm
e c'hai ragione su ArduOpen  :~ comunque chiarisco che io non devo programmare il 4313, ce l'ho e voglio usarlo come test-chip assieme ad un'altra decina di mcu che sto impiegando sul mio programmer per verificare che funzioni tutto, pare che ci siamo finalmente!

Ora studio il lock_bit e decido se implementarlo o meno

Poi faccio le Astro-prove col 4313  :D

a dopo ;)
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Mar 16, 2012, 03:02 pm
@Brain:
mi spiace di non aver provato a fondo ArduOpen ma all'epoca iniziaste a portare avanti solo lo sviluppo della sola versione per Windows lasciando indietro quella per Linux, e non lo usai per questo motivo. Poi mi misi a spippolare con i vari core in circolazione e l'interesse per ArduOpen mi passò.
Title: Re: Topic permanente di programmazione newbie
Post by: amario57 on Mar 16, 2012, 03:57 pm
Girovagando per la rete cercando avrdude ho trovato questo sito, purtroppo in giapponese, dove credo ci siano programmi interessanti, ma non riesco a capire dove scaricarli  :(

http://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/index.php?cmd=read&page=AVR%2Favrdude39&word=AVR%2Favrdude%20gui#fc809ea6
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 16, 2012, 03:59 pm

Girovagando per la rete cercando avrdude ho trovato questo sito, purtroppo in giapponese, dove credo ci siano programmi interessanti, ma non riesco a capire dove scaricarli  :(

http://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/index.php?cmd=read&page=AVR%2Favrdude39&word=AVR%2Favrdude%20gui#fc809ea6


da cosa hai dedotto che i programmi sono interessanti?
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 16, 2012, 04:32 pm
;) amario ci ha visto giusto, la versione di avrdude che avevo incluso in arduopen x windows veniva di là
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 16, 2012, 04:40 pm


Provato, adesso con la 0023, ma pure con la 1.0, si compila senza problema anche per i 4313.

L'unica prova da fare è vedere se poi il codice compilato funziona  ;)
Non ho 4313 per cui non ho potuto provare.

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

@ BB: cioè? hai il sito ufficiale perché te la sei dovuta recuperare da un sito giapponese? :smiley-eek:
Title: Re: Topic permanente di programmazione newbie
Post by: amario57 on Mar 16, 2012, 04:48 pm


Girovagando per la rete cercando avrdude ho trovato questo sito, purtroppo in giapponese, dove credo ci siano programmi interessanti, ma non riesco a capire dove scaricarli  :(

http://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/index.php?cmd=read&page=AVR%2Favrdude39&word=AVR%2Favrdude%20gui#fc809ea6


da cosa hai dedotto che i programmi sono interessanti?


perché so un po' di giapponese   :D ....
stavo invece cercando avrdude-GUI, che ho trovato nella versione 1.0.5 e li ho visto che appariva una fantomatica versione 1.4.4 , credo più aggiornata, ma non ho capito come scaricarla, perché il giapponese lo capisco in forma orale ma non lo so leggere  ;)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 16, 2012, 05:15 pm
@ Testato: dal reference del mega328:
Quote
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:
Quote

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? ;)
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 16, 2012, 05:52 pm
Quote
@ 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..
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 16, 2012, 05:52 pm

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  :)
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Mar 16, 2012, 06:02 pm
è vero anche nel mio caso naruto docet  :smiley-yell: per lo scritto c'è san google ( o google san  :smiley-mr-green:) .
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 16, 2012, 06:02 pm

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.

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 16, 2012, 06:11 pm


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 $))
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 16, 2012, 06:14 pm

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
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 16, 2012, 06:36 pm


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 :smiley-eek-blue: 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 :smiley-roll-sweat:
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 16, 2012, 06:43 pm

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.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 16, 2012, 06:57 pm


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
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Mar 16, 2012, 07:02 pm

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


Yes.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Mar 17, 2012, 09:53 am
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 :smiley-eek-blue:), 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...
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 05, 2012, 06:35 pm
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 :smiley-red: 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 :)
Title: Re: Topic permanente di programmazione newbie
Post by: ratto93 on Apr 05, 2012, 06:53 pm
Se non hanno cambiato il codice ASCII l'altro giorno dovrebbe funzionare allo stesso modo  XD
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 05, 2012, 07:17 pm

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:
Code: [Select]
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.
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Apr 05, 2012, 07:34 pm
(spazio permettendo) si poteva anche convertire tutto in striga e usare gli appositi operatori
http://arduino.cc/en/Tutorial/StringCaseChanges
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 05, 2012, 07:43 pm

(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 :smiley-mr-green:; Comunque la funzione che mi risolve il problema di maiuscole/minuscole nella conversione a HEX è:
Code: [Select]
/************************ 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.
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Apr 05, 2012, 07:50 pm
spiega meglio cosa passa e cosa vuoi filtrare
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 05, 2012, 08:10 pm
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.
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Apr 05, 2012, 08:32 pm
con if potresti fare esattamente quello che  hai detto :)
mettiamo che il carattere in entrata si chiami c
Code: [Select]

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 :)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 05, 2012, 08:44 pm
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
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Apr 05, 2012, 08:45 pm
perchè deve rileggere un carattere sbagliato?
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 05, 2012, 08:55 pm
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ì:
Code: [Select]
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:
Code: [Select]
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

Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Apr 05, 2012, 09:05 pm
usare char?
http://arduino.cc/it/Reference/Char
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 05, 2012, 10:49 pm
l'avevo visto ma sul mio manualetto non dice niente, ora ho visto che è proprio ciò che mi serve. Ma così mi funziona esattamente al rovescio, come faccio ad invertire la logica del while:
Code: [Select]
do {
    while (Serial.available() == 0);   // aspetta il primo carattere
    r = char(Serial.read());
  } while ((r>=48 && r<=57) || (r>=65 && r<=70) || (r>=97 && r<=102));
  serbuffer[0] = Serial.read();      // lo imposta come HIGH byte del fuse
 
  do {
    while (Serial.available() == 0);   // aspetta il primo carattere
    r = char(Serial.read());
  } while ((r>=48 && r<=57) || (r>=65 && r<=70) || (r>=97 && r<=102));
  serbuffer[1] = Serial.read();      // lo imposta come HIGH byte del fuse
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 05, 2012, 11:29 pm

ai miei tempi :smiley-red: mi pare che sommavo in basic 32 al minuscolo per ottenere il maiuscolo,

No si sommava 32 per passare da maiuscolo a minuscolo, oppure l'inverso cioè si sottraeva 32 per passare da minuscolo a maiuscolo. Questo perché A=65, a=97  ;)

Tornando al tuo problema, tu devi fare la conversione di un dato esadecimale in decimale. Se ad esempio ti arriva E2 devi convertirlo in 226, ma non puoi farlo come pensi tu. Cioè la conversione da esadecimale a decimale si fa con
(valore del 1° carattere*16)+valore del 2° carattere.
Quindi E*16+2 -> 14*16+2 -> 224+2 = 226

Io allora farei così

Code: [Select]
char carattere;
byte contatore=2;
byte risultato=0;
while (contatore) { //loop finché non sono arrivati 2 cifre
  if (Serial.available()) {
    carattere=Serial.read();
    if ((carattere>='0') && (carattere<='9')) { //cifra numerica
      contatore--;
      risultato+=(carattere*(contatore>0?16:1)); //sommo il valore esadecimale
     
    } else if ((carattere>='A') && (carattere<='F')) { //
      contatore--;
      risultato+=(carattere-55)*(contatore>0?16:1); //A=65 -> 65-55=10 ecc..
    } else if ((carattere>='a') && (carattere<='f')) {
      contatore--;
      risultato+=(carattere-87)*(contatore>0?16:1); //a=97 -> 97-87=10 ec...
    }
  }
}


In questo modo dovrebbe funzionare. Dovrebbe leggere 2 cifre, e continuare a leggere finché il carattere ricevuto non ricade nell'intervallo 0-9, oppure A-F oppure a-f. "contatore" serve per eseguire il ciclo solo 2 volte (2 cifre), viene anche usato per la conversione in questo modo: all'avvio vale 2, se si riceve un carattere valido, passa a 1, poi viene moltiplicato per 16 ed il risultato moltiplicato per il valore ricevuto. Vien da sé che l'operatore condizionale su contatore quando vale 1 dia 16 mentre quando vale 0 (caso della seconda cifra), dia come risultato 1.
Non so nemmeno se compila, l'ho scritta di getto
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 05, 2012, 11:46 pm
No, Leo, la mia situazione è molto più semplice, io non devo controllare la validità del valore esadecimale, semplicemente devo impedire di comporlo usando caratteri diversi da quelli previsti. Ciò che faccio è:
leggo il primo carattere
se non è 0-9, A-F, a-f rileggo il carattere
quando il carattere è corretto lo memorizzo
faccio lo stesso col secondo carattere alla fine ottengo due caratteri, p.es. F9 che passo alla procedura di scrittura del fuse. Quindi il code che ho postato prima funziona benissimo, ma al rovescio, cioè mi accetta SOLO i caratteri diversi da quelli che mi servono.
Come faccio ad invertire la logica del do-while?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 05, 2012, 11:55 pm
Anche il mio codice fa questo, forse non l'ho spiegato bene.
Tornando al tuo, mi pare che non vada bene:

Code: [Select]

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

Nel momento in cui esci dal ciclo do..while perdi il carattere che leggevi e memorizzi il secondo in arrivo. Questo perché la Serial.read preleva materialmente dal buffer seriale il carattere che leggi, perdendolo del tutto se non lo memorizzi. Ma tu l'hai memorizzato in "r", quindi metti quello direttamente in serbuffer[0] oppure usi Serial.peek() (http://arduino.cc/en/Serial/Peek) che ti dice qual è il prossimo carattere che viene prelevato dal buffer: in pratica lo leggi ma non lo togli dal buffer.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 05, 2012, 11:58 pm
Prova così:
Code: [Select]
while (true) {
  r=Serial.read();
  if ((r>=48 && r<=57) || (r>=65 && r<=70) || (r>=97 && r<=102)) {
    break;
  }
}
serbuffer[0]=r;
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 06, 2012, 12:05 am
Allora, della spiegazione del tuo codice non ho capito niente, e il mio stato psico-fisico attuale non mi aiuta :smiley-sad-blue:

chiari invece i suggerimenti peek e r, ma correggimi se sbaglio:
il mio codice resta in attesa di un carattere dalla seriale fintanto che il carattere ricevuto rientra in quelli scritti nel while, che è esattamente l'opposto di ciò che voglio ottenere.
Cioè lui legge il carattere, se è 0-9, A-F, a-f lo ignora e si rimette in lettura, mentre io devo proseguire quando il carattere letto è appunto uno di quelli che mi aspetto.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 06, 2012, 12:16 am
Non è che lo ignora, semplicemente esci dal ciclo do..while quando arriva un carattere giusto (corretto) poi però va a leggere un'altra volta dalla seriale (sbagliato): in questo modo memorizzi il carattere successivo. Hai provato col codice che ti ho messo nel 2° post?

Intanto vado a dormire, dopo 2 notti insonni causa influenza non ce la faccio più  :smiley-roll-blue:
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 06, 2012, 12:19 am

Non è che lo ignora, semplicemente esci dal ciclo do..while quando arriva un carattere giusto (corretto) poi però va a leggere un'altra volta dalla seriale (sbagliato): in questo modo memorizzi il carattere successivo. Hai provato col codice che ti ho messo nel 2° post?

Intanto vado a dormire, dopo 2 notti insonni causa influenza non ce la faccio più  :smiley-roll-blue:

certo che ho provato: se scrivo DF non dà segni di vita, se scrivo XX invece va avanti, ecco perché credo che invece lavori all'opposto. buonanotte, ne riparliamo domattina, non ti preoccupare, vado a riposare anch'io tra qualche minuto.
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Apr 06, 2012, 06:17 am
allora prova così: ti crei un indice (i) e serbuffer diventa un array con i caratteri ricevuti
Code: [Select]

if (Serial.available() > 0) {  //ci sono dei caratteri sulla seriale
 r=Serial.read();
 if ((r>=48 && r<=57) || (r>=65 && r<=70) || (r>=97 && r<=102)) { //se sono interessanti
   serbuffer[i]=r;    //li mettiamo nell'array
i++; //e passiamo a riempire il posto successivo
 }
else{  //altrimenti
Serial.print("carattere non valido");  // se non sono caratteri interessanti lo notifichiamo con un messaggio (rimuovibile)
}
 }


il controllo lo farai sull'ultimo carattere di serbuffer che se diverso da zero= (buffer pieno di caratteri validi) e usabili.
cancellerai serbuffer dopo l'uso per prepararlo a ricevere nuovi dati.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 06, 2012, 09:31 am
buono :) ora provo. grazie
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 06, 2012, 10:28 am
Solo ora mi rendo conto che se invece del Terminal di Win qualcuno usasse il serial monitor sarebbe un problema, in quanto questo ha un buffer in cui si può scrivere il fuse e poi dare invio e a questo punto sarebbe problematico gestirlo. Ma la cosa più importante è che il progetto integrale prevede la tastiera esadecimale, quindi il problema poi si risolve da solo. :)

Ora chiudo lo sketch per il terminal ed inizio a lavorare alla versione per LCD 4x20, quindi il Topic sarà ancora molto attivo.....
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 07, 2012, 03:29 pm
Finito! seguendo i saggi consigli del buon Leo, maestro d'arte programmatoria XD, ho realizzato un semplice protocollo di comunicazione seriale tra due micro. In pratica uno è quello che gestisce tutta la programmazione HV e l'altro invece controlla il keypad esadecimale ed il display LCD, sono collegati col classico scambio tx1/rx2 e rx1/tx2; molto semplicemente ho usato 5 caratteri "speciali" per controllare il clear e il posizionamento del cursore, caratteri che nel firmware del master antepongo alle stringhe di testo inviate con Serial.print.... Qualche esempio:
1 - sul master inserisco il comando Serial.print("$menu principale"); - l'altro micro effettua un clear del display($) e poi fa apparire sulla prima riga la scritta "menu principale";

2 - sul master inserisco il comando Serial.print("$%scrittura"); - l'altro micro effettua un clear del display($), poi si posiziona sulla terza riga (%) e su questa scrive "scrittura";

Semplice e comodissimo! Ad onor del vero Leo mi aveva suggerito una cosa "un po'" più professionale, con tanto di inizio e fine trasmissione, ma era fuori dalla mia portata, mi è bastato aggiungere invece alla fine del mio mini-protocollo un controllo che bloccasse la maggior parte dei caratteri strani e ho risolto.

In tutto ciò un colpo di coda della Legge di Murphy: il tx del micro del display disturbava (tanto per cambiare) la programmazione HV, in quanto sul master purtroppo sono usate anche le linee seriali; ho risolto disaccoppiandolo con una R in serie al segnale e tutto è andato bene. Ora devo solo implementare la gestione dei lock_bit, ma prima devo scrivere la seconda puntata..... :D
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 07, 2012, 06:42 pm

Finito! seguendo i saggi consigli del buon Leo, maestro d'arte programmatoria XD, ho realizzato un semplice protocollo di comunicazione seriale tra due micro.

Troppo buono  :smiley-sweat:

Code: [Select]
Ad onor del vero Leo mi aveva suggerito una cosa "un po'" più professionale, con tanto di inizio e fine trasmissione
Beh, vista la semplicità della comunicazione, forse era sovraccarico del codice che a te non serviva  ;)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 08, 2012, 11:08 am


Finito! seguendo i saggi consigli del buon Leo, maestro d'arte programmatoria XD, ho realizzato un semplice protocollo di comunicazione seriale tra due micro.

Troppo buono  :smiley-sweat:

no, senza il tuo suggerimento starei ancora impazzendo , invece me la sono cavata sfruttando una giornata di influenza trascorsa forzatamente a casa :)
Quote

Quote
Ad onor del vero Leo mi aveva suggerito una cosa "un po'" più professionale, con tanto di inizio e fine trasmissione

Beh, vista la semplicità della comunicazione, forse era sovraccarico del codice che a te non serviva  ;)

Vero, in realtà, avendo creato una copia del firmware specifica per tastiera ed lcd, non ho particolari incognite oltre a qualche disturbo seriale. Comunque ho scoperto che tra tutti i micro ATMEl i 2313 sono dei ces.. ehm, i più delicati, perdono la signature che è una bellezza; ora che ho quasi messo in ordine devo riprendere la versione di BB che mi permette di programmarli comunque; alla prima occasione ci butto un firmware e li pianto su un PCB, non ne compro mai più! Invece nessun problema con i 4313
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 15, 2012, 08:07 pm
E' arrivato il momento di implementare la gestione dei Lockbits nel firmware del Programmatore HV; inizio dalla versione HVSP. In realtà non ho un problema legato alla procedura di programmazione lettura e scrittura, perché il meccanismo è simile a quello di fuse, signature e chip erase che già funzionano senza problemi.
Spiego la questione Lock bits (rif. pag.151 Reference tiny25/45/85): si tratta di un BYTE in cui si devono considerare solo i due bits meno significativi (0 e 1), mentre gli altri sono "non programmabili). Sono possibili tre coppie di valori:
11 mode 1 : chip "libero" da blocchi
10 mode 2 : chip con blocco in scrittura della flash e della EEPROM anche in modalità HV
00 mode 3 : chip con blocco in scrittura e verifica della flash e della EEPROM anche in modalità HV

Per modificare il valore iniziale 11 in 10 o 00 devo ricorrere ad una serie di 5 byte, forniti al micro tramite apposita sequenza di comandi (qui mostro le definizioni):
#define HVSP_LOCKB_WRITE_DATA      B00100000  // Comando di scrittura LOCK BITS
#define HVSP_LOCKB_WRITE_INSTR1    B01001100  // Istruzione 1
#define HVSP_LOCKB_WRITE_INSTR2    B00101100  // Istruzione 2
#define HVSP_LOCKB_WRITE_INSTR3    B01100100  // Istruzione 3
#define HVSP_LOCKB_WRITE_INSTR4    B01101100  // Istruzione 4
Insieme alla seconda istruzione devo inviare il BYTE del LB:
#define HVSP_LOCKB_WRITE_VALUE     B00000000
Variando le ultime due cifre a destra in: 11, 10, 00

La lettura invece richiede solo 4 byte.

Finora ho provato ad inviare direttamente il BYTE in formato B000000xx (come da Reference tabella 20-16 pag.164) e ottengo questi dati:
11 = FF; 10 = FE; 00 = FC
Mi sembravano sballati ma in realtà se pensiamo che i bits  non programmabili siano = 1 (invece di 0) allora abbiamo:
FF = B11111111; FE = B11111110; FC = B11111100.

Domanda: è corretta questa interpretazione? Se la risposta è "sì" sta funzionando tutto, poi passiamo all'ulteriore chiarimento.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 15, 2012, 10:52 pm
Sì, è corretto perché nei fuse un bit ad 1 significa "NON impostato" mentre un bit a 0 significa "impostato".
Quindi 0b11111111 è il valore corretto per un byte che ha tutti i lock bit NON impostati mentre 0b11111100 è per i lock bit attivi alla massima protezione.

Credo dipenda dal fatto che si usino le celle di memoria in modalità "raw", cioè "grezza". Se ci pensi ha una sua logica dato che una EEPROM o una FLASH non programmata (o appena erasata) ha tutti i suoi byte a $FF, quindi una cancellazione pone i singoli bit ad 1. Non so il motivo elettrico, forse porre in conduzione l'elemento della cella richiede un lavoro inferiore.
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Apr 15, 2012, 10:56 pm
e' corretto
perche' nella verifica dei bit non programmabili il risultato sara' NonAttivo, che nel mondo dei fuse si identifica con 1 e non con 0
questo significa che sono invertti anche i risultati, cioe' FF significhera' 11 tutto protetto ??
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 15, 2012, 11:33 pm
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).

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?

Terzo quesito: il comando
Code: [Select]
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
Code: [Select]
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'è.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 16, 2012, 06:45 am

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).

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.

Quote

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.

Quote

Terzo quesito: il comando
Code: [Select]
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
Code: [Select]
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.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 16, 2012, 09:42 am
Chiarimenti:
Non ricordo il documento e francamente non ho provato a passare da FE a FC, da fare. :)

La domanda sul funzionamento dei LB era retorica, infatti lo vedi dal codice che avevo postato in basso che so bene qual è la loro funzione; la domanda finale era: a che serve la protezione se poi posso sovrascrivere via ISP? Io capisco che non riuscirò a leggere (a proposito, qualcosa per testare la lettura?), e capisco che chip_erase resetta tutto, ma perché mi fa scrivere tranquillamente con la write protect settata? :smiley-roll-sweat:

Quote

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.

Un esempio? Non ho capito niente. :smiley-sad-blue:

Intanto ho completato la procedura di implementazione, ora leggo e scrivo i LB in HVSP, HVPP e HVP13; mi manca solo il controllo, che risolvo appunto appena capisco questo tuo suggerimento.  :D
Ho già creato le due versioni PC e LCD (qui sudori a vasche per farci entrare tutto, ma è ok).

L'ultimo passaggio che volevo fare è fornire il vLCD di Astro come interfaccia PC, ma non ricordo più a che punto era; in realtà su PC però vorrei usare una simulazione 6x40, che mi permette di non stravolgere il firmware PC; fattibile? :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 16, 2012, 10:16 am

Chiarimenti:
Non ricordo il documento e francamente non ho provato a passare da FE a FC, da fare. :)

http://www.avrfreaks.net/index.php?func=viewItem&item_id=301&module=Freaks%20Tools

Quote

La domanda sul funzionamento dei LB era retorica,

Ponevi 3 quesiti, ho risposto a tutti altrimenti dici sempre che non ti ascoltiamo  :P

Quote

infatti lo vedi dal codice che avevo postato in basso che so bene qual è la loro funzione; la domanda finale era: a che serve la protezione se poi posso sovrascrivere via ISP? Io capisco che non riuscirò a leggere (a proposito, qualcosa per testare la lettura?), e capisco che chip_erase resetta tutto, ma perché mi fa scrivere tranquillamente con la write protect settata? :smiley-roll-sweat:

Uhm... o non spedisci il valore corretto, per cui in realtà non proteggi la memoria oppure i lock bit non funzionano  :smiley-sweat:
Che chip stai cercando di proteggere?

Quote

Quote

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.

Un esempio? Non ho capito niente. :smiley-sad-blue:

Si tratta dell'AND binario.
1 AND 1 = 1
0 AND 1 = 0
1 AND 0 = 0
0 AND 0 = 0
In pratica, hai 1 se e soltanto se entrambi i bit sono ad 1.
Una "maschera" AND serve appunto ad avere come risultato 1 solo quando un bit della maschera settato ad 1 incontra un bit del valore da testare anch'esso ad 1.
Quindi, visto che il byte che regola i fuse tiene conto solo dei primi 2 bit,
facendo
BYTE_FUSE && 0b00000011
ottieni i soli primi 2 bit, senza fregartene del contenuto del resto del byte, che può avere qualunque valore tanto il risultato dell'AND tra i suoi bit e la maschera sarà sempre 0.

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 16, 2012, 10:34 am
Se il ragionamento di ieri è giusto sono giusti anche i LB; la prova è che se setto i LB su FE o FC non riesco più a programmare i Fuse, devo per forza fare un chip erase. Ho provato con tiny84, sia FC che FE mi permettono di riprogrammarlo via ISP, anche se mi viene ora un onesto dubbio: ieri quando cambiavo i fuse la procedura veniva eseguita correttamente, ma poi alla verifica vedevo i valori inalterati, mentre ieri al tiny mandavo sempre lo stesso sletck, non vorrei che facesse finta di ricevere i dati, le linee ISP lavoravano come sempre e l'IDE mi ha dato il done, quindi mi sono fidato di ciò. Stasera approfondisco con un 328 ed un 4313, per avere l'intero arco chiaro.

Sul tuo suggerimento purtroppo non capisco come posso risolvere, scusa ma: se "stampo" a video il contenuto della variabile in forma HEX vedo i valori FF, FE, FC, in qualsiasi altra forma mi da spazio vuoto, io vorrei riuscire a leggere questa variabile e confrontarla fisicamente con uno dei possibili valori per attribuire anche la descrizione dello status. Tu dici che se faccio qualcosa come:
if LOCKB && 0b00000011 = 0b00000011 ; Serial.print("Free");
funziona? ma se è così non posso direttamente fare:
if BYTE(LOCKB) = 0b00000011 ; Serial.print("Free");
?

Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 16, 2012, 10:48 am

Se il ragionamento di ieri è giusto sono giusti anche i LB; la prova è che se setto i LB su FE o FC non riesco più a programmare i Fuse, devo per forza fare un chip erase. Ho provato con tiny84, sia FC che FE mi permettono di riprogrammarlo via ISP, anche se mi viene ora un onesto dubbio: ieri quando cambiavo i fuse la procedura veniva eseguita correttamente, ma poi alla verifica vedevo i valori inalterati, mentre ieri al tiny mandavo sempre lo stesso sletck, non vorrei che facesse finta di ricevere i dati, le linee ISP lavoravano come sempre e l'IDE mi ha dato il done, quindi mi sono fidato di ciò. Stasera approfondisco con un 328 ed un 4313, per avere l'intero arco chiaro.

Ah, allora potrebbe benissimo darsi che ti dice che ha programmato ma non l'ha fatto.
E' facile, basta mandare un blink col led su un pin, poi blocchi il micro e mandi un blink con un led diverso. Se il secondo non lampeggia, ha funzionato tutto.

Quote

Sul tuo suggerimento purtroppo non capisco come posso risolvere, scusa ma: se "stampo" a video il contenuto della variabile in forma HEX vedo i valori FF, FE, FC, in qualsiasi altra forma mi da spazio vuoto, io vorrei riuscire a leggere questa variabile e confrontarla fisicamente con uno dei possibili valori per attribuire anche la descrizione dello status. Tu dici che se faccio qualcosa come:
if LOCKB && 0b00000011 = 0b00000011 ; Serial.print("Free");
funziona? ma se è così non posso direttamente fare:
if BYTE(LOCKB) = 0b00000011 ; Serial.print("Free");
?

Ma tu ti eri messo ad usare switch su stringhe, aumentando il carico sulla memoria.
Se allora fai uno switch tipo:
Code: [Select]
switch (LOCKB && 0b00000011) {
  case: 3 //libero
    ....
    break;
  case 1: //solo lettura
    ...
    break;
  case 0: //protezione totale
    ...
    break;
}
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 16, 2012, 10:52 am
Sì, faccio la prova del "doppio" blink e speriamo bene.

Ok, ora ho capito: 3, 1, 0 sono il decimale del byte e li uso come Case; bene, per ora sono a posto, stasera provo e posto.

Grazie Maestro  XD
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 16, 2012, 11:17 am

Sì, faccio la prova del "doppio" blink e speriamo bene.

E' il test più semplice da fare.

Quote

Ok, ora ho capito: 3, 1, 0 sono il decimale del byte e li uso come Case; bene, per ora sono a posto, stasera provo e posto.

Sì, 3, 1 e 0 sono il decimale rispettivamente dei valori binari 0b00000011, 0b00000001 e 0b00000000.
Puoi mettere case 0b00000011 al posto di case 3, non cambia nulla.

Quote

Grazie Maestro  XD

Ma dai  XD
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 16, 2012, 07:48 pm
Primi aggiornamenti:
-Confermo che la programmazione dei LB si può eseguire da un livello al successivo ma non in senso contrario: FF->FE->FC, quindi se passo da FF a FE, poi posso ancora passare a FC, se passo da FF a FC, non posso più tornare a FE.

-La brutta notizia è che anche in protezione FC (massima) riesco tranquillamente a scrivere uno sketch via ISP, sovrascrivendo il precedente; questa operazione naturalmente riporta i LB a FF (condizione free); servirebbero spiegazioni.....
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Apr 16, 2012, 08:24 pm
la board ?

Quote
uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 16, 2012, 08:58 pm
Ma credo sia ininfluente, sto lavorando sul tiny84, i valori erano entrambi su FF, ho messo:
attiny84at1.bootloader.unlock_bits=0xFF
attiny84at1.bootloader.lock_bits=0xFC
ma non cambia assolutamente nulla, con i LB impostati su FC si programma e i LB si resettano a FF.
MI viene il dubbio che il fimrware ArduinoISP possa avere implementato il chip_erase (che mi risulta si possa eseguire anche via software).
Boh, davvero non ne comprendo la logica. Ora provo anche un 328 in HVPP, vediamo.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 16, 2012, 10:16 pm
@Mike:
invia lo sketch in modalità "verbose", ossia premendo contemporaneamente il tasto SHIFT mentre clicchi sull'icona UPLOAD e guarda tra le prime righe che compaiono nel terminale dell'IDE i parametri che vengono passati ad avrdude, postali qui per capire se passa l'erase del chip mentre invia i firmware al micro, almeno capiamo cosa succede
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 16, 2012, 10:19 pm

@Mike:
invia lo sketch in modalità "verbose", ossia premendo contemporaneamente il tasto SHIFT mentre clicchi sull'icona UPLOAD e guarda tra le prime righe che compaiono nel terminale dell'IDE i parametri che vengono passati ad avrdude, postali qui per capire se passa l'erase del chip mentre invia i firmware al micro, almeno capiamo cosa succede

mentre faccio upload del blink?
Code: [Select]

avrdude -CC:\arduino-0022\hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328p -cstk500v1 -P\\.\COM60 -b19200 -Uflash:w:C:\DOCUME~1\DOTT~1.MIC\IMPOST~1\Temp\build1887152033353859677.tmp\Blink_FAST.cpp.hex:i
Using Port            : \\.\COM60
         Using Programmer      : stk500v1
         Overriding Baud Rate  : 19200
avrdude: ser_open(): setting dtr
avrdude: Send: 0 [30]   [20]
avrdude: Send: 0 [30]   [20]
avrdude: Send: 0 [30]   [20]
avrdude: Recv:
avrdude: Recv:
         AVR Part              : ATMEGA328P
         Chip Erase delay      : 9000 us
         PAGEL                 : PD7
         BS2                   : PC2
         RESET disposition     : dedicated
         RETRY pulse           : SCK
         serial program mode   : yes
         parallel program mode : yes
         Timeout               : 200
         StabDelay             : 100
         CmdexeDelay           : 25
         SyncLoops             : 32
         ByteDelay             : 0
         PollIndex             : 3
         PollValue             : 0x53
         Memory Detail         :

nei dettagli del micro quel chip erase delay non mi dice nulla di buono :(
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Apr 16, 2012, 11:15 pm
Qui si sta scoprendo qualcosa di interessante  :)
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 17, 2012, 07:09 am

nei dettagli del micro quel chip erase delay non mi dice nulla di buono :(

Non ti preoccupare, quelli sono i parametri che avrdude ha nel file avrdude.conf relativamente al chip che sta gestendo, quindi è un sunto di tutto, anche di ciò che non usa in quel particolare momento.
La riga che ci interessa è questa:
Quote
avrdude -CC:\arduino-0022\hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328p -cstk500v1 -P\\.\COM60 -b19200 -Uflash:w:C:\DOCUME~1\DOTT~1.MIC\IMPOST~1\Temp\build1887152033353859677.tmp

I parametri sono:
-v -v -v -v: specifica una modalità "super verbose", ossia che manda a video qualsiasi messaggio generato
-patmega328p: specifica atmega328p
-cstk500v1: specifica il tipo di programmatore (stk500v1 è l'emulazione che offre l'ArduinoISP)
-P\\.\COM60: porta usata
-b19200: velocità
-Uflash:w:C:\.....: fimware usato e memoria programmata, ossia la flash

Quindi, non c'è nessun dettaglio relativamente alla cancellazione del chip, che sarebbe il parametro -e, che opera un erase totale della flash, della eeprom e dei fuse del micro. Il parametro "-e" dovrebbe essere usato dall'IDE solo quando programma il bootloader.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 17, 2012, 09:04 am
Boh, l'unico dato certo è che con le opzioni FE o FC non riesco più a programmare i fuse, segno che i lb stanno funzionando, niente da fare invece sulla questione programmazione, gli sketch passano che è una bellezza.
Sarebbe interessante il parere di qualcuno che li ha usati, ma ho idea che non c'è nessuno.
Comunque stanotte ho terminato i due firmware (PC e LCD) con la gestione lettura/scrittura dei Lock bits, la procedura funziona, non posso entrare nel merito del funzionamento dei lb, anche se mi piacerebbe capirlo.

Avevo chiesto se avete un qualcosa di semplice con cui possa "leggere" il contenuto della flash del micro, naturalmente non mi interessa alcuna estrapolazione o traduzione di codice, solo capire se almeno la lettura viene impedita.

Ora mi dedico ad altre cosette, tra qualche giorno (devo smaltire :smiley-sad-blue:) riprendo tutto e scrivo il terzo ed ultimo articolo sull'HV.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 17, 2012, 09:44 am

Boh, l'unico dato certo è che con le opzioni FE o FC non riesco più a programmare i fuse, segno che i lb stanno funzionando, niente da fare invece sulla questione programmazione, gli sketch passano che è una bellezza.

Non so che dirti, non ho ancora avuto mai il modo di doverli usare.
So solo che anche l'IDE di Arduino li programma (basta aprire il file boards.txt per vedere la voce dei lockbit).
Mi viene da pensare che un "programmatore" software qual è l'ArduinoISP non riesca a compiere l'operazione, e che forse ci vorrebbe un programmatore "vero".
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Apr 17, 2012, 10:31 am
Astro Astro Astro

(chiamato a gran voce stile "Il Gladiatore")
:) :) :)
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Apr 17, 2012, 10:37 am
sorry ma sono di fretta :)
date una lettura a questo documento:
http://www.avrfreaks.net/modules/FreaksFiles/files/382/DN_020.pdf
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 17, 2012, 10:55 am

sorry ma sono di fretta :)
date una lettura a questo documento:
http://www.avrfreaks.net/modules/FreaksFiles/files/382/DN_020.pdf

Arrivi tardi, l'ho già segnalato un paio di volte  ;)
Cmq lì si parla anche di "protezione in scrittura", non solo di lettura però Mike non riesce a proteggere i chip da tale operazione.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 17, 2012, 11:16 am
Astro interviene d'ufficio di solito, evidentemente non ha seguito questa parte di discussione oppure nemmeno lui ha mai sperimentato fisicamente i lock bits.
Purtroppo le ho provate tutte, il comportamento a monte è perfetto:
da stato FF (free) posso passare a FE (write protect) o direttamente a FC (write e verify protect), da FE posso passare a FC, tutte le altre direzioni non sono consentite; posso solo resettare a FF con un chip erase oppure inviando uno sketch che, sulla carta, non dovrebbe accettare.
Nelle condizioni FE o FC non riesco più a programmare i fuse, nemmeno con l'HV, e questa per me è la prova che i lock bits, almeno qui, stanno facendo il loro dovere; infatti sul reference è scritto chiaramente che i fuse non sono programmabili  se i LB non sono settati su FF.
Poi, tutto felice, vado a mandare una blink qualsiasi e passa che è una bellezza, allora a che cavolo serve tutto sto casino?
MI sembra tanto la storia del signore medievale che andava in guerra dopo aver messo la cintura di castità alla bella moglie e poi le lasciava la chiave appesa al collo  :P; dopo i primi 15 giorni di guerra l'elmo gli stava sollevato sulla testa di 30cm :smiley-yell:
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 17, 2012, 12:32 pm
Uhm... forse ho capito. Leggendo il datasheet, pagg. 283 e seguenti, mi par di capire che ci siano due coppie di lock bit, una coppia protegge la memoria del bootloader e l'altra coppia protegge la memoria flash dell'applicazione. Mi sa che il bandolo della matassa sia questo. Difatti a pag. 297 si dice che il 328 ha ben 6 lock bit.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 17, 2012, 12:54 pm
oh porc... :0, me la leggo bene anche se mi sono sempre riferito alle tabelle di programmazione e lì parla di due bit e basta.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 17, 2012, 01:29 pm

Mi sa che il bandolo della matassa sia questo. Difatti a pag. 297 si dice che il 328 ha ben 6 lock bit.


Non mi dite che non vi siete mai accorti che ci sono due distinti blocchi di L.B. ?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 17, 2012, 04:44 pm


Mi sa che il bandolo della matassa sia questo. Difatti a pag. 297 si dice che il 328 ha ben 6 lock bit.


Non mi dite che non vi siete mai accorti che ci sono due distinti blocchi di L.B. ?


Chi??? Noi????? Ceeeeeerrrrrtoooooooo  :smiley-sweat:
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 17, 2012, 06:53 pm
Allora, cerchiamo di capirci: a me del blocco dei BLB non frega assolutamente nulla, avendolo intepretato come riguardante l'area riservata al bootloader; io ho sempre parlato di LOCK BITS, che sono due e riguardano la memoria flash e l'eeprom:
Code: [Select]
LB Mode LB2 LB1
1 1 1 No memory lock features enabled.
2 1 0 Further programming of the Flash and EEPROM is disabled in
       Parallel and Serial Programming mode. The Fuse bits are
       locked in both Serial and Parallel Programming mode.(1)
3 0 0 Further programming and verification of the Flash and EEPROM
       is disabled in Parallel and Serial Programming mode. The Boot
       Lock bits and Fuse bits are locked in both Serial and Parallel
Programming mode.(1)
"1" means unprogrammed, "0" means programmed

la nota conferma che il byte 0b11111100 rappresenta la massima protezione.
Ora se mi dite che invece di questi devo programmare il BLB va bene, ma Vi chiedo gentilmente di darmi indicazioni chiare, io faccio grande fatica con i data-sheet in inglese, e a me dappertutto è sembrato che la protezione della flash si facesse con i LB e NON con i BLB :smiley-sad-blue:
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 17, 2012, 11:42 pm
Mike, a rileggere il datasheet io la intendo come la intendi tu. I lock bit BLBxx dovrebbero servire ad impedire la scrittura della flash da parte del bootloader quindi in teoria programmando via SPI si salta il bootloader quindi devono valere i lock bit LB e basta. Però a te non funziona, in questo modo, quindi io una prova impostando anche i lock bit BLB la farei, tanto tentare per tentare ormai...
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 17, 2012, 11:53 pm

Mike, a rileggere il datasheet io la intendo come la intendi tu. I lock bit BLBxx dovrebbero servire ad impedire la scrittura della flash da parte del bootloader quindi in teoria programmando via SPI si salta il bootloader quindi devono valere i lock bit LB e basta. Però a te non funziona, in questo modo, quindi io una prova impostando anche i lock bit BLB la farei, tanto tentare per tentare ormai...


Lo so Leo, però non è proprio uno schiocco di dita, ogni nuova implementazione mi costa una giornata; l'unica cosa a cui penso è che mi pare che avevo letto che la 4a combinazione dei Lock bits, cioè la 01 (sul reference credo sia prensente in un punto solo, ma poi non la riportano nelle programmazioni. A proposito: ma tu volevi dire via ISP o proprio via SPI? No, perché la combinazione 01 serve appunto per (mi pare) disabilitare la programmazione SPI, non è self-programming....? ma cos'è esattamente?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 18, 2012, 12:04 am
L'SPI sta per Serial Peripheral Interface ed è la programmazione tramite i segnali MOSI/MISO/SCK che vengono spediti sui relativi pin. E' la programmazione "standard" degli Atmega ed Attiny.
Cmq ora vado a dormire, domattina sveglia alle 5:20, ne riparliamo dopo queste 5 orette di sonno  :smiley-roll-sweat:
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 18, 2012, 12:08 am

L'SPI sta per Serial Peripheral Interface ed è la programmazione tramite i segnali MOSI/MISO/SCK che vengono spediti sui relativi pin. E' la programmazione "standard" degli Atmega ed Attiny.
Cmq ora vado a dormire, domattina sveglia alle 5:20, ne riparliamo dopo queste 5 orette di sonno  :smiley-roll-sweat:

buonanotte, mi sa che allora ho trovato l'inghippo, se setto questo valore credo di disattivare l'ISP, vedremo.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 18, 2012, 06:24 am

buonanotte, mi sa che allora ho trovato l'inghippo, se setto questo valore credo di disattivare l'ISP, vedremo.

Ti riferisci ai lock bit BLB?
Cmq ho trovato anche questo doc, guarda se ti può "ispirare": c'è la sequenza dei comandi per impostare i lock bit da spedire al micro
http://www.atmel.com/Images/doc0943.pdf
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 18, 2012, 06:36 am

perché la combinazione 01 serve appunto per (mi pare) disabilitare la programmazione SPI, non è self-programming....? ma cos'è esattamente?


Se disabiliti la programmazione SPI poi non riesce più a programmare il micro, devi per forza ripristinarla e si può fare solo tramite JTAG, per i micro che la supportano e se non è stata disabilitata pure questa, oppure con l'erase totale, il che include i fuse, tramite HV.
Dei lock bit per il bootloader puoi fregartene altamente, tanto vengono settati come serve quando vai a programmare l'eventuale bootloader via ISP.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 18, 2012, 08:39 am
OK, e comunque mi sbagliavo, le combinazioni sono proprio tre e non c'è nulla che riguarda l'SPI; del fatto che poi servisse l'HV ovviamente non mi potevo preoccupare, sto realizzando un HV e c'ho pure messo la funzione Chip_Erase :D; i comanid sono inseriti correttamente, come detto se la sequenza non fosse esatta alla rilettura non vedrei i nuovi valori dei LB, che infatti mi impediscono la programmazione dei Fuse finché non faccio un Chip_Erase.
Il blocco della programmazione dei fuse è l'unico effetto tangibile dei LB. Sul fatto di ignorare i BLB c'ero, visto che parlava espressamente di boot, infatti non mi sono proprio guardato la procedura.

Ripeto la richiesta: avreste un programmino semplice semplice (che non sia AVR Studio perché sono a corto di tempo...) che possa accedere alla flash di un qualsiasi chip ATmega (tra quelli che usiamo solitamente), leggendone in qualche modo il contenuto, anche parziale? Mi interessa solo per vedere se in condizione FC almeno ho bloccato l'accesso in lettura, altrimenti davvero non so che cosa l'ho implementata a fare la funzione
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 18, 2012, 08:46 am

Ripeto la richiesta: avreste un programmino semplice semplice (che non sia AVR Studio perché sono a corto di tempo...) che possa accedere alla flash di un qualsiasi chip ATmega (tra quelli che usiamo solitamente), leggendone in qualche modo il contenuto, anche parziale? Mi interessa solo per vedere se in condizione FC almeno ho bloccato l'accesso in lettura, altrimenti davvero non so che cosa l'ho implementata a fare la funzione


Usa Avrdude per fare un dump della flash.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 18, 2012, 08:57 am


Ripeto la richiesta: avreste un programmino semplice semplice (che non sia AVR Studio perché sono a corto di tempo...) che possa accedere alla flash di un qualsiasi chip ATmega (tra quelli che usiamo solitamente), leggendone in qualche modo il contenuto, anche parziale? Mi interessa solo per vedere se in condizione FC almeno ho bloccato l'accesso in lettura, altrimenti davvero non so che cosa l'ho implementata a fare la funzione


Usa Avrdude per fare un dump della flash.

Ottimo! ma io con AVRDUDE finora ho fatto solo operazioni con i fuse e caricamenti di .hex nel micro; avresti una sintassi "tipo" da suggerirmi, così stasera la provo e vediamo finalmente che succede :)
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 18, 2012, 09:22 am
avrdude -p m328p -c stk500 -P COMxx -U flash:r:"<percorso>flash.hex":i
Dove COMxx indica la porta seriale utilizzata e <percorso> il percorso per il file; eventaulmente dopo -P COMxx puoi stabilire un baudrate differente dal predefinito inserendo -b <baudrate>.
Inoltre, sostituendo il parametro flash con eeprom puoi leggere la eeprom.

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 18, 2012, 09:26 am

Ottimo! ma io con AVRDUDE finora ho fatto solo operazioni con i fuse e caricamenti di .hex nel micro; avresti una sintassi "tipo" da suggerirmi, così stasera la provo e vediamo finalmente che succede :)

Riprendendo ciò che ha prodotto la tua IDE direi di provare questo:
avrdude -CC:\arduino-0022\hardware/tools/avr/etc/avrdude.conf  -patmega328p -cstk500v1 -P\\.\COM60 -b19200 -Uflash:r:C:\Flash.hex:i
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 18, 2012, 09:36 am

Mostly networked community.


Spammer, segnalato ai moderatori.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 18, 2012, 09:37 am


Mostly networked community.


Spammer, segnalato ai moderatori.

Idem.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 18, 2012, 09:57 am
OK, grazie ad entrambi, stasera al rientro faccio subito un tentativo e vi riporto i risultati :)
Title: Re: Topic permanente di programmazione newbie
Post by: amario57 on Apr 18, 2012, 11:12 am
Oppure usa le utility che ti avevo suggerito qui:
http://arduino.cc/forum/index.php/topic,100580.msg754520.html#msg754520
;)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 18, 2012, 11:16 am

Oppure usa le utility che ti avevo suggerito qui:
http://arduino.cc/forum/index.php/topic,100580.msg754520.html#msg754520
;)

Sì, hai ragione, ho messo tutto in una cartella "da studiare", il test dell'AVRDUDE dovrebbe essere immediato, una riga e via, vediamo. Grazie!
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Apr 18, 2012, 01:31 pm
ricorda che anche se la lettura è bloccata potresti leggere o tutti FF o comunque dati spazzatura senza significato.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 18, 2012, 04:52 pm

ricorda che anche se la lettura è bloccata potresti leggere o tutti FF o comunque dati spazzatura senza significato.

boh, stasera al rientro faccio qualche prova e vediamo che ne esce....
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 18, 2012, 10:19 pm
La sintassi:
C:\avr\bin\avrdude.exe -C"C:\avr\etc\avrdude.conf"  -patmega328p -cstk500v1 -b9600 -PCOM60 -Uflash:r:C:\Flash.hex:i
mi restituisce:
can't open device "COM60": impossibile trovare il file specificato (ma la porta è quella); ma l'ultima parte dovrebbe crearmi un file Flash.hex in c:\?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 18, 2012, 10:46 pm

La sintassi:
C:\avr\bin\avrdude.exe -C"C:\avr\etc\avrdude.conf"  -patmega328p -cstk500v1 -b9600 -PCOM60 -Uflash:r:C:\Flash.hex:i
mi restituisce:
can't open device "COM60": impossibile trovare il file specificato (ma la porta è quella); ma l'ultima parte dovrebbe crearmi un file Flash.hex in c:\?

Metti la porta a cui è collegato il tuo Arduino.
Sì, con questa sintassi fai il dump della flash su file e lo salvi nel percorso specificato
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 18, 2012, 10:52 pm
Leo, l'ho pure scritto, la porta è quella, ora ho anche provato a mettere il micro con bl e blink durettamente su Arduino, i lock bits sono FF, ma questo è un errore di AVRDUDE, ho visto che in alcune sintassi usavi -b -P 19200 COMx, ma mi dà errore che -P è un baud errato
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 18, 2012, 10:56 pm
con COM1 parte ma poi ovviamente dà errore; ho capito che il problema è che non riesce a concepire queste COMxx, ma che posso farci io? come faccio a impostare Arduino su una COM2 o similari?

Sono riuscito a reindirizzare Arduino su COM2, ho impostato 9600baud, ora avviene l'accesso ma mi dà errore di sync... mi sa che non è cosa
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 18, 2012, 11:17 pm
Ogni opzione vuole il suo parametro, quindi se vuoi cambiare velocità devi mettere -b 19200 -P porta.
Per la porta non so come fare a vederle su Windows, prova collegando l'Arduino e poi aprendo l'icona del Computer per vedere su quale porta viene mappata la scheda.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 18, 2012, 11:34 pm
Leuccio,ma stasera non mi ascolti, va bene che è quasi ora di ninna :D
Ho detto che la porta è quella, la COM60 ma AVRDUDE non la gradisce in dos, l'ho cambiata in COM2 da gest periferiche ed ora il comando parte ma fa storie di sync (sembrano probemi del reset).
Ora ho anche provato il programma di amario57, il Sina Prog 2, ho ripristinato la COM60 ma anche qui mi dà errore di sync; sto lavorando direttamente su Arduino, senza collegamento ISP
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 18, 2012, 11:41 pm
Ah... c'era una sintassi particolare per indicare la porta com ad avrdude... non mi ricordo.
E se non ce la metti? Da qualche part ho letto che se il programmatore è su porta USB, è indifferente.

EDIT:
prova \\.\COMxx
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 12:00 am
niente da fare, con entrambe le prove, sempre errore 0x14 e 0x51, è il reset credo; sono stanco, domattina ho un paio d'ore libere, rifaccio prove a mente fresca o quasi. notte e grazie del supporto :)
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Apr 19, 2012, 01:00 am
Ma su com 2 arduino normalmente usato, cioe inviare blink via ide seriale, funziona ?
Se funziona lascialo li, non si puo leggere Com60 nei tuoi messaggi  :)
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 19, 2012, 07:50 am
Confermo che avrdude ha problemi con numeri di COM alti (ma non ne conosco il limite massimo).
Puoi comunque forzare l'assegnamento del numero di COM andando in Risorse del computer -> Proprietà -> Hardware ->Gestione periferiche.
Quindi click destro sulla porta da modificare (COM60 nel tuo caso) e selezioni Proprietà -> Impostazioni della porta -> Avanzate -> Numero di porta COM e selezioni un numero basso, magari sotto il 10. Ti viene sicuramente segnalato che quella porta è già in uso da parte di un altro dispositivo, ma confermando forzi il nuovo assegnamento. Stacca e riattacca arduino e verifica che l'assegnamento richiesto sia avvenuto.
Questo con XP ma è del tutto analogo in Win7.

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 19, 2012, 08:12 am

Confermo che avrdude ha problemi con numeri di COM alti (ma non ne conosco il limite massimo).


Windows, ogni volta che viene collegato un dispositivo USB di tipo CDC (Vcom), assegna una nuovo numero di porta seriale se sono soddisfatte queste due condizioni, Vid e Pid del device USB non ancora registrato e numero di serie non ancora registrato, questo modo di procedere è sia un vantaggio che uno svantaggio al tempo stesso.
Può fare molto comodo che windows mappi differentemente due device Vcom identici, cioè stesso Pid e Vid, ma con diverso numero di serie, perché in questo modo posso collegare due, o più, diversi Arduino avendo la certezza che avranno sempre lo stesso numero di Vcom quando collegati alla stessa porta seriale indipendentemente da quanti altri dispositivi CDC ho collegato nel tempo a quella porta, per contro con questo modo di procedere è facile trovarsi nel tempo con un numero enorme di Vcom assegnate e non tutti i programmi sono capaci di accedere a valori della Vcom alti, anzi spesso sono limitati solo fino a 10.
Da notare che cambiare semplicemente il numero della porta ad una periferica esistente non sempre funziona se prima non si disinstalla il precedente device.
C'è un modo per evitare che Windows assegni nuovi numeri di Vcom ogni volta che si collega un device con lo stesso Pid e Vid, ma con numero seriale diverso, basta aggiungere una voce al registry, poi apro un topic dedicato a questa cosa, in questo modo ogni volta che si collega un Arduino dello stesso modello, anche se sono schede diverse, viene usato sempre e solo il numero di Vcom assegnato alla prima connessione.
Per fare piazza pulita di tutte le Vcom assegnate nel tempo, di cui la maggior parte spesso non viene più utilizzata, c'è un modo semplicissimo, basta aggiungere alle variabili di sistema la voce "devmgr_show_nonpresent_devices" e settarla a 1, in questo modo andando nella "gestione periferiche" basta attivare attivare dal menù "visualizza" la voce "mostra periferiche nascoste" per vedere tutte le periferiche che sono state installate anche se non in uso o scollegate, dopo di che aprire la voce relativa alle porte COM e LPT per vedere tutta la lista e a questo punto eliminare le porte di troppo usando l'opzione disinstalla.
Fatto quanto sopra quando si collega nuovamente una delle periferiche cancellate sarà necessario reinstallare i driver e verrà assegnata il primo numero più basso di Vcom disponibile.
Esempio pratico ho le porte da 1 a 28 assegnate a schede "fantasma", la 29 e la 30 assegnate al cellulare, disinstallo dalla 1 alla 28 e quando ricollego Arduino dopo la procedura di installazione dei driver gli viene assegnata la porta 2 o la 3, dipende dalla mother board perché le prime due sono quasi sempre riservate alle seriali hardware anche se non presenti.

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 09:10 am
La questione posta da Astro è estremamente interessante e comoda; io effettivamente tra le tante cose che ho collegato al PC (internet key, cellulari, convertitori, arduini vari) sono arrivato alla COM 76 :smiley-eek:
Come ho già detto sono riuscito a cambiare nelle periferiche la COM da 60 a 2, al riavvio IDE l'ha trovata e sono riuscito a lavorarci senza problemi. A questo punto ho riprovato con AVRDUDE e mi dà errore di sync (non più l'errore di COM precedente); allora ho scompattato il Sinaprog2.0 gentilmente offerto da Amario57 ma è la stessa cosa, anche se qui non ho capito come settarlo.
Separiamo le due cose, che stamattina sono un po' più "leggero" e posso fare diverse prove:
Ripartiamo da AVRDUDE. La mia configurazione è: Arduino UNO visto su COM2, IDE 0022 con Astro-toolchain, ISP di Leo&BB, un 328P in stand-alone a 1MHz. Domanda, la sintassi:
Code: [Select]
C:\avr\bin\avrdude.exe -C"C:\avr\etc\avrdude.conf"  -p atmega328p -cstk500v1 -b 9600
-P COM2 -Uflash:r: C:\Flash.hex:i
dovrebbe leggere la flash del 328 in stand alone e memorizzarla in un file Flash.hex in C:\?
Mi dà l'errore:
Code: [Select]
avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

che è quello che l'IDE mi dà quando dimentico il condensatore per l'antiautoreset e cerco di programmare Arduino.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 19, 2012, 09:20 am
@Mike:
rileggendo i vecchi msg, io ti avevo scritto:

Riprendendo ciò che ha prodotto la tua IDE direi di provare questo:
avrdude -CC:\arduino-0022\hardware/tools/avr/etc/avrdude.conf  -patmega328p -cstk500v1 -P\\.\COM60 -b19200 -Uflash:r:C:\Flash.hex:i


Ma tu stai continuando ad usare questo:

Code: [Select]
C:\avr\bin\avrdude.exe -C"C:\avr\etc\avrdude.conf"  -p atmega328p -cstk500v1 -b 9600
-P COM2 -Uflash:r: C:\Flash.hex:i


Lasciamo da parte la questione dell'indicazione della porta (\\.\COM60 contro COM60 e basta) però è la velocità differente. Io ho segnalato 19200 bps, tu metti 9600. L'ArduinoISP della 002x lavora a 19200.
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 19, 2012, 09:32 am
Con la versione 0023, che richiede un baudrate a 115200, funziona senza problemi.

Quote
C:\Documents and Settings\tgiovanni>C:\arduino-0023\hardware\tools\avr\bin\avrdu
de.exe -C "C:\arduino-0023\hardware\tools\avr\etc\avrdude.conf"  -p atmega328p -
cstk500v1 -b 115200 -P com4 -Uflash:r:"C:\Lavoro-temp\flash.hex":i

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude.exe: Device signature = 0x1e950f
avrdude.exe: reading flash memory:

Reading | ################################################## | 100% 4.64s

avrdude.exe: writing output file "C:\Lavoro-temp\flash.hex"

avrdude.exe: safemode: Fuses OK

avrdude.exe done.  Thank you.


Ciao
QP

Edit: parte del codice scaricato
Quote
:200000000C9463000C948B000C948B000C948B000C948B000C948B000C948B000C948B00B0
:200020000C948B000C948B000C948B000C948B000C948B000C948B000C948B000C948B0068
:200040000C9419030C948B000C944D040C948B000C948B000C948B000C948B000C948B00F1
:200060000C949E010C948B0000000000240027002A0000000000250028002B000000000029
:20008000230026002900040404040404040402020202020203030303030301020408102071
:2000A0004080010204081020010204081020000000070002010000030406000000000000EB
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 09:40 am
Scusa hai ragione, nelle tante prove mi sono impippolato e come dicevo ero stanco e poco lucido.
Avevo provato la sintassi alternativa COM ed anche a non metterla.
Ora fatto tutto con calma e con -P COM2 ed a 19200 sta leggendo  XD ..... ha finito....
(E ora che ho chiaro tutto sono riuscito a far partire ance Sinaprog2.0.)
L'errore di AVRDUDE ora è in scrittura, da quanto capisco.
EDIT: mentre scrivo leggo il prost di QP e capisco che l'errore è che il file destinazione andava racchiuso tra "", quindi tutto ok!!!
La sintassi funzionante è:
Code: [Select]
C:\avr\bin\avrdude.exe -C"C:\avr\etc\avrdude.conf"  -p atmega328p -cstk500v1 -b 19200 
-P COM2 -Uflash:r:"C:\Flash.hex":i


Ora posso finalmente impostare i LB e riprovare a leggere :smiley-sweat:
Grazie a tutti e a fra poco.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 19, 2012, 09:42 am

Lasciamo da parte la questione dell'indicazione della porta (\\.\COM60 contro COM60 e basta) però è la velocità differente. Io ho segnalato 19200 bps, tu metti 9600. L'ArduinoISP della 002x lavora a 19200.


Esatto, devi usare come baud rate quello dello sketch ISP che a sua volta dipende dall'IDE e da che versione di questo sketch utilizzi.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 19, 2012, 09:44 am

Grazie a tutti e a fra poco.


Tieni presente che con un micro protetto in lettura dovresti ottenere un file contenente tutti 0xff, a meno che AvrDude non preveda un errore specifico se il micro è protetto in lettura.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 09:56 am
micro protetto con FC: lettura
Code: [Select]
:00000001FF
micro protetto con FE o non protetto (FF): lettura
Code: [Select]
:200000000C9461000C9473000C9473000C9473000C9473000C9473000C9473000C9473005A
:200020000C9473000C9473000C9473000C9473000C9473000C9473000C9473000C94730028
:200040000C948F000C9473000C9473000C9473000C9473000C9473000C9473000C947300EC
:200060000C9473000C94730000000000240027002A0000000000250028002B00000000006D
:20008000230026002900040404040404040402020202020203030303030301020408102071
:2000A0004080010204081020010204081020000000070002010000030406000000000000EB
:2000C000000011241FBECFEFD8E0DEBFCDBF11E0A0E0B1E001C01D92A930B107E1F70E94F2
:2000E000EA010C94F1010C9400008DE061E00E948C0108958DE061E00E94B00164E670E0CE
:2001000080E090E00E94FD008DE060E00E94B00164E670E080E090E00E94FD0008951F9219
:200120000F920FB60F9211242F933F938F939F93AF93BF938091040190910501A091060192
:20014000B0910701309108010196A11DB11D232F2D5F2D3720F02D570196A11DB11D2093BD
:2001600008018093040190930501A0930601B09307018091000190910101A0910201B09106
:2001800003010196A11DB11D8093000190930101A0930201B0930301BF91AF919F918F91A2
:2001A0003F912F910F900FBE0F901F9018959FB7F89420910001309101014091020150913C
:2001C000030186B5A89B06C08F3F21F02F5F3F4F4F4F5F4F9FBF542F432F322F2227280F5C
:2001E000311D411D511D82E0220F331F441F551F8A95D1F7B901CA010895EF92FF920F936C
:200200001F93CF93DF937B018C010E94D700EB010FC00E94D7006C1B7D0B83E0683E78070B
:2002200038F00894E108F10801091109C851DC4FE114F1040105110561F7DF91CF911F91D2
:200240000F91FF90EF900895789484B5826084BD84B5816084BD85B5826085BD85B5816017
:2002600085BDEEE6F0E0808181608083E1E8F0E01082808182608083808181608083E0E8F5
:20028000F0E0808181608083E1EBF0E0808184608083E0EBF0E0808181608083EAE7F0E004
:2002A0008081846080838081826080838081816080838081806880831092C10008958330EC
:2002C00071F0843028F48130A1F0823021F514C08630B1F08730D1F08430E9F404C08091DA
:2002E00080008F7703C0809180008F7D80938000089584B58F7702C084B58F7D84BD0895C4
:200300008091B0008F778093B00008958091B0008F7D8093B000089590E0FC01E656FF4F92
:200320002491FC01EA57FF4FE491EE23C1F0F0E0EE0FFF1FE859FF4F85919491DC0166232A
:2003400041F49FB7F8948C91209582238C939FBF08959FB7F8948C91822B8C939FBF08952F
:200360000F931F93DF93CF930F92CDB7DEB7282F30E0F901E255FF4F8491F901E656FF4F1C
:2003800014912A573F4FF90104910023E9F0882321F069830E945F016981E02FF0E0EE0FAE
:2003A000FF1FEE58FF4F85919491DC01662331F49FB7F8948C911095812304C09FB7F894D7
:2003C0008C91812B8C939FBF0F90CF91DF911F910F9108950E9424010E9475000E947A0081
:0603E000FDCFF894FFCFF1
:00000001FF

quindi la protezione in lettura FUNZIONA!!!. Resta il mistero della protezione in scrittura. Vorrei provare da AVRDUDE, se cambio "r" in "W" dovrebbe funzionare in scrittura, no?
EDIT: sì, funziona, purtroppo, cioè quando devo scrivere scrivo e non gliene frega niente dei LB; se non avete idee o notizie da darmi non posso che fermarmi; a questo punto posso anche ritenermi soddisfatto, anche se non al 100%; almeno la protezione da lettura e quella dei fuse funziona bene.
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 19, 2012, 10:01 am

quindi la protezione in lettura FUNZIONA!!!. Resta il mistero della protezione in scrittura. Vorrei provare da AVRDUDE, se cambio "r" in "W" dovrebbe funzionare in scrittura, no?


Si. Sostituendo :r con :w scrivi sulla flash. Esiste poi il parametro :v che permette di fare la verifica tra file.hex e flash.

Ciao
QP

AriEdit: scrittura con :w e verifica con :v
Quote
C:\Documents and Settings\tgiovanni>C:\arduino-0023\hardware\tools\avr\bin\avrdu
de.exe -C "C:\arduino-0023\hardware\tools\avr\etc\avrdude.conf"  -p atmega328p -
cstk500v1 -b 115200 -P com4 -Uflash:w:"C:\Lavoro-temp\flash.hex":i

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude.exe: Device signature = 0x1e950f
avrdude.exe: NOTE: FLASH memory has been specified, an erase cycle will be perfo
rmed
             To disable this feature, specify the -D option.
avrdude.exe: erasing chip
avrdude.exe: reading input file "C:\Lavoro-temp\flash.hex"
avrdude.exe: writing flash (32748 bytes):

Writing | ################################################## | 100% 3.36s

avrdude.exe: 32748 bytes of flash written
avrdude.exe: verifying flash memory against C:\Lavoro-temp\flash.hex:
avrdude.exe: load data flash data from input file C:\Lavoro-temp\flash.hex:
avrdude.exe: input file C:\Lavoro-temp\flash.hex contains 32748 bytes
avrdude.exe: reading on-chip flash data:

Reading | ################################################## | 100% 4.64s

avrdude.exe: verifying ...
avrdude.exe: 32748 bytes of flash verified

avrdude.exe: safemode: Fuses OK

avrdude.exe done.  Thank you.

-----------------------------------------------------------------------------------------------
C:\Documents and Settings\tgiovanni>C:\arduino-0023\hardware\tools\avr\bin\avrdu
de.exe -C "C:\arduino-0023\hardware\tools\avr\etc\avrdude.conf"  -p atmega328p -
cstk500v1 -b 115200 -P com4 -Uflash:v:"C:\Lavoro-temp\flash.hex":i

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% -0.00s

avrdude.exe: Device signature = 0x1e950f
avrdude.exe: verifying flash memory against C:\Lavoro-temp\flash.hex:
avrdude.exe: load data flash data from input file C:\Lavoro-temp\flash.hex:
avrdude.exe: input file C:\Lavoro-temp\flash.hex contains 32748 bytes
avrdude.exe: reading on-chip flash data:

Reading | ################################################## | 100% 4.64s

avrdude.exe: verifying ...
avrdude.exe: 32748 bytes of flash verified

avrdude.exe: safemode: Fuses OK

avrdude.exe done.  Thank you.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 10:02 am
Grazie, nel frattempo avevo provato e aggiunto un EDIT.... :)
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 19, 2012, 10:10 am
Occhio che avrdude prima cancella la flash (e forse i fuse)

Quote
avrdude.exe: Device signature = 0x1e950f
avrdude.exe: NOTE: FLASH memory has been specified, an erase cycle will be perfo
rmed
             To disable this feature, specify the -D option.
avrdude.exe: erasing chip


Prova ad inserire il parametro -D

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 19, 2012, 10:17 am

Grazie, nel frattempo avevo provato e aggiunto un EDIT.... :)


La protezione in scrittura è intesa interna al micro, ovvero da software non puoi scrivere sulla flash, cosa normalmente possibile se non attivi il relativo l.b., stessa cosa da programmatore se prima non esegui un erase, che cancella anche i fuse,l.b. inclusi, quindi è normale che se non disabiliti l'erase da riga di comando di AvrDude il micro viene riprogrammato.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 10:30 am
Scusate, ma non vi sto capendo, quindi ricomincio dalla mia necessità. Io voglio proteggere il micro dalla scrittura, un esempio, fornisco una scheda a tizio e voglio evitare che accidentalmente tizio la sovrascriva con un banale uploading; nello stesso tempo voglio proteggerne il contenuto (si fa per dire, in realtà è ciò che dovrò spiegare presentando lo strumento HV); quindi in HV imposto i LB su "FC" che significa protezione in scrittura e lettura. Fatto, ora cosa mi succede:
NON riesco a leggere con AVRDUDE (bene!)
RIESCO a scrivere con AVRDUDE (male!).
Quindi a me NON interessa che mettendo il parametro -D non scriva, perché significa che volontariamente NON voglio scrivere, a me serve proteggere dall'incidente o dalla cattiva idea. Avevo capito che l'unico modo per "sproteggere" era il Chip_ERASE (che effettivamente riporta i LB a FF, libero), purtroppo lo stesso effetto me lo fa una banale operazione ISP o l'AVRDUDE da riga di comando.
A questo punto posso solo fare un'ultima prova: mettere il micro con Bootloader su Arduino, protetto con FE o FC e vedere se almeno via seriale mi impedisce di scrivere :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 10:37 am
Il blink passa che è una bellezza, posso UFFICIALMENTE dire che la protezione da scrittura via LB è una emerita cag :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 19, 2012, 10:39 am
Il punto è che avrdude, se non diversamente specificato con -D (Disable auto erase), esegue un chip-erase ed a quel punto hai un chip vergine sul quale puoi fare tutte le scritture che vuoi.

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 10:44 am

Il punto è che avrdude, se non diversamente specificato con -D (Disable auto erase), esegue un chip-erase ed a quel punto hai un chip vergine sul quale puoi fare tutte le scritture che vuoi.

Ciao
QP

Questo è chiarissimo, la cag consiste nel fatto che ti indicano una via per proteggere un micro e poi l'unico strumento che ti mettono a disposizione per lavorarci lo sprotegge d'ufficio; cioè avrei capito se di default il -D fosse attivo, ma qui entra in ballo tutto un discorso che non vale la pena nemmeno di affrontare, tanto questa è :smiley-sad-blue:
Comunque almeno ora ho la certezza di non aver sbagliato nulla nella programmazione dei Lock Bits. Grazie per l'eccellente supporto, come sempre! XD
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 19, 2012, 10:54 am

Scusate, ma non vi sto capendo, quindi ricomincio dalla mia necessità. Io voglio proteggere il micro dalla scrittura, un esempio, fornisco una scheda a tizio e voglio evitare che accidentalmente tizio la sovrascriva con un banale uploading;


La protezione per la scrittura è intesa solamente ed esclusivamente contro la scrittura della stessa da parte del firmware, non esiste nessun modo per impedire la scrittura da programmatore, ed è ovvio che sia così.
Però Avrdude usato da Arduino non esegue un erase, la flash viene semplicemente riscritta dal bootloader senza nessuna cancellazione preventiva.
La stringa di comando inviata dall'IDE è la seguente:

"..\arduino-1.0.1-rc2\hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328p -carduino -P\\.\COM4 -b115200 -D -Uflash:w:C:\DOCUME~1\user\IMPOST~1\Temp\build5651456138611584630.tmp\BlinkWithoutDelay.cpp.hex:i"

Con tanto di parametro -D che inibisce l'uso dell'Erase.

Sicuro di aver fatto i test nel corretto modo ?
Adesso non posso mettermi a fare prove, a pranzo ci provo io a caricare uno sketch tramite programmatore, avrisp MKII, settando la massima protezione  della flash e vediamo cosa succede.

edit: dimenticavo, è possibile proteggere gli AVR contro la riprogrammazione hardware, basta bloccarla da fuse disabilitando la modalità ISP e Jtag, se presente, in questo modo è possibile riprogrammali solo passando per la modalità HV per poter resettare i fuse.

Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 19, 2012, 10:58 am

Questo è chiarissimo, la cag consiste nel fatto che ti indicano una via per proteggere un micro e poi l'unico strumento che ti mettono a disposizione per lavorarci lo sprotegge d'ufficio; cioè avrei capito se di default il -D fosse attivo, ma qui entra in ballo tutto un discorso che non vale la pena nemmeno di affrontare, tanto questa è :smiley-sad-blue:
Comunque almeno ora ho la certezza di non aver sbagliato nulla nella programmazione dei Lock Bits. Grazie per l'eccellente supporto, come sempre! XD


Il chip non viene sprotetto, nel senso che puoi accedere al codice, ma riportato ad una condizione di utilizzo senza sapere cosa c'era prima e nessuno ti può impedire di scriverci su ulteriormente.
Diversamente (chip super protetto) se fosse impedito il chip-erase il micro lo dovresti buttare via e buona notte. Non credo che la protezione in scrittura sia intesa in questo modo.

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 19, 2012, 11:16 am
Una prima risposta alla questione l.b. si trova sul data sheet:

Code: [Select]

The user can select:
• To protect the entire Flash from a software update by the MCU.
• To protect only the Boot Loader Flash section from a software update by the MCU.
• To protect only the Application Flash section from a software update by the MCU.
• Allow software update in the entire Flash.


Si parla esclusivamente di protezione da riscrittura effettuata via software dalla MCU stessa, ovvero è esclusa la riscrittura da programmatore hardware che lavora tramite ISP, Jtag e HV.
C'è da fare un paio di prove per la conferma però in linea di massima direi che se programmi tramite ISP puoi sempre riscrivere il micro indipendente dai l.b., e questo include pure lo spazio dove è allocato il boot loader, al contrario se cerchi di caricare un programma tramite bootloader con la protezione in scrittura attiva, p.e. dall'IDE di Arduino, questo non è possibile.
Per proteggere contro la riprogrammazione tramite programmatore devi disabilitare i relativi fuse, però se fai questa operazione poi sei obbligato a ricorrere alla HV per ripristinare il micro.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 19, 2012, 11:33 am
@Mike:
vuoi un sistema sicuro per poter non riscrivere su un chip?
Te lo do io! Togli il bootloader e disattiva il pin di reset! In questo modo usando un normale ArduinoISP oppure un programmatorino ino ino come l'USBtinyISP l'utente non può più inviare nessuno sketch.

Se manca il bootloader, la programmazione seriale tramite bootloader non funziona perché il bootloader non c'è.
Se hai disattivato il pin di reset, non puoi programmare il micro con la tecnica ISP perché la programmazione SPI sfrutta il pin di reset per dare l'avvio alla programmazione.

Hai solo la possibilità di un erase ad alta tensione (ecco che torna fuori il tuo programmatore HV) altrimenti non leggi (lock bit) e non scrivi (pin di reset).

Saluti e bacia, la fattura te la mando a fine mese  XD
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 19, 2012, 11:34 am
Nella descrizione della funzionalità dei LBx indica le tre possibili impostazioni:
Code: [Select]
1) No memory lock features enabled.

2) Further programming of the Flash and EEPROM is disabled in
Parallel and Serial Programming mode. The Fuse bits are
locked in both Serial and Parallel Programming mode.

3) Further programming and verification of the Flash and EEPROM
is disabled in Parallel and Serial Programming mode. The Boot
Lock bits and Fuse bits are locked in both Serial and Parallel
Programming mode.


Da questa descrizione io capisco che si riferisce alla programmazione parallela e seriale (intesa come ISP/SPI), ma (suppongo) possa ancora funzionare tramite bootloader che utilizza l'istruzione SPM (Store Program Memory) per caricare i programmi sulla Application Section della flash.
Se così fosse, bisogna agire sui fuse BLBxx per inibire, secondo le modalità indicate sul datasheet, la scrittura sulla flash memory.

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Apr 19, 2012, 11:40 am
ma disabilitare SPIEN no?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 19, 2012, 11:46 am

ma disabilitare SPIEN no?

SPIEN disattiva la programmazione SPI ma non la programmazione interna, quindi se c'è un bootloader in ascolto sulla seriale puoi riflashare il micro, giusto?
Fare come ho detto io un paio di post più sopra (disattivare reset e togliere il bootloader) ti mette al riparo da qualsiasi tentativo.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 19, 2012, 11:55 am

[SPIEN disattiva la programmazione SPI ma non la programmazione interna, quindi se c'è un bootloader in ascolto sulla seriale puoi riflashare il micro, giusto?


Se è attiva la protezione in scrittura della flash tramite l.b. il bootloader non può riprogrammare il micro, avevo già fatto presente che per bloccare la riprogrammazione SPI o Jtag è necessario disabilitare i relativi fuse, dopo di che solo tramite HV è possibile riprogrammare il micro.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 19, 2012, 11:59 am


[SPIEN disattiva la programmazione SPI ma non la programmazione interna, quindi se c'è un bootloader in ascolto sulla seriale puoi riflashare il micro, giusto?


Se è attiva la protezione in scrittura della flash tramite l.b. il bootloader non può riprogrammare il micro, avevo già fatto presente che per bloccare la riprogrammazione SPI o Jtag è necessario disabilitare i relativi fuse, dopo di che solo tramite HV è possibile riprogrammare il micro.


Bene, quindi di protezioni a questo punto Mike ne ha un bel po' a sua disposizione:
- fuse SPIEN anti programmazione SPI
- fuse RSTDISBL anti pin reset
- lock bit anti scrittura bootloader (BLB0 e BLB1)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 12:36 pm
@ QP: io non voglio disabilitare il chip_erase, solo che non sia attivo in condizioni normali; cioè l'utente non dovrebbe poter fare una normale operazione di scrittura con successo, se ho attivato la protezione. Prendo atto che non è possibile.

@ Astro: ma un firmware all'interno di un micro è capace di gestire una autoscrittura nella flash? mi torna utile questa info per l'articolo, se me la confermi :)

@ Leo e BB: considerando che parlerò di stand-alone il problema bootloader non me lo pongo proprio, quindi la disabilitazione reset non mi serve; invece ok per la disabilitazione SPI, provata, l'effetto è che il micro non è sovrascrivibile via ISP(bene!) ma non è più neanche leggibile (male!) nemmeno se lascio i lock bits a FF; infatti mi dà errore di signature. Con la scusa ho capito cosa è successo a quei 2-3 chip che ho immolato per la progettazione dell'HV, a forza di sparargli botte da 12V (parlo di centinaia di volte....) devo aver danneggiato il circuito del pin reset di questi micro, e quindi è come se fosse disabilitato, perché ho provato la disabilitazione del reset e l'effetto è lo stesso: invalid device signature (quindi sia se disabilito il reset che se disabilito lo SPI).
Conclusioni, la procedura:
impostazione fuse per no SPI
lockbits su FE o FC
protegge il micro da lettura e scrittura

la procedura:
lockbits su FC protegge il micro dalla sola lettura
non c'è modo di proteggere il micro da scrittura e lasciarlo libero in lettura (condizione FE), ma comunque direi di avere una soluzione per tutto, questa particolare opzione non ha significato per me.
Naturalmente ho provato sia da IDE che da riga di comando, identici comportamenti.Grazie!
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 19, 2012, 01:10 pm
Scusa Mike ma ogni tanto perdo il filo del tuo ragionamento e delle tue necessità....
Scrivi:

NON riesco a leggere con AVRDUDE (bene!)
RIESCO a scrivere con AVRDUDE (male!).


Poi affermi invece:

il micro non è sovrascrivibile via ISP(bene!) ma non è più neanche leggibile (male!)


Quindi ora non ti va bene che sia leggibili ma ti va bene che non sia riscrivibile però ieri dicevi l'esatto opposto  :smiley-sweat:
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 19, 2012, 01:13 pm

@ Astro: ma un firmware all'interno di un micro è capace di gestire una autoscrittura nella flash? mi torna utile questa info per l'articolo, se me la confermi :)


Scusa se rispondo io.
E' proprio quello che fa il bootloader. Scrive nella zona definita Application section che è la flash decurtata della quantita riservata all'area del bootloader. Per farlo, il codeice del bootloader fa uso di macro in assembly che utilizzano l'istruzione (assembly) SPM.
Un esempio tratto da boot.h, alla 7a riga

Code: [Select]
#define __boot_page_fill_short(address, data)   \
(__extension__({                                 \
    __asm__ __volatile__                         \
    (                                            \
        "movw  r0, %3\n\t"                       \
        "out %0, %1\n\t"                         \
        "spm\n\t"                                \
        "clr  r1\n\t"                            \
        :                                        \
        : "i" (_SFR_IO_ADDR(__SPM_REG)),        \
          "r" ((uint8_t)__BOOT_PAGE_FILL),       \
          "z" ((uint16_t)address),               \
          "r" ((uint16_t)data)                   \
        : "r0"                                   \
    );                                           \
}))


Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 19, 2012, 01:17 pm
Se è per questo, è possibile per lo stesso codice scrivere all'interno di sé stesso, ossia un programma può cambiare in tempo reale il contenuto della memoria che occupa. A parte le considerazioni sul fatto che se si sbaglia locazione di memoria poi si rende il codice ineseguibile, la possibilità c'è ed è documentata dal datasheet.
Title: Re: Topic permanente di programmazione newbie
Post by: brainbooster on Apr 19, 2012, 01:33 pm
@Menniti , quindi obbiettivo raggiunto :)
....anche se
http://www.cl.cam.ac.uk/~sps32/mcu_lock.html  ;)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 01:39 pm
@ QP: grazie del chiarimento, ma in condizione FC ho messo il chip con bootloader caricato direttamente su Arduino e sono riuscito ugualmente a caricare un blink, quindi il blocco continua a non avere alcuna utilità. Forse, come dicevi tu stesso mi pare, bisognerebbe mettere mano anche ai BLB, però l'uovo non vale la candela.

@ Leo: vuoi farmi passare per un rincoglionito :smiley-mr-green:? La premessa fondamentale è che io NON voglio proteggere alcun firmware, ma devo solo presentare un progetto del Programmatore HV spiegandone caratteristiche ed uso, quindi immagino che uno che lo voglia realizzare voglia poi provare a sfruttarne tutte le caratteristiche. La prima coppia di affermazioni era legata al settaggio FC che, teoricamente, doveva impedirmi sia di leggere che di scrivere, non è così, una bene, una male. La seconda coppia riguarda il fatto che in condizione FE (solo write protect), con l'ausilio della SPI disabled mi aspettavo di non poter più scrivere ma di poter continuare a leggere, così non è, uno bene, uno male. I miei giudizi riguardano le prove che faccio rispetto a ciò che mi aspetto come esito, non sono assoluti, perché sto usando uno strumento che deve poter agire parzialmente su questi parametri; non sto cercando, come premesso di proteggere un micro. Chiaro ora?  :) la mia mente è salva per ora :D?

@ BB: come battuta va benissimo, ma restando in tema l'obiettivo è raggiunto; scusa, se sto progettando uno strumento che ha la funzione chip erase non ho certo bisogno di ricorrere ad un tesista russo per farmi cancellare un micro (ciò che ho "intuito" dando un'occhiata al volo al tuo link).
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 19, 2012, 01:44 pm

@ Leo: vuoi farmi passare per un rincoglionito :smiley-mr-green:? La premessa fondamentale è che io NON voglio proteggere alcun firmware, ma devo solo presentare un progetto del Programmatore HV spiegandone caratteristiche ed uso, quindi immagino che uno che lo voglia realizzare voglia poi provare a sfruttarne tutte le caratteristiche. La prima coppia di affermazioni era legata al settaggio FC che, teoricamente, doveva impedirmi sia di leggere che di scrivere, non è così, una bene, una male. La seconda coppia riguarda il fatto che in condizione FE (solo write protect), con l'ausilio della SPI disabled mi aspettavo di non poter più scrivere ma di poter continuare a leggere, così non è, uno bene, uno male. I miei giudizi riguardano le prove che faccio rispetto a ciò che mi aspetto come esito, non sono assoluti, perché sto usando uno strumento che deve poter agire parzialmente su questi parametri; non sto cercando, come premesso di proteggere un micro. Chiaro ora?  :) la mia mente è salva per ora :D?

No, il rinco... sono io perché siccome non mi ricordo le cose, poi mi tocca andare a ricercare ciò che uno scrive per seguire il filo del discorso, solo che poi mi intreccio lo stesso  XD
Ti chiedo, tu vuoi impedire la scrittura E la lettura, giusto?
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 02:18 pm
no, il mio intento esatto è: impedire la lettura e/o la scrittura, ecco perché NON ho raggiunto il 100% del mio scopo: oggi posso impedire la lettura, posso impedire la lettura e la scrittura, ma NON posso impedire la scrittura lasciando libera la lettura.
Questa è da incorniciare :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 19, 2012, 02:22 pm
Mike, ma questo non potrai mai ottenerlo.
I lock bit servono proprio per impedire primariamente la lettura della memoria: sono nati come una sorta di "lucchetto" (da "lock") per bloccare ogni tentativo di copia del firmware non autorizzata. Lo scopo primario è proprio quello di evitare che un cinese si svegli la mattina e decida di clonare un certo dispositivo basato su un micro. Anche se non è in possesso del codice del firmware, che gliene frega? Compra uno di quei dispositivi, fa un dump del firmware, dopo di che realizza 100000 copie del dispositivo ed in ogni micro inserisce il firmware che ha prelevato dal micro. A lui non importa che sia in codice macchina, tanto lo deve semplicemente rimettere in un altro micro.

Se usciamo da questo presupposto, usciamo dal significato di lock bit.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 02:26 pm

Mike, ma questo non potrai mai ottenerlo.
I lock bit servono proprio per impedire primariamente la lettura della memoria: sono nati come una sorta di "lucchetto" (da "lock") per bloccare ogni tentativo di copia del firmware non autorizzata. Lo scopo primario è proprio quello di evitare che un cinese si svegli la mattina e decida di clonare un certo dispositivo basato su un micro. Anche se non è in possesso del codice del firmware, che gliene frega? Compra uno di quei dispositivi, fa un dump del firmware, dopo di che realizza 100000 copie del dispositivo ed in ogni micro inserisce il firmware che ha prelevato dal micro. A lui non importa che sia in codice macchina, tanto lo deve semplicemente rimettere in un altro micro.
Se usciamo da questo presupposto, usciamo dal significato di lock bit.

Forse vuoi dire una cosa diversa da ciò che intendo io, rileggiti il mio post in cui ho copiato le caratteristiche dei due lb, in breve:
FE: write protect
FC: write & verify protect
quindi in FE teoricamente dovrei poter leggere (e lo faccio) ma non scrivere (ma lo faccio lo stesso); poi mettiamola sul filosofico ed hai ragione tu, ma il datasheet parla chiaro. ;)
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 19, 2012, 02:35 pm
Ma astro ti ha spiegato che l'impedimento alla scrittura non si applica ai tentativi "interni", fatti cioè dal bootloader.
Ecco perché ti dicevo che secondo me dovresti togliere il bootloader e disattivare il pin di reset.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 19, 2012, 02:52 pm

Forse vuoi dire una cosa diversa da ciò che intendo io, rileggiti il mio post in cui ho copiato le caratteristiche dei due lb, in breve:


Michele stai travisando completamente il significato, e l'uso, dei L.B., adesso non ho tempo per darti una spiegazione dettagliata, devo uscire e vado di fretta, più tardi ti spiego per bene il tutto.

Title: Re: Topic permanente di programmazione newbie
Post by: testato on Apr 19, 2012, 04:04 pm
intervengo giusto per spezzare una lancia
Michele in genere non travisa niente, a limite sono i manuali che sono scritti criptici ed interpretabili  :)

Io anche mi sarei aspettato che usando protezione massima non avrei potuto programmare il micro

attendiamo illuminanti delucidazioni al fine di buttarci in test atti a conferme/smentite (in genere con voi e' la prima opzione che si avvera  :))
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 19, 2012, 05:56 pm
Ho fatto un paio di prove veloci settando tutte le varie possibilità dei lock bit tramite Avrstudio e l'Avrisp MKII, più che altro per essere certo di quello che stavo facendo senza dover combattere con lo sketch AvrIsp e avrdude.
Tramite i due lock bit per la flash è possibile bloccare solo la scrittura da parte di un applicativo della stessa e la lettura tramite un qualunque sistema esterno, però rimane completamente accessibile ad un programma che si trova nell'area del bootloader se dichiarato come tale tramite gli appositi fuse.
In pratica anche attivando i lock bit della flash il bootloader può sempre leggere e scrivere la porzione dove si trova il programma, è possibile impedire al bootloader di leggere la flash bloccando la modalità LPM nella zona applicazione, il che permette di continuare a riprogrammare il micro ma non di leggerne il contenuto, il che crea problemi nella fase di verify, se si blocca anche la SPM diventa impossibile programmare il micro tramite bootloader.
La stessa cosa è applicabile alla sola zona del bootloader, ovvero è possibile impedire che tale area venga letta o scritta oppure tutti e due.
Per farla breve, i due lock bit per la flash agiscono solo su questa esclusa l'eventuale zona del bootloader, i quattro lock bit relativi al bootloader permettono di bloccare lettura e scrittura da parte di questo sia del resto della flash che della zona del bootoader stesso, se non c'è il bootloader ovviamente non serve settare i relativi bit.
Se si cerca di caricare un nuovo sketch tramite l'IDE con la modalità SPM in area applicazione del bootloader bloccata con i relativi l.b. questo è l'errore che ritorna avrdude:

Code: [Select]

avrdude: verification error, first mismatch at byte 0x0000
         0x0c != 0x62
avrdude: verification error; content mismatch

Title: Re: Topic permanente di programmazione newbie
Post by: testato on Apr 19, 2012, 06:08 pm
se ho capito bene tu dici che a massima protezione e' possibile programmare la flash via bootloader ma non via ICSP.
Mentre il Menny sta dicendo che anche via ICSP riesce a caricare il blink  :)
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 19, 2012, 06:16 pm

se ho capito bene tu dici che a massima protezione e' possibile programmare la flash via bootloader ma non via ICSP.


Via ICSP lo programmi sempre per il banale motivo che prima devi comunque cancellarlo, quindi vengono rimosse tutte le eventuali protezioni, per proteggerlo contro questa eventualità va disattivato l'apposito fuse che blocca la programmazione (SPIEN).
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 19, 2012, 06:29 pm

...Per farla breve, i due lock bit per la flash agiscono solo su questa esclusa l'eventuale zona del bootloader, i quattro lock bit relativi al bootloader permettono di bloccare lettura e scrittura da parte di questo sia del resto della flash che della zona del bootoader stesso, se non c'è il bootloader ovviamente non serve settare i relativi bit.


Che è poi quello che ho cercato di spiegare sommariamente nel reply #417, ma una prova è meglio 1000 parole.

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 19, 2012, 06:52 pm

Che è poi quello che ho cercato di spiegare sommariamente nel reply #417, ma una prova è meglio 1000 parole.


Si, infatti avevi spiegato correttamente la cosa.
Ho voluto fare un test pratico relativo ai l.b. del bootloader perché non ho mai avuto bisogno di settarli visto che normalmente utilizzo gli AVR programmandoli direttamente via ISP o Jtag quindi se devo proteggerli contro la copia mi basta settare i due l.b. della flash normale.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 19, 2012, 06:59 pm
La questione dei bit LBL l'avevo già fatta presente anch'io un paio di giorni fa. Però Mike ha delle esigenze particolari perché come avete letto:

il mio intento esatto è: impedire la lettura e/o la scrittura, ecco perché NON ho raggiunto il 100% del mio scopo: oggi posso impedire la lettura, posso impedire la lettura e la scrittura, ma NON posso impedire la scrittura lasciando libera la lettura.
Questa è da incorniciare :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 19, 2012, 07:12 pm

La questione dei bit LBL l'avevo già fatta presente anch'io un paio di giorni fa. Però Mike ha delle esigenze particolari perché come avete letto:


Per quanto riguarda la flash generica è solo possibile inibire la scrittura, da parte del software, e contemporaneamente la lettura, solo la lettura no, per quanto riguarda il bootloader è possibile impedire la lettura e la scrittura singolarmente, o tutte e due, sia per la sola flash generica che per la sola area del bootloader, ovvero sono possibili tutte le combinazioni.
Una curiosità, nel momento in cui si setta LB2, blocco programmazione della flash, diventa impossibile modificare i lock bit del bootloader pertanto sono da settare prima di attivare LB2 altrimenti tocca fare un erase (non serve che sia HV) del micro per poterli scrivere.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 07:22 pm

Nella descrizione della funzionalità dei LBx indica le tre possibili impostazioni:
Code: [Select]
1) No memory lock features enabled.

2) Further programming of the Flash and EEPROM is disabled in
Parallel and Serial Programming mode. The Fuse bits are
locked in both Serial and Parallel Programming mode.

3) Further programming and verification of the Flash and EEPROM
is disabled in Parallel and Serial Programming mode. The Boot
Lock bits and Fuse bits are locked in both Serial and Parallel
Programming mode.


Da questa descrizione io capisco che si riferisce alla programmazione parallela e seriale (intesa come ISP/SPI), ma (suppongo) possa ancora funzionare tramite bootloader che utilizza l'istruzione SPM (Store Program Memory) per caricare i programmi sulla Application Section della flash.
Se così fosse, bisogna agire sui fuse BLBxx per inibire, secondo le modalità indicate sul datasheet, la scrittura sulla flash memory.
Ciao
QP

Boh, a me pare tanto la storia del "Quo Vadis?" che vi raccontai tempo fa. Io non dubito che tu abbia spiegato bene la cosa, anzi sai bene quanto io mi fidi della tua opinione, però riprendo le tue parole "una prova vale più di mille parole". Anch'io ho sempre inteso ESATTAMENTE che sia la funzione 2 che la 3 mi bloccassero la programmazione ISP (quindi come dice Test, che ringrazio, io non traviso assolutamente nulla), ma NON è così e lo sto dimostrando con i fatti; SOLO la disabilitazione del fuse SPI mi impedisce di scrivere nella flash! Astro ti dà ragione ma poi sostiene il contrario dicendo che l'ISP si può fare sempre e si può bloccare solo tramite FUSE. Leo dice che bisogna bloccare il RESET. Io ho detto chiaramente che voglio insegnare a proteggere un micro stand-alone, quindi devo ignorare la programmazione dei boot LB. Nell'intervento di Astro che leggo in diretta lui sostiene che non si può bloccare la sola lettura, invece io dico di sì, e l'ho scritto 10 volte, ma il mio sì non è teorico (la modalità 3 parla chiaramente di lettura e scrittura bloccati) bensì pratico (in modalità 3 non riesco a leggere ma riesco a scrivere). Ho la sensazione che ci stiamo incasinando, quindi l'unica è la domanda chiusa:
Se voglio mettere tizio in condizioni di poter leggere la memoria flash, ma di non poterla sovrascrivere, cosa devo fare? Io non ci sono riuscito. :)
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 19, 2012, 07:34 pm

Anch'io ho sempre inteso ESATTAMENTE che sia la funzione 2 che la 3 mi bloccassero la programmazione ISP


Certo che la bloccano, però a condizione che non esegui prima un erase, operazione che viene sempre fatta di defualt da tutti i programmatori, se inibisci tale comando non puoi riscrivere la flash.
Detto in altri termini, in realtà negli AVR non è obbligatorio fare un erase prima della programmazione, puoi semplicemente sovrascrivere quello che c'è, però se lo fai ti ritrovi con la flash "sporca" con tutte le conseguenze che questo può portare, p.e. acquisizione di valori assurdi nel caso di puntatori che vanno oltre il limite previsto.
Quando fai la programmazione ISP la prima operazione è un erase, infatti se c'è un bootloader precaricato viene cancellato, quindi non esiste nessun l.b. che ti può proteggere, solo il blocco della modalità ISP e JTAG permette questo livello di protezione, però se lo fai su un micro saldato poi ti puoi scordare di ripristinare la normale operatività visto che sei obbligato ad usare la modalità HV con tutte le relative problematiche.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 07:54 pm
Sì, ormai mi è tutto chiarissimo, sono duro di comprendonio, ma alla fine le prove mi aiutano a capire. Non dimentichiamo che tra me e te c'è la stessa comunicabilità tecnica di chi parla a bassa voce dal terrazzo di un palazzo (tu) e chi cerca di ascoltare ciò che dici in mezzo alla strada (io), se non "scendi a terra" hai voglia di parlare con me :~ :~ :~ Poi succede che tu mi stavi dicendo "spostati che le macchine ti investono", io non sento e quando la macchina mi investe dico "czz, ragazzi, ho scoperto che se restate in mezzo alla strada prima o poi qualcuno vi investe con l'automobile" :smiley-mr-green: Quindi alla fine arrivo empiricamente dove tu volevi portarmi teoricamente qualche ora prima. Il risultato è quello che conta, no? Ingessature a parte :smiley-yell: :smiley-yell:
Quindi alle prove dei fatti, restano valide le mie conclusioni PRAGMATICHE da incorniciare:

il mio intento esatto è: impedire la lettura e/o la scrittura, ecco perché NON ho raggiunto il 100% del mio scopo: oggi posso impedire la lettura, posso impedire la lettura e la scrittura, ma NON posso impedire la scrittura lasciando libera la lettura.

Cioè, il problema non è che si può evitare di finire investiti non restando in mezzo alla strada, ma che, se si resta in mezzo alla strada, prima o poi si finisce investiti. Dite la verità, una metafora del genere me la fa guadagnare la mia sedia all'UNI o no? XD
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 19, 2012, 08:06 pm

Quindi alle prove dei fatti, restano valide le mie conclusioni PRAGMATICHE da incorniciare:

il mio intento esatto è: impedire la lettura e/o la scrittura, ecco perché NON ho raggiunto il 100% del mio scopo: oggi posso impedire la lettura, posso impedire la lettura e la scrittura, ma NON posso impedire la scrittura lasciando libera la lettura.

Cioè, il problema non è che si può evitare di finire investiti non restando in mezzo alla strada, ma che, se si resta in mezzo alla strada, prima o poi si finisce investiti. Dite la verità, una metafora del genere me la fa guadagnare la mia sedia all'UNI o no? XD


Si, però quello è un limite degli AVR e non del tuo lavoro  :D
Giusto per affondare il forcone nelle terga dei fanboy avr, nei pic questi problemi non esistono, ovvero non è possibile brickarli se sbagli qualcosa in fase di programmazione, non serve una complessa procedura con mille mila pin impegnati per cancellare tutto a fondo, è possibile bloccare la flash sia in lettura che in scrittura in modo indipendente ed è possibile scegliere su varie arie di memoria, cioè non solo per il bootloader o per la flash generale, mi fermo qui altrimenti mi bannano però la lista è lunga  :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 08:33 pm
Se vogliono bannarti dovranno passare sul mio cadavere, sei troppo utile alla "causa". Io sono un fanboy (boy... :~) avr ma solo perché ho ripreso l'elettronica (lasciata ai tempi delle logiche non programmabili) partendo da Arduino, i cui meriti per me sono indubbi. Diventa sempre più chiaro, ad ogni tua forconata :smiley-eek-blue:, che se avessero realizzato l'Arduino con un PIC invece che con un ATMEL, probabilmente oggi avremmo molti meno casini e tanti vantaggi in più, ma ne siamo sicuri? Cioè, dal punto di vista software, compilatori, tool vari, interfacce, il mondo PIC è altrettanto ben fornito? Bada, la mia non è una domanda retorica, è una domanda e basta, non ne so niente del mondo PIC, e tu lo sai bene (a proposito, non scordarti che aspetto una risposta in MP :D), mi piacerebbe avere le idee più chiare, tutto qui, visto che non riesco a capire perché dei micro così tanto meglio attrezzati, pur essendo stra-diffusissimi, non abbiano attecchito così tanto sul popolo ignorante come invece è capace di fare atmega.
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Apr 19, 2012, 09:26 pm
Ottimissimo,

si e' arrivati ad una chiarezza eccellente, metterei due puntine utili a tutti, specialmente per chi legge velocemente il tutto, su elementi che sono da ricordare sotto l'aspetto anticopia (che e' la vera cosa importante dei LockBit) uscite da questo topic :

1- Attivare il lockbit di massima protezione
2- Non lasciare mai il bootloader a bordo, altrimenti anche con la protezione il cinese fa festa lo stesso
3- l'aspetto protettivo in scrittura, che e' stato il piu' difficile da sviscerare, non interessa per scopi anticopia, perche' nel momento in cui il cinese ha cancellato/scritto in flash si e' fregato con le sue mani  :)
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 19, 2012, 09:34 pm

Se voglio mettere tizio in condizioni di poter leggere la memoria flash, ma di non poterla sovrascrivere, cosa devo fare? Io non ci sono riuscito. :)

Ho provato anche io le due combinazioni di lock utilizzando AVR Studio e Dragon in modalità ISP (e con erase disabilitato):
Con FE posso riprogrammare la flash (anche con un altro .hex) e leggerla senza problemi.
Con FC posso riprogrammare la flash ma non posso leggerla/verificarla, più esattamente sembra che la legga ma poi ottengo un file .hex pieno di FF.
In pratica ha ragione Mike, FE ed FC non bloccano la riprogrammazione :P
Ora bisogna capire cosa intenda Atmel quando dice " Further programming disable".

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 19, 2012, 09:44 pm
QP, te lo dico di cuore: GRAZIE!

Test, puoi aggiungere che la disabilitazione del fuse SPI, seguita da una qualsiasi delle due modalità LB (FE o FC è indifferente), impediscono in ogni modo lettura e scrittura e, visto che il bootloader non c'è (parliamo sempre di stand-alone), l'unico modo per poter riscrivere è l'HV per dare un chip erase e poi riabilitare il fuse SPI, ma intanto il firmware si cancella e finché non si arriva a questa manovra volontaria, il chip è anche ragionevolmente protetto contro scritture accidentali.

Mi pare che tanta discussione abbia prodotto davvero buoni frutti, ora che siamo tutti sulla stessa lunghezza d'onda XD
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 20, 2012, 04:39 am

ma ne siamo sicuri? Cioè, dal punto di vista software, compilatori, tool vari, interfacce, il mondo PIC è altrettanto ben fornito?


Sotto il profilo tool di lavoro il mondo pic è sempre stato molto più fornito di quello avr, però fino a poco tempo fa erano disponibili solo per Windows, dato che Arduino è multipiattaforma, in particolare il MAC visto che nell'ambiente in cui è nato è maggiormente diffuso questo s.o., la scelta è caduta sugli avr perché erano gli unici micro, al tempo della nascita di Arduino, per i quali fosse disponibile un ambiente di lavoro free per tutti e tre i sistemi operativi.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 20, 2012, 06:16 am
E' da tanto che son tentato.... non foss'altro per l'IDE nativo per Linux... risolverei i miei sbattimenti continui....  :smiley-sweat:
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Apr 20, 2012, 07:20 pm
x mike: il mio ultimo "riassunto" era dichiaratamente diretto alla funzione anticopia, indi come gia' detto in tal senso non interessa proteggere dalla scrittura.

x QT: a me sembra chiarita la questione, infatti con i LB non e' possibile RIPROGRAMMARE, ma solo PRIMA CANCELLARE E POI PROGRAMMARE. In tal senso va letto il datasheet (cosa facile da asserire ora, ma che prima di certo non era chiara, anzi Atmel dovrebbe spiegare meglio la cosa)
Probabilmente, come dicevo, essendo la funzion anticopia la cosa piu' importante, la protezione da scrittura ha solo senso in ambito didattico, non c'e' nessun motivo per implementarla in un progetto commerciale.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 20, 2012, 07:47 pm
Test, non facciamo questioni di lana caprina, volevi riassumere ed ho completato, altrimenti riassumi solo ciò che interessa te :smiley-mr-green:

vedi che è QP, non QT ;) Comunque io li ho spiegati i motivi per i quali anche un prodotto commerciale o comunque fornito a terzi potrebbe necessitare di una protezione da scrittura, evitare danni accidentali; metti il caso che tu realizzi un qualcosa per qualcuno su un micro e questo qualcuno poi si mette a smanettare (ormai Arduino ce l'hanno pure le colf) e cancella tutto, poi ti dice che non ne sa niente e via le questioni; invece lo proteggi e almeno sai che se l'ha cancellato è uno che sa il fatto suo :) Un po' come quelli che ti vendevano i film originali in videocassetta e spezzavano la linguetta in modo che tu non potessi cancellarli accidentalmente; certo che se gli mettevi un pezzo di nastro adesivo poi erano tazze tue, ma almeno risparmiavi l'incidente.
Poi siamo nel campo delle ipotesi, a me personalmente non interessa, ciò che faccio viene non solo pubblicato e reso disponibile, ma perfino spiegato riga per riga, quindi stiamo solo parlandone. :)
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 20, 2012, 08:37 pm

x QT: a me sembra chiarita la questione, infatti con i LB non e' possibile RIPROGRAMMARE, ma solo PRIMA CANCELLARE E POI PROGRAMMARE. In tal senso va letto il datasheet (cosa facile da asserire ora, ma che prima di certo non era chiara, anzi Atmel dovrebbe spiegare meglio la cosa)


Dalla prova che ho fatto NON è necessario prima cancellare, tant'è che ho disabilitato l'auto-erase in AVR Studio ed il log nella finestra di output lo conferma (a meno che AVR Studio non mi pigli per il cuxo), ma puoi riprogrammare a piacere. Nel mio test, con protezione 'light' che permette la lettura, ho RIprogrammato la flash con un binario diverso ed ho successivamente scaricato il contenuto della stessa ottenendo un file .hex assolutamente identico all'originale.
Resta il fatto che con la protezione massima non puoi leggere la flash e questo ti assicura la protezione 'intellettuale' del codice binario. Se vuoi una protezione integrale devi ricorrere al fuse SPIEN.

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Apr 20, 2012, 09:28 pm
Spettate, allora si stanno sostenendo due cose diverse ?


Certo che la bloccano, però a condizione che non esegui prima un erase, operazione che viene sempre fatta di defualt da tutti i programmatori, se inibisci tale comando non puoi riscrivere la flash.




Dalla prova che ho fatto NON è necessario prima cancellare, tant'è che ho disabilitato l'auto-erase in AVR Studio ed il log nella finestra di output lo conferma (a meno che AVR Studio non mi pigli per il cuxo), ma puoi riprogrammare a piacere.

Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 21, 2012, 06:22 am

Spettate, allora si stanno sostenendo due cose diverse ?


Il test l'ho fatto e con la protezione in scrittura della flash attiva non è possibile caricare un nuovo programma tramite spi se prima non si esegue un erase, dal punto di vista pratico sembra che l'operazione va a buon fine, esattamente come la lettura della memoria protetta, però la flash rimane inalterata.
Oggi rifaccio il test con calma, l'altro giorno li ho fatti in fretta ed è possibile che mi è sfuggito qualcosa.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 21, 2012, 09:34 am
Per quanto mi riguarda, non ho provato l'opzione -D, perché non mi interessava concettualmente, per i motivi più volte spiegati; il chip_erase resetta i lock bits (è proprio una delle sue funzioni e io l'ho provata) e quindi è ovvio che dopo si possa scrivere; però in un mio precedente intervento ho scritto
Quote
ma in condizione FC ho messo il chip con bootloader caricato direttamente su Arduino e sono riuscito ugualmente a caricare un blink, quindi il blocco continua a non avere alcuna utilità.
e questa operazione, se esegue un chip erase lo fa parzialmente perché resta protetta l'area del bl, ma per me chip_erase significa cancellazione totale di flash, eeprom e reset dei lb. Ma se QP dice che disabilitando il chip_erase scrive lo stesso io ci credo. Peraltro sarebbe la prova assoluta di ciò che sostengo da un po' di pagine: la protezione in scrittura è una cag :smiley-mr-green:
Se Astro dedica un po' di tempo magari tira fuori qualcosa di interessante.
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 21, 2012, 09:46 am
Rettifica e smentita di ciò che ho affermato:
Dopo aver lasciato sfiammare i neuroni (settimana di lavoro pesante; come dice Karl Popper "Tutta la vita è risolvere problemi"), ho riprovato con l' "Hello, world" di Arduino cioè Blink, prima con lampeggio ad 1 secondo, poi lampeggio con 5 secondi.
Ebbene...
Il lampeggio resta ad 1 secondo anche se la riprogrammazione sembra andare a buon fine.
In pratica mi sono preso per il cuxo da solo.  :smiley-red:

Una volta impostati i lock bit NON si può riprogrammare il micro.

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 21, 2012, 10:05 am

Una volta impostati i lock bit NON si può riprogrammare il micro.

Quindi confermi che, anche se la programmazione "sembra" andata a buon fine, difatti non è così?
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 21, 2012, 10:11 am

Il lampeggio resta ad 1 secondo anche se la riprogrammazione sembra andare a buon fine.
In pratica mi sono preso per il cuxo da solo.  :smiley-red:
Una volta impostati i lock bit NON si può riprogrammare il micro.


Ok, quindi confermi quello che avevo visto pure io, sembra che si riprogramma, ma rimane inalterato.

x Menny.
Se programmi da Bootloader è normale che il micro viene riscritto anche se hai settato i l.b. per la protezione in scrittura perché in questo caso devi settare i relativi l.b. del bootloader che hanno una priorità maggiore rispetto a quelli della flash generica.
Per farla breve, con il blocco in lettura e scrittura della flash generica non puoi scriverla tramite ISP, a meno di non fare un erase, e non puoi scriverla dal software applicativo, non puoi leggerla tramite ISP.
Se non setti nessun l.b. del bootloader questo può tranquillamente leggere e scrivere la flash generica indipendentemente da come settati i relativi l.b. Relativamente al bootloader hai due distinti livelli di blocco, uno che riguarda solo la flash generica (application) che ti permette di inibire singolarmente la lettura e/o la scrittura, l'altro è relativo al bootloader stesso e anche in questo caso puoi inibire singolarmente lettura e/o scrittura per un totale di 8 differenti condizioni come permesso dai relativi quattro l.b.
C'è solo un punto oscuro relativamente ai l.b. della flash generica, due bit consentono quattro diverse combinazioni però ne vengono sfruttate solo tre, apparentemente la condizione che blocca solo la lettura, e non la scrittura, non è permessa toccherebbe verificare se è una carenza del data sheet oppure è un limite reale
In tutti i casi da AvrStudio il menù di settaggio dei l.b. per la flash prevede solo i tre stati indicati sul data sheet il che mi porta a pensare che effettivamente il blocco della sola lettura non sia possibile.

Title: Re: Topic permanente di programmazione newbie
Post by: testato on Apr 21, 2012, 10:12 am
mi autopropongo come coordinatore nazionale dei test  :smiley-yell: :smiley-yell: :smiley-yell:

grazie QP per il ri-test, Astro tu puoi esimerti dal rifarlo. :)
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 21, 2012, 10:12 am
Si. Confermo!

Appena ho un po' di tempo provo con avrdude, che sembra possa vedere AVRDragon, con l-opzione -D che disabilita l'auto-erase e senza bootloader.

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 21, 2012, 10:15 am

Appena ho un po' di tempo provo con avrdude, che sembra possa vedere AVRDragon, con l-opzione -D che disabilita l'auto-erase e senza bootloader.


Probabilmente devi usare dei driver diversi da quelli presenti in AvrStudio esattamente come succede con l'Avrisp MKII, con i driver standard non si può usare da Arduino perché Avrdude non lo vede.
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 21, 2012, 10:42 am

Probabilmente devi usare dei driver diversi da quelli presenti in AvrStudio esattamente come succede con l'Avrisp MKII, con i driver standard non si può usare da Arduino perché Avrdude non lo vede.

Ho visto. C'è bisogno di installare la libusb-win32 che si trova qui (http://sourceforge.net/apps/trac/libusb-win32/wiki), ma ora non ho tutta questa voglia di provarci. Magari in futuro per approfondire la cosa.

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 21, 2012, 11:24 am

C'è solo un punto oscuro relativamente ai l.b. della flash generica, due bit consentono quattro diverse combinazioni però ne vengono sfruttate solo tre, apparentemente la condizione che blocca solo la lettura, e non la scrittura, non è permessa toccherebbe verificare se è una carenza del data sheet oppure è un limite reale
In tutti i casi da AvrStudio il menù di settaggio dei l.b. per la flash prevede solo i tre stati indicati sul data sheet il che mi porta a pensare che effettivamente il blocco della sola lettura non sia possibile.


Ho provato a programmare i l.b. con FD (4a combinazione) ma alla rilettura dei l.b. il valore si riporta ad FC.
Questa combinazione non è impostabile.

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 21, 2012, 02:59 pm
Come detto non ho provato il -D perché non mi interessava. Però leggendo bene l'intervento di QP NON capisco se ha usato o meno il -D con AVRDUDE; perché se non lo ha usato e quindi ha lasciato il chip erase attivo, e non è riuscito a scrivere, la cosa sarebbe in totale conflitto con le mie prove; se invece l'ha usato siamo nella norma; io senza il -D ho scritto regolarmente.
Come detto non mi interessa la questione bootloader perché mi riferisco agli stand-alone, ho solo detto di aver fatto le relative prove.
Riprendo due frasi di Astro:
Quote
Per farla breve, con il blocco in lettura e scrittura della flash generica non puoi scriverla tramite ISP, a meno di non fare un erase, e non puoi scriverla dal software applicativo, non puoi leggerla tramite ISP.

Io con il blocco lb su FC (lettura e scrittura inibite) mediante ISP scrivo tranquillamente, inizialmente provavo con lo stesso sketch, lo dissi chiaramente, poi ho provato due blink assolutamente diversi (sul mio Programmatore ISP dispongo di 3 led): uno su un LED a 1000 e l'altro su un altro LED a 100, mi accorgerò della differenza no? Ogni volta cambia comportamento, quindi scrivo; evidentemente Arduino ISP fa un erase; d'altra parte se AVRDUDE di default fa l'erase è ovvio che ArduinoISP ne erediti i parametri. Ribadisco che tutto ciò è una cag perché questo è come il ferramentaio che ti vende una serratura di sicurezza e contemporaneamente ne da una copia al cugino ladro!

Quote
C'è solo un punto oscuro relativamente ai l.b. della flash generica, due bit consentono quattro diverse combinazioni però ne vengono sfruttate solo tre, apparentemente la condizione che blocca solo la lettura, e non la scrittura, non è permessa toccherebbe verificare se è una carenza del data sheet oppure è un limite reale

La combinazione FD NON esiste, non è una carenza ma proprio non è prevista, non solo da data-sheet, ma nemmeno dalla programmazione; vedo che intanto QP ha provato, ma le prove le avevo fatte anche io , senza riportarvele perché erano inutili. Il parametro FD non è accettato e di default viene imposto l'FC. Non penso valga la pena perderci altro tempo, le conclusioni sono e restano quelle a cui ero arrivato, incorniciandole :smiley-mr-green:, un po' di pagine fa (http://arduino.cc/forum/index.php/topic,95050.msg765654.html#msg765654). Naturalmente disabilitando il fuse SPI ora sappiamo con certezza che non si programma, ma questo non c'entra nulla con i lb.

EDIT: ho riscritto la prima parte di questo post, da rileggere, please.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 21, 2012, 03:17 pm

evidentemente Arduino ISP fa un erase; d'altra parte se AVRDUDE di default fa l'erase è ovvio che ArduinoISP ne erediti i parametri. Ribadisco che tutto ciò è una cag perché questo è come il ferramentaio che ti vende una serratura di sicurezza e contemporaneamente ne da una copia al cugino ladro!


Si però questa volta stai facendo il sordo  :smiley-mr-green:
L'IDE di Arduino se gli dici di programmare un micro tramite ISP non usa l'opzione -D per Avrdude pertanto viene fatto un erase come prima cosa e di conseguenza vengono sbloccati i b.l. il che rende possibile riprogrammare il micro.
Ti ho già spiegato che lo scopo principale dei b.l. relativi alla flash è impedire la lettura della stessa tramite un programmatore hardware, ovvero protezione anticopia, e impedire che sia il tuo programma che un eventuale accesso da ISP/Jtag possono scrivere sulla flash con le conseguenze disastrose che puoi ben immaginare.
Lo scopo dei b.l. non è impedire la riprogrammazione del chip in assoluto, se vuoi questo deve settare gli appositi fuse che disabilitano la programmazione ISP/Jtag, però se lo fai poi se obbligato a passare per l'HV per sbloccare i fuse e non è detto che sia possibile farlo una volta che hai messo il micro sul circuito.
Ti faccio presente che su tutti i micro di questo mondo esiste la protezione anticopia e scrittura, funziona allo stesso modo delgi AVR, ovvero se la setti il solo modo per accedere al micro è eseguire un erase per riportarlo alle condizioni di default.
La cosa è pure logica, cosa te ne fai di un micro che non puoi più programmare ?
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 21, 2012, 03:22 pm

Però leggendo bene l'intervento di QP NON capisco se ha usato o meno il -D con AVRDUDE;


Meno male che sia io che Q.P. abbiamo scritto chiaramente che i test sono stati fatti tramite AvrStudio e programmatore hardware vero, Avrisp MKII nel mio caso, Avr Dragon per Q.P.  :smiley-mr-green:
Da AvrStudio puoi settare a piacere tutti i parametri di programmazione, incluso se non eseguire l'erase che è attivo di default.
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 21, 2012, 04:03 pm

Come detto non ho provato il -D perché non mi interessava. Però leggendo bene l'intervento di QP NON capisco se ha usato o meno il -D con AVRDUDE; perché se non lo ha usato e quindi ha lasciato il chip erase attivo, e non è riuscito a scrivere, la cosa sarebbe in totale conflitto con le mie prove; se invece l'ha usato siamo nella norma; io senza il -D ho scritto regolarmente.
Come detto non mi interessa la questione bootloader perché mi riferisco agli stand-alone, ho solo detto di aver fatto le relative prove.

EDIT: ho riscritto la prima parte di questo post, da rileggere, please.


Per le prove rifatte questa mattina a neuroni freschi non ho utilizzato AVRDUDE ma AVR Studio e confermo che impostando i l.b. ad FE o FC NON sono più in grado di riprogrammare la flash.
Mike, il paramtero -D di AVRDUDE significa "Disable auto erase for flash" ovvero disabilita l'auto erase per la flash. Se non lo metti AVRDUDE esegue una cancellazione della flash prima di spedire il programma. Per cui -D ti deve interessare se vuoi verificare la funzionalità de l.b.
Come contro prova, riprogramma la flash senza -D come hai fatto e poi verifica l'effettivo stato dei l.b. Se sono cambiati ad FF o sono ancora ad FC-FE.

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Apr 21, 2012, 04:15 pm

Si però questa volta stai facendo il sordo  :smiley-mr-green

Stavo pensando la stessa cosa, tutte questi test lo hanno fatto precocemente invecchiare.
:)
Prof riprenditi, lascia perdere per un paio di giorni, poi sara' tutto piu' chiaro  :)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 21, 2012, 05:32 pm


Si però questa volta stai facendo il sordo  :smiley-mr-green

Stavo pensando la stessa cosa, tutte questi test lo hanno fatto precocemente invecchiare.
:)
Prof riprenditi, lascia perdere per un paio di giorni, poi sara' tutto piu' chiaro  :)

]:D
@ Tutti: io farò il sordo ma voi fate i grilli :smiley-mr-green: Dove sta scritto che nel seguire uno (io) che fa delle prove ed aiutarlo ad arrivare a delle conclusioni, ognuno (voi) faccia quello che vuole? :smiley-eek: Infatti che me frega di AVR Studio e quant'altro se io conduco test con AVRDUDE e IDE? Quello che mi state ribadendo ogni volta l'ho capito dalla prima, anche se non ci credete, ma ormai stiamo scadendo nel "Quo vadis?". Quindi è inutle che sto a ripetere che ho capito ed a ribadire che questo non cambia la mia idea sulla protezione lb: io NON ho detto che NON funziona (questo alla fine dei fatti....) ma solo che fa cag il modo in cui funziona, né ho mai detto di voler ottenere un chip inprogrammabile ma solo di volerlo rendere non immediatamente sprogrammabile dal primo che passa e collega Arduino ad una USB. Queste incomprensioni nascono dal fatto che ognuno di noi segue perfettamente il proprio filo ma alla lunga perde quello degli altri, poi si ci mette Testato che non ha alcun filo da seguire e tenta di rompere quelli degli altri e la frittata è servita :smiley-yell: :smiley-yell: :smiley-yell: Buone cose e grazie di avermi dato del sordo e rincoglionito, è un piacere, se non ci si loda tra amici :D XD
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 21, 2012, 05:59 pm

Infatti che me frega di AVR Studio e quant'altro se io conduco test con AVRDUDE e IDE?


Stavolta mi tocca bacchettarti sul serio  :smiley-mr-green:
Poco importa se usi l'IDE di Arduino e Avrdude, o avrdude da riga di programma, o Avrstudio e un programmatore hardware, i risultati sono sempre gli stessi a parità di condizioni di test, ovvero poco importa che strumenti usi, a patto siano quelli giusti, se le condizioni del test sono uguali per tutti.
Ti ripeto per l'ennesima, e spero ultima, volta che non esiste nessun micro che puoi proteggere dalla riscrittura tramite un programmatore a meno che non vengano settati appositi flag (fuse) interni, in certi casi poi non è più possibile tornare indietro, il micro rimane cristallizzato per sempre, oppure è possibile annullare il settaggio tramite particolari procedure.
Con gli AVR il solo modo per proteggerli totalmente dalla riprogrammazione è disabilitarla tramite fuse, sono stati inseriti apposta, operazione non reversibile tramite sistemi normali, e non credo che ti piace dover smontare un micro dal pcb per doverlo mettere sullo zoccolo di un programmatore HV per resettare i fuse (santa Microchip che non ha questi problemi visto che l'equivalente della HV lo puoi fare onboard  :smiley-mr-green: )
Quello che non riesci a capire è che il programmatore hardware, e non avrdude che è solo un programma di interfaccia tra il pc e il programmatore, è uno strumento che ha la massima priorità, gli è sempre permesso di cancellare la memoria del micro e riscriverla salvo speciali "paletti" che per la loro rimozione richiedono l'uso di strumenti speciali.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 21, 2012, 08:11 pm
Quo vadis? sarei tentato di fare un collage dei miei interventi, ma vedo che non servirebbe a niente. Ci rinuncio e, naturalmente, mi tengo le bacchettate. Poi è più forte di me.... :~
Prendiamo queste affermazioni:
- i lb si resettano con la programmazione ISP o mediante AVRDUDE (senza -D)
- l'unico modo di proteggere il micro in scrittura è disabilitare il fuse SPI
- con i lb su FC la lettura è effettivamente disabilitata e non c'è modo di superare questo blocco se non con un chip_erase
- nessun essere umano, dotato di intelletto minimo, vuole bloccare un micro per sempre
Se non siete d'accordo con queste affermazioni allora io sono un deficiente (ma rispiegate per favore). Se invece siete d'accordo trovate un solo mio intervento in cui affermo il contrario :smiley-eek-blue:
Il punto è che io faccio delle affermazioni che vanno oltre il funzionamento del sistema, che ritengo di aver capito bene, ma voi continuate a rispiegarmi le cose che io continuo a dire di aver capito, come se non le avessi capite. Cioè secondo voi, visto il funzionamento di lb, fuse, ISP, AVRDUDE, Programmatori AVR vari, io NON posso affermare, parlando di mcu in stand-alone:
- E' stupida la gestione dei LB, riguardo la protezione in scrittura del micro (perché il datasheet dice ... (http://arduino.cc/forum/index.php/topic,95050.msg766035.html#msg766035)), perché non serve a nulla, visto che qualsiasi tentativo di riprogrammazione va a buon fine, senza dover fare niente, visto che il chip_erase è ATTIVO di default. Non ho detto che non ho capito perché questo avviene, ma solo che è stupido che avvenga così :smiley-sweat:
- NON c'è modo, per le stesse ragioni di cui sopra, di settare un micro per proteggerlo da scrittura ma NON da lettura; lasciamo stare se ha significato o meno fare questa cosa (spiegavo la possibilità di evitare l'incidente di cancellazione, senza che il firmware debba essere protetto da copia). L'opzione FE che è dichiarata espressamente per proteggere la scrittura ma NON la lettura, NON Funziona, in quanto posso scrivere (non è importante il "perché" io possa scrivere ma il fatto che "possa scrivere" senza sforzo alcuno). E se disabilito lo SPI non posso nemmeno leggere, oltre che scrivere.
Allora la domanda della settimana è:
posso farle queste due ultime affermazioni pur confermando come veritiere le prime quattro? Se continuate a sostenere il contrario trovatemi Voi una combinazione di lb e fuses che mi permetta di leggere la flash e di non poterla scrivere, SENZA ricorrere a opzioni (-D p.es.), ma usando gli strumenti standard a disposizione di ogni utente di Arduino (ArduinoISP e AVRDUDE).
Uff, per me vi arrendete :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 21, 2012, 08:54 pm

Prendiamo queste affermazioni:
- i lb si resettano con la programmazione ISP o mediante AVRDUDE (senza -D)
- l'unico modo di proteggere il micro in scrittura è disabilitare il fuse SPI
- con i lb su FC la lettura è effettivamente disabilitata e non c'è modo di superare questo blocco se non con un chip_erase
- nessun essere umano, dotato di intelletto minimo, vuole bloccare un micro per sempre
Se non siete d'accordo con queste affermazioni allora io sono un deficiente (ma rispiegate per favore).


Queste affermazioni sono ineccepibili e mi trovi daccordo.

Quote

- E' stupida la gestione dei LB, riguardo la protezione in scrittura del micro (perché il datasheet dice ... (http://arduino.cc/forum/index.php/topic,95050.msg766035.html#msg766035)), perché non serve a nulla, visto che qualsiasi tentativo di riprogrammazione va a buon fine, senza dover fare niente, visto che il chip_erase è ATTIVO di default. Non ho detto che non ho capito perché questo avviene, ma solo che è stupido che avvenga così :smiley-sweat:


Si. Utilizzando solo i l.b. la gestione della protezione in scrittura è stupida se posso fare un chip erase

Quote

- NON c'è modo, per le stesse ragioni di cui sopra, di settare un micro per proteggerlo da scrittura ma NON da lettura; lasciamo stare se ha significato o meno fare questa cosa (spiegavo la possibilità di evitare l'incidente di cancellazione, senza che il firmware debba essere protetto da copia). L'opzione FE che è dichiarata espressamente per proteggere la scrittura ma NON la lettura, NON Funziona, in quanto posso scrivere (non è importante il "perché" io possa scrivere ma il fatto che "possa scrivere" senza sforzo alcuno).


Per quanto riguarda la scrittura ri-confermo che la gestione è stupida. Con un chip erase puoi riscrivere.

Quote

E se disabilito lo SPI non posso nemmeno leggere, oltre che scrivere.


Questo completa in buona misura la protezione ma a quel punto non hanno più molto senso i l.b.

Quote

Allora la domanda della settimana è:
posso farle queste due ultime affermazioni pur confermando come veritiere le prime quattro? Se continuate a sostenere il contrario trovatemi Voi una combinazione di lb e fuses che mi permetta di leggere la flash e di non poterla scrivere, SENZA ricorrere a opzioni (-D p.es.), ma usando gli strumenti standard a disposizione di ogni utente di Arduino (ArduinoISP e AVRDUDE).


Si. Ho capito quello che vuoi dire. Non esiste una combinazione di l.b. e fuse che permetta la lettura della flash ma non la riprogrammazione visto che posso fare un chip erase.

Quote

Uff, per me vi arrendete :smiley-mr-green:


E' solo questione di capirsi.

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 21, 2012, 09:20 pm

fare questa cosa (spiegavo la possibilità di evitare l'incidente di cancellazione, senza che il firmware debba essere protetto da copia). L'opzione FE che è dichiarata espressamente per proteggere la scrittura ma NON la lettura, NON Funziona, in quanto posso scrivere (non è importante il "perché" io possa scrivere ma il fatto che "possa scrivere" senza sforzo alcuno). E se disabilito lo SPI non posso nemmeno leggere, oltre che scrivere.


Quello che ti ostini a non voler capire è che la protezione da scrittura serve unicamente per impedire al software utente di scrivere sulla flash, è una cosa che può succedere, in particolari condizioni, anche se non desiderata, non serve per proteggerti da eventuali cancellazioni da programmatore hardware.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 22, 2012, 12:09 am

E' solo questione di capirsi.

E' esattamente ciò che intendevo, ovviamente detto in modo scherzoso XD

@ Astro: scusami, tu sai quanta stima ho di te e quanto io mi fidi ciecamente di ciò che dici, ma stavolta non riesco a convincermi, e non ti chiedo nemmeno di insistere; però c'ho lavorato troppo su questa cosa; sarà, come dice Test, che devo smaltire, però tu hai riportato queste indicazioni del datasheet:
Quote
The user can select:
• To protect the entire Flash from a software update by the MCU.
• To protect only the Boot Loader Flash section from a software update by the MCU.
• To protect only the Application Flash section from a software update by the MCU.
• Allow software update in the entire Flash.

io me le sono andate a cercare e le trovo sotto la voce
Quote
Boot Loader Lock Bits
, che non sono quelli che mi interessano. Invece sotto la voce
Quote
Lock Bit Protection Modes
trovo:
Quote

Memory Lock Bits    Protection Type
LB Mode LB2 LB1
     1       1    1       No memory lock features enabled.
     2       1    0       Further programming of the Flash and EPROM is disabled in
                            Parallel and Serial Programming mode. The Fuse bits are
                            locked in both Serial and Parallel Programming mode.(1)
     3       0    0       Further programming and verification of the Flash and EEPROM
                            is disabled in Parallel and Serial Programming mode. The Boot
                            Lock bits and Fuse bits are locked in both Serial and Parallel
                            Programming mode.

Il mio inglese è pessimo e lo sappiamo tutti, ma mi pare che anche QP e Leo trovino stravaganti queste definizioni; qui non si riferisce affatto alla scrittura da parte del software, qui parla chiaramente di modo di programmazione parallelo e seriale che, per quanto ne so, dovrebbe essere la SPI e non c'entra niente con l'"autoscrittura" della flash da parte del firmware che avviene internamente alla mcu.
Poi ce la diciamo tutta e quindi mentre tu sai benissimo di cosa stiamo parlando, io invece sono un ignorante, per cui tu ti basi sulle tue stratosferiche conoscenze ed io solo sulle poche righe tradotte sudando sangue e verificate con centinaia di prove. Però se tu non tiri fuori la tua scienza per dimostrare che queste righe dicono ciò che tu dici e non ciò che io leggo, non puoi pretendere di convincermi "a capire", perché ti direi che hai ragione solo per chiudere la questione, ma io resterei insoddisfatto nel dover convincermi di una cosa che non mi convince affatto. Oppure diciamo tutti che ATMEL ha scritto due stronzate a proposito dei Lock Bits e questo mi basta; almeno tutto il mio errore si baserebbe sull'errore di una fonte che dovrebbe essere ineccepibile. Come detto, non sei tenuto ad insistere, se ti sei fatto l'idea che so' de coccio no problem, però per un solo attimo dimentica la tua scienza e mettiti dal mio punto di vista :~
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on Apr 22, 2012, 12:31 am
Devo spezzare una lancia a favore di Mike.
Se sul datasheet c'è scritto che attivando i Lock Bits si può disattivare la scrittura seriale (quindi SPI) e/o la lettura e ciò non avviene, le cose son 2: o il datasheet è sbagliato oppure non è spiegato bene in che condizioni ciò si verifica.

Io non sono un esperto, però credo di capirlo l'inglese, e quella frase mi pare che dica questo. Se poi servono i bit LBL allora vuol dire che quella tabellina in cui sono riportate le combinazioni dei lock bit LBx non serve a un czz

EDIT:
parlo senza aver fatto test (non ho al momento possibilità di farli) ma penso che ci siano diverse decine di test fatti

EDIT2:
c'è poi il fuse SPIEN, però se davvero serve attivare questo fuse bit per disattivare la scrittura, perché nella tabella dei lock bit non ce lo scrivono? "Devi attivare LBx e SPIEN sennò non ottieni nessun risultato".
Allora alla fine il mio sistema è quello più sicuro: disattivi il pin di reset e togli il bootloader. E tanti saluti. Se poi ci metti anche uno SPIEN disattivato sei a posto.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 22, 2012, 12:38 am

Devo spezzare una lancia a favore di Mike.
Se sul datasheet c'è scritto che attivando i Lock Bits si può disattivare la scrittura seriale (quindi SPI) e/o la lettura e ciò non avviene, le cose son 2: o il datasheet è sbagliato oppure non è spiegato bene in che condizioni ciò si verifica.

Io non sono un esperto, però credo di capirlo l'inglese, e quella frase mi pare che dica questo. Se poi servono i bit LBL allora vuol dire che quella tabellina in cui sono riportate le combinazioni dei lock bit LBx non serve a un czz

Ma nemmeno, secondo me; i BLB (non LBL  :)) fanno quello che dicono (almeno sulla carta :smiley-sweat:) e cioè proteggono separatamente l'area boot e l'area application, ma SOLO se utilizzi il bootloader e NON possono risolvere il problema dei LB per questa semplice ragione:
Quote
Program the Fuse bits and Boot Lock bits before programming the LB1 and LB2.
quindi come è possibile che i BLB possano gestire il funzionamento dei LB se questi ultimi bloccano la programmazione dei BLB? Sarebbe un controsenso ridicolo. D'altra parte mi pare che si sia d'accordo tutti sul fatto che i BLB e i LB agiscano separatamente ed i primi solo in caso sia presente il bootloader nel micro.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 22, 2012, 01:01 am

EDIT:
parlo senza aver fatto test (non ho al momento possibilità di farli) ma penso che ci siano diverse decine di test fatti

Le prove le ho fatte io, non meno di un centinaio :smiley-eek-blue:
Quote

EDIT2:
c'è poi il fuse SPIEN, però se davvero serve attivare questo fuse bit per disattivare la scrittura, perché nella tabella dei lock bit non ce lo scrivono? "Devi attivare LBx e SPIEN sennò non ottieni nessun risultato".
Allora alla fine il mio sistema è quello più sicuro: disattivi il pin di reset e togli il bootloader. E tanti saluti. Se poi ci metti anche uno SPIEN disattivato sei a posto.

E' la domanda che mi sto e sto ponendo da giorni; c'è qualcosa che non torna. Comunque, come detto, disattivare il reset o lo SPIEN è la stessa identica cosa, se NON c'è il bootloader, entrambi impediscono sia la lettura che la scrittura della flash.
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Apr 22, 2012, 01:27 am
Mike io sono d'accordo con la tua analisi. Sommando ad essa il reale comportamento del micro, che sottolineo  ormai e' chiaro come funziona perche sia i tuoi test che quelli di  astro che quelli di qp portano gli stessi risultati, il dato di fatto e' un grave errore del datasheet nella spiegazione del funzionamento dei LB.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 22, 2012, 07:29 am
x Tutti

Il punto chiave della questione, e che continua a sfuggirvi, è che i l.b. relativi alla flash generale fanno quello che devono fare, ovvero se settate la protezione in scrittura è impossibile alterare la flash oltre che dal firmware anche da SPI/Jtag e pure da HV.
Se durante la programmazione, non importa con che sistema, viene inviato un comando di reset, cosa che tutti i programmatori eseguono di default come prima operazione, i fuse vengono riportati al loro stato iniziale, ovvero nessun protezione nel caso dei l.b., e diventa possibile riprogrammare il micro.

Possibile che non vi entra in testa questa cosa tanto semplice ?
Possibile che non capite che se bloccate nel vero senso della parola la cancellazione del micro tramite programmatore poi lo potete buttare via se dovete aggiornarlo ? Una volta esistevano i micro OTP (One Time Programming) che si programmavano solo una volta, sono spariti non appena la flash è scesa a costi accettabili perché era veramente assurdo dover sostituire il micro per fare un update del software.



Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 22, 2012, 09:19 am

x Tutti

Il punto chiave della questione, e che continua a sfuggirvi, è che i l.b. relativi alla flash generale fanno quello che devono fare, ovvero se settate la protezione in scrittura è impossibile alterare la flash oltre che dal firmware anche da SPI/Jtag e pure da HV.
Se durante la programmazione, non importa con che sistema, viene inviato un comando di reset, cosa che tutti i programmatori eseguono di default come prima operazione, i fuse vengono riportati al loro stato iniziale, ovvero nessun protezione nel caso dei l.b., e diventa possibile riprogrammare il micro.


Tutta questa apparente confusione deriva dal significato che diamo ai termini "alterare" e "riprogrammare" la flash.
Dalla nota applicativa AVR910 (http://www.atmel.com/Images/doc0943.pdf), pagina 8 penultimo paragrafo, si afferma: "Per proteggere il contenuto della memoria da una sovrascrittura accidentale o da letture non autorizzate , i lock bit possono essere impostati per proteggere i contenuti della memoria ecc. ecc."
Io associo questa affermazione al termine alterare. Posso sovrascrivere parte o tutta la flash dopo aver impostato i l.b.?
No.

Più avanti la nota applicativa precisa: "Il solo metodo per riguadagnare l'accesso alla memoria dopo aver impostato i lock bits è di cancellare l'intero chip con un comando 'chip erase'. I lock bits saranno impostati ad 1, disabilitando la protezione, solo in seguito ad una pulitura di tutte le locazioni di memoria".
In questo caso il termine appropriato può essere riprogrammare. Dopo aver pulito tutta la flash, con la conseguente disabilitazione dei lock bits, posso riprogrammare la flash?
Si.

Poi si può discutere se la cosa è furba o stupida. Ma questo è un altro livello del discorso, in cui non si parla più dei lineamenti dei lock bits (cosa fanno) ma della loro efficacia (come lo fanno).

Ciao
QP

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 22, 2012, 10:07 am

x Tutti
Il punto chiave della questione, e che continua a sfuggirvi, è che i l.b. relativi alla flash generale fanno quello che devono fare, ovvero se settate la protezione in scrittura è impossibile alterare la flash oltre che dal firmware anche da SPI/Jtag e pure da HV.
Se durante la programmazione, non importa con che sistema, viene inviato un comando di reset, cosa che tutti i programmatori eseguono di default come prima operazione, i fuse vengono riportati al loro stato iniziale, ovvero nessun protezione nel caso dei l.b., e diventa possibile riprogrammare il micro.
Possibile che non vi entra in testa questa cosa tanto semplice ?

NON è possibile, ed infatti siamo tutti completamente d'accordo su questa cosa. Su cosa fanno i Lock Bits mi pare che QP col suo ultimo intervento abbia piantato una pietra miliare, penso che non sia più necessario spiegare altro.
Quote

Possibile che non capite che se bloccate nel vero senso della parola la cancellazione del micro tramite programmatore poi lo potete buttare via se dovete aggiornarlo ? Una volta esistevano i micro OTP (One Time Programming) che si programmavano solo una volta, sono spariti non appena la flash è scesa a costi accettabili perché era veramente assurdo dover sostituire il micro per fare un update del software.

Anche questo è chiarissimo ed io avrò scritto parecchie volte che non aspiro a realizzare il micro bloccato per sempre, sarei stupido!
Quindi nessuno nega tutto questo, e questo era il senso delle mie affermazioni precedenti. La questione che sto ponendo e su cui orami quasi tutti sono d'accordo è che:
- L'utente standard di Arduino programma un microcontrollore o mediante IDE o mediante AVRDUDE e, nella stragrandissima maggioranza dei casi, NON è in condizione di attivare/disattivare parametri.
- Se gli consegni un micro programmato per lavorare in standalone e con i lock bit settati per la protezione in lettura (non vuoi che possa copiare il firmare) e scrittura (non vuoi che lo possa sovrascrivere accidentalmente) e lui lo collega al suo Arduino via ISP, per vedere se è vero :smiley-mr-green:, cosa ottiene?
a - effettivamente non riesce a leggere
b - però riesce a scrivere e fa la czzt e perde il firmware (lasciamo stare se è sciocco o meno)
e tutto questo senza fare niente di particolare, perché? perché ArduinoISP e AVRDUDE (che poi è la stessa cosa...) hanno abilitato di default il chip_erase.

Cioè TUTTO si riduce ad una sola cosa: per me è ridicolo dare la possibilità di proteggere un micro mediante programmazione e poi impostare gli strumenti ordinari di manipolazione in modo tale che la protezione venga spazzata via anche se l'utente NON lo desidera (qui non parliamo di programmatori nel senso stretto del termine, tipo il Dragon). E' come se io esco di casa, metto 4 mandate di chiave di sicurezza e poi lascio la chiave attaccata alla porta. IO NON HO DETTO CHE LA PORTA NON SI CHIUDE con questo sistema, ma solo che il sistema è inutile perché la chiave è attaccata alla porta :D.

Chiudo dicendo che tutta sta discussione non si sarebbe mai fatta se semplicemente si fosse mantenuto il chip erase disabilitato di default. In questo caso l'utente standard NON sarebbe stato messo in condizioni di poter sbagliare involontariamente, mentre quello più evoluto avrebbe potuto a suo piacimento attivare l'opzione chip_erase e cancellarlo.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 22, 2012, 10:25 am

Chiudo dicendo che tutta sta discussione non si sarebbe mai fatta se semplicemente si fosse mantenuto il chip erase disabilitato di default.


Altra cosa che ti sfugge è che sebbene è possibile riscrivere la flash a singoli blocchi senza usare l'erase è il modo sbagliato di procedere nel caso della riprogrammazione, da non usarsi mai salvo casi particolari e comunque in modo ponderato.
Il comando chip erase è indispensabile prima di riprogrammare un micro, non è una carenza dell'IDE e/o di avrdude che venga utilizzato di default.
Poi se vogliamo filosofeggiare su quanto può essere "ignorante" (nel vero senso del termine) l'utente medio di Arduino, pertanto è facile che commette azioni con esiti disastrosi ed irreversibili, allora è un altro paio di maniche ed è un discorso che ha ben poco a che vedere con i lock bit  :D
Title: Re: Topic permanente di programmazione newbie
Post by: QuercusPetraea on Apr 22, 2012, 11:31 am


Altra cosa che ti sfugge è che sebbene è possibile riscrivere la flash a singoli blocchi senza usare l'erase è il modo sbagliato di procedere nel caso della riprogrammazione, da non usarsi mai salvo casi particolari e comunque in modo ponderato.
Il comando chip erase è indispensabile prima di riprogrammare un micro, non è una carenza dell'IDE e/o di avrdude che venga utilizzato di default.



Aggiungo, per completezza e dopo chiudo, che anche per l'auto-programmazione (Application note AVR109 (http://www.atmel.com/Images/doc1644.pdf) pagina 3 paragrafo Page Erase) gestita dal codice del bootloader con l'istruzione SPM necessita, prima di essere effettuata, che la pagina interessata alla programmazione sia prima cancellata.
Inoltre, il comando AVRDUDE che esegue l'IDE di Arduino per programmare il micro, utilizza l'opzione -D (disabilita la cancellazione della flash) altrimenti il codice del bootloader andrebbe a farsi fott.. friggere.
Direi che non altro da aggiungere.

Ciao
QP
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on Apr 22, 2012, 11:48 am

Inoltre, il comando AVRDUDE che esegue l'IDE di Arduino per programmare il micro, utilizza l'opzione -D (disabilita la cancellazione della flash) altrimenti il codice del bootloader andrebbe a farsi fott.. friggere.
Direi che non altro da aggiungere.


Esatto, infatti è il bootloader che provvede a cancellare la flash, dato che i relativi l.b. non gli impediscono di scrivere nella application area, e sono dominanti rispetto agli l.b. della flash, può tranquillamente cancellare il programma presente.

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on Apr 22, 2012, 01:47 pm
Alla fine ci siamo capiti sul fatto che la questione era puramente concettuale (o filosofica, come l'hai definita tu); mi permetto solo di riprendere una tua frase:
Quote
.... e sono dominanti rispetto agli l.b. della flash

per poter ancora di più affermare che questi L.B. sono una emerita cag :smiley-mr-green:, una sorta di cane da guardia che scodinzola a chiunque tenti di entrare in casa del proprio padrone, e magari gli indica pure qual è il materasso giusto  $)
Va bene, penso davvero che si possa chiudere ragionevolmente la questione, al solito Astro ha ragione da vendere ed io mi devo accontentare della filosofia, beh, meglio che niente :D :smiley-mr-green: :D :smiley-mr-green:
Grazie a tutti di avermi dato corda in questa squilibrata, ma spero anche utile, tematica.
Title: Re: Topic permanente di programmazione newbie
Post by: testato on Apr 22, 2012, 03:39 pm
Andiamo in pace  :)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 08, 2012, 11:15 am
Riapro per approfondire qualche concetto, visto che sto studiando il Reference del mega328P ai fini dell'articolo teorico sul Programmatore HV.
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on May 08, 2012, 11:31 am

ho notato che di default il bit è settato, mentre su Arduino è su 1, quindi teoricamente non dovrebbe essere possibile programmare via ISP il micro originale di Arduino.


Mi sa che stai sbagliando l'interpretazione dei fuse, su Arduino il fuse HIGH è settato a 0xDE (11011110) che prevede anche SPIEN a 0, ovvero abilitato, infatti se cambi il valore di SPIEN a 1 (disabilitato) il valore del fuse diventa 0xFE (11111110) perché cambia il bit 5 del fuse che è proprio quello del SPIEN.
Da notare che il fuse SPIEN non è accessibile da ISP, cosa voluta per evitare di settarlo involontariamente e bloccare il micro, cioè anche se disabiliti il fuse per errore non succede nulla se programmi da sketch ISP, per scrivere quel fuse devi utilizzare la programmazione JTAG (se supportata dal micro e il 328 non la prevede, la trovi sul 2560), oppure la HV.

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 08, 2012, 11:44 am


ho notato che di default il bit è settato, mentre su Arduino è su 1, quindi teoricamente non dovrebbe essere possibile programmare via ISP il micro originale di Arduino.


Mi sa che stai sbagliando l'interpretazione dei fuse, su Arduino il fuse HIGH è settato a 0xDE (11011110) che prevede anche SPIEN a 0, ovvero abilitato, infatti se cambi il valore di SPIEN a 1 (disabilitato) il valore del fuse diventa 0xFE (11111110) perché cambia il bit 5 del fuse che è proprio quello del SPIEN.
Da notare che il fuse SPIEN non è accessibile da ISP, cosa voluta per evitare di settarlo involontariamente e bloccare il micro, cioè anche se disabiliti il fuse per errore non succede nulla se programmi da sketch ISP, per scrivere quel fuse devi utilizzare la programmazione JTAG (se supportata dal micro e il 328 non la prevede, la trovi sul 2560), oppure la HV.


Sì, sì, non vedi che intanto avevo cancellato l'intervento lasciando solo la riapertura? :smiley-mr-green: Chiarisco: siccome sto lavorando con 6-7 file aperti, comprese alcune tabelle che ho disegnato specificatamente per spiegare il funzionamento dei Fuse, ad un certo punto ho confrontato il DE con la tabella dell'High, se ci fai caso risulterebbe proprio lo SPIEN disabilitato, allora ho scritto il post, dopo aver chiusu ho letto meglio e mi sono accorto della cxxt che avevo fatto e ho cancellato la domanda. :smiley-red:
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 08, 2012, 12:07 pm
Mi interessa approfondire due aspetti che non ho mai affrontato:
DebugWire: da quanto capisco si attiva sul pin RESET del micro e sul datasheet ci sono una serie di indicazioni su come deve essere usato (pull-up, condensatore, collegamento a Vcc), ma a cosa serve esattamente?

WatchDog: questo è un termine che ho letto diverse volte nelle discussini del Forum, se non erro a proposito dei micro che si bloccavano sulla comunicazione seriale col PC, a motivo di un errore di programmazione, ma in sostanza cosa fa e di che si occupa questa funzione?
Title: Re: Topic permanente di programmazione newbie
Post by: lestofante on May 08, 2012, 12:56 pm
DebugWire: non sono sicuro ma dovrebbe essere un sistema per il quale puoi conoscere lo stato di registri e variabili ad ogni istante nel micro. in oltre credo tu possa simulare il clock, facendo quindi un debug passo-passo delle istruzioni asm.

WatchDog: è una specie di timer, quando raggiunge un certo valore resetta il mirco. Ovviamente tu puoi resettare quando vuoi questo timer senza far resettare il tutto.
E' utile, per esempio se la Wire ogni tanto si impalla, allora metti un watchdog per esempio a 2secondi, e ogni loop lo resetti. Nel momento in cui il micro rimane bloccato, dopo 2 secondi dall'ultimo reset il watchdog resetta il micro.

può essere pericoloso se per esempio setti tempi di reset inferiore a meno di 2 o 3 secondi: infatti il bootloader (almeno in alcune sue versioni) non spegne il watchdog, edato che il boot impiega più tempo e non resetta nemmeno il timer, il micro finisce per andare in reset infinito.
E' risolvibile riprogrammando il micro da ISP
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 08, 2012, 01:22 pm
Grazie, spero di avere degli ulteriori approfondimenti, dovrei scriverci qualcosa se possibile,  e devo comprendere le problematiche più a fondo.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 08, 2012, 01:42 pm
@Mike:
confermo quanto detto da lesto.

Il debugWire è una particolare modalità di debug per la quale serve però un programmatore a tutti gli effetti. Eseguendo il codice con tale modalità attiva, il programmatore può leggere i registri interni del micro man mano che avanza l'esecuzione del codice accedendo ad essi tramite 1 solo pin.

Il watchdog, in italiano "cane da guardia", è un sistema per evitare blocchi del codice. Il watchdog va attivato dandogli un tempo di allarme. Se il timer supera quel valore, il micro viene resettato a forza. Bisogna stare attenti col watchdog, si rischia il briccaggio del chip dato che se si imposta un timer inferiore al tempo che occorre al codice per resettare il timer, il micro viene resettato a forza entrando in un circolo vizioso.
Title: Re: Topic permanente di programmazione newbie
Post by: testato on May 08, 2012, 02:03 pm
non sono daccordo con la definizione del cane.
non e' che il watchdog evita "blocchi di codice", il codice se si blocca si blocca, non puoi far altro che trovare il bug e risolverlo, il watchdog assodato che il codice e' bloccato fa un reset.

metti un arduino in una montagna, spero che non si blocchi, ma se proprio si blocca invece di salire in montagna a resettare il cane da guardia lo fa per me
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 08, 2012, 02:17 pm
Per "blocchi del codice" intendo "blocchi del dispositivo causati da codice scritto senza che il programmatore ne abbia tenuto conto".

Cioè, il watchdog serve per evitare che l'esecuzione del codice si blocchi in loop non previsti. Ad esempio, se mi metto in ascolto di un segnale in arrivo sulla seriale e questo segnale non arriva perché un bimbominchia mi ha tagliato i fili? Se non ho previsto un timeout, il mio codice "muore" lì: resta vita natural durante in ascolto di un byte che non arriverà mai.


metti un arduino in una montagna, spero che non si blocchi, ma se proprio si blocca invece di salire in montagna a resettare il cane da guardia lo fa per me

Attenzione a questa cosa. Non prendiamo il watchdog come un taumaturgo. Se il codice è buggato, come ho detto sopra, è e resta buggato e la condizione di blocco si ripresenterà nuovamente se le condizioni scatenanti si ripresentano anch'esse.
Title: Re: Topic permanente di programmazione newbie
Post by: lestofante on May 08, 2012, 02:29 pm
vero, però prendi il caso eth shield: alcune persone lamentano il blocco della shield e quindi delle comunicazioni. una soluzione sarebbe quella di usare chiamate non bloccanti, ma complica un sacco il codice, un'altra è di mettere il watchdog.

Diciamo che è più "una pezza" che una soluzione  :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on May 08, 2012, 02:30 pm

Per "blocchi del codice" intendo "blocchi del dispositivo causati da codice scritto senza che il programmatore ne abbia tenuto conto".


Il vero scopo del watchdog è far ripartire il programma in caso di eventi disastrosi che mandano in crash il codice o il micro, in particolar modo disturbi sulla alimentazione o di natura elettromagnetica che possono far impazzire letteralmente il codice, non ha nulla a che vedere con i bug di programmazione per i quali è assolutamente inutile, anzi può essere più dannoso che utile, il watchdog si attiva solo quando il codice è stabile e debuggato.
Va da se che non basta attivare il watchdog e resettarlo ad ogni ciclo del main loop, o all'interno di eventuali funzioni a lunga durata, è indispensabile che il codice stesso sia strutturato per l'utilizzo del watchdog.

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 08, 2012, 02:41 pm
Ecco, comincio ad avere le idee più chiare su questi due argomenti; però l'ultima frase di Astro mi fa sorgere un dubbio, quindi faccio un esempio pratico: i miei 7 nanetti ormai stanno lavorando da mesi ininterrottamente, avendo messo i tx w/less(con led) all'interno degli infissi l'attività del LED mi conferma la cosa; ma se un giorno un nanetto di dovesse bloccare, sarei costretto ad aprire il cassonetto per resettarlo manualmente. Allo stato attuale posso ben dire che il software è perfettamente funzionante, quindi mi basterebbe aggiungere un paio di righe di comando (quali???) per mettermi al riparo da questa evenienza?

Introduco un altro argomento, o meglio lo riprendo, quello dei Lock bits: ora è chiaro che i boot lock bits ed i lock bits sono 6 bits dello stesso byte; nelle prove non mi è mai balenata l'idea che potesse essere così e non ho provato valori diversi da FF, FE, FC (i tre che agiscono sui lb); ma nelle note di programmazione del reference non vedo traccia della programmazione dei BLB, in quanto parla sempre e solo di lb. Non ho l'HV se non mi rispondevo da solo :smiley-mr-green: Secondo Voi per programmare anche i BLB mi basterebbe semplicemente inserire un valore, tra quelli permessi, contemplando anche lo status 0/1 che voglio dare ai blb? P.es. con CF potrei programmare i due blb più alti lasciando il resto a 1?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 08, 2012, 03:20 pm
Riprendo l'appunto di astro e rispondo parzialmente anche a Mike.
In giro per la rete oggi ho letto di tutto sul watchdog, anche che un reset è "salutare". Cioè anche se il software gira bene, ogni tanto dargli un reset può starci, come uno scappellotto ad un figlio birbone, giusto per ricordargli le vecchie "buone maniere". Insomma, il watchdog non solo per salvare il micro da eventi hw disastrosi (i tanto pericolosi sbalzi di tensione) ma anche per rimettere le cose a posto. Un esempio sono i calcoli che consumano molta memoria: per esperienza diretta, posso affermare che nel momento in cui la ram va in esaurimento, possono accadere le cose più impensate. Però secondo me si torna al mio discorso: se non si elimina la causa del blocco (sia esso sw o hw) il watchdog da solo serve il giusto.

PS:
Non entro nel merito dei lock bit, dopo giorni in cui non se ne parla e dopo essermi concentrato su altro, ho rimosso quasi del tutto l'argomento dalla mia memoria  :smiley-sweat:

PPS:
@Mike:
http://www.logicaprogrammabile.it/arduino-resettare-automaticamente-la-scheda-utilizzando-il-watchdog-timer/

EDIT:
ripensavo ai problemi hw. Ricordo che il watchdog resetta il microcontrollore ma non l'hardware agganciato per cui se la condizione di blocco è esterna ed il dispositivo è bloccato, bisogna pensare a creare un sistema di reset anche per quell'hardware (tipo un transistor per togliere l'alimentazione, un segnale su un eventuale pin di reset eccc) altrimenti non abbiamo risolto nulla
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 08, 2012, 07:06 pm
Sui lock bits spero di fare qualche prova diretta, non avendo risposte certe, sono andato al lab e ho recuperato il Programmatore; solo che avevo "blindato" l'input in modo da non poter fornire valori diversi dai "3" e quindi mi tocca rimetterci mano, ci sta :smiley-sweat:, se dovesse andar bene sarebbe sempre una funzione in più; con tutto il lavoraccio che ho fatto sulle routine di lettura e scrittura.....

Sul WD il link che mi hai dato pare proprio fatto per i tardi come me, grazie :D; ora me lo studio; se mai arrivasse un giorno che un nanetto si blocchi o si scarichi la batteria (ma ho calcolato 5 anni :smiley-sweat:) o, più facilmente, si dovesse rompere una corda, approfitto per aggiornare il firmware ;) un si sa mai :)
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 08, 2012, 07:53 pm

Sul WD il link che mi hai dato pare proprio fatto per i tardi come me, grazie :D; ora me lo studio; se mai arrivasse un giorno che un nanetto si blocchi o si scarichi la batteria (ma ho calcolato 5 anni :smiley-sweat:) o, più facilmente, si dovesse rompere una corda, approfitto per aggiornare il firmware ;) un si sa mai :)

Se vuoi evitare problemi di basse tensioni, usa il brown-out al posto del watchdog: è fatto apposta. Ma che te lo dico a fare  :P

Se vuoi esser sicuro di non ritrovarti con il codice infilato in un loop infinito o piantato perché le piogge radioattive ti hanno mandato a meretrici il micro, allora pensa al watchdog con i tempi massimi consentiti (mi pare sia 2s il max impostabile sui Tiny).
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 08, 2012, 08:01 pm
Letto e [forse] capito: (scusa Leo, ti leggo mentre posto)
uso la libreria wdt.h
in setup setto il tempo di WD (lì però non consiglia di NON scendere sotto i due secondi come diceva lesto....ma a me risulta che abbia ragione lesto, quindi?)
in un punto strategico del loop, ma non necessariamente ad ogni ciclo..., resetto il WD. Il punto strategico lo fisso in un punto al quale il software arriva solo se è andato tutto bene fino a quel momento. E a quel punto il siftware deve arrivare sempre prima del tempo impostato per il WD, altrimenti il micro si resetta perennemente.
Quindi se imposto il timer del WD a 4 secondi, io devo scegliere il punto di reset in modo che normalmente esso azzeri il timer PRIMA che passino i 4 secondi; se succede qualcosa il timer non viene resettato e quindi WD interviene (allo scadere dei 4 secondi) e resetta il micro.
Ho capito bene :smiley-eek-blue:?
Il brown-out l'ho disattivato Leo, per un circuito a batteria lo vedo invece "pericoloso", comunque lo sto proprio descrivendo ora nell'articolo :D
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 08, 2012, 08:15 pm
http://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html

Sì, è vero. Anche i Tiny consentono tempi di 4 e 8s. Andavo a memoria.

Per il resto è come hai interpretato. Fissi un punto di azzeramento del contatore del watchdog, che valuti in base a come hai strutturato il codice. Se non passa da quel punto, il tuo codice significa che si è piantato ed il watchdog farà il suo dovere.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 08, 2012, 08:19 pm
Dando ragione a lesto mi riferivo al fatto di NON impostare tempi sotto i due secondi per non rischiare l'impallo sotto forma di reset perenne, in quando al riavvio il bootloader ci metterebbe più tempo di quello del reste WD per diventare operativo.
Come stanno le cose?
Se c'è questo rischio come mai prevedono tempi inferiori a quelli di riattivazione del BL (probabilmente perché i tempi del WD li stabilisce ATMEL mentre il BL è specifico di Arduino?)
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 08, 2012, 08:36 pm
A logica non si corre questo pericolo perché se andiamo ad analizzare la sequenza di avvio del micro, abbiamo:

- accensione
- controllo passato al bootloader: questo esegue il controllo sulla seriale per vedere se arriva uno sketch
- se non arrivano sketch da flashare, passa il controllo al programma dell'utente
- parte il programma dell'utente che, solo a questo punto, imposta e gestisce il watchdog

Per dirla tutta, c'è un watchdog anche internamente al bootloader, per resettarlo nel caso si pianti in ascolto. Ma che si può evitare di considerare. Se il tuo sketch imposta 2 secondi, i 2 secondi sono conteggiati al suo interno. Essi sono impostati nel setup, quindi il tempo del bootloader non entra nel conteggio.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 08, 2012, 09:46 pm
Code: [Select]

/* CAGNACCIO
sketch di esempio per imparare ad usare il watchdog (by Leo72)
*/

#include <avr/wdt.h> //libreria necessaria per gestire il watchdog
const byte LED=13; //led sul pin 13
byte statoLed=1; //stato del led

void setup() {
    pinMode(LED, OUTPUT); //led come ouput
    flashStart(); //salutiamo
    //Watch out! Watchdog! (Pericolo! Cane mordace!)
    cli(); //stop agli interrupt
    wdt_reset(); //resettiamo il cagnaccio
    wdt_enable(WDTO_4S); //4 secondi di attesa prima del reset
    sei(); //riattivo gli interrupt
   
}

void loop() {
    delay(1000); //1 secondo d'attesa
    statoLed^=1; //cambio di stato del led
    digitalWrite(LED, statoLed); //lampeggio del led
   
    //**********
    //delay(3500); //commenta/decommenta questa riga per vedere il cagnaccio in azione
    //**********
    wdt_reset(); //resettiamo il contatore
}
   

//semplice routine per verificare il reset della scheda
//esegue 5 flash veloci del led integrato
void flashStart() {
    for (byte i=0; i<5; i++) {
        digitalWrite(LED, statoLed);
        delay(50);
        statoLed^=1;
        digitalWrite(LED, statoLed);
        delay(50);
    }
}


Piccolo sketch di esempio. Caricatelo sull'Arduino. 5 flash del led e poi lampeggi regolari ogni secondo. Se decommentate la riga delay(3500) avrete la soprersa. Vedrete in azione il watchdog: 5 lampeggi veloci, led acceso fisso per 3,5 secondi e poi altri 5 lampeggi veloci ecc..
Questo perché il tempo complessivo supera i 4 secondi impostati per il watchdog ed il circuito resetta l'Atmega.
Title: Re: Topic permanente di programmazione newbie
Post by: legolas93 on May 08, 2012, 09:55 pm
Ragazzi, primo programma con Arduino e subito sono in crisi. Cavolo non capisco proprio perchè non funzioni..

Code: [Select]
  int x = 9;
  int y = 3;
  int z;

void setup(){

  z = x/y;
  Serial.begin(2400);
 
}

void loop(){
 
  Serial.println(z);
 
}


Apro serial monitor e guardate cosa trovo:

(http://img43.imageshack.us/img43/9836/arduino.jpg) (una sfilza infinita...)

Non dovrei avere una sfilza di "3"?..Mi sto perdendo in un bicchiere d'acqua, nonostante ciò non trovo l'errore..Cosa sono questa serie di X accompagnate da un simbolo strano?

Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 08, 2012, 10:05 pm
1) non si vede bene
2) hai messo la stessa velocità sul monitor seriale?
3) i numeri stampali con Serial.println(z, DEC)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 08, 2012, 10:15 pm
Mi stavo per incavolare per l'"intrusione" di legolas93, poi mi sono ricordato che il titolo al Topic l'ho dato proprio io..... :smiley-sweat:
Ho copiato il tuo code, lo proverò; hai ragione su quello che dici, solo non ricordo più perché tempo fa più di qualcuno bloccò Arduino usando male il WD, tu ne hai memoria?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 08, 2012, 10:21 pm

Mi stavo per incavolare per l'"intrusione" di legolas93, poi mi sono ricordato che il titolo al Topic l'ho dato proprio io..... :smiley-sweat:

Esatto  ;)

Quote

Ho copiato il tuo code, lo proverò; hai ragione su quello che dici, solo non ricordo più perché tempo fa più di qualcuno bloccò Arduino usando male il WD, tu ne hai memoria?

No, se ne è sempre parlato ma sempre di terzi, io non mi ricordo di qualcuno che abbia scritto "io ho briccato il micro".
Title: Re: Topic permanente di programmazione newbie
Post by: legolas93 on May 08, 2012, 10:24 pm
Michee..ehh  :P io mi sono rifatto al titolo!

Grazie Leo72..era la velocità impostata diversa  :~ La cosa bella è che è una cosa che so e che avevo anche controllato..  :smiley-zipper: Questi sono proprio errori da newbie.

Vediamo se ora della Maturità riesco a tirare fuori qualche progetto carino da portare alla commissione  8)
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 08, 2012, 11:41 pm

Grazie Leo72..era la velocità impostata diversa  :~ La cosa bella è che è una cosa che so e che avevo anche controllato..  :smiley-zipper: Questi sono proprio errori da newbie.

E per questo sei degnamente finito su questo Topic  :smiley-mr-green:
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 09, 2012, 07:35 pm

Introduco un altro argomento, o meglio lo riprendo, quello dei Lock bits: ora è chiaro che i boot lock bits ed i lock bits sono 6 bits dello stesso byte; nelle prove non mi è mai balenata l'idea che potesse essere così e non ho provato valori diversi da FF, FE, FC (i tre che agiscono sui lb); ma nelle note di programmazione del reference non vedo traccia della programmazione dei BLB, in quanto parla sempre e solo di lb. Non ho l'HV se non mi rispondevo da solo :smiley-mr-green: Secondo Voi per programmare anche i BLB mi basterebbe semplicemente inserire un valore, tra quelli permessi, contemplando anche lo status 0/1 che voglio dare ai blb? P.es. con CF potrei programmare i due blb più alti lasciando il resto a 1?

Fatte le prove "LI CONTI TORNANO" (ultimo dialogo tra la Morte e Brancaleone): effettivamente, rimossi i blocchi che avevo messo, al LOCK BITS BYTE nel suo insieme riesco a dare qualsiasi valore, quindi posso programmare sia i BLB e i LB. Il vero problema che mi si pone ora è capire tutto il casino che ruota attorno a questi 6 bit (due non sono usati); attenzione, non mi riferisco alla questione protegge/non protegge, già abbondantemente chiarita, ma proprio come si dovrebbe usarli. E per quanto sono riuscito a comprendere io spiegherei questo in prima battuta:
Il LBB è così organizzato:
7-6 : non usati
5-4 : Protezione della Sezione Bootloader della memoria Flash
3-2 : Protezione della Sezione Application della memoria Flash
1-0 : Protezione della memoria Flash e EEPROM

Cioè a me pare di capire che mentre i bit 5-4 e 3-2 agiscono solo sulla specifica sezione di memoria flash (la Application va da 0x0000 all'inizio della Bootloader, che è fissato dai fuse: 512-1024-2048-4096 byte), i bit 1-0 agiscono sull'intera memoria flash e anche sulla EEPROM (sempre che non sia protetta dall'attivazione dell'apposito Fuse.

Tutto ciò lo ricavo dal Rev. 8271D-AVR-05/11 del 328P (salvo eccezioni sul 48P) pag. 283 par. 27.5 e pag. 297 par. 28.1 e la cosa mi sembra confermata dalla nota "Program the Fuse bits and Boot Lock bits before programming the LB1 and LB2" che ora finalmente capisco; infatti se è come ho intuito è ovvio che i LB siano più "potenti" dei BLB, che verrebbero ignorati; e infatti riesco a programmare nella direzione FF->FE->FC ma non nella direzione opposta.

Ma il mio inglese… :~ vi chiedo conferma, ho capito bene secondo voi?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 09, 2012, 07:56 pm
Concordo con te. Ma la parte più significativa secondo me è la coppia di tabelle a pagina 284, dove spiega "chi" e "dove" può accedere. Vedi infatti le distinzioni fra area dell'applicazione ed area del booloader nonché i permessi della programmazione seriale e parallela.

Ah, piccola precisazione. Questo non è corretto:
Quote
la Application va da 0x0000 all'inizio della Bootloader, che è fissato dai fuse: 512-1024-2048-4096 byte

In realtà quei valori indicano la dimensione, non l'indirizzo di partenza. Il bootloader occupa sempre la parte più alta della memoria. Ma penso che tu abbia solo scritto male.

Comunque per chiarezza facciamo un esempio. Se abbiamo un Atmega168, la sua memoria va da 0000 a 16383 ($0000-$3FFF). Se impostiamo un bootloader di 512 byte, la memoria dell'applicazione va da $0000 a $3DFF, poi da $3E00 a $3FFF c'è il bootloader. In un 328, lo stesso bootloader occupa da $7E00 a $7FFF.
Title: Re: Topic permanente di programmazione newbie
Post by: Maurotec on May 09, 2012, 08:00 pm
Menniti se non ricordo male (due settimane fa ho letto circa i 6 bit nel datasheet del 328)  il tuo inglese questa volta è stato sufficiente.
Possiamo dire che LB è Global Lockbit, e BLB e BLB1 sono Specific Lockbit.

Come usarli non lo so, io in avrdudequi li ho implementati come si vedono nel datasheet, con la stessa descrizione "pessima" perchè non ho saputo trovare niente di meglio e in mancanza ho preferito lasciare le note di Atmel.

Ciao.

Anticipato da leo:
Quote
Comunque per chiarezza facciamo un esempio. Se abbiamo un Atmega168, la sua memoria va da 0000 a 16383 ($0000-$3FFF). Se impostiamo un bootloader di 512 byte, la memoria dell'applicazione va da $0000 a $3DFF, poi da $3E00 a $3FFF c'è il bootloader. In un 328, lo stesso bootloader occupa da $7E00 a $7FFF.


Vero anche io penso che abbia scritto sbagliato ma sa come stanno le cose.

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 09, 2012, 08:11 pm
Grazie ragazzi, mi conforta questa cosa :)
Allora chiarisco che mi sono spiegato male ma che ho ben presente la questione dell'area di bootloader: l'ho approfondita studiando i fuse bits in questi giorni; so che l'area Bootloader è nella parte alta della memoria e che l'indirizzo di partenza dipende da quanta memoria viene riservata ad essa, essendo tale valore variabile in base al settaggio dei fuse bits.
Ora mi pare di aver capito anche ciò che dice lo specifico, pes. i due bit della sezione Application:
1 1 No restrictions for SPM or LPM accessing the Application section. (sezione non protetta)
1 0 SPM is not allowed to write to the Application section. (protetta da scrittura)
0 0 SPM is not allowed to write to the Application section, and LPM executing from the Boot Loader section is not allowed to read
from the Application section. If Interrupt Vectors are placed in the Boot Loader section, interrupts are disabled while executing
from the Application section. (protetta da scrittura e anche dalla lettura da parte del bootloader, eventuali vettori di interrupt collocati nel BL vengono disabilitati durante l'esecuzione dalla sezione Application)
0 1 LPM executing from the Boot Loader section is not allowed to read from the Application section. If Interrupt Vectors are placed
in the Boot Loader section, interrupts are disabled while executing from the Application section. (come sopra ma solo per ciò che riguarda la protezione dalla lettura)
:smiley-sweat:
che dite?
Title: Re: Topic permanente di programmazione newbie
Post by: Maurotec on May 09, 2012, 09:11 pm
Quote
che l'area Bootloader è nella parte alta della memoria e che l'indirizzo di partenza dipende da quanta memoria viene riservata ad essa, essendo tale valore variabile in base al settaggio dei fuse bits.


Non mi pare così, direi che l'indirizzo di partenza in cui risiede il bootloader è sempre 00, poi dopo tot byte (in base ai fuse) termina
l'area del bootloader e comincia quella così detta application area.

Quote
Ora mi pare di aver capito anche ciò che dice lo specifico, pes. i due bit della sezione Application:
1 1 No restrictions for SPM or LPM accessing the Application section. (sezione non protetta)
1 0 SPM is not allowed to write to the Application section. (protetta da scrittura)
0 0 SPM is not allowed to write to the Application section, and LPM executing from the Boot Loader section is not allowed to read
from the Application section. If Interrupt Vectors are placed in the Boot Loader section, interrupts are disabled while executing
from the Application section. (protetta da scrittura e anche dalla lettura da parte del bootloader, eventuali vettori di interrupt collocati nel BL vengono disabilitati durante l'esecuzione dalla sezione Application)
0 1 LPM executing from the Boot Loader section is not allowed to read from the Application section. If Interrupt Vectors are placed
in the Boot Loader section, interrupts are disabled while executing from the Application section. (come sopra ma solo per ciò che riguarda la protezione dalla lettura)
smiley-sweat
che dite?


Si in effetti ora è anche più chiaro, scrivilo tutto in italiano che ha più senso. Appunto se ho un bootloader installato e voglio evitare che l'utente lo usi per leggere l'application area devo selezionare l'ultima sequenza di bit 0 1. Ma il bootloader può scrivere però magari non offre questa capacità all'utente di suo. Insomma io non ho un buon motivo per usarle forse per questo non mi figuro un caso di uso.

Ciao.
Title: Re: Topic permanente di programmazione newbie
Post by: testato on May 09, 2012, 09:17 pm
menny sono daccordo con la tua interpretazione/traduzion, mentre sul posizionamento fisico del bootloader anche io sapevo che era all'inizio della flash, mi sembra anche abbastanza logico, cioe' l'mcu inizia a lavorare sempre da 0000 e poi vediamo, se' ce' un bootloader il suo codice che mi indirizzera' all'applicativo, che e' piu' avanti fisicamente parlando
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 09, 2012, 09:18 pm
No, mi spiace contraddirvi. Il bootloader è nell'ultima sezione della Flash.
La tabella a pag. 18 fa vedere chiaramente come il bootloader sia posizionato proprio in alto (basta vedere gli indirzzi).
Title: Re: Topic permanente di programmazione newbie
Post by: astrobeed on May 09, 2012, 09:19 pm

Non mi pare così, direi che l'indirizzo di partenza in cui risiede il bootloader è sempre 00, poi dopo tot byte (in base ai fuse) termina
l'area del bootloader e comincia quella così detta application area.


All'indirizzo 0x00 c'è il reset vector, cioè un jmp alla prima di memoria dove risiede il programma, poi c'è il vettore di interrupt, il bootloader è sempre posto in fondo alla flash, se è presente all'indirizzo 0x00 c'è un jmp alla prima locazione del bootloader, vedi tabella 11-1 del data sheet per i dettagli.

Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 09, 2012, 09:38 pm
Sul bootloader ero certissimo, ho studiato a fondo i fuses, ora ho anche il conforto di Astro e Leo :)
Per il resto ho letto e riletto e tutto torna, quindi ora il Programmatore HV legge e programma correttamente l'intero Lock Bits Byte, «another brick in the wall» XD
Riepilogando:
2 bits controllano R/W della memoria bootloader
2 bits controllano R/W della memoria applicazioni
2 bits controllano R/W di entrambe le aree, quindi dell'intera flash memory ed anche dell'EEPROM e bloccano anche i fuse bits (cosa che non fanno i 4 bits precedenti) e/o i boot lock bits.
Quindi si può agire indifferentemente su lettura e/o scrittura delle due aree o contemporaneamente su entrambe.
La "novità" sta nel fatto che, contrariamente a ciò che mi era parso di capire nei giorni scorsi, sempre su questo Topic, i lock bits hanno maggior peso dei boot lock bits ed infatti il reference dice che i blb vanno programmati PRIMA dei lb.
Mi metto e scrivo tutto per l'articolo $) ora sto valutando se caricare le descrizioni sintetiche di tutte le combinazioni, ma mi sa che sono tante :smiley-eek-blue:
Per il momento un dono alla vostra gentilezza e disponibilità: tabella riepilogativa (anteprima assoluta per gli amici del Forum!!) del Lock Bits Byte del mega328P XD
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 09, 2012, 09:52 pm
I BLB sono delle specie di custodi interni della memoria. Difatti servono per evitare che il codice possa scrivere sulla Flash a runtime.
I lock bit veri e propri sono, usando un'altra figura,come le sentinelle di ronda che controllano che tentativi di lettura/scrittura che provengono dall'esterno del micro possano passare.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 09, 2012, 10:17 pm
Grazie del chiarimento. Mi pare che l'argomento possa ritenersi esaurientemente trattato, salvo richieste di approfondimenti :)

Invece vorrei ora parlare di un qualcosa che ho sfiorato marginalmente in questi giorni e mi ha fortemente incuriosito, cito il datasheet:
Quote
Calibration Byte
The ATmega48A/PA/88A/PA/168A/PA/328/P has a byte calibration value for the Internal RC
Oscillator. This byte resides in the high byte of address 0x000 in the signature address space.
During reset, this byte is automatically written into the OSCCAL Register to ensure correct frequency
of the calibrated RC Oscillator.

Ci sono due aspetti estremamente interessanti da capire:
1 - qui parla di una scrittura automatica del byte di calibrazione dell'oscillatore, ma la cosa significa che sarebbe possibile agire su 256 bit per tarare la frequenza dell'oscillatore interno?
2 - Se ben capisco il byte risiede nell'area della signature che dovrebbe essere protetta (probabilmente solo dall'esterno); ma secondo Voi potrebbe esistere un modo per riscrivere la signature (mi riferisco a quei 2313 che ho azzerato ma che continuano a funzionare anche senza signature) visto che in quest'area di memoria viene riscritto il registro OSCCAL?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 09, 2012, 10:22 pm
Mi sa che hai frainteso. Dall'area di memoria dove risiede anche la signature viene letto il valore di calibrazione dell'oscillatore interno e copiato nel registro OSCCAL, che risiede in RAM ed è quindi modificabile.

Non l'inverso, perché la memoria dove risiede la signature dovrebbe essere di tipo PROM. Una volta scritta, è quella. Difatti mi pare che astro avesse scritto che, in uno scambio di mail con Atmel, era venuta fuori la questione che a "giocare" con le signature, forzando le programmazioni con avrdude ed il parametro "-f", si poteva rovinare l'area dove risiede la signature. A quel punto la signature era persa anche se il micro continuava a funzionare regolarmente. Solo alcuni programmatori "precisini", che leggevano la signature obbligatoriamente, potevano impuntarsi nel cercare di programmare questi chip senza nome.

Sul fatto del valore di calibrazione, ci sono dei micro che permettono di modificare tale valore. Ad esempio la V-USB!!! Te la ricordi Mike?  ]:D
Ti ricordi che l'Attiny85 viene calibrato internamente a 12 MHz agendo proprio su questo parametro?
Title: Re: Topic permanente di programmazione newbie
Post by: Maurotec on May 09, 2012, 10:38 pm

No, mi spiace contraddirvi. Il bootloader è nell'ultima sezione della Flash.
La tabella a pag. 18 fa vedere chiaramente come il bootloader sia posizionato proprio in alto (basta vedere gli indirzzi).




Non mi pare così, direi che l'indirizzo di partenza in cui risiede il bootloader è sempre 00, poi dopo tot byte (in base ai fuse) termina
l'area del bootloader e comincia quella così detta application area.


All'indirizzo 0x00 c'è il reset vector, cioè un jmp alla prima di memoria dove risiede il programma, poi c'è il vettore di interrupt, il bootloader è sempre posto in fondo alla flash, se è presente all'indirizzo 0x00 c'è un jmp alla prima locazione del bootloader, vedi tabella 11-1 del data sheet per i dettagli.


Si ma io guardavo il monitor al contrario e il mio cervello era in negato ~, quindi ~FF= 00 e scusate. Ho lo sapevate che arrampicarsi sugli specchi è davvero difficile. :smiley-mr-green:

Ciao.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 09, 2012, 10:46 pm

Mi sa che hai frainteso. Dall'area di memoria dove risiede anche la signature viene letto il valore di calibrazione dell'oscillatore interno e copiato nel registro OSCCAL, che risiede in RAM ed è quindi modificabile.

hai perfettamente ragione, ora che ho letto meglio :smiley-sweat: è proprio come dici
Quote

Non l'inverso, perché la memoria dove risiede la signature dovrebbe essere di tipo PROM. Una volta scritta, è quella. Difatti mi pare che astro avesse scritto che, in uno scambio di mail con Atmel, era venuta fuori la questione che a "giocare" con le signature, forzando le programmazioni con avrdude ed il parametro "-f", si poteva rovinare l'area dove risiede la signature.

no, non abbiamo mai scoperto perché questo succedesse ed io non avevo mai usato il -F; Astro scrisse ad ATMEl e gli risposero che poteva succedere che si cancellasse per eventi elettrici non meglio specificati.
Quote

A quel punto la signature era persa anche se il micro continuava a funzionare regolarmente. Solo alcuni programmatori "precisini", che leggevano la signature obbligatoriamente, potevano impuntarsi nel cercare di programmare questi chip senza nome.

errore consequenziale: SOLO dopo averli azzerati ho usato il -F per vedere se potevo usarli ed infatti poi ho suggerito con successo la cosa a BUD ;)
Quote

Sul fatto del valore di calibrazione, ci sono dei micro che permettono di modificare tale valore. Ad esempio la V-USB!!! Te la ricordi Mike?  ]:D
Ti ricordi che l'Attiny85 viene calibrato internamente a 12 MHz agendo proprio su questo parametro?

non lo ricordavo, ero troppo impegnato a maledirla per poterne approfondire il funzionamento. Invece mi interessava capire se si poteva gestire via software in modo da calibrare il singolo micro disponendo di idonea strumentazione. Se parli di 12MHz significa che tale byte opera anche su oscillatore esterno o cosa?
Chiuso il discorso signature mi piacerebbe capirne di più su questa cosa.
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 09, 2012, 10:51 pm
La calibrazione dovrebbe influenzare solo l'oscillatore interno.
Si può modificare via software, vedi cap. 9.6 pag. 34 e link correlati. Mai approfondito il discorso.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 09, 2012, 10:59 pm
ok approfondirò, solo un chiarimento,a quale reference ti stai riferendo tiny o mega?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 09, 2012, 11:11 pm
Mega. Citavi i Mega, ho spulciato quello dei Mega. Lo stesso tuo, doc8271d-avr-85/11.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 09, 2012, 11:13 pm

Mega. Citavi i Mega, ho spulciato quello dei Mega. Lo stesso tuo, doc8271d-avr-85/11.


so' stanco, grazie! domani giornataccia ma venerdì voglio approfondire, dopo aver scritto tutto sul LbB. Ciao :)
Title: Re: Topic permanente di programmazione newbie
Post by: testato on May 09, 2012, 11:13 pm
Posizione bootloader: Thanks
Tabella Lockbits: Thanks

il discorso calibrazione oscillatore interno: se ho capito viene testato il corretto valore in fabbrica e lo si scrive in signature, ad ogni boot viene copiato dalla signature e scritto in Ram, quindi se via sketch ad esempio in Setup() sovrascriviamo questo dato lo gestiamo come vogliamo ?
Potrebbe servire alla swRTC al posto del deltaT ?
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 09, 2012, 11:20 pm
La swRTC va più che bene così, lasciamola in pace  :P
Altrimenti potremmo usare anche il termometro interno e calibrare l'oscillatore in base alla temperatura. Poi, con un calendario lunare, verificare se è gobba a ponente deltaT crescente, gobba a levante deltaT calante  :smiley-yell:
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 09, 2012, 11:44 pm
@Mike:
sono andato a spulciare sul sito del core Tiny ed ho trovato quella libreria che serviva a calibrare i Tiny. Ti ricordi di TinyTuner?
http://code.google.com/p/arduino-tiny/downloads/list

Dentro ho trovato un readme con un paio di link. Il primo è ad un documento di Atmel sulla calibrazione dell'oscillatore. E' vecchio (2006) ma qualche info la da:
http://www.atmel.com/Images/doc2555.pdf

Un altro metodo è quello usato dalla libreria, che si basa sul principio descritto qui:
http://forums.adafruit.com/viewtopic.php?t=5078
l'uso della trasmissione della seriale.
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 10, 2012, 10:26 am
grazie, voglio provare a capirci qualcosa in più.
l'idea è proprio quella di Test :smiley-red:, poiché esiste il modo di misurare il clock interno, a tentativi si potrebbe trovare una condizione oiù precisa di quella di default
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 10, 2012, 10:40 am

La swRTC va più che bene così, lasciamola in pace  :P
Altrimenti potremmo usare anche il termometro interno e calibrare l'oscillatore in base alla temperatura. Poi, con un calendario lunare, verificare se è gobba a ponente deltaT crescente, gobba a levante deltaT calante  :smiley-yell:

Notizia: ah leo, fai attenzione agli OT, mi hanno riferito che qualcuno sta sudando freddo terrorizzato dall'idea che qualcuno possa sporcargli il suo bellissimo Topic, sembra che l'abbia addirittura scritto in un suo post. Meno male che c'è ancora gente seria su questo Forum, fosse per me e te l'avrebbero già chiuso  :smiley-sweat:
Commento: minc.... è davvero sconcertante come certa gente si presenti sul Forum solo per vampirizzare informazione e risolversi i propro problemi, senza nulla dare o restituire, in sintesi, che si fa i zz propri, e poi si permette anche di criticare e tentare di blindare il proprio Topic succhiasangue.
Precisazione: ma ciò mi è stato riferito, non so se corrisponde a verità, quindi se ci tieni mettiti a cercare, altrimenti te ne stra..ftt come me e tiri innanz.
Commento finale: BAH!
Title: Re: Topic permanente di programmazione newbie
Post by: leo72 on May 10, 2012, 11:09 am
Questa poi mi giunge nuova.... sarà che sono "innocente" nei miei interventi e non faccio caso a queste piccolezze....
Però... penso... se uno si vuol tenere tutto per sé, perché frequenta un forum pubblico?

PS: piccolo indizio?  :smiley-sweat:
Title: Re: Topic permanente di programmazione newbie
Post by: menniti on May 10, 2012, 02:24 pm

Però... penso... se uno si vuol tenere tutto per sé, perché frequenta un forum pubblico?

solo per soddisfare le sue necessità e farsi spiegare dagli altri le cose che non sa fare, hai presente quei rettili che stanno nei buchi della terra in agguato senza farsi vedere da nessuno? appena passa la preda (cioè loro hanno necessità di cibarsi) schizzano fuori a velocità pazzesca, agguantano e si rintanano fino a nuova necessità, poi arriva l'altro rettile che gli dice "me ne dai un pò?" e lui risponde "gné!! ]:D" (citazione da "Bertoldo, Bertoldino e Cacasenno", scena del lancio di pochi polli arrosto dalla cucina del Re in mezzo ad una folla di poveri e morti di fame).
Il termine che ho usato, vampiro, non ti dice nulla? Hai mai sentito parlare di vampiri che fanno trasfusioni di sangue? :smiley-yell: :smiley-yell: :smiley-yell:
Comunque sia chiaro, ribadisco che io non ho letto questa cosa ma mi è stata riferita ed il mio discorso è generale e vale per tutti coloro che in genere agiscono in questo modo, niente di personale XD Non vorrei che si presentasse qui qualcuno con la coda di paglia a dirmene di tutti i colori  :smiley-eek-blue: