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!
Nálad az lehet a gond hogy a stack túlcsordul. Magyarul: a programod túl sok memóriát zabál fel a változók számára. Igaz, egy double csak 8 bájt(AVR GCC-ben lehet hogy inkább 4), de a műveletek alatt(szorzás-osztás, stb.) ennek sokszorosát is használja. Ugyanis a fordító először fixpontossá alakítja át a lebegőpontos értékeket, azt a memóriában(stack-ban) tartja, kiszámol, visszaalakít, majd felszabadítja a helyet. Ha túl sok helyet foglal akkor belelóghat a stack a változókba. Mivel a stack-en tárolódik a függvényhíváskor a visszatéréshez szükséges cím, könnyen elszállhat a programod.
AVR-GCC esetében szerintem tökmindegy, ugyanaz mindkettő.
Sziasztok!
Szeretem bonyolítani az életem és a kapcsolásaim. Szeretném készülő vezérlőmet órával és dátummal ellátni, hogy óra:perc/nap alapján is programozható legyen. Ehhez mire lenne szükségem? Én arra gondoltam, hogy kapna az AVR 5V tápja egy 1F puffer kondit áramkimaradás esetére: Bővebben: Link Valamint tennék bele egy RTC IC-t pl. ezt: Bővebben: Link Milyen hardverre lehet még szükségem?
Mindig tanul valamit az ember . Mi ilyenkor a teendő?
Ehhez programozói gyakorlatra , mert én fölöslegesnek találom az RTC IC-t főleg, ha a mikrokontrollered csak óraként funkcionálna. Ha szeretnéd bonyolítani, akkor csináld meg rá a DCF77-t. A nagy puffer kondi okos gondolat csak figyelj arra, hogy legyen sorosan ellenállás, mert a tápod nagyon meg fog örülni a pillanatnyi rövidzárlatnak. Nem olvastam az előzményeket, de gondolom 32 kHz-es kvarcot használnál.
Kösz, ezt észre sem vettem! Tényleg igazad volt!
Én pl. alapból kerülném a lebegőpontos számokat és műveleteket. Lehet 32 és 16 bites fixpontos értékekkel
is dolgozni, igaz, egy kis odafigyelés nem árt a pontosság és optimalizáltság megőrzése érdekében.
Végtelenül érdekes dologgal találtam szemben magam. Megépítettem ezt az ISP mkii klónt. Sikerült feltöltenem rá a hexet minden oké volt. Csatlakozott is. Oh mondom végre először minden klappolni fog. Mint kiderült a nagy túrót, mert az entering és leaving mode failed. Csodás! Természetesen minden lábat végig néztem, hogy nincs-e összeforrasztva, vagy kimaradt forrasztás (tanultam a legutóbbi esetből), de nem volt. A DMM-el működés közben néztem, hogy a reset lábat lerántja-e, és erre frankón elkezdett működni. A próbapanelen 27k felhúzó ellenállás volt, és a reset lábra pár Mohmmal húztam le földre a DMM keresztül, de ettől miért kezdett el rendesen működni?
Fényévekkel gyorsabb mint a Doper. Amikor az egyik dopert programoztam a másikkal, akkor még a fürdőbe is ki tudtam menni inni, és még mindig égette , most ugyanaz a hex az isp klónnal feállni sem volt időm .
Köszönöm, az interruptot módosítottam, ISR re, használtam szemafor szerű dolgot, az igazi szemafor hogy működik? Nem találtam rá példát avr-ben. Vagy csak egy PORT bitet kellene "billegtetni"? Az a megoldás azért nem lenne jó, mert nem nagyon akad felesleges láb majd az avr-en.
Végül sajnos még mindig nem akart működni a dolog. Ezt már észrevettem máskor is, hogy ha a végtelen ciklust megszakító interruptban megváltozik egy globális változó, akkor a végtelen ciklusban a változót használó folyamatban nem mindig töténik változás... Ez miért van? Vagy a C nyelv hiányossága? bool változótípus nincs a c-ben? mejnek értéke 0 vagy 1? Mert az lenne a legegyszerűbb szemafor, és nem foglalna sok helyet(mint a mostani char-os megoldás) Ha így próbálon definiálni:
hibát ír a fordító... Így néz ki a mostani, működő program, kicsit csúnya elemzéssel az s_pwm függvényben.
Szemaforra egy példa:
Továbbra sem látok volatile-t , és még mindig túl sok a globális változó.
Avr studiot használok, ott csak sima C van sajnos, és nem használható benne a bool. Megteszi majd a char is.
A volatile pontosan mit csinál? Találtam róla egy leírást: Idézet: „Bár ritkán használjuk érdemes tudni, hogy van még egy módosító kulcsszó: volatile. Ez a kulcsszó azt mondja meg a fordítónak, hogy a változó értéke úgy is megváltozhat, hogy a fordító nem szerez róla tudomást. (Például több szálú, threading, programfuttatás során.)” De ez pontosan miért is jó nekem, így ez a while-os bug megszűnik?
Valóban, így minden bug eltűnik ami a while hoz köthető... Tehát célszerű minden változót ellátni ezzel a volatile-val, aminek köze van a végtelen ciklushoz és globális változó.
Egyébként, pl ha egy függvényben kellene nekem egy változó, aminek az értékére a függvény lefutása után is szükségem lesz, de csak ugyanebben a függvényben, akkor is globális változó kell. Jól gondolom?
Elmondom mi a baj: MAX3002.
Szerintem már leírtam ebben a topikban, hogy mire jutottam ezzel az IC-vel. Kb. fél éve. Sajnos túl nagy a csatornaellenállása(~6kOhm), ami a RESET 10kOhm felhúzó ellenállásával is összeveszik. Maga az IC sem valami stabil, kóboráramok miatt képes beragadni. Nem AVR-programozókhoz találták ki. Ha egyszerű áramkört akarsz akkor ellenállásos leválasztást(~220Ohm minden vonalra), ha korrektre vágsz akkor FET-es megoldásra, vagy GTL2003 IC-re lesz szükséged. És igen, nagyságrendekkel gyorsabb mint a Doper, de még a gyári STK-500 is alulmarad. A munkahelyen is inkább a házi készítésű mkII-t használom ha sokat kell égetni...
Igazából bármi lehet globális. Csak annyi a különbség hogy az végig a memóriában marad,
és nem a stack-en foglal helyet. Sok ideiglenes, vagy azonos nevű változót használó függvényeknél nem ajánlott. Ha kritikus az időzítés vagy a kódméret, a volatile-t csak az interruptban használt változókra használd, ettől függetlenül odateheted bárhová. Én azért nem használom ész nélkül, mert nagyobb lesz tőle a kód, és processzoridőt is elvesz a programodtól. Idézet: „Valóban, így minden bug eltűnik ami a while hoz köthető... Tehát célszerű minden változót ellátni ezzel a volatile-val, aminek köze van a végtelen ciklushoz és globális változó.” Az, hogy vegtelen ciklus van nem azt jelenti, hogy egy 'volatile' nevu varazsszo azt meg fogja neked oldani! A vegtelen ciklusnak rengeteg oka lehet! De most koncentraljunk az eredeti temara! A volatile pusztan az optimalizalast kapcsolja ki az adott valtozora. Mert mi is tortenik? Ahhoz, hogy a kodod kicsi es gyors legyen, a fordito csomo trukkot csinal. Tobbek kozott nezi, hogy a valtozod nem valtozik. Tehat a while feltele sohasem fog valtozni (gondolja a fordito), ezert felesleges azt figyelni -- egyszeruen kihagyja a vizsgalatot a kodbol es a ciklusod egy egyszeru vegtelen ciklussa degradalodik le. De mas miatt is lehetnek problemak amik szinten az optimalizaciobol erednek, pl egy RAM-ban tarolt valtozot athelyezhet regiszter teruletre a gyorsabb feldolgozas miatt, es ugy gondolhatja, hogy mivel sokszor kerdezgeted le a valtozot, felesleges ujra es ujra beolvasni azt a RAM teruletrol. Tehat a megszakitas a RAM teruleten modositgatja ugyan a valtozod, de azt a ciklus fejleceben nem olvasgatja ki... Az ilyen optimalizalasok legtobb esetben eszrevehetetlen a kodod logikaja szempontjabol, a program hiba nelkul fogja csinalni azt amit kigindoltal. Azonban ebben az esetben Te megiscsak azt szeretned, hogy a while feltetele vizsgalva legyen, hisz tudod, hogy ha a ciklus magban nem is, de a megszakitasban az a valtozo igenis valtozhat. Ezt mondod meg a forditonak a volatile kulcsszoval, es ennek hatasara a fordito nem fog buveszkedni es kioptimalizalni a valtozo figyeleset, azt minden esetben ki fogja olvasni a megfelelo RAM teruletrol es ellenorizni annak erteket. Ebbol kovetkezik, hogy 'volatile' mindenhova kell, ahol ilyen jellegu hibakra lehet szamitani -- mashova felesleges, persze hibat nem okoz, csak lassbb es nagyobb kodot, mivel nem lesz szepen optimalizalva. Itt a kontrollerek vilagaban a megszakitas az elso szamu gyanusitott, de ha bele nezel a header fileokba a regiszterek definicioiba, ott mar gyarilag figyelnek erre (hisz pl egy port valtozasat vagy timer, vagy egyeb modul valtozasat szeretned figyelni, akkor nem lenne jo ha a fordito ezeknek a regisztereknek a figyelgeteset kioptimalizalgatna). Ezen felul ha RTOS-t hasznalsz (Real-Time Operating System, azaz Valos Ideju Operacios Rendszer), akkor ott is elofordulhatnak hasolo bukfencek a parhuzamos programvegrehajtasbol eredo problemak miatt.
Valaki tudna segíteni?
Idézet: „Sziasztok! Az miért van ha áramot adok az attiny45-nek akkor a PB0-n lévő led felvillan de PB4-en lévő nem?”
Köszönöm válaszod, tényleg hasznos volt! Örülök ennyi jó magyar szaki van a témában!
Adatlap 236. oldal
Idézet: „ If the user has a fixed voltage source connected to the AREF pin, the user may not use the other reference voltage options in the application, as they will be shorted to the external voltage. ” Ezért mér mindig egy referencia ellenében.
Azért mert olyan program fut benne, aminek ez a működése.
Idézet: „bool változótípus nincs a c-ben? mejnek értéke 0 vagy 1? Mert az lenne a legegyszerűbb szemafor, és nem foglalna sok helyet(mint a mostani char-os megoldás) Ha így próbálon definiálni:” A bool ugyanúgy 1 byte-ot használ az AVR-ben. Amúgy tartalmazza a standard c is.
aztán mehet is.
Nagyszerű, köszi!
OOOOOooooooooooo, pedig ezt vagy kétszer már átolvastam, át is futott bennem, hogy mit is ír pontosan, de valamiért mégis figyelmen kívül hagytam.... :| Akkor szinte tuti h ez lesz a probléma. Kipróbálom. Köszönöm a segítséget, valszeg ez lesz a kulcs
Hozzászólásom javítom: Hirtelen felbuzdultam, hogy az AVCC-ről ír az adatlap, de nem, hanem AREF-ről. Az pedig a földre van kötve - még valahol írta is az adatlap, hogy a földre ajánlott kötni, szal tutira nem kötöttem máshova. Tehát a lehetetlen helyzet továbbra is fenn áll... Amúgy működik az AD átalakító meg minden, csak a 0-5V-os tartomány miatt az a 2-300 mV-os feszültség roppant gagyi felbontásban jelenik meg, és másfél-két °C fok változás is kell, hogy az AD átalakító akárcsak egyetlen értékkel is változzon. Gondoltam már arra is, hogy nem-e a 3-szoros átszerelés/forrasztástól megzakkant a chip :| Végülis ez az Atmega128-as már 3 panelben is volt, szóval ilyen téren "viharvert".
Most nincsen keznel nekem az adatlap, de szerintem rossz otlet az AREFet foldre kotni. Az adatlap nem egy kondit emlit az AREF es fold kozott?
Tipp: az AREF-re köss kisebb feszülstéget(~1V), ezzel megnöveled az érzékenységet(de a zajt is).
Fontos hogy a referencia stabil legyen, és a mérendő fesz is 0V-AREF közé eshet! Ezután már csak annyi a dolgod, hogy az ADC-ben a referenciát AREF-ről veszed(ADMUX) és kész vagy!
Igen,igen úgy gondoltam, csak nem írtam a kondit. De azért köszi.
Zombeee Ha a panelemmel viszonylag sok barbárkodás nélkül meg bírom oldani, akkor mindekép megpróbálom.
Üdv!
Én is erre gondolok, de még nem teljesen értem, hogy miért. Az a furcsa, h program memóriával áll összefüggésben. Ha belefordítok olyan C fájlokat, amik már nem kellenek és nem is használom őket akkor is megnő a program mérete és akkor fagy. Volt már hasonló. Még csak nem is függvények meg program, hanem program memóriában tárolt képek miatt. Mivel a műszer, amit fejlesztek egyszerre 3 nyelvet kezel, ezért 3 nyelven vannak benne BMP-ből átalakított képek. Amikor viszont elértem a plusz képekkel az ATXMEGA192-flash-ének a 75%-át kb, akkor el se indult, mindig resetelt. Ekkor elkezdtem kivenni képeket a kódból egyenként és egyszer csak ment. Tehát volt egy éles határ ahol meghalt. Márió
Sziasztok!
24 VAC feszültséggel fogom vezérelni az AVR-t. Erre van három lehetséges megoldásom. Szerintetek melyik vagy milyen megoldás lenne a legbiztonságosabb hosszútávon?
Hello!
Azt kellene figyelembe venni hogy egy mezei optocsatoló bétája általában 1-nél kisebb. Tehát a legalsót preferálnám, és a D22-re (szerintem) nincs szükség, a D23 és a kondi megfogja az ellenfeszültségű komponenst. |
Bejelentkezés
Hirdetés |