Fórum témák
» Több friss téma |
WinAVR / GCC alapszabályok: 1. Ha ISR-ben használsz globális változót, az legyen "volatile" 2. Soha ne érjen véget a main() függvény 3. UART/USART hibák 99,9% a rossz órajel miatt van 4. Kerüld el a -O0 optimalizációs beállítást minden áron 5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás 6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et Bővebben: AVR-libc FAQ
Kijelzőt úgy szoktam programozólábra tenni, hogy programozás közben ne terhelje. Vagy a közös katód/anód vezérlő tranzisztorok mennek oda(min. 10k ellenállással), vagy a szegmensek, de úgy hogy a közös anód/katód meghajtótranzisztora a programozás alatt (magasimpedanciás állapot!) biztosan ne kapjon jelet. Nagyáramú fogyasztó (pl. 12A-es RGB LED-sor) esetén úgy jártam el hogy a programozás idejére lekapcsoltam a LED-ek főtáp bemenetét, így nem változott az áramköröm 115kHz-es rádióadóvá. Ugyanis amíg a LED-ek kb. 100Hz-es PWM-et kapnak, a programozó ennél 1000x gyorsabban ketyeg.
A JTAG az sajnos nem teljes értékű port, vagy az egyik, vagy a másik(lásd: JTAGEN fuse bit).
De legalább az a 4 láb dedikált programozóláb lesz, és nincs speciális(pl. I2C, UART) portfunkciójuk. Nagyobbaknál ADC, de abból van még másik 4. A hozzászólás módosítva: Jan 17, 2016
A kijelzőt pontosabban ilyenre gondoltam:vBővebben: Link
Ez egy TFT kijelző. Hogy szokták azt megoldani,hogy a kijelző fényerejét állítsam AVR-ből? Elvileg 3.3V-os táp kell neki, és a led háttérvilágítás 2.7V-os (30mA). Az AVR(Atmega328p)-em 5V-os. Csinálok közéjük egy 5V-3.3V-os stabilizátort (AMS1117). Viszont ezt a LED háttérvilágítását hogy? PWM-el esetleg 5V-al? vagy 5V és egy soros ellenállás (50-100 ohm) és PWM? n-fet?
Chiptöl függöen az ISP vagy a JTAGot használom, eddig soha semmi gond nem volt velük ( ha már ment), pedig igen gyakran van a JTAG lábakon más felhasználás is ( valami más is oda van kötve).
Persze, lehet rákötni mást is, de a JTAGEN nevű fusebit értékétől függően vagy programozóláb, vagy használható port. A kettő együtt soha nem megy.
Lenne egy kérdésem szervó ügyben.
Lehet az ebay-en shieldeket kapni. Ezek tüskékből állnak és egy nano-ra (Atmega328P) fel lehet pakolni vagy 20 szervót. Ez tényleg csak ennyiből áll, hogy az AVR +5V tápjára felkötök 20 szervót és berakok valami komolyabb +5V-os tápot neki? Mégiscsak motorokról van szó, azért érdekelne, hogy egy 2A-s +5V-os tápra rányomok 20 szervót, ami ugyanazt a feszültséget használja mint a mikrovezérlő, akkor ez menni fog-e? A hozzászólás módosítva: Jan 18, 2016
Ekkora teljesítményben mindenképp érdemes külön tápot adni a szervóknak szerintem...
A gond az, hogy össze vannak drótozva, de látom olyan termék is van, ahol nincs összedrótozva, hanem külön szervó és MCU táp van.
Akkor a táp meghalt.
Szervonként ( még a mini szervoknál is) min 1A-t kell számolni, és nagyon kemény tápot (eredetileg akkukra lettek tervezve). A hozzászólás módosítva: Jan 18, 2016
Érdemes egy lehúzót tenni oda(mondjuk 1k). Ökölszabály, hogy amikor az AVR RESET-ben van, az erősítős kimeneteket is inaktiválni kell. Az R kimenetre (AVR-en bemenet) egy felhúzót(~10k) érdemes, mert amikor küldesz, akkor az nagyimpedanciára vált és a TTL szintű UART inaktív állapotban mindig logikai magas.
Van egy elmebeteg kérdésem
Valaki próbálkozott már olyannal hogy AVR-t programozzon AVR-el, egy flash vagy eprom tartalmából? Szeretnék megvalósítani egy olyan dolgot hogy AtMega2560 és Wiznet W5100 eth-val épített panel, olyat tudjon, hogy az AtMega egy webszerver amin van egy "upload" menüpont. Abban ki lehet majd tallózni egy HEX file-t amit gombnyomásra feltölt a PC a szerverre ami pedig tárolja egy RAM vagy Eeprom IC-ben. Ha a letárolás megvolt, az AtMega újraindulna, és akár egy Mega238 segítségével vagy magától bootloader-en keresztül felégetné a flash-ébe azt a HEX file-t. Tulajdonképpen a terv az hogy weben keresztül tudjak rajta "firmware"-t frissíteni. Még elméleti síkon próbálkozom csak, olyat már találtam hogy SD kártyáról kerül felégetésre egy Arduino segedelmével, de azt még nem tudom hogy a "feltöltés"-t hogy lehetne megcsinálni. Bár SPI-n MP3-at is le lehet játszani ami több mega szóval talán az is működne hogy SD kártyára kerüljön a HEX fájl a weben keresztül. Onnan már csak az SD-t kéne lecserélni vagy egy másik AVR-re vagy valami egyéb memória IC-re. Azon is gondolkodtam hogy maradna az Arduino-s bootloader, és megpróbálni soros porton feltölteni a HEX-et valahonnan. Ezekben a témákban még nem vagyok túl fejlett, így tapasztaltabb kollégák javaslatait/ötleteit szívesen venném. Leginkább a Bascom nyelvet részesítem előnyben, de úgy ahogy az Arduinóval is elboldogulok. Köszi a válaszokat előre is!
Ezt jó, hogy mondod. 20 szervót rá lehet kötni, de vezérelni csak 2-t fogok egyszerre.
Természetesen megvalósítható. Viszont nem annyira egyszerű. A gond, hogy az ATMega nem egy erőgép és egy flashnyi adat folyamatos küldése és feldolgozása (pl. SD kártyára írása vagy külső flash IC-re mentése) nem biztos, hogy megy. Én egy hasonló funkciót (képek letöltése webszerverről, majd átkonvertálása és SD-re mentése) ATXMega-val odottam meg DMA-val és külső SRAM-ba mentéssel (aminek videomemória volt az elsődleges feladata persze). Így már elég gyors volt, hogy a külső webszerver ne akarja megszakítani a kapcsolatot a "lassú" ügyféllel. Ebből is látszik, hogy a hagyományos feltöltés valószínűleg nem fog menni, ezért valamilyen kliens oldali scripttel kell majd megoldani az adatok adagolt küldését és akkor nem probléma ha csak egyszerre mondjuk 256 byte-ot tudunk feldolgozni és van idő azt kimenteni is.
Második probléma, SD vagy külső flash + bootloader. Extra AVR használata csak a frissítéshez elég feleslegesnek tűnik, inkább kell keresni egy jó vagy már majdnem jó bootloader-t amit erre a célra írtak és azt kell testreszabni. Az SD kártyának értelemszerűen komoly előnyei vannak egy flash IC-hez képest (olcsón óriási tárhely) és egy nagy hátránya, hogy a programban implementálni kell egy fájlrendszer kezelést is (főleg a bootloader oldalon gond, ahol jóval kisebb a rendelkezésre álló hely) az SD kártya SPI-os kezelésén felül (FatFS elég jó cucc). A flash IC-t viszont könnyebb kezelni és tárolhatod az adataidat rajta előre fixált címeken (könnyű implementálni a bootloader-ben is), az ára pedig 2Mbites kivitelben jóval olcsóbb mint az SD kártya és a foglalat. Elérkeztünk a harmadik ponthoz, Bascom. Gyanítom, hogy nem úszod meg C kód írása nélkül ezt a projektet.
Hát most nagyon lelomboztál, C valahogy sosem ment hiába próbálkoztam vele már többször is. De akkor lehet hogy nézek valami kínai DSP-s panelt egy linuxal.
Xmegát még sosem használtam, azért gondoltam a mega2560 mert az van itthon és tudok vele próbálkozni. De azt hiszem így inkább lemondok a kis tervemről. köszi az infót.
Az mindegy. A szervok akkor is éhesek ha állnak. Ezt egyesek ugy küszöbölik ki, hogy az állo szervokba megszüntetik a tápot.
Sima szabály továbbra is, ahány szervo van egy procira akasztva annyi Amper kell a tápbol. Én 8 mini szervot kezelek egy procival (azokat sem egyszerre) mégis kellett a 12V/6A táp. A 3 A-s egyszerüen összeomlott.
Sziasztok
Szenvedek egy kicsit itt a char és a String átalakításokkal. Szeretnék EEPROM-ból kinyerni adatokat és azt egy String-be menteni de folyamatosan kifagy a program ha oda jutok. Biztos én rontok el valamit remélem valaki tud segíteni.
Itt az utóbbinál hal meg amikor az apiKey-t szeretném felülírni a readKey-el. Valaki tud esetleg segíteni?
Ezt kipróbálom. Mármint, hogy a kívánt pozíció elérése után megszüntetem a servo jelet (konstans földre rakom) az 50 Hz impulzusok helyett.
Értelemszerűen ha 50 Hz-en kiadsz 1.5ms HI + 18.5 ms LO jel mellett, akkor a szervo elfordul és beáll. A hangján hallani is, hogy mozog valamennyire. De utána ha megszünteted a PWM jelet szerintem kikapcsol. Legalábbis erre emlékszem.
Az nem jo. Nem a szervo jelét kell megszüntetned hanem a tápot. Ha nem lesz jel a szervo meghülyül..
Gondolom ez C++ lehet, először Java-ra gondoltam de ott new operátort használunk.
A programmal az a baj (ami egyébként Java esetén nem fordulhatna elő), hogy a függvény végén a pointert másolod át, majd kilépsz. Az AVR ekkor pontosan azt csinálja a readKey-el (pontosabban a pointerével), mint minden stack-en definiált változóval: törli. De nem csak a pointert veszi ki a stack-ből, hanem a tartalmát is felszabadítja a heap-en. Innentől az apiKey egy érvénytelen memóriaterületre fog mutatni, amit ha használni kezdesz, különös dolgok történhetnek. De történik más is: a függvény végén az apiKey pointert lényegében eldobod, a tartalma(általa elfoglalt terület) viszont ottmarad a heap-en, foglalva azt. Megoldás: rendes másolófüggvényt alkalmazol, és nem a pointert másolod. Java esetén e két hiba teljesen jó működést eredményezne, mert a pointer átmásolásával a területet "forgalomban tartod", míg az eldobott régi pointer által jelölt területet a garbage collector felszabadítja. Igaz, nem túl optimális, de ettől még működik. A hozzászólás módosítva: Jan 20, 2016
Megtaláltam a hibát. Egyébként C++ nyelv. A probléma azzal volt hogy amikor karakterenként pakolja át a dolgokat String-be nincs a végén lezáró karakter. Még kellett hozzá egy "0x00" és így működik megfelelően.
Ezt szeretném kipróbálni. A dokumentáció azt írja, hogy ha nincs jel, akkor nem csinál semmit a modell servo (SG90).
Ezt fogom kielemezni fogyasztás szempontjából is, jelenleg még nem volt rá elég időm. Azt egyébként nem hiszem el, hogy meghülyülne attól, ha folyamatosan nyomom a RESET gombot az Arduinon, ezért nincs PWM output. Én a konstans 0-t a normális bemenetek közé sorolnám.
Ha akarod videon is be tudom mutatni. De nyugodtan probálkozz, a szervo karjára ha bármilyen erö hat, akkor az automatikusan és állandoan igazgatja az állást, hogyan lehet ezt áram nélkül megoldani azt még Einsteins sem tudná, csak egyes e-okosok irkálnak ilyemit a világhálon.
Ha nincs PWM output akkor a bemeneti differenciál erösitö azt sem tudja mit tegyen, a szervonak kell a stabil helyzetállapot és az orajel ( mindkettö a bemeneti jelben van.)
Nem volt időm tegnap bemérni, a héten valamikor megcsinálom.
Bocsi, nem szeretnék belemélyedni nagyon, de azt gondolom, kicsit másként értitek egymást.
Tapasztalatom szerint a modellezésben használt szervók karját el lehet forgatni, ha nincs pwm jel, amely a pozíciót adja. A táp folyamatosan rajta maradhat. (Sőt, én biztosan nem is venném le, hiszen ez digitális cucc, ahol lehetnek problémák az állandó ki/be kapcsolgatással.) A "differencia" képzés csak akkor indul el, ha jön egy vezérlő impulzus a bemenetre. Fontos, hogy a pwm jelet, amit a proci előállít stabil legyen, mert különben hibajel keletkezik a szervóban és apró tüskékkel próbál majd "beállni" a helyes pozícióba. Massawa teljesen jól javasolja, hogy ne tervezd alul a tápot, mert azért ezek a kis motorok is "harapnak", de csak ha van amper.
Részben igen részben nem, de az állapot nem stabil, ha nincs PWM jel. Nekem is van >50 szervom, van amelyik PWM nélkül elfordithato, de egy idö után elkezd rángatni. Szerintem ez az állapot nincs kezelve, igy szolgálhat meglepetésekkel, ezért jobb kerülni.
Én már kénytelen voltam letesztelni, a modelljeimben a szervok mind hibátlanul müködtek az asztali berendezéseimben (én is sporolni akartam a tápon) meg kitapasztaltam minden csapdát. Ma már ott tartok, hogy 7 darab 12V/5A kezel közel 45 beépitett szervot, és még jön néhány).
Kicsit megdobja a költségeket, azért érdeklődtem.
PCA9685 - 16 csatornás servo driver ~1000 Ft Ha még külön tápkapcsolgatás is van, akkor 2xI2C IO expander ~ 1400 Ft 16x IRF9Z34 FET ~ 2000 Ft Szóval több, mint négyszerezi a költséget, ezért érdemes mélyebben belemászni. Az is kérdéses, hogy az általam használt servo motor hogyan működik. Nem univerzálisat szeretnék, arra legyen jó, amilyen szervókat használok. A hozzászólás módosítva: Jan 20, 2016
|
Bejelentkezés
Hirdetés |