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
Megírtam a kódot, működik is ahogy kell, viszont fejlesztés céljából annyit változtattam rajta, hogy ha a led állapotot vált, egy y nevű változót 1-el növelek, a végtelen ciklusban pedig megvizsgálom, hogy elérte-e a változó a 10-et. Ha elérte, akkor egy másik led-et bekapcsolok 1 másodpercre, aztán ki(azért a végtelen ciklusban mert az ISR rutinba nem szabad várakozást bevinni). De a másik led nem akar felvillanni.
Itt a kód:
eddig ment rendesen, de most... viszont mégsem működik, ha bent hozok létre változót, mert ha használom is valamire akkor megint fagy...
Alapszabályokat ovlasd el a fórum fölött . (Nekem anno a volatile-s, UART-os és PORTC-s segített) Volatile kimaradt, amikor a globális x, y-onokat létrehoztad. Most már mennie kell.
X_arany is double? Próbáld ki ezt:
Próba szerencse. Amit te csináltál azt úgy hívják, hogy explicit castolás, mert a compileren kívül te határoztad meg a típusokat, te kezdeményezted a castot. Amit fentebb írtam azaz un. implicit castolás avagy kikényszerített típuskonverzió, amikor a változók típusa nem egyezik meg. Ekkor a compiler maga fogja végrehajtani. Elméletileg nem kéne különbségnek lennie. Az általad írt kód olvashatóbb.
ez nem megy
ez igen nem is a vissza kasztolással van gond, hanem azzal, hogy int-ből double
Ahogy tanult kolléga, de már én is említettem korábban:
Ha egy változót nem csak egyazon interruptból használod, a "volatile" jelzőt elé kell tenni! Esetedben az "x" még maradhat sima, az "y" viszont mindenképp volatile kell hogy legyen! A volatile-t többféleképp fel lehet fogni, én úgy fogalmazok hogy a fordító nem optimalizálja, nem tartja regiszterben a függvény végéig, minden változáskor kimenti a memóriába, és minden felhasználás(olvasás) beolvassa a memóriából.
Köszönöm, hirtelen elfelejtettem, hogy az y változó már nem csak az interruptban szereel, hanem a mainben is. Eddig az életemben elég kevésszer programoztam, de gondolom hogy idővel észre fogom venni az ilyen hibákat is.
Tisztában vagyok a fogalmakkal.
Hadd idézzelek: Idézet: „Gondolkozom egy IDE fejlesztésen, de elég macerásnak tűnik, vagyis inkább hosszú ideig tartana, ahhoz hogy normális környezet legyen , mert tényleg nagyon bugos. Csak akkor van a baj, hogy ha nem csak az AVR Studio hanem az exe-k is bugosak.” Tehát te egy IDE -t akarsz fejleszteni egymagad? Ugyanakkor azt mondod, hogy az eclipse-t felfúrni AVR támogatásra rettentő bonyolult lenne. Eleve kapásból itt van az AVR Eclipse Plugin. A programozást máris támogatja az avrdude-dal. Idézet: „Azokkal a környezetekkel az a probléma, hogy nem AVR specifikusak. Tudsz benne írni C-ben, és eltudod fordítani...” Ez eddig jól hangzik Idézet: „...Viszont nem tudod felprogramozni, fuse biteket állítani...” Erre mint lásd fentebb van megoldás Idézet: „...asm-ben írni...” Azt hiszem erre aztán tényleg pofon egyszerű plugint csinálni Idézet: „, online debuggolni, nem tudod szimulálni stb...” A szimuláció az tényleg felejtős, de azt teszem azt az IAR sem tudja, pedig az tényleg nem olcsó program. Amúgy van egy Simulavr nevű projekt, ami támogatja néhány AVR szimulálását . Az online debuggolásra szintén van létező projekt, persze az sem terjed ki minden AVR-re. Most azt nem találom hirtelen, de az ugye eleve a gdb-vel kommunikál, tehát ott sem lenne lehetetlen megoldani a működést. Minden egyes projekt open source és várják a lelkes fejlesztőket. Ha annyi erőd van, hogy nulláról írnál egy IDE-t, akkor szerintem inkább ezekbe öld bele az energiád.
Próbáld meg csak simán értéket adni.
Ilyenkor a tizedes vessző utáni számokat lehagyja. Próbáltad már a disassaemblying ablakban megnézni, hogy tényleg lefordítja azt a sort?
Azért egyelőre veled sem állnék le vitatkozni a programozás rejtelmeiről, mert alulmaradnék.
Óóó ha tudnád, hogy én mennyit káromkodtam a lemaradt pontos vesszők, == helyett = írtam if-ben és társaitól, hogy azt el nem tudom mondani . De még most is amikor sok ideig csak egy nyelvet használok aztán visszatérek egy másikra..
Eclipse-t már sokat láttam, meg azt is tudtam hogy van egy pár plugin, de az avr támogatottságával újat mondtál nekem! Igaz nem igazán néztem utána ennek. Egyelőre csak gondolati szinten van a dolog, de addig fog idegesíteni az AVR Studio amíg tényleg neki nem esek, és össze nem dobok rá valamit. Ezekről amúgy honnan van tudomásod?
Idézet: „Ezekről amúgy honnan van tudomásod?” avrfreaks.net -et is figyelemmel követem. Javaslom bárkinek, aki érti az angolt és szeretne elmélyülni az AVR témában. Az új atmel studiot nézted már? Leszámítva, hogy eléggé vízfejű lett a visual studio alapja miatt, egyre használhatóbb kezd lenni. Fél év és a legidegesítőbb bugok mind eltűnnek belőle szerintem. Igaz most is csak ritkán fut bele az ember.
AZ alábbi programrészletben kérném a segítségeteket.
Lm35 DZ-t kötöttem Atmega128-ra. A portf.0-n venném az analóg jelet, single-ended üzemmódban. A problémám csak annyi, hogy ez a nyomorult chip nem hajlandó a Vref feszültséget átállítani 2.56V-ra. Abból gondolom ezt, hogy a REFS1:0 biteket akárhogy is állítom, az ADC átalakítás eredménye Vref=VCC és 2.56V Internal Vref esetén is hajszál pontosan ugyanaz. Márpedig ha nem tévedek, akkor 2.56V-os referencia feszültségnél pontosan kétszer olyan pontos (felbontású) értéket kellene kapnom. Számolgattam és akkor sem jön ki az, hogy miért nem megy az egész. ADC_RESULT=Vin*1024/Vref képtlet alapján, amit multiméterrel lemértem és pl.300mv-nál az eredmény ~62, amit szépen meg is kaptam a kontrollertől. Viszont - amint a programban is írva van - 2.56V-os referencia mellett dupla olyan pontos felbontás kellene kapnom tehát 120-at. De valamiért nem hajlandó 0 és 2.56V között végezni a konvertálást. Ha valaki tudja mit rontok el pls segítsen Talán külön kellene bekapcsolnom a Vref=2.56-os internal feszkót?!?! De pedig az adatlapban nem írtak ilyet..... Köszi előre is ha valaki tudja mi a gond.
Sziasztok!
Írtam egy egyszerű soros port, hardware pwm programot, csak van egy gondom, ha az s_pwm függvénybőlé kiveszem az outdec() függvényt, akkor nem működőképes a program, tehát nem változik meg a pwm kitöltési tényezője, míg ha benne van, minden tökéletesen fut, csak közben rengeteg adatot küld ki a tx lábon... ( egy parancs felépítése pl "a 0100=") Emellett nem sikerült az interruptban, az elemző függvényben entert('/n') alkalmazni '=' helyett, ez valyon miért lehet? (mármint, hogy ha ez a karakter van, akkor csináljon valamit az if ben, egyszerűen nem ismeri fel az entert, pedig a terminal programban leütöm...) A pwm egyszerűbb lenne hardweresen, de nekem sajnos most szoftweresre van szükségem, a hardwereseket másra fogom használni, ott simán működött, ha megadtam az interruptban, hogy pl OCR1A=servo)
Valaki tudna segíteni? Előre is köszönet, Zoltán
*software(!) pwm + uart, már nem engedett javítani...
Ha benne van egy double-é kasztolás, de nem használom utána, akkor nem fagy, ha használom, akkor fagy. Szerintem nem fordul bele, ha nem használom.
Üdv!
Kezd szűkülni a hiba. Nem is kasztolással van a gondja. Magával a lebegőpontos számokkal. Ha volatile, akkor elég csak egy művelet a lebegőpontos számmal és már resetel is..
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?
Azt már olvasgattam én is, de még nem lettem függő . Ott van Dean, aki a LUFA-t csinálja. Az 5-ösben nagyot csalódtam, így azóta a 4.19-et használom, de akkor megnézem, hogy milyen lett az új, mert tán van 6-as is?! Sajnos mostanában nem sok időm jut erre.
Jááááj, ez a 0b1010111010101 regiszter beállítást felejtsd el (én is így csináltam először), mert az őrületbe fog kergetni, és segíteni sem fog senki, mert nem fogják kibogarászni az adatlapból. Ehelyett így írd fel:
vagy írhatod ezeket egymás alá is.
Nem így szoktam írni, csak a szerencsétlen beállítás miatt írtam át regiszter szerint olvasható formába, mert - naivan - már azt reméltem hátha így működik a dolog.... de a jelek szerint ez sem ért sokat....
Az adatlap szerint az ADC átalakító bekapcsolásával együtt indul be a belső ref. fesz. De nekem tojik beindulni..... :| annyira hihetetlen.... Önállóan beállítja magát 5V-os referenciára és ennyi.... Így pedig egy 10mv/°C -os hőszenzort elég szar felbontásban tudok csak kiolvasni.....
1. globális változókat csak akkor használj, ha megszakítási rutinból szeretnél valamit kiemelni, mert nem lehet követni, hogy melyik függvény mikor mit használ, és hogy előtte milyen érték volt az adott változóban.
2. /n helyett használj \n 3. az aposztrófok a közötük lévő ASCII karaktert számmá alapítod, így ha nem nyomtatható karaktert szeretnél összehasonlítani, akkor bátran keress rá az ASCII kód táblára és keresd ki a neked megfelelő karaktert és annak a számát írd be. 4. ez már csak kötekedés, hogy a while ciklus után nem kell ;. Lásd 145. sor. 5. ne SIGNAL-t használj, hanem ISR-t, mert újabb 6. ne legyen ilyen hosszú megszakítás és főleg ne legyen benne delay függvény. Ha ilyet szeretnél csinálni, akkor használd az un. szemafort. Ez egy sima bit, amikor akkor áll 1-be amikor megszakítás történt, és a main-ben egy if-fel figyeled. Ha volt megszakítás, akkor belép az if-be ahol lefut aminek le kell futnia, végül a a bitet 0-ba állítja.
Érdemes ilyen formában írni, mert a hex méret szemponjából lényegtelen, hogy melyikkel írod.
Ha belső 2,56V-t szeretnéd használni akkor egy kondit kell rá az AREF-re tenni, de hogy mekkorát azt nem tudom. 211. oldal ADC Voltage Reference bekezdést olvasd el az utolsó két mondatát, de lehet hogy nem ez a probléma.
Akkor sajnos kerülő úton kell megoldani a problémát. Megszakítás után rögtön add át az értéket egy lokális double-nek. De lehet, hogy valaki más tud ennél okosabbat.
Sajnos nem az a gond, de azért köszi. Asszem jó ideig jegelem az AVR-t és inkább PIC-ezek addig.... nagyon le bír zsibbasztani ha valamire ennyire nem tudok rájönni.
Én még egy dolgot hozzátennék:
A comm függvény "comm("echo")" hívásra szerintem akkor is igazat ad ha "info" van a bufferben, mert nem annyira szerencsésen van megírva az az összehasonlítás.
Mondjuk ez se 100 mert ha a bufferben "abcd" van es te "ab" val hasonlítod akkor ez is rossz értéket ad de ezt már rádbízom
Már eleve a lebegőpontossal gond van. Amint használná rögtön resetel.
Tovább kutakodtam. Ha kiszedek programrészleteket, akkor nem resetelődik :S 150 kb-os kódnál resetel, ha lebegőpontossal számol, 125 kb-osnál nem :S
Jah, értem. De közben eszembe jutott, hogy miért is kell neked double? Miért nem elég a float? Hiszen a végén úgy is castolsz.
|
Bejelentkezés
Hirdetés |