Ho una scheda con il 644 con quarzo a 16Mhz che non risponde più alla programmazione ISP tramite avrisp mkii, ora mi chiedo cosa posso fare girare su una 2009 per sistemare i fuse tramite la programmazione paralella?
In pratica il fuse sbagliato è quello che decide il tempo di avvio del quarzo, l'ho scelto troppo breve e la stessa cosa è successa con un 328, quindi sono due le MCU in attesa di essere sbricked.
Già, se hai già le connessioni fatte per la programmazione HVPP puoi scaricarti gratuitamente il mio firmware (versione PC) dal sito di Elettronica In, peraltro hanno messo a disposizione gratuita anche il mio articolo con tutti i dettagli dei collegamenti, ti serve solo un po' di pazienza
Ma l'MKII non ha il supporto per i 12V? Chiedo perché non conosco il programmatore.
Non credo, cioè può essere pure che dal reset escano all'occorrenza 12 volts ma non vedo altri pin di uscita se non quello ISP, la doc non dice nulla a riguardo di una possibile configurazione HV del mkii.
Se fosse possibile eviterei volentieri trafficare con le board.
@menniti
Ci contavo sul tuo intervento, ma posso fare tutto con la 2009 e i ponticelli o mi serve altro?
Ovviamente ritienimi a tua disposizione, se alla fine ti scoccia fare tutto e pensi che il problema sia effettivamente che il micro è briccato, me lo spedisci e te lo sistemo in un istante
La 2009 va benissimo, devi montare il 644 su una bread e collegarvi praticamente tutti i pin di Arduino secondo lo schema che trovi lì sul sito. Ti serve un'alimentazione esterna (12V 100mA bastano e avanzano) ed un paio di transistor per la commutazione, col mio firmware praticamente fa tutto da solo: lo apre lo legge e da menu gli dici di ripristinare i deafult e in un istante è tutto fatto, garantito.
Fa come meglio decidi, su di me conta assolutamente al 1000%
Grazie menniti, sapevo di poter contare sulla tua disponibilità, comunque provo a fare tutto seguendo gli schemi e lo sketch e mi sembra impossibile non riuscirci e tutto molto chiaro, almeno lo schema, perchè ho solo il primo documento pdf che hai redatto, il secondo ancora devo procurarmelo. Sto anche rileggendo tutti i post del progetto, cioè questo http://arduino.cc/forum/index.php/topic,104478.0.html
MauroTec:
Grazie menniti, sapevo di poter contare sulla tua disponibilità, comunque provo a fare tutto seguendo gli schemi e lo sketch e mi sembra impossibile non riuscirci e tutto molto chiaro, almeno lo schema, perchè ho solo il primo documento pdf che hai redatto, il secondo ancora devo procurarmelo. Sto anche rileggendo tutti i post del progetto, cioè questo http://arduino.cc/forum/index.php/topic,104478.0.html
Ciao.
Allora, l'intero lavoro è suddiviso in 4 puntate: la prima è quella che hai trovato ed è quella che ti serve; la seconda (sul numero attualmente in edicola) parla della sezione keypad & display e del montaggio nel contenitore, non ti serve. La terza, in uscita nei prossimi giorni, e la quarta (l'ho consegnata poco fa) sono interamente dedicate alla spiegazione del software e di come esso è derivato dallo studio dei data-sheet; in tal senso tu non hai proprio niente da imparare da me :), quindi ciò che hai ti basta e ti avanza. Studiati e applica lo schema elettrico, ignorando la sezione master (usi Arduino 2009 al suo posto oltre ad un alimentatore 12V 100mA) che ti serve solo per vedere i collegamenti da fare (rispettali al 100%!); devi montare solo lo stadio a transistor per lo switch dei 12V, ma sono componenti comunissimi. La versione del software è LCD per chi usa il display e la tastiera esadecimale, per Arduino serve la versione PC.
MauroTec:
Mi pare di capire che per avere i sorgenti del software devo abbonarmi ad elettronica in, ho sbaglio?
Se è così allora il software non è rilasciato sotto licenza GPL.
Mi chiarisci questi punti.
Ciao.
No, è sufficiente registrarti sul sito, per quanto ne so. Poi vai sulla pagina del numero di rivista che ti interessa e lì trovi il pdf dell'articolo (ma questa è un'eccezione le cui ragioni ho spiegato nel Topic che hai linkato tu), trovi i file per realizzare i PCB e trovi il firmware in versione pde, quindi assolutamente libero di scaricarlo a modificarlo a tuo piacimento. E' così per ogni articolo che presentano: PCB e firmware sono sempre in omaggio, ripeto basta registrarti al sito.
menniti io nel sito mi sono registrato e ho potuto scaricare il file HEX165 e HEX166, dove all'interno trovo tutto tranne il software che mi serve, cioè mi serve la versione PC, io onestamente non riesco a capire dai nomi qual'e il .hex.
L'HEX166 contiene il codice della tastiera e del display.
Se invece clicco su link SRG165 o SRG166 vengo invitato gentilmente ad abbonarmi.
MauroTec:
menniti io nel sito mi sono registrato e ho potuto scaricare il file HEX165 e HEX166, dove all'interno trovo tutto tranne il software che mi serve, cioè mi serve la versione PC, io onestamente non riesco a capire dai nomi qual'e il .hex.
L'HEX166 contiene il codice della tastiera e del display.
Se invece clicco su link SRG165 o SRG166 vengo invitato gentilmente ad abbonarmi.
Giuro che ci sto capendo poco.
Ciao.
Hai ragione, è che io non ho la cognizione del tempo di pubblicazione. Il firmware "PC" è in uscita nei prossimi giorni, con il n.167, ed è in formato pde non hex, quindi lo carichi direttamente via ide sul tuo Arduino; i firmware sono CERTAMENTE scaricabili gratuitamente, forse l'abbonamento è richiesto per i PCB, che peraltro non ti servono, e che non sono certo soggetti alla licenza GPL.
Hai ragione, è che io non ho la cognizione del tempo di pubblicazione. Il firmware "PC" è in uscita nei prossimi giorni, con il n.167, ed è in formato pde non hex, quindi lo carichi direttamente via ide sul tuo Arduino; i firmware sono CERTAMENTE scaricabili gratuitamente, forse l'abbonamento è richiesto per i PCB, che peraltro non ti servono, e che non sono certo soggetti alla licenza GPL.
Ok, aspetto il prossimo numero, non c'è premura, sono rimasti nel cassetto per tanto tempo, stare li ancora un po male non gli fa.
Fammi capire però come funziona la versione per PC, mi sembra di capire che si fa tutto tramite terminale seriale, ma allora basterebbe una GUI per non avere a che fare con il terminale. Io non ci metto molto a trasformare il mio programma AvrDudeQui per interfacciarsi via usb, peccato che posso farlo solo su linux sta cosa.
Il programma deve risiedere su un Arduino oppure su un micro atmega328P in stand-alone. In entrambi i casi devi collegare tutti i pin del micro (o di Arduino) al 644 montato su una breadboard (con tanto di quarzo e C, oltre al circuito switch per i 12V). Il micro "master" poi deve dialogare col Serial Monitor (o qualsiasi altro programma, io ho usato il Win HyperTerminal, tu puoi usare la tua GUI). Sulla pubblicazione credo che sia davvero questione di qualche giorno, il numero è andato in stampa settimana scorsa, e comunque non devi nemmeno aspettare che esca in edicola, visto che ti serve solo il firmware; appena lo mettono su Internet te lo scarichi ed è fatta. Magari nell'attesa ti conviene iniziare a montare tutto e ricontrollare per bene. La tecnica è perfetta ed efficace, ma se sbagli i collegamenti il tuo Programmatore HV diventa un Serial Killer che fa fuori i 644, quindi fai molta attenzione, così è meglio che lo monti con calma e ricontrolli i collegamenti. Se ti va di avere una mano mi mandi qualche foto o mi scrivi in MP, quello che decidi va bene.
Rieccomi, per tutti quelli che hanno la chiavetti internet, occhio che ti fregano 5€, attivando a tua insaputa un servizio VM18. menniti ricordo che tu ti connetti con la internet key, chiama il call center e chiedi la disabilitazione dei servizi VM18.
:0
Questa è la causa che mi ha tenuto offline, mancanza credito ed io invece pensavo ad un disservizio.
Comunque ho scritto codice per impostare il fuse low a 0x62, ma non funziona, però riesco a leggere il fuse low che risulta essere 0xc3.
Qui c'è il codice:
#include <mio.h>
#include <util/delay.h>
// mcu target ATmega644A
#define LED_AH GPIO_B0 // il led
#define VCC5_AH GPIO_B1 // alimentazione mcu target
#define V12_RESET_AH GPIO_B2 // alimentazione RESET pin of mcu target
#define BS2_AH GPIO_B3
// programming pin 0 1 2 3
#define PAGEL_AH GPIO_D4
#define XA1_AH GPIO_D5
#define XA0_AH GPIO_D6
#define BS1_AH GPIO_D7
#define WR_AL GPIO_D0
#define OE_AL GPIO_D1
#define XTAL1_AH GPIO_D2 // XTAL1 pin of mcu target
#define DATA PORTC
#define DATA_IN PINC
#define SET_DATA_TO_INPUT DDRC = 0x0;
#define SET_DATA_TO_OUTPUT DDRC = 0xFF;
// fuse default value
#define LFUSE_644 0x62
// command
#define CMD_FUSE_WRITE 0x40
#define CMD_FUSE_READ 0x4
// controll input
// input pin to connect linea RDY/BSY (ready/busy)
#define RDY_BSY GPIO_D3 // to PD1 pin on target
// pulse width
#define TXHXL 0.250 // 150 ns
void
ioinit(void) {
// set output mode
gpio_mode(LED_AH, out_mode);
gpio_mode(VCC5_AH, out_mode);
gpio_mode(V12_RESET_AH, out_mode);
gpio_mode(BS2_AH, out_mode);
gpio_mode(PAGEL_AH, out_mode);
gpio_mode(XA1_AH, out_mode);
gpio_mode(XA0_AH, out_mode);
gpio_mode(BS1_AH, out_mode);
gpio_mode(WR_AL, out_mode);
gpio_mode(OE_AL, out_mode);
gpio_mode(XTAL1_AH, out_mode);
// set low
gpio_off(VCC5_AH);
gpio_off(V12_RESET_AH);
gpio_off(PAGEL_AH);
gpio_off(XA1_AH);
gpio_off(XA0_AH);
gpio_off(BS1_AH);
gpio_off(BS2_AH);
gpio_off(WR_AL);
gpio_off(OE_AL);
gpio_off(XTAL1_AH);
// set input mode
gpio_mode(RDY_BSY, inp_mode);
// set data port to input mode for now
DATA = 0x0;
SET_DATA_TO_INPUT;
}
static inline
void strobe_xtal1(void)
{
//_delay_us(TXHXL);
gpio_on(XTAL1_AH);
_delay_us(TXHXL);
gpio_off(XTAL1_AH);
}
void
blink_50_ms(void)
{
gpio_on(LED_AH);
_delay_ms(50);
gpio_off(LED_AH);
_delay_ms(50);
}
void
blink_one_second(void) {
for (uint8_t i = 0; i<10; i++) {
gpio_flip(LED_AH);
_delay_ms(100);
}
}
void
enter_programming_mode(void) {
gpio_on(VCC5_AH); // power on Vcc 5 volts to mcu target
_delay_us(100);
gpio_off(V12_RESET_AH); // RESET pin of target to low
_delay_us(300);
for (uint8_t i = 0; i < 6; i++) { // clicla 6 volte. Larghezza impulso 150ns
strobe_xtal1();
}
volatile uint8_t *outD = get_out(PAGEL_AH); // prende la porta di PAGEL
// scrive a 0 D4, D5, D6, D7
*outD = *outD & 0x15; // 0x15 mask lsb for bit
_delay_us(0.2); // wait 200ns
gpio_on(V12_RESET_AH); // accende la 12 volts
_delay_us(300); // attende 50us
gpio_on(WR_AL); // no active high
gpio_on(OE_AL); // no active high
_delay_ms(1);
}
void
send_cmd(uint8_t cmd)
{
// Set controls for command mode
gpio_on(XA1_AH);
gpio_off(XA0_AH);
gpio_off(BS1_AH);
gpio_off(BS2_AH);
// write command
DATA = cmd;
SET_DATA_TO_OUTPUT;
strobe_xtal1();
DATA = 0x0;
SET_DATA_TO_INPUT;
}
void
erase(void)
{
volatile uint8_t *rdy_bsy = get_in(RDY_BSY);
send_cmd(0x80);
strobe_xtal1();
_delay_us(0.250);
gpio_off(WR_AL);
_delay_us(0.250);
gpio_on(WR_AL);
while((*rdy_bsy & _BV(get_bit(RDY_BSY))) == 0); // when RDY goes high, burn is done
for (uint8_t i = 0; i < 20; i++) {
blink_50_ms();
}
}
void
write_low_fuse(void)
{
volatile uint8_t *rdy_bsy = get_in(RDY_BSY);
send_cmd(CMD_FUSE_WRITE);
// Enable data loading
gpio_off(XA1_AH);
gpio_on(XA0_AH);
// Specify low byte
gpio_off(BS1_AH);
gpio_off(BS2_AH);
DATA = LFUSE_644;
SET_DATA_TO_OUTPUT;
strobe_xtal1();
DATA = 0x0;
SET_DATA_TO_INPUT;
gpio_off(BS1_AH);
gpio_off(BS2_AH);
_delay_us(0.250);
// Burn the fuse
gpio_off(WR_AL);
_delay_us(0.250);
gpio_on(WR_AL);
while((*rdy_bsy & _BV(get_bit(RDY_BSY))) == 0); // when RDY goes high, burn is done
}
void read_low_fuse(void) {
uint8_t lfuse;
send_cmd(CMD_FUSE_READ); // Send command to read fuse bits
// Configure DATA as input so we can read back fuse values from target
DATA = 0x0;
SET_DATA_TO_INPUT;
// Set control lines
// Read LFUSE
gpio_off(BS2_AH);
gpio_off(BS1_AH);
// Read fuse
gpio_off(OE_AL);
_delay_ms(1);
lfuse = DATA_IN;
gpio_on(OE_AL);
// for (uint8_t i = 0; i < lfuse; i++) {
// blink_200_ms();
// _delay_ms(500);
// }
if (lfuse == 0xc3) {
blink_one_second();
_delay_ms(1000);
blink_one_second();
}
}
int
main(void) {
ioinit();
_delay_ms(5000); // 5 secondif
blink_one_second(); // segnala lo start dell'applicazione
_delay_ms(100);
enter_programming_mode();
erase();
write_low_fuse();
_delay_ms(1000);
//enter_programming_mode();
read_low_fuse();
send_cmd(0x0);
// set low
gpio_off(VCC5_AH);
gpio_off(V12_RESET_AH);
gpio_off(PAGEL_AH);
gpio_off(XA1_AH);
gpio_off(XA0_AH);
gpio_off(BS1_AH);
gpio_off(BS2_AH);
gpio_off(WR_AL);
gpio_off(OE_AL);
gpio_off(XTAL1_AH);
//enter_programming_mode();
return 0;
}
Non è codice wiring ma si capisce cosa fa, almeno spero.
MauroTec:
Rieccomi, per tutti quelli che hanno la chiavetti internet, occhio che ti fregano 5€, attivando a tua insaputa un servizio VM18. menniti ricordo che tu ti connetti con la internet key, chiama il call center e chiedi la disabilitazione dei servizi VM18.
:0
Questa è la causa che mi ha tenuto offline, mancanza credito ed io invece pensavo ad un disservizio.
Non sapevo che il forum di Arduino fosse a LED rossi ] ] ]
MauroTec:
Rieccomi, per tutti quelli che hanno la chiavetti internet, occhio che ti fregano 5€, attivando a tua insaputa un servizio VM18. menniti ricordo che tu ti connetti con la internet key, chiama il call center e chiedi la disabilitazione dei servizi VM18.
:0
Questa è la causa che mi ha tenuto offline, mancanza credito ed io invece pensavo ad un disservizio.
Non sapevo che il forum di Arduino fosse a LED rossi ] ] ]
mmm "a tua insaputa" forse solo il fato che si pagasse era ignoto ]
mmm "a tua insaputa" forse solo il fato che si pagasse era ignoto smiley-twist
Ecco appunto, il fatto è che non ne ho neache goduto di questo servizio a pagamento, quindi non so valutare se ne valesse la pena.
Tornando in topic.
È uscito il numero 167 di elettronica in e ho scaricato il software pensando di poter avere il codice del programmatore, ma anche questa volta c'è di tutto tranne che il codice.
Guarda, tentare non costa nulla.
Procedi in questo modo.
Ti crei lo standalone su una breadboard e colleghi tutti i pin del caso (MOSI/MISO/SCK). Il filo del pin 10, che andrebbe al pin di reset dello standalone, mandalo alla base di un transistor e tramite questo collega 12V al pin di reset del micro da sbriccare.
Poi ti prendi avrdude da terminale, e dai un bel chip erase (parametro "-e") tramite ArduinoISP. Io dico che funziona: i 12V sul pin di reset dovrebbero bastare a bypassare le impostazioni dei fuse ed a rimettere tutto a posto.