Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   702 / 839
(#) tbarath válasza Josi777 hozzászólására (») Szept 24, 2021 / 1
 
És az miért ne lenne "korrektül elkészített" az a kód, ami egy ismert jelenséget (változó túlcsordulás) lekezel, és amúgy jól működik?
(#) Skori válasza tbarath hozzászólására (») Szept 24, 2021 / 2
 
Így van! Ráadásul nem is bonyolult. Ha eltároljuk a millis() korábbi értékét (uint32 változóba), a millis() aktuális értékét szintén, majd a korábbi értéket levonjuk az aktuálisból, akkor túlcsordulás esetén is helyes különbség értéket kapunk.

Többször kellet már olyan programot készítenem, amiben sok időzített feladat volt, mindegyik elmentette a futásakor aktuális időt. A fő ciklus nagyon gyorsan tudott futni, mert mindegyik részfeladat csak megnézte, hogy elérkezett-e a futásának az ideje, és ha még nem, akkor azonnal kilépett. Ez afféle kooperatív multitaskinghoz hasonló működést tud eredményezni, csak arra kell figyelni, hogy egy-egy részfeladat ne foglalja nagyon hosszú ideig a processzort, tehát az összetett feladatokat érdems több kisebb részfeladatra szétszedni. Amelyik feladatnak pedig pontos időzítés kell, akkor arra ott van pl. a timer megszakítás. Ez pedig kombinálható is a fentiekkel. Pl. a megszakítás beállít egy flag-et (is), amelyet valamelyik időzített részfeladat figyel, és töröl amikor lefutott.
Pl. a forrasztóállomásomban is használtam hasonló megoldást, a mérés, PID számolás, pwm beállítás ment a timer megszakításban (40ms időközzel), ehhez "szinkronizálva" négy külön ágon a többi részfeladat, pl. kijelző frissítés (160ms), eeprom kezelés, hibadetektálás-kezelés, stb...
(#) Josi777 válasza tbarath hozzászólására (») Szept 25, 2021 /
 
Mert a túlcsordulás "lekezelése" valójában egy hibajavítás, egy felesleges dolog, ami növeli a kód hosszúságát és a loop idejét. Ezért a millis() működik, de korrektebb, ha timer-el van megoldva az időzítés.
(#) tbarath válasza Josi777 hozzászólására (») Szept 26, 2021 /
 
A kód hosszúságát a timer kezelés is növeli, a loop futásideje pedig az esetek túlnyomó többségében nem kritikus. Pl. ebben az esetben az a feladat, hogy X esetben történjen Y riasztás, majd ha 12 óra múlva még mindig fennáll az X eset, akkor ismét történjen Y riasztás, és stb. Valahogy nem érzem annyira időkritikusnak ezt a dolgot, ide a timer ágyúval verébre téma, pláne egy kezdőnél, aki eredetileg delay()-t akar használni.
Azt pedig már csak halkan mondom, hogy ha tényleg csak ennyi a feladat (amit senki se tud), akkor a delay()-es megoldás se elvetendő. Csak nem 12 órás várakozással, hanem mondjuk ciklusban percenkénti vizsgálattal, a kilépési feltétel pedig vagy a szakadás megszűnése, vagy 12*60 elvégzett vizsgálat. Ezzel lekezeljük azt is, ha az első riasztás követő 12 órában javítják a hibát, majd ismét megszakad a kábel.
(#) Josi777 válasza tbarath hozzászólására (») Szept 26, 2021 /
 
Ez az én véleményem, kerülöm a millis()-t 1s-nél hosszabb időzítéstől. A timerek remekül használható dolgok és biztosak, nem kell odafigyelni rájuk. És ha már delay(), arra kb. ugyanez vonatkozik, nem ördögtől való, csak hosszabb időre nem szabad megakasztani a loop-ot (vagy a kvázi loop-ot). De te vagy bárki más úgy használja, ahogy akarja.
(#) Kovidivi válasza Josi777 hozzászólására (») Szept 29, 2021 / 1
 
Azt tudod-e, hogy ha a timer-eket saját szájíz szerint állítgatod, akkor bizonyos függvények nem fognak működni? Pl. a timer0 a millis() fv. menedzseli... Szerintem te nem is Arduinoról beszélsz, hanem sima Atmel Studios programozásról! Vagy fogalmam sincs, mire gondolsz, de Arduino alatt Timer-t állítgatni csak akkor lehet, ha tényleg tudod mit csinálsz, mit befolyásolsz a későbbiekben. A kérdező, aki pedig 12 óráig akarta a delay-t használni, biztosan nincs tisztában ezzel (ami egyáltalán nem baj, senki sem születik mindentudónak), szóval ha neki szeretnél segíteni, figyelembe kell venni, hogy kb. milyen szinten áll a kérdező.
A hozzászólás módosítva: Szept 29, 2021
(#) Josi777 válasza Kovidivi hozzászólására (») Szept 29, 2021 /
 
Igen, tudom. Ennek ellenére a hosszú távú idők mérésére következetesen a timerek valamelyikét kell használni. Ez az én véleményem, nem kell vele egyetérteni. Mindenki olyan kódot ír, amilyet tud. Nem gondolom, hogy a timerek használata annyira nehéz lenne, főleg úgy, hogy létezik több féle library is a használatukhoz.
A programozói szinthez pedig megint csak szerintem, fontos, hogy már a tanulás elején tisztában legyenek a kezdők legalább az alapvető működésével a rendszernek. Pl. hogy a millis() függvény számlálója túlcsordul egy idő után. Tehát úgy használom, hogy ez a tulajdonsága ne okozzon problémát.
(#) Kovidivi válasza Josi777 hozzászólására (») Szept 29, 2021 / 1
 
Melyik timer-t használod? A timer0-t? Mert akkor a delay-nek annyi, és mindennek, amit timer0-t/delay-t használ. A másik kettő timer pedig a PWM kimenetekért felel, plusz a szervó könyvtár, meg egyéb spéci könyvtárak.

"hogy a millis() függvény számlálója túlcsordul egy idő után." - ez eléggé köztudott probléma, de ha nem, akkor 50 nap folyamatos működés után kiderül a hiba...

Amit pedig fent Skori írt, még az átfordulásnál is helyes eredményt szolgáltat. Miért kellene pont a timer-ekbe belenyúlni, az Arduino lelkében turkálni, ami jól működik? Ezzel előre nem látható hibákat generálni? Ezt pedig egy kezdőnek tanácsolni?
(#) Josi777 válasza Kovidivi hozzászólására (») Szept 29, 2021 /
 
Elmondtam a véleményem, szerintem érthetően. Azt meg, hogy nem érted, ne rajtam kérd számon. Mindenki úgy csinálja, ahogy akarja, miért kell ezt ismételnem? Hadd gondoljam már úgy, ahogy akarom!
(#) Skori válasza Josi777 hozzászólására (») Szept 29, 2021 / 1
 
Én azt látom, hogy Kovi is elmondta a véleményét, ill. kérdezett tőled. Szerintem neki is ugyanúgy joga van a véleményéhez, és neki sem kötelező egyetértenie veled. Mellesleg szerintem sincs igazad, de attól még valóban úgy csinálod ahogy akarod.
Szerintem a nagyon hosszú időzítések esetében (több óra, vagy akár több nap) pont mindegy, hogyha néhány ms-ot elcsúszik, erre felesleges a timer-t elhasználni, az csak akkor kell ha szükséges a nagy pontosságú időzítés.
(#) Josi777 válasza Skori hozzászólására (») Szept 29, 2021 /
 
Csakhogy én nem erősködtem a véleményem mellett! És még csak nem is utaltam arra, hogy ne lehessen eltérő véleménye, sőt, ellenkezőleg. Erre most te is kifogásolod, hogy nekem is van, a tiétektől eltérő véleményem, ugyanis felhozol egy szubjektív példát. Ha nem lenne bajod a véleményemmel, akkor nem próbálnál meg ellentmondani neki egy fals példával. Mi az isten van már ezen a fórumon is, hogy ne mondhatná el az ember érthetően a véleményét, hogy ne ugornának rá páran! Meg sem próbáltátok értelmezni a mondanivalómat!
(#) kapu48 hozzászólása Szept 29, 2021 /
 
Ilyen hosszú időzítésekhez inkább olyan HW-t ajánlanák amin van beépített RTC. Azzal kel az ilyen feladatot megoldani!
Pl.: Bővebben: NUCLEO F103
Arduino alól is programozható, és kap hozzá sok támogatást a neten.

Bővebben: Link
A hozzászólás módosítva: Szept 29, 2021
(#) kapu48 válasza kapu48 hozzászólására (») Szept 29, 2021 /
 
Vagy Arduinos lib: Bővebben: STM32 RTC
(#) mateatek válasza kapu48 hozzászólására (») Szept 29, 2021 / 2
 
Én arduino-nál, hosszú időzítésnél azt a megoldást használom, hogy a timer0 előosztóját 64-ről 1024-re állítom. Így a millis() és a delay() függvények ideje 8-szorosára megnyúlik. A cirka 50 napos túlcsordulás megnő cirka 400 napra. 400 nap alatt vagy megtanulok programozni, vagy egy áramszünet ad még kis haladékot.
(#) Kovidivi válasza Josi777 hozzászólására (») Szept 30, 2021 / 1
 
Emlékszem, amikor kezdőként Arduinoztam, olvastam egy ugyanilyen ajánlást, hogy "hát az Arduino alatt a timer a király, azt kell mindenre használni!!!". Gondoltam hajrá, legyen timer-es LED-villogtatás! El is kezdtem, megértettem a timer működését, a regisztereket, megtanultam, hogyan kell a regiszter értékét megváltoztatni, példaprogramokat kerestem. Beírtam Arduino alatt egy egyszerű kódot, amit előtte leellenőriztem adatlappal. Aztán teszt, és: Nem működik... De miért nem? Ezután jött a kód ellenőrzése, a LED próbája csak a port írásával, stb, stb. Minden jónak tűnik, mégsem megy! Ekkor (több óra próbálkozás után) visszaírtam soros porton a regiszterek tartalmát (ehhez persze előtte le kellett programoznom, hogy az 1-2 byte-ot bitenként lássam soros porton), és csodálkozva láttam, hogy a timer már az Arduino lap bekapcsolásának legelső pillanatába sem az adatlapi 0x00-t tartalmazza. Na ettől a szívástól szerettem volna mindenkit megkímélni, aki a te tanácsodat olvassa. Szóval nem a véleményeddel van a baj, hanem hogy nem írod oda, az mivel jár!
(#) Kera_Will hozzászólása Szept 30, 2021 /
 
Az adott fejlesztői keretrendszer keretein belül maradva kevésbé ér meglepetés bárkit is.
Persze lehet tekergetni és "alányúlni" , de akkor mindenről tudnod kell : mit, miért teszel, ezért hol és mit kell beállítani ? Akkor már másik fejlesztői keretrendszerben kellene dolgozni. (pl.:ASM).
(#) Jonni hozzászólása Okt 1, 2021 /
 
Sziasztok.

Hagyományos 16x2 LCD háttérvilágítását akarom szabályozni arduino kóddal. Úgy gondoltam , hogy van 2 nyomógomb az egyik + (emeli a fényerőt) a másik - (ez meg csökkenti a fényerőt) pwm jellel.
Tudtok ebbe segíteni?
régebben valahol már láttam ilyen kódot megírva de most nincs meg
(#) Massawa válasza Jonni hozzászólására (») Okt 1, 2021 /
 
Bármilyen PWM kimenetet ráköthetsz az LCD LED bemenetére és azt szabályozhatod. Keress egy motorvezérlö vagy szervovezérlö kodot, vagy csak PWM alapok is elegek.
Csinálsz számlálot az egyik gombbal növeled az értéket a másikkal meg csökkented, az eredmény egy változo, amit kiküldesz a PWM portra,
(#) Jonni válasza Massawa hozzászólására (») Okt 1, 2021 /
 
Inkább a kódot vagy linket légyszi. Köszi
(#) Jonni válasza Jonni hozzászólására (») Okt 1, 2021 /
 
Ezt találtam
  1. int pinIncrease = 2;
  2. int pinDecrease = 3;
  3. int pinLED = 11;
  4. int brightness = 0;
  5.  
  6. void setup() {
  7. Serial.begin(9600);
  8. pinMode(pinIncrease, INPUT);
  9. pinMode(pinDecrease, INPUT);
  10. pinMode(pinLED, OUTPUT);
  11. digitalWrite(pinIncrease, HIGH);
  12. digitalWrite(pinDecrease, HIGH);
  13. }
  14.  
  15. void loop() {
  16. brightness = constrain(brightness, 0, 255);
  17. analogWrite(pinLED, brightness);
  18. Serial.println(brightness);
  19. delay(100);
  20.  
  21. if(digitalRead(pinIncrease) == LOW){
  22. brightness++;
  23. }else if(digitalRead(pinDecrease) == LOW){
  24. brightness–;
  25. }
  26. }


Ezt a kódot tudom használni ha be van kapcsolva a belső felhúzó ellenállás (INPUT_PULLUP) vagy nem azt csinálja amit kéne?
(#) sargarigo válasza Jonni hozzászólására (») Okt 1, 2021 /
 
Most is be vannak kapcsolva a belső felhúzó ellenállások, azok hajtják meg a gombokat a pin2 és pin3 bemeneteken. A led ellenállását akarod bekapcsolni, vagy melyiket? A példa amúgy szerintem pont jó arra amit kérdeztél.
szerk.: esetedben a Serial-sorokat ki is lehet szedni, az csak a soros monitorhoz kellenek.
A hozzászólás módosítva: Okt 1, 2021
(#) Jonni válasza sargarigo hozzászólására (») Okt 1, 2021 /
 
A nyomógombhoz nekem hardveresen nincs felhúzó ellenállás kötve és azt olvastam hogy azt a setup pinMode-ba kell.
Nem igy van bekapcsolva? pinMode(pinIncrease, INPUT_PULLUP);
(#) Jonni válasza Jonni hozzászólására (») Okt 1, 2021 /
 
PL itt is írnak róla.
(#) sargarigo válasza Jonni hozzászólására (») Okt 1, 2021 / 1
 
A fenti kód teljesen jó. Inkább ezt az oldalt nézd meg, jobban le van írva. Ha még nem tetted volna meg, akkor a TAVIR féle tanfolyamot érdemes lenne végigolvasnod, abban minden felmerült, és majd felmerülő kérdésedre választ kapsz.
(#) sargarigo válasza Jonni hozzászólására (») Okt 1, 2021 /
 
Idézet:
„nekem hardveresen nincs felhúzó ellenállás kötve”

Miért, milyen hardvered van? Az atmega csipek a tokon belül tartalmazzák a felhúzó ellenállást, azért tudod ki-be kapcsolgatni őket. Vannak helyzetek amik indokolttá tehetik a külső ellenállás használatát, de a tiéd nem az az eset.
(#) Jonni válasza sargarigo hozzászólására (») Okt 2, 2021 /
 
Hagyományos Arduino nano-t használok. Amit belinkeltél ott tényleg elég részletes a leírás.
(#) Jonni hozzászólása Okt 3, 2021 /
 
Van 1 sorom
  1. else if (reading < 590) bright = 255;

Azt hogy lehet megoldani, hogy a relációs jel utáni 590 érték ne csak 590 legyen hanem 590-től egészen 1023-ig minden szám ?
(#) sargarigo válasza Jonni hozzászólására (») Okt 3, 2021 /
 
Ez a sor pontosan azt teszi amit mondasz. Ha a reading értéke kevesebb mint 590, vagy 591, vagy 1000, akkor a bright értéke 255 lesz.
szerk.: vagy pedig nem értem mire gondolsz
szerk2.: nem azt szeretnéd, hogy ha reading értéke _nagyobb_ mint 590 akkor maximálja a bright értékét 255-ben? Mert akkor csak annyi, hogy a relációs jelet megfordítod.
A hozzászólás módosítva: Okt 3, 2021
(#) Jonni válasza sargarigo hozzászólására (») Okt 3, 2021 /
 
Én is erre gondoltam. Pedig valmi hiba van valahol. Akkor tovább keresem
(#) sargarigo válasza Jonni hozzászólására (») Okt 3, 2021 /
 
Tedd fel kódot, és megtaláljuk!
Következő: »»   702 / 839
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem