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
