Stránka 1 z 2

Blikání LED

Napsal: 20 črc 2020, 12:38
od Ludek
Zdravím, hledal jsem na Netu kus kodu, kdy LED bliká, bez ohledu na SW - který má spousty časových prodlev, delay smyček atd atd.
Tak jestli lze naprogramovat natvrdo nějaký pin (časovač) aby LED blikala 500/500. Našel jsem něco, ale to jsou jen milisekundy, ale
tato vteřina je moc... Jde to? Nerad bych přidával HW...

Re: Blikání LED

Napsal: 20 črc 2020, 12:45
od commar
No a není lepší (jednodušší) koupit blikající LED?

Re: Blikání LED

Napsal: 20 črc 2020, 13:07
od Ludek
Díky za radu :-) Tu LED jsem použil pro příklad... Potřebuji v zařízení "rozblikat" alarmová relátka,
pokud dostanou příkaz k sepnutí. A jelikož se mi nechce předělávat DPS a přidat HW, tak chci použít
blikající PIN a buď relé budou sepnuté nebo budou vteřinově "cvakat" dle SW...
Ale i tak pokud to jde, zase budu o něco dál :-)

Re: Blikání LED

Napsal: 21 črc 2020, 08:45
od ondraN
Použij timer2 a udělej si ovládání na pozadí přes interrupt. Je to docela triviální. Tedy, pokud je řeč o arduinu.

Re: Blikání LED

Napsal: 21 črc 2020, 10:23
od pavel1tu
https://arduino.cz/arduino-zaklady-blik ... kce-delay/

nauč se používat Google, tyto triviální věci jsou několikset let již popsané ;)

Re: Blikání LED

Napsal: 21 črc 2020, 16:32
od Ludek
Ale ale Pavle ...
V uvodu jsem psal, ze to tak nejde. Jakmile SW něco čte, nebo tam je delay, tak by blikani prestalo.
Tak tedy jinak - lze nastavit nejaky timer tak, aby byla frekvence trvala a bez prestavani ?
Nejak to jde, ale toto je frekvence 1 Hz. Proto jsem zde, jestli toto vubec Arduino dokaze.

Re: Blikání LED

Napsal: 21 črc 2020, 18:31
od kiRRow
Timer, neboli časovač, je forma přerušení. Přerušení znamená, že procesor přeruší svojí činnost (delay, smyčku) a provede nějakou funkci. Časovač běží mimo program procesoru a jde nastavit v nějakém rozmezí. Pokud potřebuješ delší časový úsek než umožňuje časovač, tak musíš spustit tu funkci až při třeba každém 126tém přerušení.

Re: Blikání LED

Napsal: 21 črc 2020, 20:44
od pavel1tu
Ludek píše:
21 črc 2020, 16:32
Ale ale Pavle ...
V uvodu jsem psal, ze to tak nejde. Jakmile SW něco čte, nebo tam je delay, tak by blikani prestalo.
Tak tedy jinak - lze nastavit nejaky timer tak, aby byla frekvence trvala a bez prestavani ?
Nejak to jde, ale toto je frekvence 1 Hz. Proto jsem zde, jestli toto vubec Arduino dokaze.
Normálně to v alarmu používám a bliká mi to, jak při odchodu, tak při aktivaci zony.
Netvrdim že je to na 1ms, ale každý cyklus kdy proběhne program se porovnává IF s časem 1000ms, tento "časovač" mám pro všechny LED jeden ;)
Takže nechápu proč by to nemělo chodit.

delay nepoužívám - není důvod. Pokud používáš delay, neřeš blikání a kup si blikací LED jsou i na 1Hz, nebo si LED řiď zvlášť pomocí ATtiny

Re: Blikání LED

Napsal: 22 črc 2020, 08:52
od ondraN

Kód: Vybrat vše

#define LED 13  //pin ledky

const unsigned int PERIOD=1000; //perioda blikani v ms
volatile bool LedBlink=false;

//------------- Function prototypes
ISR(TIMER2_COMPA_vect);  // obslouzeni interruptu od timeru 2 (kazdych 13us)



void setup() {
  pinMode(LED,OUTPUT);
// nastaveni timeru 2
  TCCR2A = bit(WGM21);          // nebude vystup na port a rezim bude CTC
  TCCR2B = bit(CS22)|bit(CS21)|bit(CS20);    // zdroj signalu Fosc a preddelic 1024, inkrementace 15625 za sec
  OCR2A =  155;                  // interrupt a znovunastaveni pri dosazeni stavu,int kazdych 155x64us=cca 10ms
  TIMSK2 = bit (OCIE2A);        // povoleni preruseni v masce interruptu
// END nastaveni timeru 2


}

void loop() {
  // put your main code here, to run repeatedly:
  LedBlink=true; //zapne blikani
  delay(14589); //neco delame 
  LedBlink=false;//vypne blikani
  delay(19722); //neco delame 
  
}

// Interruptt routine
ISR(TIMER2_COMPA_vect){  // obslouzeni interruptu od timeru 2 (kazdych cca10ms)
  static unsigned int Prescaler=0;
  static bool Toggle=true;
  static bool Set=true;
  if(LedBlink){  
    Set=true;
    Prescaler++;  //preddelic pro periodu 
    if(Prescaler>=(PERIOD/20)){
      Prescaler=0;
      if(Toggle){
        digitalWrite(LED,HIGH);
      }else{
        digitalWrite(LED,LOW);
      }
      Toggle=!Toggle; 
    }
  }else{
    if(Set){  //aby se nastavovalo jenom jednou
      digitalWrite(LED,LOW); //ledku musime vypnout, protoze nevime v jake fazi blikani prijde zakaz  
      Prescaler=0;
      Set=false;
    }
  }
  
}
Šo by to jistě ještě zoptimalizovat, ale jsem na dovolené a nemám už čas. Nastavováni a zastavení blikání by bylo vhodnější udělat přes funkci a v ní ošetřit všechny stavy, které se teď musí řešit v interruptu. Nicméně, tohle bude fungovat i tak, jak je to napsané.

Re: Blikání LED

Napsal: 22 črc 2020, 16:00
od Ludek
pro Pavla - Psal jsem, že to je program, kde jsou delay ! Nechci to přeprogramovávat po někom...
pro Ondru - díky !!!!! to je ono, to jsem hledal.... tak zase někdy :-)