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
Hát a 2313-al így nem fog menni, hacsak nem használsz portbővítőt. Zavarokra igen de késleltetésre nem érzékeny eszköznél javasolt az időzítős megoldás, ahol a bemeneti kombinációnak adott ideig stabilnak kell maradnia hogy a kimeneten változást érjen el. Ehhez kell két segédváltozó. Az egyikben tárolod az "előző" bemenet értékét, ezzel az időzítő megszakításban egyetlen művelettel megállapítod hogy a bemenet változott-e. A másik segédváltozó egy számláló amit minden változáskor lenullázol, majd növelsz minden egyes IRQ-nál ha nincs változás. Ha elér egy adott értéket, akkor átbillented a kimenetet a kívánt állapotba, és tovább nem növeled a változót.
Akkor a végtelenített ciklusban nem PWM változót használsz hanem egy mezei számlálót, és a számláló értéke alapján kiválasztod a megfelelő kimenetet és betöltöd azokat az OCR regiszterekbe. A legvégén pedig egy hosszabb delay-t használsz, ami jól esik.
A bemenetet ugy gondoltam, ahogy eddig a nyomogombokat szoktam kezelni. Az idözitett IRQ többször leolvassa az állapotot, és csak akkor kezelem, ha egymásután ugyanazt az értéket olvassa (3-5x). Ez eddig elég jól bevált. Az eredmény egy BE változo, amit ezután kiértékelnék és megkeresném a táblázatban a hozzávalo kimenetet.
( már látom, hogy a 2313-s egy kicsit kicsi...)
Sőt! A számláló (tehát ami az állapotot mutatja) alapján variálhatod a késleltetést is. Arra nagyon ügyelj hogy a "_delay_ms" függvényekbe SOHA ne adj meg változót, az csak konstanssal működik (mivel valójában egy makró, nem igazi függvény). Variálni for ciklus beszúrásával tudsz amiben vagy egy kis delay és semmi más.
Remélem, de mindig olyan remegö ujakkal ülök a gép mögé, pedig már egy sereg müködö berendezést megépitettem és megirtam a SW hozzá. Gyakran primitiv aproságokon nem tudok tuljutni...
( szerencsére megvannak az univerzális macroim meg a subroutinokat is univerzálisra irom, igy minden programba be tudom illeszteni, de igy azok elég áttekinthetetlenek, mert az alprogramok jelentös része felesleges)...
Rájöttem mi a baj. A pwm csatornák között fix a különbség, így kezdőértékkel el tudom őket különíteni. Most ez a program fut:
Most jöhet az oda-vissza, és a knight rider effekt! ![]()
és így tovább...
Így?
Udv!
Egy kerdes, amiben nem vagyok biztos:
A return miatt a while() ciklus csak 1x fut le, vagy nincs jelentosege? Elnezest az egyszeru kerdesert, de nem vagyok AVR kozelben, amivel 1 perc alatt letesztelhetnem, de fontos az informacio.
Csak 1x fut le.
Ha a "valamilyen kod" tartalmaz (mondjuk egy if után) egy continue parancsot is, akkor nem feltétlenül egyszer.
Ha meg csak egy continue-t tartalmaz, akkor természetesen végtelenszer. Amúgy szebb lenne egy break a return helyett és a while vége alatt lehet a return.
Szia!
Szerintem ez lesz az, amire gondolok. Köszönöm. Ezt is ki kell majd próbálni. Csak pont most szedtem le a programozó kábelt a szekrény tetejéről! ![]()
Arra azért majd figyelj nehogy véletlenül 0-nál kisebb vagy 255-nél nagyobb értéket vegyen fel valamelyik változó a 4db while ciklusban de elvileg mindegyik 127-szer fog lefutni.
Amint elér a kód a return(0);-hoz ott vége is lesz, mert az a main függvényed végét fogja jelenteni. Szóval ha a "valamilyen kód" nem egy másik while(1) ciklus vagy valami egyéb végtelen csoda akkor 1x fog lefutni. Bizonyíték a képen
![]() A hozzászólás módosítva: Okt 12, 2015
Most az első cout -os sor és a return sor közé tegyél be egy continue; -t és csinálj egy screenshotot megint.
A hozzászólás módosítva: Okt 12, 2015
Úgy nem jut el a returnig ofcourse...
Szia, Mikor használatos a continue? Köszi.
Nem tudom a szabályos -iskolákban tanított- megfogalmazását csak saját szavaimmal írom:
A continue, while ciklusnál a ciklus elejére dob vissza - ignorálja a continue alatti és a ciklus-blokk vége közötti részt. Gyakorlatilag olyan mintha a blokk aljára ért volna a program. Hogy mikor használatos arra elég nehéz válaszolni. Például itt ez a végtelen ciklus, de ha van benne egy feltétel, aminek teljesülése esetén felesleges vagy nem szabad végrehajtani a továbi részt (viszont a ciklust mondjuk nem szabad megállítani) akkor ezt teheted egy változó beállításával, amit ellenőriz a fennmaradó rész, goto-val, vagy éppen continue-val, ami viszont (számomra) sokkal áttekinthetőbb és gyorsabb, mint a többi megoldás. A hozzászólás módosítva: Okt 12, 2015
Értem. Köszi a magyarázatot. Sok if-et és változót meg lehet vele spórolni, csak meg kell szokni.
A hozzászólás módosítva: Okt 12, 2015
Sziasztok.
Van egy régi projektem amihez 1602A-s kijelzőt használtam, most elfogyott rendeltem újat kínából de ezzel az újonnan rendeltem csak egy értelmetlen sort ír ki. Próbáltam másokat is azzal is értelmetlenséget jelenít meg. A régi LCD ami működik szépen az 1602A v2.0 van ráírva. Ezekre pedig simán 1602A és alatta QAPASS. Van e valakinek ötlete mi lehet a baj miért nem kompatibilisek?
Igen. Sok if-et (else if-et) és az ezzel járó végrehajtási időt, ami egy jól összerakott PC-re írt program esetén lehet, hogy nem jelentős de például pic és társainál hasznos lehet + a forrás áttekinthetőbb lehet.
Ne felejtsd a continue "párját" a break-et se használni! A ciklus hasában elszaporodó return-ök szintén áttekinthetetlenné tehetik a programot nem beszélve arról, hogy egy esetleges program-módosításkor (pláne ha azt a programot mondjuk egy éve írtad és azóta rá sem néztél) vagy esetleges hibakeresésnél sokat segít ha minél kevesebb helyen lép feljebb (return) az adott funkció/process. +ha visszatérés előtt muszáj pl egy file-t bezárni(vagy jelvezetéket 0-ba rakni stb.), akkor azt ne kelljen sok-sok ponton leismételni.
A QAPASS csak minöség ellenörzés. Valoszinüleg a bemenetek vannak elkeverve. 2 fajta kivitel van forgalomban, ha jol emlékszem 2 pin funkcioja különbözik. Nézz utánna.
Sajnos nem látszik hogy milyen verzió ez a mostani lcd. A régin rajta volt a v2.0 Megpróbálok kérni adatlapot az eladótól. Ha esetleg belinkelnéd ez a 2 típus áttanulmányoznám őket.
Köszi
Szerintem az időzítésen kell állítani, pl. az "új" több időt kér a bekapcsolás és inicializálás, vagy inicializálás és az első "rendes" utasítás közt. Illetve lehet hogy hosszabb impulzus kell neki az "E" (6) vonalon, de olyannal is találkoztam ami a 4 bites módot nem tudja.
Ha beütöd a googlebe ( németül) akkor kapsz egy sereg infot, és ott van az a kivitel is, ahol a lábak, vagy a jelalakjuk fel van cserélve ( anno én is szivtam vele, valahol megvannak a rajzok is nem elektronikus formában - az ilyesmit kinyomtatva el szoktam tenni).
De az is lehet, amit a kolléga ir, föleg a handshake nélküli kommunikácio esetén, hogy rövid az idö. ( ezért én nem is használom azt az egyszerü modot, hanem szépen megvárom amig az LCD visszajelez).
Tegyük hozzá, hogy a for és a do-while ciklusnál is pont ugyanígy használható a continue.
A hozzászólás módosítva: Okt 12, 2015
|
Bejelentkezés
Hirdetés |