Led non banale

Buongiorno a tutti,
Possiedo un arduino nano e mi sono trovato a dover far “blinkare” un durante l’intera attività del circuito, indipendentemente dai compiti che il processore sta svolgendo.
Ho provato con millis, però nel momento in cui arduino entra in un ciclo (ad esempio while) smette di controllare se i millis sono maggiori dell’intervallo che gli ho impostato.
C’è qualche soluzione software a questo problema?
Grazie in anticipo.

Buona sera, essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del nostro regolamento, ti chiedo cortesemente di presentarti QUI ([u]spiegando bene quali conoscenze hai di elettronica e di programmazione[/u] ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :)

Se l'esigenza è solo quella, mi pare che soluzioni software (senza peraltro sapere com'è fatto il resto del codice) siano difficili da proporre, ma perché non risolvi via hardware usando un blinking LED?

ciao...potresti usare un watchdog legato ad una ISR; in QUESTO link un po' di info.

Mah si, ma a me pare solo una inutile complicazione attivare un watchdog che innesca una ISR solo per far lampeggiare un LED...

... in reltà basta un timer programmato con il periodo che serve e una ISR legata a tale timer, senza andare a scomodare il WatchDog che serve per altre cose ::)

Guglielmo

docdoc: Mah si, ma a me pare solo una inutile complicazione attivare un watchdog che innesca una ISR solo per far lampeggiare un LED...

... si, infatti, o con il WD o con un Timer ... ma a che serve ? ? ? :o

Guglielmo

Ho idea che sia una specie di spia d'attività (retaggio di Windows :) ) nel tentativo d'individuare se la MCU sia bloccata o stia lavorando regolarmente quindi mi sa che l'uso di un circuito esterno sia non praticabile, aspettiamo chiarimenti dall'OP comunque

Grazie mille ragazzi, no è una semplice spia di accensione di un congegno che ho realizzato (che essendo inscatolato non permetterebbe all’utente di capire se è acceso o meno altrimenti). grazie mille per le informazioni!

E allora segui il suggerimento di @docdoc un led con blink integrato e hai risolto senza manco una linea di codice :)

Ok! Ma allora a che ti serve farlo lampeggiare, non basta che sia acceso?

Ed eventualmente, se vuoi renderlo un segnale di attività, ogni tanto spegnerlo quando "fa qualcosa" (diciamo l'inverso delle spie degli hard disk per intenderci)?

... in reltà basta un timer programmato con il periodo che serve e una ISR legata a tale timer, senza andare a scomodare il WatchDog che serve per altre cose ::)

Concordo, bastano poche righe di codice:

[code]


#define TEMPO_BLINK 100           // tempo di blink in millisecondi (semiperiodo)
#define LED 13
uint16_t Tempo;

//------------------------------------------------------------------------------

void setup()
{
  pinMode(LED, OUTPUT);

  OCR0A = 0x80;                   //  abilita Timer 0 compare lontano da millis() e delay()
  TIMSK0 |= _BV(OCIE0A);          // 
}


//------------------------------------------------------------------------------

void loop() 
{
  // qui puoi fare quello che vuoi comprese attivita' bloccanti


}

//------------------------------------------------------------------------------


ISR(TIMER0_COMPA_vect)          // servizio interrupt Timer 0 compare
{
  if (Tempo++ > TEMPO_BLINK)
  {
    Tempo = 0;
    digitalWrite (LED, !digitalRead(LED));
  }
}

[/code]

Ciao Marco

Per fare lampeggiare il LED con millis devi togliere dal Sketch qualsiasi cosa che lo blocca come i While, i delay() e tanto altro. Non credo neccessario ricorrere a Timer o Wathcdog ma di scrivere uno sketch scorrevole. Una soluzione é sicuramente un LED lampegiante con controller interno. Ma risolverlo scrivendo uno sketch che non si blocca mai in nessuna parte é un esercizio utile.

Ciao Uwe

Gabrieled: C’è qualche soluzione software a questo problema?

La più semplice chiamare la funzione di gestione del LED anche da dentro tutti i while che bloccano l'esecuzione. La più efficace è quella di eliminare tutti i while che bloccano l'esecuzione strutturando diversamente il programma.