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
Ezt nem igazán értem!
Honnan tudjuk, hogy mikor jön az impulzus, Mikor mérjük, és milyen hosszú? Ezt inkább szét kellene osztani 2 I/O pinre!
Az impulzust én generáom az AVR kimenetén, de csak akkor, ha a meghajtott berendezés ezt igényli.
Annak a bemenete ugyanis minden impulzusra billen, nekem meg csak akkor kell billenteni, ha nem jo állapotban van. ( gondolj el egy lámpát. Minden impulzus be illetve kikapcsolja, nekem viszont csak akkor kell kapcsolnom ha pl. nem világit). Szoval mielött ki kiüldök egy impulzust meg kell vizsgálnom, hogy át kell- e egyáltalán kapcsolni a berendezést. A hozzászólás módosítva: Dec 30, 2014
Sajnos még mindég én vagyok az értetlen!
![]() Kimenet vezérel >> Bemenetet! Hogyan jön visszajelzés a Bemenetről >> Kimenet fellé??? ![]()
A vezérelt cucc is egy AVR-s berendezés ( sok egyforma porttal). A portokra adott impulzusokkal lehet a kimeneteket átbillenteni ( bonyolult impulzussorozatot ad ki). Amint megszünik a bemenetre adott impulzus, ugyanezen a porton jelzi vissza ( pl. egy opcionális LED-el), hogy a kimenet milyen állapotban van. ( gondolj el egy vezérlöpanelt kivilágitott nyomogombokkal, amik fénye jelzi a kezelönek, hogy az adott funkcio aktiv vagy sem, ha sötét meg kell nyomni, ha világit akkor nem).
Az én berendezésem meg hivatott ezeket a gombokat kezelni, azaz bizonyos algoritmus szerint kapcsolgatni a cucc kimenetét - de csak akkor, ha az már nem a kivánt állapotban van. ( mert akkor az ujabb bemeneti impulzusra kikapcsolna). Az eredeti AVR egy berendezés vezényel 8 kimenetet 8 gombbal vezérelve). Az én AVR meg egy folyamatot vezérel mikor melyik kimenetnek milyen állapotban kell lennie. ( sok egyéb feltétel teljesitése alapján). A hozzászólás módosítva: Dec 30, 2014
Nem a kérdésre válaszoltál!
Honnan tudja a Vezérlő, hogy milyen állapotban van a Vezérelt eszköz? ![]()
Mondjuk 1 impulzus érzékelésre valami ilyesmit gondolok:
Bocs. Az elsö cucc - ami megvan - kepzelj el, hogy 8 ajtot nyit vagy csuk. Minden ajtohoz van egy bemenet, amire adott 0V impulzus az ajtot az ellenkezö állapotba csukja. Ezt az állapotot a bementi portrol ki lehet olvasni.
Azaz a nyomgomb világit, ha az ajto nyitva van. Az én most épülö berendezésemnek tehát ki kell olvasnia mind a 8 ajto pillanatnyi állapotát, s ha a feladat ugy kivánja egyik másik ajtot csuknia kell a másikokat meg nyitni. Mivel azonban minden impulzus ellenkezö állapotba billenti az ajtot, csak arra a bemenetre küldhetek imoulzust, ahol változnia kell a pillanatnyi állapotnak. Az én berendezésemen van még további 8 bemenet, amik állapota határozza meg, hogy a 8 ajtonak az adott pillanatban milyen állapotban kell lennie. Kb igy néz most ki a bemenet. A az adott berendezés Az 1 kohmos ellenálláson küldöm az impulzust ha kell ( attol függ, hogy világit vagy sem a LED.) A hozzászólás módosítva: Dec 30, 2014
Nem az impulzusra kell várni, hanem eldönteni, hogy kell-e egyáltalán impulzust küldeni a külsö ( uj berendezésböl). Pl. Csak akkor, ha a LED nem világit mehet az impulzus.
Ez esetben:
A vezérlő Port alapesetben Bemenet, amit beolvasol. És Pin-enként kiértékelve eldöntöd, hogy kel e vezérlés? Majd a Port.Pint Kimenetre váltod és az adott Pin-en kiküldöd az impulzust. ![]() A hozzászólás módosítva: Dec 30, 2014
Azaz, minden portra kell egy rutint irnom, ami elöször beolvassa az állapotot, s ha az nem jo, akkor átvált kimenetre és kiküld egy impulzust, majd visszavált bemenetre.
Jo lesz igy?
Kel 1 rutin!
Amelynek paraméterekben megadod a vizsgált PORT, PIN értéket. És eszerint elvégzi az adott portra a műveletet. Esetleg még vissza is jelez, hogy mit végzett! A hozzászólás módosítva: Dec 30, 2014
Kevés segítség!
Amennyiben AtmelStudiot használsz? Nálam Mega64 esetén. Megnyitod: A Solution Explorer ablak, Dependencies > iom64.h (illetve amit használsz?). Állományban többek között megtalálod a kérdéses I/O Constansok meghatározását. ...
Studiot használok, de olyasmiröl mint solution explorer még nem is hallottam. Magam irkálom a rutinokat meg mindent. ( asm-ben, minden máshoz hülye vagyok
![]()
Eddig úgy tűnt mintha használtad volna a szabványos:
1. #include <avr/io.h> 2. #include <util/delay.h> 3. #include <avr/interrupt.h> Fájlokat? A.Studio > View menü > Solution Explorer ablak, > Dependencies > Ben megtalálod az Projectben alkalmazot összes Header fylet, dupla klik a: iomxx.h A kérdéses rutint asm-ben is meg írhatod! Az iomxx.h ismerete csak segítség, a Proci adatlapjának összefoglaló kivonata.
Valakivel összekeversz.
Az én programjaimban ilyet még soha nem használtam. A gyári rutinok közül szinte kizárolag a chip rutinját használom ( pl. M644pdef.inc). Minden más include parancs a saját kodjaimra utal (equats, macros, eermbs stb.). Igaz, hogy studio 4-t használok ( egyébb kompatibilitási okok miatt) de abban a VIEW fül alatt nincs Solution explorer). Nem gond, az asm rutint megirom, s majd azzal vizsgálom a portok állapotát. Kösz a segitséget.
Üdv uraim.
Erre van az apróhirdetés! -moderátor- A hozzászólás módosítva: Dec 31, 2014
Bocsi!
Tényleg össze kevertelek az előtted kérdezővel! (Akkor a választ neki szántam!) Viszont az általad felvetett téma részletei is érdekelnének! Ha az Új évben még vissza térhetünk rá? Addig is BUÉK mindenkinek! ![]() A hozzászólás módosítva: Dec 31, 2014
Természetesen! Addig az egészségedre!
B U E K 2015 !!!
Sziasztok. Az miért van, hogy ha az OCR2A=0, a porton akkor is az idő 0,4%-ában logikai magas szint jelenik meg?
Ha PWM-re gondolsz, ott én is belefutottam ebbe a hibába.
Arra nem jöttem rá, hogy miért van, de PC PWM-nél nincs ez a jelenség, ezért én azt használtam Fast PWM helyett.
Köszönöm, PC PWM-mel tényleg jó. Utánanézek Fast PWM-nél miért van így, mert elég fura ez a dolog.
Sziasztok!
Először is BÚÉK! ![]() UV levilágítót szeretnék majd építeni. Ehhez egy mega8-at fogok használni. Készítettem egy programot, Proteusban tökéletesen működik. Véleményeznétek? Mivel lehetne szebbé varázsolni? A tanácsokat és az eddigi segítségeket köszönöm szépen...
A hozzászólás módosítva: Jan 2, 2015
![]()
Valami prellmentesítést tegyél a gombokra. A start még működhet is, de az IDO gomb lenyomásakor nem egy hanem több INT1 fog generálódni, ami meg fogja nehezíteni az idő beállítását
![]()
Sziasztok. Van egy érdekes problémám: a watchdogtól lefagy a mikrokontroller.
Bekonfigolom a main elején így: wdt_reset(); WDTCSR = (1<<WDCE)|(1<<WDE); WDTCSR = (1<<WDE)|(1<<WDP1)|(1<<WDP2); És a while elején mindig resetelem. Ettől elvileg 1 mp után resetelnie kéne a mikrokontrollernek, ha nem fut le a while ennyi idő alatt. Ha próbaképpen berakok egy _delay_ms(1500)-at, akkor viszont lefagy az egész, csak a tápfesz levételével és újra ráadásával lehet újraindítani, de persze amikor elér az 1500ms-os késleltetéshez a program, akkor újra lefagy. Mi ennek az oka? Szerk: ha a wdt.h könyvtárat használom és így állítom be az elején: wdt_reset(); wdt_enable(WDTO_1S); és a while-ban resetelek, akkor teljesen jó, az 1500 ms-os delaynél újraindul a mikrokontroller. Akkor már csak egy kérdés maradt: mit rontottam el? A hozzászólás módosítva: Jan 2, 2015
Csak a headert használd.Ez első esetben a fordító az optimalizációtól függően szétdobhatja a két setup sort,aminek szigorúan követnie kell egymást.Egyébként cli/sei közé is kell tenni.
Igen az lenne.
Javítottam. Köszi ![]() A hozzászólás módosítva: Jan 2, 2015
Szép estét, sziasztok!
Prell-mentesítésnek jó ez a megoldás? ISR-ben kikapcsolom a megszakítást. Timer0 segítségével másodpercenként megnézem hogy ki van-e kapcsolva a megszakítás, ha igen akkor vissza kapcsolom.
Működni működik, szerintetek jó így? Köszi szépen. ![]()
Szia!
Felesleges bonyolitas es a megszakitas kulonben sem arra valo, hogy nyomogombokat erzekelj vele, bar ketsegtelenul lehet arra is hasznalni. A foprogramodban 20..50ms idonkent nezd meg a gomb allapotat es ha megvaltozott az elozo vizsgalat ota, akkor lenyomtak vagy felengedtek. Ez a modszer automatikusan kiszedi a prellezest es nem igenyel kulon megszakitast. Azon felul ezzel tobb gombot is lehet kezelni, akar egesz billentyumatrixokat. Elsore talan bonyolultnak tunhet, de abbol indul ki a dolog, hogy valami idoalap mindenkeppen van a programban, ahogy a tiedben is van.
|
Bejelentkezés
Hirdetés |