Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Sziasztok! Már a múltkor feltettem kérdésnek, hátha valaki tud valami megoldást, hogy van egy megám és elég lassan fut a progi rajta, megnézegettem a problémás részeket, és pl egyik a dht11-es szenzornak az olvasása, ez normális, hogy ilyen lassú? Előre is köszi!
Nem, dht11, de nem csak az okozza a lassúságot, hanem pl. lcd-re kiiratom time könyvtárból a pontos időt, és az is nagyon lassú.
Szerintem olyan hosszú az interruptod, vagy olyan sok van belőle, hogy nem marad ideje a Meganak a főprogramot futtatni. Arról nem is beszélve, hogy egy digitalwrite() függvény meghív meg további függvényeket, az ADC beolvasása sem éppen gyors, ezeket érdemes lenne átirni rendes AVR kódokra, mint PORTD=stb.
A hozzászólás módosítva: Márc 12, 2015
A kód ismerete nélkül csak lottózni lehet! (Azt meg ügye nehéz eltalálni!)
Itt a komplett kód! Van egy olyan rész, hogy homero() abban van a dht11-es olvasás.
A hozzászólás módosítva: Márc 12, 2015
Huhh, felteszem a kérdést. Mitől lenne gyors?
Őrült mennyiségű serial kiírás (legalább emelnéd meg a bitrátát mondjuk 115200-ra, azt ugye tudod, hogy minden karakter kiíratása majdnem 1ms-be kerül most? te meg regényeket írsz ki). Használsz egy csomó delay-t (ilyenkor az uC-d nem csinál semmi hasznosat). Old meg időzítő megszakítással vagy millis-el. Rengeteg vizsgálatot végzel el minden egyes ciklusban. Kérdem, minek? Ha az időt csak perc pontossággal dolgozod fel, minek állandóan lekérdezni (időzítő megszakítás)? Ha elég lenne az eseményeket akkor vizsgálni ha változott is valami, akkor minek állandóan nézni (PCINT megszakítások)? EEPROM kezelés (haragszol az EEPROM-odra? ), tegyél fel egy Save gombot és csak akkor mentsd el a paramétereket ha tényleg kell (előtte olvasd ki a byte-ot, hogy tényleg változott-e). A kód amúgy szinte olvashatatlan. Rengeteg ismétlés (szervezd ki függvénybe, esetleg inline is lehet).
A serial csak akkor ír, ha megnyitom a webes felületet, a delay is csak akor van, ha egy zóna iktatva van, alapból a delayt kihagyja, az idővel és az eeprommal kapcsolatban nem igazán értem.
Az időnél azt az if (evbeallitasa1 == false && evbeallitasa2 == false & stb. részt értem. Arra például mi szükség minden egyes ciklusban? Persze kiemelhettem volna még hasonlókat.
Az EEPROM nem örök életű, azt ugye tudod. Meghatározott számban írhatod, utána vége. Épp ezért illik vigyázni rá, csak akkor írni ha tényleg kell. Ha előtte beolvasod az aktuális tartalmát és összehasonlítod azzal, amit oda írni szeretnél akkor gyakran spórolhatsz egy ciklust. Ha jól értem, amit csináltál, akkor most minden egyes alkalommal, amikor vki átnyom egy beállítást akkor menti az EEPROM-ba. Csinálsz egy apró hibát vhol a webkódban, esetleg rászabadul egy crawler bot, vagy akármi más és kinyírja most az EEPROM-odat.
Értem, köszi, az EEPROM-ot meg fogom csinálni, és átnézem, amit előzőekben írtál, az valóban kerülhetne máshova...
Még annyi kérdésem lenne, hogy ha pl a hónapot a napot meg az órát, esetleg a percet berakom egy változóba, és megnézem, hogy az aktuális nagyobb-e mint a változó, és csak akkor iratom lcd-re, ha negyobb, az számit valamit?
Minden pici számít. De azért csinálj egy időzítő megszakítást, amivel aszinkron módon aktiválhatod az ilyen jellegű vizsgálatokat.
A bemenetekhez pedig nézd meg a PCINT megszakításokat. Ezek azért jók, mert akkor hívódnak csak meg ha a konfigurált pin-ek értéke változik (minek olvasgasd a lábakat digitalread-al ha úgyse változott?). Ráadásul abban a pillanatban reagálhatsz rá, ahogy valami történt, nemcsak amikor a ciklusban arra került a sor, hogy beolvasd azt a lábat.
Köszi szépen a sok infót!
Ilyen megszakítást találtam, ez jó? Csak az a baj hogy itt muszáj létrehoznom egy void ot minden lábnak.
A hozzászólás módosítva: Márc 12, 2015
Illetve még annyi hogy ha van egy digitalWrite-om, amit mindig csinál, akkor jobban járnék, ha előtte digitalRead-del megnézném a lábat és csak akkor írnék rá, ha változott?
Nincs véletlenül egy Arduino UNO-d? Egyszerűbb ha egy kis programon begyakorolod azt a pár példát, amit mutatok és csak utána implementálod a MEGA-ra (ezek a kódok uC függőek lesznek, nem használhatod azt, amit az UNO-ra írtál direktben a MEGA-n!).
A gond az Arduino megszakítás kezelésével, hogy nagyon limitált. Ezért én sosem használom. Amire szükséged lesz az az UNO és a MEGA 2560 uC-inek kézikönyvei. Ezek első látásra elég rémisztőek lehetnek, de szerencsére szépen fejezetekre bontották a különböző funkciók szerint a leírásokat, így mindig csak pár oldalt kell átnézni. Ha kicsit jobban beleásod magad, láthatod majd milyen sok minden mást is kihozhatsz még a cuccodból. Hasznos még az alábbi két gyors referencia kép is, ami az UNO és a MEGA lábkiosztását mutatja, a lábak port kiosztásával, illetve egyéb kiegészítő funkcióinak feltüntetésével egyetemben.
Az első példa a PCINT megszakításokkal kapcsolatos (Pin Change Interrupt). Adott egy 3 nyomógombból összerakott kezelőfelület és a gombok lenyomását szeretnénk érzékelni.
Előkészület: Regisztrálunk pár makrót a kód könnyebb olvashatósága érdekében. Ezek a makrók a regiszterek bitjeinek beállítására illetve törlésére valóak.
Első feladat: a megszakítás inicializálása
Mi is történik itt: A cli() letiltja a megszakításokat, a sei() újra engedélyezi azt. Fontos tudni, hogy több pin change megszakítás áll rendelkezésre. Például ebben az esetben a D porthoz a PCIE2 tartozik. Mivel az összes vizsgálni kívánt bemenet ehhez a porthoz csatlakozik elég csupán ezt engedélyezni. (12.2.4. fejezet) Ha megnézed a refernciaképet, láthatod, hogy a 4, 5 és 6 os lábak mellett szerepel a PCINT20, 21 és 22 felirat. Ez alapján tudjuk bebillenteni a maszkban, mely lábak változásakor lépjen működésbe a megszakítás. (12.2.6. fejezet) Definiáljunk pár változót:
Következő lépés a megszakítás elkészítése:
Ha megnézed újra a referencia képet, láthatod, hogy a 4, 5 és 6-os lábak mellett a PD4, PD5 és PD6 szerepel. Ez azt jelenti, hogy a lábak a D port 4-es, 5-ös, illetve 6-os bitjeihez vannak rendelve. Tehát egy utasítással beolvasható 8 láb állapota (khm, nem éppen 8 lassú digitalRead ). A PIND utasítás szolgál a D port beolvasására. Előtte negálom, mivel a lábak felhúzó ellenállással 5V-on vannak és csak gomb lenyomásakor lesz az értékük 0-a. Utána pedig a 0x70 maszkkal eldobom az érdektelen biteket (ez itt mondjuk nem fontos). A következő lépés, hogy megkeresem melyik gomb lett most lenyomva. (switches ^ prev_switches) azokon a biteken ad vissza egyet, ahol változott a bit a korábbi állapothoz képest. (switches ^ prev_switches) & switches végeredménye pedig, hogy csak ott lesz 1, amit most nyomtak le (a felengedések nem érdekesek). A kód többi részében előállítom a később használandó változók értékét. Azért tűnik komplikáltnak, mert egy egyszeri lenyomást, illetve folyamatos lenyomást egyaránt kezelő a gombokat pergésmentesített kód következik utána.
Nézzünk most egy példát időzítőre.
A példában a timer 1 időzítőt fogom használni, ami 16 bites. A cél egy 1280Hz-es analóg mintavételezés indítása. Első lépés a megszakítás inicializálása.
A cli utáni első három utasítással alaphelyzetbe állítom az időzítőt. (15.11 alatti fejezetek) Ezek után meghatározom, milyen gyakran hívódjon meg a megszakítás. A képletben a 16MHz a használt kristály frekvenciájára utal. Ez 16MHz szokott lenni 5V-os arduino-nál. A második rész a kívánt mintavételezési frekvencia szorozva a később beállítandó prescaler értékével. A mínusz egy pedig az azért van, mert 0 esetén is van egy ciklus. Ha a kiszámított érték nagyobb mint 2^16 -1 (65535), akkor növelni kell a prescaler értékét. A lehetséges prescaler beállítások a 15.11.2 alatti 15-5-ös táblázatban találhatóak. Aktiválom a CTC módot (Clear Timer on Compare). Ez azt jelenti, hogy felszámol a timer 1 0-tól az OCR1A-ban tárolt értékig, majd nulláz és kezdi elölről. Következő lépésben kikapcsolom a prescaler-t (prescaler = 1, ugye). Majd engedélyezem a megszakítást (15.11.8). Majd jön a megszakítás:
A lényeg persze az analóg mintavételezés kész megszakításban lesz itt (semmiféle várakozás az analogRead-re , ráadásul tök pontatlan is ahogy az arduino-ban használják). De ennyi most elég szerintem. A hozzászólás módosítva: Márc 13, 2015
Nagyon szépen köszi a sok infót!
Sziasztok!
Ethernet shield SD kártyán lévő index.htm-el szeretnék megjeleníteni egy szintén az SD kártyán lévő x.jpg-t. Viszont a weboldal nem tölti be a képet, csak a keretet. Valaki tudna segíteni? Arduino kód:
index.htm kód:
A hozzászólás módosítva: Márc 14, 2015
Ha az index.htm-en kívül mást is letölthetővé akarsz tenni, akkor természetesen olvasni és értelmezni kell a beérkező kérelmeket. Ha például a kliens az x.jpg állományt kéri le, akkor ne az index.htm állományt küldd ki neki. Figyelem: az x.jp kiküldésekor a fejlécben értelemszerűen más kell, hogy legyen a Content-Type értéke is. Ha 1-2 hónapot visszanézel, ebben a topikban találsz erre vonatkozó hozzászólásokat.
Sziasztok!
Watchdog timer-t használtatok már? Be van állítva 8mp-re, be is következik az időtúllépés, talán még egy resetet is kap, de nem indul el a főprogram. Lehetséges, hogy a bootloader nem engedi tovább a futást? Tápfeszültség ráadása után kb. 9.5mp-cel következik be a képszakadás. Ha csak sima interruptot állítok be, az pedig le sem fut. Arduino mini pro-ról van szó. Köszi.
Sajnos iszonyat lassú. Kb. 100kb méretű képet szeretnék megjeleníteni, de 10-15mp mire betölti. (nincs módom, hogy átméretezzem)
Ez a modul (W5100) miatt ilyen lassú vagy az SD kártyáról a SPI miatt ilyen a sebesség? Láttam W5200 jelölésű ethernet shieldet arduinohoz. Azzal van tapasztalata valakinek?
Próbáld meg hogy 512byte-ot olvasol a kártyáról elmented tömbbe majd ezt az 512-t kiírod clientprint-tel a fájl végéig.
Ezt találtam: "The more severe issue is, that the bootloader does not de-activate the watchdog upon reset, so that one can end up with endless resets. There are patched bootloaders available, but without official Arduino support this remains tricky." Nálam ha 8mp-re van állítva az időzítés, attól ha lefutna a bootloader, setupból már le tudnám nullázni. De nem is lép be még a setup-ba sem. Kipróbálom Atmega128-on bootloader nélkül, hátha a kód a hibás...
Sziasztok!
char n[20]; A fenti sorral: létrehoztunk egy változókat tartalmazó tömböt, amit n-nek nevezünk és megadtuk, hogy 20 eleme van. Jól gondolom?
Igen!
És a típusa 1 Byte -128 tol 127. terjedő szám.
Sziasztok! Hogyan tudnék lcd-n több mint 8 karaktert definiálni, mert ha definiálok egyet mondjuk a 0. helyre, kiiratom, aztán újradefiniálom a 0. helyet, akkor az előzőt is lecseréli.
Lecseréled az LCD-t GLCD-re!
|
Bejelentkezés
Hirdetés |