Arduino- delay

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#16 Příspěvek od mtajovsky »

dj_rizek - dovolím si udělat malý code review:

1)
Definice konstant na začátku - použijte buď C styl

Kód: Vybrat vše

#define led 11
nebo pro číselné konstanty také ve stylu C++

Kód: Vybrat vše

const int led = 11;
Takhle se zbytečně alokuje inicializovaná RAM.

2)
Blok uvozený komentářem //PWM má zbytečné složené závorky. Pokud se proměnná value nepoužívá jinde, pak blok má smysl, ovšem s nadefinováním lokální proměnné value. Platí zásada, že proměnné se mají definovat s minimálním oborem viditelnosti. To samé platí pro proměnnou x. Takže:

Kód: Vybrat vše

// -------------  PWM  -------------
{
int value, x;

   value = analogRead(analogpin);      //precist potenciometr
   x = map(value, 0, 1023, 0, 255);    //prevod hodnot z potenciometru na PWM rozsah
   analogWrite(Ledpin, x);
}

delay(20);
nebo lépe:

Kód: Vybrat vše

// -------------  PWM  -------------
{
   int x = map(analogRead(analogpin),
               0, 1023, 0, 255);           //prevod hodnot z potenciometru na PWM rozsah
   analogWrite(Ledpin, x);
}

delay(20);
3)
Za delay(20) opět zbytečný blok.

4)
Řádku:

Kód: Vybrat vše

if (svetlo) svetlo = false; else svetlo = true; 
je lépe napsat takto:

Kód: Vybrat vše

svetlo = !svetlo;

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#17 Příspěvek od FHonza »

frpr666 píše: Tak jsem zjistil, že arduino si už použilo časovač ke svým účelům...
Arduino používá timer0 vždy ke svým účelům. Timer0 je použit pro funkce millis(), delay() a micros(). Taky je použit pro PWM na pinech 5 a 6. Proto nejde jednoduše měnit frekvence PWM. A taky když se změní předdělička časovače, tak výše uvedené funkce přestanou fungovat správně. Obdobně je použit i Timer1 a Timer2, z hlavy si nepamatuji přesně k čemu. Určitě nějaký používá např. knihovna k ovládání serv.

Uživatelský avatar
dj_rizek
Příspěvky: 711
Registrován: 07 dub 2005, 02:00
Bydliště: blízko Třeboně

#18 Příspěvek od dj_rizek »

mtajovsky- děkuji za reakci,bohužel muj problem je že ve škole nás učili už v tý době mrtvej jazyk Pascal z něj jsem pak přešel na Delphi, něco málo nás učili assembler, bohužel C šlo mimo a to je ten zádrhel (to je tak když vás učí pitomec kterej víc neumí).
Pokud to píšu,tak právě složitě.

Pokud porovnám tvou upravu,je logická a jasná až na kód:
svetlo = !svetlo;
Co má za funkci "!" ?

Právě se ještě trápím s interním časováním protože je mi vlastne jedno že to nebude přesný ale aby to prostě kolem jedný hodiny vyplo výstup relé.

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#19 Příspěvek od FHonza »

! je negace. V Pascalu svetlo := not svetlo;

Sem ještě v práci, buď v noci nebo zítra ti ten kus kódu napíšu. Ještě při pohledu na kód jsem si všiml že nemáš ošetřen "debouncing" tlačítka.

Uživatelský avatar
dj_rizek
Příspěvky: 711
Registrován: 07 dub 2005, 02:00
Bydliště: blízko Třeboně

#20 Příspěvek od dj_rizek »

FHonza píše:! je negace. V Pascalu svetlo := not svetlo;

Sem ještě v práci, buď v noci nebo zítra ti ten kus kódu napíšu. Ještě při pohledu na kód jsem si všiml že nemáš ošetřen "debouncing" tlačítka.
To jsem zatím neřešil :) zatím jsem rád že alespoň něco dělá jak jsem chtěl, eventuelně jsem plánoval druhy tlačítko na vypnutí.

Jednoduchej odpočet je tohle ale funguje to solo,pokud to vložím do mojí smyčky zastaví mi vše ostatní až do odpočítání.

{ while (t!= 0) {
for (t; t>0; t--){

delay(10);
digitalWrite(tout, 1);
}
if (t==0)
{

digitalWrite(tout, 0);
}}}

Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 01:00

#21 Příspěvek od frpr666 »

Shrnutí
Na první pohled to vypadá, že použití funkce millis() je více komplikované než použití delay(). V některých případech je to pravda. Přesto výhodou je, že sketch se stane výrazně flexibilnější. Animace se stanou jednodušší. Komunikování s LCD a souběžné čtení tlačítek bude bez problému. Virtuálně můžete udělat Arduino multitaskové.
https://www.baldengineer.com/millis-tutorial.html

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#22 Příspěvek od FHonza »

Pro multitasking doporučuji vyzkoušet nějaký RTOS, u Arduina bych tomu multitasking neříkal :)

Zkoušel sem Femto OS a FreeRTOS. Ten první je jednodušší a je podporováno víc mcu z rodiny AVR, ale bohužel už nějaký čas není vyvíjen.

Uživatelský avatar
ross4435897
Příspěvky: 426
Registrován: 10 lis 2009, 01:00
Bydliště: Brno

#23 Příspěvek od ross4435897 »

V nekolika konstrukcich mam implementovan ChiBios asi v 6-ti vlaknech ? (6x I/O, 4x I2C, 1x LCD a Keyboard) ... a pokud vim, vse zatim bezi tak jak ma. Je to jednoduche a snadno pochopitelne, s prilozenymi priklady to zmaknes. Funkce DELAY je tam primo zakazana, a je nahrazena jinou, kompatibilni s RTOS. Millis tedy neresis.
Jak uz zde bylo zmineno, o multitasking v pravem slova smyslu se nejedna ... spis o jeho 'simulaci'.

Uživatelský avatar
pospisjak
Příspěvky: 212
Registrován: 10 dub 2009, 02:00
Bydliště: Blanensko

#24 Příspěvek od pospisjak »

Ahoj, otvírám trochu starší téma.
Potřeboval bych nasimulovat výstup ze snímače otáček, tedy obdélník do cca 15 kHz. Je reálné použít atmegu 328, resp. Arduino UNO coby generátor obdélníku? Frekvenci bych zadával ručně potenciometrem na analog IN, případně přes UART nějak z PC.
Pomocí funkce Delay takto "vysoká" frekvence již vygenerovat nejde, ale mohl by jít nějak využít interní counter např. OCR1A.

Uvažuju správně, nebo to mám rovnou vzdát, protože tudy cesta nevede?

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#25 Příspěvek od FHonza »

S velkou rezervou vyhoví jakýkoli ATMega nebo ATTiny. Stačí použít čítač v režimu CTC. Tady je na to docela dobrý kalkulátor.

Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“