Ciao a tutti
Dopo un'ora a fare tentativi assurdi con un codice che sembrava proprio dover funzionare, ho avuto l'ispirazione di mettere un delay e ha funzionato! Prima, rilevava la pressione del pulsante solo ogni tanto, nemmeno una volta su quattro. Qualcuno mi sa spiegare perché il delay risolve il problema? Non sapendo a che altro pensare, l'unica spiegazione era che stato==2 non fosse ancora vera un attimo dopo aver fatto l'assegnazione, perciò ho provato a mettere un delay a caso... E' sufficiente un delayMicroseconds(10). Come è possibile???...
Grazie
Gianluca
#include <LiquidCrystal.h>
LiquidCrystal lcd(17,15,13,12,11,10);
// LiquidCrystal lcd(0,1,2,3,4,5); // RS,EN,D4,D5,D6,D7
uint32_t t_premuto; // millis() alla pressione del pulsante.
uint8_t prg=0; // Numero del programma selezionato.
uint8_t lfuse;
uint8_t hfuse;
uint8_t xfuse;
uint8_t stato=1;
void setup() // run once, when the sketch starts
{
pinMode(0, OUTPUT); // LCD RS
pinMode(1, OUTPUT); // LCD EN
pinMode(2, OUTPUT); // LCD D4
pinMode(3, OUTPUT); // LCD D5
pinMode(4, OUTPUT); // LCD D6
pinMode(5, OUTPUT); // LCD D7
pinMode(A1, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
lcd.begin(16,2);
lcd.print(F(" Fuse Rescue GG "));
lcd.setCursor(0,1); lcd.print("n.");
lcd.setCursor(5,1); lcd.print("LF");
lcd.setCursor(9,1); lcd.print("HF");
lcd.setCursor(13,1); lcd.print("Ext");
delay(2000);
lcd.clear();
lcd.setCursor(1,1); lcd.print('.');
}
#define PREMUTO !(PIND&0b01000000) // Pulsante su PD6.
void loop()
{
t_premuto=millis(); // Prende il tempo.
while(PREMUTO) // Pressione lunga: programmazione.
{
if(millis()-t_premuto>3000)
{
lcd.setCursor(0,0); lcd.print(F("*PROGRAMMAZIONE*"));
programma();
delay(1000);
lcd.setCursor(0,0); lcd.print(F(" *** FATTO! *** "));
stato=0;
return;
}
}
if(stato==1)
{
prg++; if(prg>4) prg=1;
lcd.setCursor(0,1); lcd.print(prg); // Numero progressivo.
lcd.setCursor(0,0);
switch(prg)
{
case 1:
lcd.print(F("328P 16MHz Bld "));
lfuse=0xFF; hfuse=0xFD; xfuse=0xDF;
display_fuse();
break;
case 2:
lcd.print(F("328P 16MHz NoBld"));
lfuse=0xFF; hfuse=0xFD; xfuse=0xDF;
display_fuse();
break;
case 3:
lcd.print(F("328P 8MHz NoBld"));
lfuse=0xFF; hfuse=0xFD; xfuse=0xDF;
display_fuse();
break;
case 4:
lcd.print(F("328P 1MHz NoBld"));
lfuse=0xFF; hfuse=0xFD; xfuse=0xDF;
display_fuse();
break;
}
stato=2;
}
delay(10); // < < < < < < < < < < < DELAY! Qui sono 10ms, ma bastano 10us.
// 1us non basta; con 5us comincia a funzionare.
if(stato==2 && !PREMUTO) stato=3;
if(stato==3 && PREMUTO) stato=1;
}
void display_fuse()
{
lcd.setCursor( 5,1); lcd.print(lfuse,HEX);
lcd.setCursor( 9,1); lcd.print(hfuse,HEX);
lcd.setCursor(13,1); lcd.print(xfuse,HEX);
}
void sendcmd(byte command) // Send command to target AVR.
{
}
void writefuse(byte fuse, boolean highbyte) // write high or low fuse to AVR.
{
}
void programma()
{
}