Attiny85 usare pin reset come output

Ciao a tutti,

Mi rivolgo a voi per risolvere un problemino che potrebbe diventare problemone

Ho realizzato dei pcb gestiti da un attiny85, inconsciamente ho sfruttato il pin 1 (PB5) che corrisponde al reset.

Ora, se io lo dichiaro output nel setup con pinMode, e nel loop eseguo un banale blink con digitalWrite, non accade nulla (testato anche con oscilloscopio). (Se cambio pin, lo sketch funziona correttamente).

Come posso procedere secondo voi?
Vi ringrazio in anticipo

Se non vuoi rifare i PCB, l'unica soluzione è perdere il pin di "reset" attivando il FUSE RSTDISBL che trasforma il pin di "reset" in un normale pin di I/O.

Attento però, una volta fatto NON potrai più programmare il ATtiny85 e, per ripristinare il normale funzionamento del pin di "reset", ti occorrerà un apposito programmatore HV (High Voltage).

Guglielmo

Ok, potrei fare una prova ed eventualmente donare alla scienza un micro :smiley:

Quindi se ho capito bene prima programmo il micro con il mio algoritmo e poi con software quali AVRFuses per macOS procedo a modificare il pin, perdendo per sempre la possibilità di riprogrammare il micro. Giusto?

max95:
... perdendo per sempre la possibilità di riprogrammare il micro. Giusto?

Giusto. Volendo potresti dotarti di QUESTO oggetto che ti permetterebbe, all'occorrenza, di ripristinare il micro :slight_smile:

Guglielmo

Solo per sicurezza,

impostati cosi (ovvero quelli di default + RSTDISBL) vanno bene?

(casualmente ho trovato questo comodo "calcolatore")

Ti serve veramente andare così lentamente (stai dividendo il clock per 8, quindi gli dici di viaggiare ad 1 MHz) ?

Guglielmo

gpb01:
Ti serve veramente andare così lentamente (stai dividendo il clock per 8, quindi gli dici di viaggiare ad 1 MHz) ?

Guglielmo

No, ma avevo visto che l'opzione era stata impostata di default... devo gestire uno switch elettronico basato su relay... esso viene attivato/disattivato con tempi mai inferiori ai 2 secondi

Ok, se la velocità ti basta, meglio, consuma meno :slight_smile:

Di base, tutti quei chip arrivano settati con il clock interno a 8MHz, ma con il divisore x8 attivo, quindi con un clock risultante di MCU di 1 MHz. Sta poi all'utilizzatore, in funzione delle sue necessità, cambiare i FUSE ed eventualmente disabilitare il divisore x8.

Guglielmo

Grazie per le preziose dritte.

Ora faccio un po' di prove e riporterò gli esiti... speriamo in bene :slight_smile:

Ho avuto di fare una prova...

ho generato questa configurazione dei fuses

ho scritto uno sketch non usando il pin Reset, ho verificato il corretto funzionamento, ho cambiato solo il pin interessato indicando PB5 (ovvero il pin di Reset), ho caricato il software senza errori e da terminale (su linux) ho dato:

avrdude -c usbtiny -p attiny85 -U hfuse:w:0x5F:m

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e930b (probably t85)
avrdude: reading input file "0x5F"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0x5F:
avrdude: load data hfuse data from input file 0x5F:
avrdude: input file 0x5F contains 1 bytes
avrdude: reading on-chip hfuse data:

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

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified

avrdude: safemode: Fuses OK (E:FF, H:5F, L:E2)

avrdude done.  Thank you.

da li, il micro non ha più dato segni di vita :roll_eyes:

... in che senso? Il programma non gira?

Perché da programmatore ora non ci accedi più e non lo vedi più funzionante eh ...

Guglielmo

gpb01:
... in che senso? Il programma non gira?

esatto, non gira più il programma. Alcuni input pull up ad esempio restano LOW fissi...

E ovviamente come ci dicevamo all'inizio del post il micro non è più accessibile (se non tramite HV Rescue)

Molto strano ...
... allora, di solito io uso, con gli ATtiny85P-PU, la seguente configurazione: L=0xE2, H=0xD7, E=0xFF ... se hai un ATtiny nuovo, prova a programmargli i seguenti FUSE, poi carica il tuo programma e quindi riprogramma TUTTI i fuse in questo modo: L=0xE2, H=0x57, E=0xFF ... dovrebbe andare.

Guglielmo

Ciao,

ho avuto modo di fare il seguente test:

  • effettuo cablaggio del mio circuito su breadboard e verifico che tutto funzioni mettendo un pin diverso da PB5 (Reset)

  • imposto i fuse come da te suggerito
    sudo avrdude -c usbtiny -p attiny85 -U lfuse:w:0xE2:m -U hfuse:w:0xD7:m -U efuse:w:0xFF:m

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e930b (probably t85)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "0xE2"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.00s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xE2:
avrdude: load data lfuse data from input file 0xE2:
avrdude: input file 0xE2 contains 1 bytes
avrdude: reading on-chip lfuse data:

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

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified

avrdude: safemode: Fuses OK (E:FF, H:D7, L:E2)

avrdude done.  Thank you.
  • correggo lo sketch impostando il pin PB5 (Reset) e lo carico correttamente sul micro

  • modifico i fuses
    sudo avrdude -c usbtiny -p attiny85 -U lfuse:w:0xE2:m -U hfuse:w:0x57:m -U efuse:w:0xFF:m

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e930b (probably t85)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "0xE2"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.00s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xE2:
avrdude: load data lfuse data from input file 0xE2:
avrdude: input file 0xE2 contains 1 bytes
avrdude: reading on-chip lfuse data:

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

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude: reading input file "0x57"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0x57:
avrdude: load data hfuse data from input file 0x57:
avrdude: input file 0x57 contains 1 bytes
avrdude: reading on-chip hfuse data:

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

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified

avrdude: safemode: Fuses OK (E:FF, H:57, L:E2)

avrdude done.  Thank you.

a questo punto il micro è interdetto, non esegue più il programma e diventa inaccessibile

Molto strano, sembra quasi che non esegua il POR (Power On Reset), ovvero il reset quando viene inizialmente alimentato ... ::slight_smile:

Purtroppo, al momento, non ho altre idee, difatti dovrebbe andare ... :confused:

Guglielmo

Ho provato ora con un attiny25: dopo il cambio fuse il micro funziona ma con anomalie che prima del cambio fuse non presentava. Inoltre da oscilloscopio vedo che il pin Reset ha una tensione di circa 2v a stato logico alto... (probabilmente eroga meno corrente degli altri, perché se lo faccio lavorare a vuoto (senza il circuito collegato a valle) il pin torna sui 4V (e comunque 1V in meno rispetto gli altri pin)

Potrebbe essere qualcosa a livello di sketch?

#include <PinChangeInterrupt.h>

const int switch_attivazione = 4;     // PIN 3
const int led    = 0;     // PIN 5
const int uscita = 3;    // PIN 2
const int relay_P   = 2;     // PIN 7
const int relay_N   = 5;     // PIN 1
boolean stato_old    = 1;
boolean stato = 1;
int a = 0;
int tempo = 50;

void setup() {
  attachPCINT(digitalPinToPCINT(switch_attivazione), Test, CHANGE); //considero tutti e due i fronti

  pinMode(switch_attivazione, INPUT_PULLUP);
  pinMode(led, OUTPUT);
  pinMode(uscita, OUTPUT);
  pinMode(relay_N, OUTPUT);
  pinMode(relay_P, OUTPUT);

  digitalWrite(led, HIGH);
  digitalWrite(uscita, LOW);
  digitalWrite(relay_N, LOW);
  digitalWrite(relay_P, LOW);
  digitalWrite(relay_P, HIGH);
  delay(tempo);
  digitalWrite(relay_P, LOW);
  delay(tempo);
  digitalWrite(relay_N, LOW);
  digitalWrite(led, LOW);

}

void loop() {
  if (stato != stato_old) {
    if (stato == 1) {
      digitalWrite(uscita, HIGH);
      digitalWrite(led, HIGH);
      digitalWrite(relay_P, HIGH);
      delay(tempo);
      digitalWrite(relay_P, LOW);
      digitalWrite(uscita, LOW);
      a = 0;
    }
    if (stato == 0) {
      digitalWrite(uscita, HIGH);
      digitalWrite(led, LOW);
      digitalWrite(relay_N, HIGH);
      delay(tempo);
      digitalWrite(relay_N, LOW);
      digitalWrite(uscita, LOW);
      a = 0;

    }
    stato_old = stato;
  }
}


void Test() {
  if (a == 0) {
    stato = !stato;
    a = 1;
  }

}

... come controlli i relè? usi delle schedine già fatte o hai fatto tu un circuito driver?

Hai uno schema elettrico del tutto (incluse alimentazioni) ?

Guglielmo

gpb01:
... come controlli i relè? usi delle schedine già fatte o hai fatto tu un circuito driver?

Hai uno schema elettrico del tutto (incluse alimentazioni) ?

Guglielmo

con classico bit npn e l'alimentazione è il classico 7805 filtrato. Credo che non dipenda dal circuito poiché ora sto programmando con solo il micro posizionato su breadboard e aggiungo il carico in un secondo momento. Ho notato un'altra cosa su un attiny85 programmato in precedenza: che una volta cambiati i fuses l'interrupt change si comporta come un rising e che PB5 non viene attivata mai... il resto dello sketch segue l'algoritmo scritto.

Come già detto, se cambio lo sketch cambiando pin ed eliminando PB5 gira tutto perfettamente

max95:
... Inoltre da oscilloscopio vedo che il pin Reset ha una tensione di circa 2v a stato logico alto... (probabilmente eroga meno corrente degli altri, perché se lo faccio lavorare a vuoto (senza il circuito collegato a valle) il pin torna sui 4V (e comunque 1V in meno rispetto gli altri pin)

Questo è chiaramente indicato nel datasheet, paragrafo 1.1.4:

Reset input. A low level on this pin for longer than the minimum pulse length will generate a reset, even if the clock is not running and provided the reset pin has not been disabled. The minimum pulse length is given in Table 21-4 on page 165. Shorter pulses are not guaranteed to generate a reset.
The reset pin can also be used as a (weak) I/O pin.

... quindi devi aspettarti meno disponibilità di corrente e, probabilmente, come stai rilevando, una tensione più bassa.

Leggi i grafici indicati:

The RESET pin must tolerate high voltages when entering and operating in programming modes and, as a consequence, has a weak drive strength as compared to regular I/O pins. See Figure 22-23, Figure 22-24, Figure 22-25, and Figure 22-26 (starting on page 184).

Guglielmo

max95:
... Ho notato un'altra cosa su un attiny85 programmato in precedenza: che una volta cambiati i fuses l'interrupt change si comporta come un rising e che PB5 non viene attivata mai ...

Naturalmente stai cambiando il "pin change interrupt" vero? Perché, PB5, può essere (datasheet 10.3.1):

RESET: Reset Pin
dW: debugWIRE I/O
ADC0: ADC Input Channel 0
PCINT5: Pin Change Interrupt, Source 5

Guglielmo