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
Üdv ismét én.
Ezernyi doksit átrágtam ADC vel kapcsolatban is.Letöltöttem más által "irt" egyszerű kódokat(Programozható led) gondoltam na végre ebből kitudom szedni ami kell de tévedtem.Szimplán egy kód kéne amivel az Attiny45 el egy LDR tudok fényviszonyhoz megfelelő ledet tudok bekapcsolni (később más szerepet szánok) de még ez se jön össze.Egy nagy gurut kérnék meg hogy egy kicsit segítsen az elindulásban már ha nem nagy kérés sehol-se találok csak is arduino hoz való kódot (ami épp azt teszi ami nekem kéne LED et kapcsol-be ha sötét van) de hát nem arduino-m van.Köszönöm előre is.Csak egy apró löket kéne akár doksi(de ne ADC mert mar a fülemen jön ki).
Bascom program jó lessz?
A hozzászólás módosítva: Jún 10, 2013
Atmel studio 6.1 et hasznhalok C vagy Assembler bascomot mivel tudom felhasználni??
Pedig érdemesebb az ADC-t gyúrni, mint trimmerrel és műveleti erősítőkkel ökörködni. Szerintem egy kapcsolásnál ne az döntsön, hogy mit tudsz most megcsinálni, hanem az, hogy hogyan érdemes. Itt pedig ha 10 embert megkérdezel, 10 ADC-t fog javasolni.
Ha már úgyis ott a mikrokontroller, akkor azzal mérsz. Ha nincs mikrokontroller, akkor OPAMP. Én megvettem egy fényérzékeny ellenállást, ami normál fényviszonyok között 2k. Vele sorosan kötöttem másik 2k-t a 0 és 5V közé, a két ellenállás közti feszültséget mérem ADC-vel. A hardver az két ellenállás és egy 100nF-es kondi az AREF és a föld közé. Ha pontosan akarsz mérni, akkor az AVCC-re 30mH induktivitás és 100nF utána a fölre. Ennyire bonyolult. Persze szórakozhatsz LM324-essel, schmitt triggert csinálsz belőle, amit trimmerekkel hangolsz. Ezt is csináltam már, de ha van mikrokontroller, akkor nem fogok idétlenkedni.
Igen tudom mert énis megépitettem BC447 (asszem msot nem vagyok biztos benne) Ledet kapcsolja(full sötétben teljesen világit stb) csak nekem "programozható" rész kell mert az kis-seb is meg stb ezért is döntöttem az AVR mellet mert van csak nem értem azt a részét oké hogy az ADC részét megírom csak a lekérdezés és használatát nemértem. Mármint Megelégednék hogy Éjszaka(ON fénynél meg OFF) a szerkezet egyenlőre de este tudom megírni mert nekem túl komplikált.Nem találok leírást ehhez csak is bonyolult exampleket.
Panaszkodtál, hogy a GCC túl bonyolult és nem érted, a regiszterek közvetlen programozását!
Ezért javasoltam a Bascomot! Jóval 1*űbb, Elvégzi helyetted a Regiszterek beállítását. Bascom könyv hu.
Igen látom hogy könnyebb müködik is úgyhogy köszönöm.Csak C után fura nem tom h ültetem át a RGB ledet most gondolkoznom kell de köszönöm .
A hozzászólás módosítva: Jún 10, 2013
Vagy van C-ben az oldal alján 1 szép megoldás:
ATtiny45 ADC Tanulni kel és gyakorolni! A hozzászólás módosítva: Jún 10, 2013
Kapu48, szerintem ha az ADC 120 fölött van, akkor bekapcsoljuk a LED-et.
Sötétedik, az ADC eléri a 120-at: bekapcsoljuk a LED-et, a LED fényétől hirtelen "világos lesz", 119-re visszaesik, ennél fogva kikapcsoljuk a LED-et, akkor meg megint sötét lesz... Nem így szokták megoldani és szerintem a szürkületi ki-be kapcsolgatás igencsak zavaró tud lenni. Ahogy jönnek, mennek a felhők, úgy fog kapcsolni. Nálam a kikapcs, bekapcs között az ADC-n 64 fok különbség van. Ha 544-nél bekapcsol, akkor 480-nál fog kikapcsolni. Ez az a szint, ami nálam már elfogadható és tényleg sötétben kapcsol be és világosnál kapcsol ki, ahogy az életben is működik. A hozzászólás módosítva: Jún 10, 2013
Mert nem olvasol vissza! A kérdező éjel/napali fényváltozásra akar valami ki/be kapcsolót!
Én vázoltam egy megoldást, minden részletes kidolgozás nélkül. Mivel még a HW részletezése sem lett ismertetve! Ezért, hogy milyen szinten kapcsol az megoldandó feladat maradt! És honnan veszed hogy a LED vezérli a Napot? A hozzászólás módosítva: Jún 10, 2013
Hát, a fényérzékeny ellenállásra nincs ráírva, hogy kizárólag a napot érzékeli.
Amikor LED-es zseblámpával telibekapom az ellenállást, észleli. Nem kell megsértődni, viccnek szántam az előző hozzászólást. Mindenesetre a ki-be kapcsolás független attól, hogy reggel van-e vagy este.
A hozzászólás módosítva: Jún 10, 2013
(Lehetne még bonyolítani a programot. De az ATtiny-nak kevés a memóriája, és kelhet még más feladatra is!)
A hozzászólás módosítva: Jún 10, 2013
Nem volt szó hiszterézisről (szürkületi átmenet), hirtelen fényerőingadozásról (villámlás, belevilágítás), a felkapcsolt fény kereszthatásáról....
De lehet belső óra is és GPS óraszinkronnal... Tulajdonképp a feladat definíciója igen hiányos. Kapu48 adott egy _kiindulási_ alapot, amit el lehet bonyolítani. Végülis mehet 8k-n túlra is a kód és akkor a Tiny85 már kicsi lesz...
Ezt személyesen kipróbáltam és agybajt kaptam tőle, de lehet hogy másokat nem zavar.
Amikor jött a szürkület, akkor össze-vissza kapcsolt ide-oda mindenféle szabály nélkül, hol villódzott, hol másodpercekig 1 volt utána 0. Az említett módosításom valóban több erőforrást igényel, mert 4 byte-tal megtolja a végleges lefodított kódméretet. Ha nem maradt még 4 bájtod az attiny-n (CPI és BRLT), akkor én is azt javaslom, hogy ne tedd bele.
Lehet, hogy szükség van hiszterézisre? Én nem próbáltam!
Itt a hsz-ed modortalanságáról van szó! És ne keverj Bascomos programba C sorokat! A hozzászólás módosítva: Jún 10, 2013
Üdv!
Itt a mai rejtvényem
A problémám, hogy a count változóm csak 1 és 0 között változik. Nem tudom 1 fölé emelni. Szóval úgy néz ki a gombok működnek, de csak oda-vissza. pl.:0->1->0->1->1->1->0... Még egy érdekesség: Ha a count---t felcserélem a count++-al, akkor csak 1x tudom 1re változtatni, de 0ra már vissza nem és 1 fölé szintén nem megy.
Ezt a nyelvet nem ismerem, de pár másikat igen. Szerintem a 70. sor csinálja. Kommenteld ki és nézd meg úgy.
Ön itt volt az elmúlt fél évben? A fórumban már nagyon sokszor felmerült, és a legjobb hogy a fejlécre is kikerült:
Idézet: „1. Ha ISR-ben használsz globális változót, az legyen "volatile"”
Ezt néha még a tapasztaltak is elrontják.
Alapvetően nem rajongok a volatile-ért, mert jelentősen növeli a program méretét. Mindenegyes változó esetén át kell gondolni, hogy kell-e a volatile, vagy fölöslegesen pazaroljuk vele a memóriát. Csak oda kell, amit a főprogram és valamelyik interrupt egyszerre használnak. Ha csak a főprogram / csak az interrupt / több interrupt egyszerre használja, akkor nem kell. A hozzászólás módosítva: Jún 11, 2013
Igen az ISR-ben és a főprogramban használt változóim:
Ahogy elképzeltem: Amint megnyomom az egyik gombot a kettőből, amik egy MCP23S17-re vannak kötve, az küld egy interrupt jelet az AVR-nek. Az ISR rutin először vár 100ms-ek (sok, de ez a software-es anti-prell), majd kiolvassa az MCP INCTAPA regiszterben található értékeket és a KeyPad[1]-be menti. Mivel az INTCAPA-ban 6 másik bit van, ami kimenetként funkcionál, így azoknak az értéke nem kell, ezért jön a
Mivel mindig csak 1 gombot nyomok le, ezért az új KeyPad[1] értéke csak 0x01 vagy 0x02 lehetne vagy itt tévedek? SB
Kicsit zavarba jöttem. Lefoglalsz egy nulla méretű tömböt, amit beraksz a KeyPad pointerbe. Ezután a KeyPad[1]-et használod. Ez gyakorlatilag annyit jelent, hogy a countot simán felülvághatod a KeyPad[1] írásánál, de mást is, attól függően, hogy a fordító hová tette a 0 méretű tömbödet.
Elfelejteted lekapcsolni a megszakítás kezelés végén a GIFR regisztert!
Ezért a Prel hatására közben eltárolt INT kérés aktív maradt, és lesz 1 felesleges megszakításod. Aminek már bizonytalan az eredménye!
GCC-ben próbáld ki, a count értéke 0 helyett 12(!) lesz:
A javítás:
A Prel nem közvetlen az AVR INT lábánál jelenik meg hanem az MCP23S17 adott bemenetén. Neki, meg mind1, hogy hány megszakítás lép életbe(mennyit is ugrál a gomb). Addig küldi az AVR-nek a megszakítás jelet, amíg ki nem olvasom vagy az INCTAP vagy a GPIO regisztert. Mivel ennek a kiolvasását az AVR gyorsan elvégzi, ezért ha nem lenne ott a 100ms-es késleltetés, akkor ~30-40x kapna az AVR az MCP-től egy megszakítást. Ezt le is teszteltem, valamikor a múlthéten.
A GIF Regiszterben az INTF nem áll vissza automatikusan magától? Idézet: „...The flag is cleared when the interrupt routine is executed. ...”
1. az interrupt flag Atmega48 alatt törlődik az interrupt meghívásakor, a többi chipet nem ismerem. (GIFR nincs is Atmega48 alatt)
2. interruptban ne használj delay-t, sok bajod lehet még belőle. Amíg te az interruptban vagy, addig sem más interrupt, sem a főszál nem hívódhat meg. A rendszer áll és vár. Ha a sleep a főszálban lenne, akkor simán tudnál még UART-olni, ADC-zni, timer megszakítást használni,... A hozzászólás módosítva: Jún 11, 2013
Van az! Csak más a neve: EIFR – External Interrupt Flag Register!
(Ilyen egyszerű) Szóval én azért megpróbálnám!
Itt olvasd el a Prell részt:
Megszakítások Interrupt Igaz ez Bascom de mégis csak AVR. atmega48.pdf A hozzászólás módosítva: Jún 11, 2013
Érdekes, hogy a cikk is azt írja, hogy prell ellen tegyél sleepet a megszakításba. Ezzel viszont az UART-ot garantáltan kinyírod, TWI az jobb, mert az összes IC a buszon megvár téged, amíg sleepelsz, de egyéb baj nem lesz.
Ahogy én csinálom: 2ms-enként timer interrupt, ott a sok egyéb dolog mellett a billentyűket is kiolvasom. Ha megváltozott, akkor elindítok egy számlálót és a következő 30 timer interruptban nem olvasom ki. Emellett az IC dumál UART-on a számítógéppel, TWI-n a többi IC-vel, dolgozza fel az eseményeket,...
A prell ellen sokféleképpen lehet védekezni. Az már elég korrekt, ha lenyomáskor a megszakításban letiltod a saját megszakítását, elindítasz egy időzítőt, és az időzítő megszakításában újra engedélyezed a nyomógombot. Ennél egy fokkal jobb, ha nem letiltod, hanem az irányát fordítod meg - tehát felengedéskor újabb megszakítást eredményez. Az időzítő megszakítása pedig az érdemi munkát végzi(pl. változó beállítása), de csak akkor, ha addig a felengedésre nem érkezett megszakítás. Ez a módszer azért jó, mert megköveteli a stabil lenyomást X ideig, hátránya hogy ugyanennyit késni fog a "hatás" is.
A hozzászólás módosítva: Jún 11, 2013
Attiny44A-val készítettem a tápomhoz egy mérőműszert. Egyszerű cucc indikálásra. A gond, hogy ha a két adc bemenetét a földre kötöm a kijelzett érték akkor sem 0 hanem 6.
A számítás egyszerű: a max bemeneti fesz és áram esetén a mért érték 900. Ezt 3-mal osztva épp 300. A táp max feszültsége 30V árama 3A. Ebből következik, hogy a 0 helyett 3*6=18 a zéró érték. Mi lehet a baj? Lehet a belső ADC-nek fix offsete? Elég kivonnom a 18-at és kész? A kijelző algoritmus jó, mert a mért érték helyett 0-t írva szép 0 lesz a számítások és kijelzés után. A 6 nem változik, nem zavar. A hozzászólás módosítva: Jún 12, 2013
|
Bejelentkezés
Hirdetés |