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).
Ok, potrei fare una prova ed eventualmente donare alla scienza un micro
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?
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
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.
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.
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.
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;
}
}
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).
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):