Il mio Fuse Rescue - Parte 2 :)

Dopo un anno di meditazione e qualche altro lavoretto, ho ripreso la costruzione del mio Fuse Rescue:


Ho aggiunto una voce del menu per l'impostazione manuale dei valori dei fuse (sì, è possibile caricare valori errati, ma poi è sempre possibile ricaricare una configurazione corretta).
Devo ancora montare l'elevatore di tensione da 5 a 12V e i LED.

Houston, abbiamo un problema... Il Nano, appena vede che metto PD6 e PD7 del 328p da programmare sui suoi A4 e A5 (SDA e SCL), seppure attraverso due resistenze da 1k, si blocca totalmente! >:(
Nel progetto da cui sono partito questo collegamento è previsto, ma non usano un display OLED I2C!
Devo metterci in mezzo un doppio interruttore di qualche tipo (4066 o buffer con uscita a 3 stati) pilotato dallo stesso comando dei 12V sul RST o c'è un'altra soluzione?...

Per questo io avevo usato il ATmega644A perché ha più pin e la seriale mi restava libera.
Perché si blocca?
La Wire è event driven da IRQ, SCL e SDA vanno LOW appena collegni PD6 e PD7?

Sull'A4/SDA (pin 12 del 328 da programmare) basta la sonda x1 dell'oscilloscopio per non far funzionare più il display (ma ruotando l'encoder sento bip bip) e il segnale va giù; se tolgo la sonda o la commuto x10, il display riprende a funzionare.

Sull'A5/SCL (pin 13 del 328 da programmare) la sonda x1 non dà fastidio, ma basta caricarlo con 1k a massa e far aggiornare il display ruotando l'encoder per bloccare tutto finché non si toglie e si rimette l'alimentazione.

Nel frattempo ho recuperato un paio di TC40H244P del Maggio 1991... :slight_smile:
No, non posso usarlo... L'I2C è bidirezionale. Devo metterci un CD4066 o simile.

Il problema è che l'I2C ha il pull-up fatto con resistenze da 4k7, quindi per forza 1kOhm carica troppo!

Ah... Per scorrere rapidamente ruotando l'encoder, poiché la scrittura sul display rallentava il passaggio da una pagina all'altra, ho aggiunto
Wire.setClock(1000000);
per impostare la velocità dell'I2C a 1MHz anziché i 100kHz di default.

Uhmm... Come posso disattivare la libreria u8g2 sull'I2C, una volta fatto all'inizio u8g2.begin()?...

Non so se esiste il metodo u8g2.end(), esiste sicuro Wire.end() ma poi per riprende non so se basta Wire.begin();.

In ogni caso appena inserisci il micro nello zif si blocca tutto?

Ciao.

Sì.

No, non posso risolvere via software, perché quando inserisco il 328p blocca tutto, anche se non lo sto ancora programmando!
Devo metterci un CD4053.

Dovrebbero bastare due AND ognuno connesso alla 12V

A----!--\
         --- PD6
B----!--/

A connesso alla 12V
B connesso ad A4 o A5

Ma devi comunque fermare la Wire perché ti serve controllare i due GPIO.

Oppure come dici tu devi aprire la connessione A4 -> display,
ma cosa accade controllando i GPIO alla state machine della Wire?

Ciao.

Perché 12V?... I 12V servono solo sul RST per programmare...
Ci metto un CD4053B. Ne ho recuperato uno SMD, piccolino.

Ciao :slight_smile:

1 Like

Ok, come lo comandi il 4053 penso che riduci la 12V con partitore e la usi per commutare, se la 12V manca funziona il display, se è presente il display è isolato e "puoi controllare i GPIO". Tra l'altro hai già il 4053 e perché non provare ad usarlo.

Ciao.

Io proverei anche a disabilitare l'interrupt momentaneamente della Wire e poi dopo un po lo riabiliti e provi a scrivere sul display.

Quale strada prendere lo decidi tu. Però in ogni caso durante la programmazione del chip target non puoi mostrare l'avanzamento sul display.

Ciao.

La programmazione dura un istante! Ho dovuto aggiungere un delay in testa e uno in coda per far vedere il LED acceso! :smiley:

Perché continui a parlare di 12V?... Quella tensione, che accende anche un LED rosso, è comandata da un pin, mentre l'alimentazione a 5V del 328p da programmare, che accende anche un LED giallo, è fornita direttamente da un altro pin.

Ricordavo male, ricordavo che bastava la 12V su RESET.

In teoria se risolvessi la troppo bassa impedenza che porta a LOW SCL ed SDA potresti provare a fare Wire.end() e poi dopo la scrittura Wire.begin(). Le informazioni in memoria ram del display rimarrebbero quello, ma alla begin() non ho idea di ciò che può accadere, io proverei questa strada, per bufferizzare PD6 PD7 basterebbero due mosfet LL con uscita da SOURCE.

Ciao.

Che costruttore usi per il display? Hai provato ad usare l'I2C software anzichè hardware?

Ciao, Ale.

Uhmm... Costruttore?...

Il problema del blocco in realtà era semplice: non mi ero reso conto che, tenendo lo ZIF non alimentato fino al momento della lettura o della programmazione, il microcontrollore inserito aveva tutti i diodi di protezione che chiudevano a massa attraverso i suoi pin Vcc e il pin del Nano che fornisce i 5V! Per risolvere il problema, ho interrotto SDA e SCL verso lo ZIF con un 4053B comandato dall'alimentazione dello ZIF: solo quando lo ZIF viene alimentato, SDA e SCL vengono collegati allo ZIF, altrimenti sono collegati solo al display.

Ora, però, che succede se vado a fare digitalWrite HIGH o LOW sui pin I2C dopo aver fatto all'inizio u8g2.begin()?

Grrr... ChatGPT suggerisce (e mi sembra proprio la soluzione giusta!):


void setup() {
  u8g2.begin();
  
  // Usa il display OLED per visualizzare un messaggio iniziale
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB08_tr);
  u8g2.drawStr(0, 10, "Hello, world!");
  u8g2.sendBuffer();
  delay(1000);  // Attendi un momento per mostrare il messaggio

  // Disabilita il bus I2C dopo aver utilizzato il display OLED
  disableI2CBus();
}

void loop() {
  // Il resto del codice del tuo programmatore parallelo
  // dove puoi utilizzare i pin A4 e A5 come desiderato
}

void disableI2CBus() {
  // Disabilita il bus I2C
  TWCR &= ~(1 << TWEN);  // Disabilita l'interfaccia I2C

  // Configura i pin A4 (SDA) e A5 (SCL) come input o output
  pinMode(A4, INPUT);  // o OUTPUT se necessario
  pinMode(A5, INPUT);  // o OUTPUT se necessario
}

void enableI2CBus() {
  // Riabilita l'interfaccia I2C
  TWCR |= (1 << TWEN);  // Abilita l'interfaccia I2C

  // Configura i pin A4 (SDA) e A5 (SCL) come input con pull-up
  pinMode(A4, INPUT_PULLUP);
  pinMode(A5, INPUT_PULLUP);
  
  // Reinicializza il display OLED
  u8g2.begin();
}

TWCR &= ~(1<<TWEN); // Disabilita l'interfaccia I2C



TWCR |= (1<<TWEN); // Abilita l'interfaccia I2C


FUNZIONA!!! :smile:

Ho alternato più volte la scrittura di FF D6 FD e FF DE FD e AVRDUDESS ha letto i valori programmati.
Ho provato anche a mettere FA FB FC (senza avere la minima idea di che configurazione sia) e AVRDUDESS non riusciva a leggere nulla; appena ricaricato FF D6 FD, però, è tornato tutto a posto.

Devo rivedere la lettura, perché legge sempre 04 04 04.

Se il 4053 costa meno di due porte AND allora meglio il 4053, diversamente meglio le AND.

Ciao.

Ciao :slight_smile:
Ormai avevo dissaldato un 4053B SMD da una delle vecchie schede elettroniche che ho da parte, ma comunque SDA è bidirezionale! Come puoi usare una AND?...