Pages: 1 [2] 3   Go Down
Author Topic: bootloader x caricare sketch da SD?  (Read 3980 times)
0 Members and 1 Guest are viewing this topic.
MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Con lo sketch solo ci fai poco, è tutto l'insieme delle cose .
La cosa più complicata è stato fare l'upload del file da pagina web... sembrava banale invece è stato uno sbocco di sangue, però ora c'è e funziona bene, quindi sono soddisfatto.
Ora voglio vedere se riesco ad automatizzare anche il riavvio post upload direttamente da codice, senza utilizzare hardware aggiuntivo.
Se riesco a fare pure quello sono a cavallo.
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 8
Posts: 2246
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Con lo sketch solo ci fai poco, è tutto l'insieme delle cose .
La cosa più complicata è stato fare l'upload del file da pagina web... sembrava banale invece è stato uno sbocco di sangue, però ora c'è e funziona bene, quindi sono soddisfatto.
Ora voglio vedere se riesco ad automatizzare anche il riavvio post upload direttamente da codice, senza utilizzare hardware aggiuntivo.
Se riesco a fare pure quello sono a cavallo.
cito massimo banzi in un post di tempo fa:
Quote
4.  Raccomandato da Atmel. Attivare il "watchdog timer" e aspettare che si resetti.
Il "cane da guardia" è un timer che serve a resettare un processore che si sia incastrato per un problema software. Il timer, una volta attivato, resetta il processore a meno che non venga fatto ripartire... perciò in un'applicazione che deve mantenere un certo livello di affidabilità, il programma fa ripartire il timer regolarmente ... dovesse mai incepparsi allora dopo pochi millisecondi il processore si resetta. Aggiungi questo all'inizio tuo sketch Arduino
Code:
#include <avr/io.h>
#include <avr/wdt.h>

#define Reset_AVR() wdt_enable(WDTO_30MS); while(1) {}
 



mentre nel punto dove vuoi resettare scrivi:
Code:
Reset_AVR();
 


Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie superlol ma ho già provato col cane da guardia!
Purtroppo si incarta, ovvero pare che si resetti, in realtà si pianta e non riparte.

Avevo pensato di provare qualcosa tipo asm volatile(" jmp 0xbladdress") per saltare direttamente al bootloader , ma poi ieri sera era tardi e non mi andava di fare il dump per capire a che indirizzo puntare...
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 8
Posts: 2246
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie superlol ma ho già provato col cane da guardia!
Purtroppo si incarta, ovvero pare che si resetti, in realtà si pianta e non riparte.

Avevo pensato di provare qualcosa tipo asm volatile(" jmp 0xbladdress") per saltare direttamente al bootloader , ma poi ieri sera era tardi e non mi andava di fare il dump per capire a che indirizzo puntare...

si un jump a 0x00 dovrebbe andare ma devi anche svuotare la ram e ripulire i timer..
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si ma non penso di dover saltare a 0x00, in questo caso riavvierei il programma senza passare dal bootloader , che non è proprio quello che voglio!
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 8
Posts: 2246
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Si ma non penso di dover saltare a 0x00, in questo caso riavvierei il programma senza passare dal bootloader , che non è proprio quello che voglio!

beh 0x00 è da dove comincia tutto no?  smiley-eek-blue
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mhh , pensaci meglio !!!
 smiley-cool
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10473
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

a 0x00 dovrebbe esserci la prima istruzione del boot-loader, se non erro, non so se effettua anche tutti gli azzeramenti del caso, ma credo proprio di sì, altrimenti come fai ad essere sicuro dei dati che stai utilizzando? altrimenti si può fare a mano successivamente smiley

edit: come non detto, ho controllato ed a 0 ci sta la prima istruzione del programma... l'unica pare essere il watchdog o un minimo di circuiteria, anche se un tizo dice che con un PWM a low sul reset riesce a fare un reset senza problemi: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1250663814/
« Last Edit: August 23, 2012, 05:22:13 pm by lesto » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sto provando proprio ora il jmp fatto all'indirizzo 0x7000 .
Secondo le impostazioni dei fuses ho un bootloader da 2000 word, che dovrebbe iniziare esattamente li.
Reebotare si reeebota ma se carichi il fw nuovo o meno questo ancora lo ignoro.
Non è facile da debuggare sta cosa!

Anche a me sarebbe piaciuto di più usare il watchdog, ma purtroppo quando tento di resettare con quel metodo la scheda si impalla e non riparte più nemmeno se premo il reset.
Devo staccare l'alimentazione per farla rinsavire.
« Last Edit: August 23, 2012, 06:33:03 pm by niki77 » Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22811
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Al reset, il microcontrollore imposta il PC (Program Counter) in base alle impostazioni dei fuse Boot Reset Vector.
Se questi fuse sono disattivati, il micro carica $0000 ed esegue il programma da lì, altrimenti carica il valore impostato tramite fuse ed esegue un salto al bootloader. Tale valore varia in base alla dimensione della memoria del microcontrollore nonché alla memoria riservat al bootloader stesso.
Ad esempio, per il 328, che ha 32 kB di Flash ed un'area per il bootloader che può essere di 512/1024/2048/4096 byte, l'indirizzo di salto può essere rispettivamente: $3F00, $3E00, $3C000 e $3800.
Il bootloader dell'Arduino, se non deve flashare la memoria, termina con un JMP $0000 per avviare il programma dell'utente.
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22811
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

edit: come non detto, ho controllato ed a 0 ci sta la prima istruzione del programma... l'unica pare essere il watchdog o un minimo di circuiteria, anche se un tizo dice che con un PWM a low sul reset riesce a fare un reset senza problemi: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1250663814/
L'auto-reset è stato detto più volte che può non funzionare correttamente, il segnale di reset deve essere tenuto basso per un certo periodo altrimenti il reset non funziona correttamente. Nel momento in cui arriva il segnale low sul pin di reset parte il reset ma ciò interrompe il segnale Pwm. Atmel suggerisce sempre di usare un circuito esterno per il reset. Anche nel link da te citato viene riferito questo.
Logged


MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I fuses sono impostati correttamente perchè se il reset lo faccio da pulsante il bootloader parte, fa il suo dovere e passa al programma principale.
Anche io ho letto questi valori $3F00, $3E00, $3C000 e $3800 ,sta scritto pure sul datasheet, ma non sono riuscito a 'spiegarmeli' , ovvero non sò a cosa facciano riferimento.
Io mi sono regolato vedendo da dove cominciava a scrivere il bootloader nel file HEX.
Comunque mi sarebbe piaciuto indagare sul perchè la tecnica wathcdog  (che mi ha già salvato le ciapp ai tempi dei pic dove in un progetto m'ero finito tuttti i pin ) mi fà impallare la scheda...
Penso che a seguito di un reset del WD sia tutto più pulito e stabile rispetto al JMP.

Il reset HW coi controcatsi è l'ultima spiaggia, tanto quello sono sicuro che funziona di certo, una circuiteria decente si riesce a farla(Qualche schema?)  o ancor meglio al limite posso recuperare un chip dedicato.


P.S

@Legacy

nella toolchain viene passato 0x7000  in –section-start

« Last Edit: August 24, 2012, 03:17:46 am by niki77 » Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22811
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quei valori sono l'indirizzo da cui il microcontrollore crea l'area riservata al bootloader, rappresentano ovviamente anche l'indirizzo di salto a cui va il micro all'avvio. Il valore è dato dalla differenza tra la memoria totale e lo spazio riservato. Ricordati però che la memoria dei micro è organizzata a 16 bit, quindi quelli sono indirizzi in word.
Se riservo 512 byte su un 328, come nel caso dell'Arduino UNO, l'indirizzo di inizio del bootloader è $3F00.
Logged


MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, esattamente quindi nel mio caso il bootloader è stato riservato da 2k word, quindi il suo address è $3800 che equivale esattamente a 0x7000 hex (in byte)
Ora c'è da capire se ASM VOLATILE (" JMP 0x7000") effettua effettivamente un salto alla locazione 0x7000(in byte) o se tenta di cercarla a 0x7000 word ( smiley-eek-blue) e non trovandola punta a 0x00;
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

giusto per ridurre l'entropia
io farei una function softreset con dentro la prepare_for_softreset
dove ti crei il contesto sotto controllo

magari il codice prima ha fatto porcate varie e farcite, e valle a trovare
col rischio che aggiustandole propaghi problemi altrove =P

Code:
void softreset(uint32_t time)
{
    prepare_for_softreset();
    wdt_enable(time)
        {
        /* waiting for wdt event  */;
        }
}


Si mi sembra la cosa giusta, ed è quello a cui avevo pensato anche io, ma cosa fare dentro prepare_for_softreset()??
Magari chiudere la connessione ethernet e seriale (ma si può???) un clear interrupt ... ma poi cos'altro?
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Pages: 1 [2] 3   Go Up
Jump to: