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
Sziasztok!
Van ez a board: MINI USB Nano V3.0 ATmega328P CH340G 5V 16M Micro-controller board Arduino Telepítettem a driverét: Bővebben: Link így a windows felismeri az eszközkezelőben a boardot. Itt azt írják, hogy STK500 protokollt használ. AVR studio 4-ben megírtam egy kisebb programkódot, lefordítottam majd az IDE-ben a "Con" ikonra kattinttottam, ekkor felugrott egy ablak "Select AVR programmer". Kiválasztom az STK500-at. A "Connect"-re kattintáskor pislákol, majd világít a board-on lévő RX piros LED aztán kis idő múlva elalszik és ismét felugrik a "Select AVR programmer" ablak. Szerintem nincs kapcsolat a boarddal. Hogyan használhatnám a boardot AVR Studio 4-el?
Ha jól sejtem, ez bootloaderes cucc amit Arduino-IDE, meg talán az avrdude tud használni.
4-es Studio csak egy külön ISP programozóval tudja használni. De lehet, jobban is jársz vele...
Üdv!
Ubuntu 13.04 alatt szeretném használni a Topi-féle AVR progranozozót CDC módban. A programozót összeszerelve vettem a hestore-on keresztül. A programozandó készülék a MIKROE MINI-AT 5V-os kis eszköze, amelyben M328 MCU van. Ennek van USB-to-soros bemenete, azon keresztül is lehet programozni. Ez működött is, de egyszer csak egy hibás program betöltése után már csak egyszer lehetett programot tölteni rá bekapcsolás után. Kísérleteztem a bootloader újra feltöltésével, no ez után "halt le" teljesen a kártya. Hogyan lehetne ezt helyrehozni a Topi féle programozóval ? Az avrdude-on keresztül próbálom elérni, de nincs normális kapcsolat. Terminál módban mintha létrejönne akapcsolat, de sem kiolvasni sem írni nem tudom a kártyát. Mit tehetnék ? Utóirat: kérdésemet feltettem a "Topi-féle AVR programozó" témában is, de ott egy éve volt az utolsó hozzászólás, lehet, hogy már nem nézi senki. Elnézést a dupla posztért!
Sziasztok!
Belefutottam egy jelenségbe és nem értem, hogy miért. float x=0; float y=1; float z=0; x=1/2; z=x*y; A lefutás során ha nézem a watch ablakban,akkor x értéke 0. Miért ? Persze a végeredmény és 0 lesz, holott 0,5-nek kellene lennie. Miért ? Mi a hiba?(ha közben a watch ablakban átírom az x értékét 0,5-re,akkor minden oké,de így nem) AVR Studio + gcc és egy Mega16 A hozzászólás módosítva: Jan 2, 2017
Próbáld meg, hogy nem 1/2-t írsz be, hanem 0.5-öt. Nálam ez volt a hiba egyszer, én define-nál használtam. Gondolom az osztást integeren végzi el (miért is float lenne, ha nincs neki megmondva?). Az integer osztás eredménye pedig nulla, ebből pedig készít egy float "másolatot". Szerintem.
Az "1/2" valószínűleg intként kezeli aminek az eredménye 0 és ez megy x-be. próbáld úgy, hogy 1.0/2.0. Nem tudom a pontos szintaxist, de a lényeg, hogy a számokat már floatként értelmezze a fordító.
Köszi a tippet. Bejött.
A számolásban az egyik szám után oda kellett biggyesztenem egy tizedes jegyet és rögtön jó lett. Ment mancs ![]()
Nincs mit! Köszi, de nem egyedüli az érdem.
![]()
Ha egy számot így írsz a forráskódba: 1.0 , onnantól floatként kezeli a C. Valószínűleg ha vele végzel műveletet, akkor minden komponenst átalakít float-tá. Azt tudtátok egyébként, hogy ha valami összegét számoljátok vele nagyon hosszú ideig, és mindig csak nagyon kis számot adtok hozzá, akkor el lehet érni arra a pontra, amikor nem fog növekedni a szumma, mert a float típusából következően a két szám aránya túl nagy, és "elveszik" a kisebb? De ez nagyon szélsőséges, mondjak ha egy éven keresztül méred a lakásod fogyasztását valami óriási felbontással, és mp-ként adod hozzá az egységnyi idő alatt mért értéket. Csak érdekesség.
Sziasztok, ATmega328p -ről vezérelnék nagyfeszültségű dolgokat PWM-mel. Izoláció miatt TLP627-es optocsatolót használok (ötöt, multiplexálva). Szerintetek kell az optocsatolók bemeneteit az ATmega oldalról a földre húzni hogy elkerüljem a lebegést? Nixie csövek vannak a túlvégen, és túllövöm őket a multiplexing miatt, nem lenne jó ha lebegés miatt bekapcsolva ragadna egy cső, mert nem bírná sokáig károsodás nélkül.
Ennek az optónak a current transfer ratio-ja elég magas (min. 1000 adatlap szerint), ezért elképzelhető, hogy ha a mega i/o portján lévő felhúzó ellenállás valahogy bekapcsolódik akkor azon keresztül folyhat annyi áram, ami az optónak egy parázslásra elég és ez a kimenetén változást okoz. Ki is mérheted, hogy az optó mikor kezd el nyitni, de egy lehúzó ellenállással biztosra mehetsz.
Köszönöm a gyors és pontos választ!
![]()
Ennél rosszabb a helyzet. A mikrokontrollerekben általában 4 bájtos lebegőpontos számokat használnak. Ezek mantisszája elég korlátozott felbontást tesz csak lehetővé. Ebből adódóan, a két egymáshoz képest nagyságrendekkel különböző számmal végzett lebegőpontos műveletek hibája kifejezetten nagy (ahogy írtad, szélsőséges esetben nem is változik már az eredeti szám). Ezek a hibák ráadásul össze is adódnak, így sorozatos műveleteket végezni egyáltalán nem tanácsos lebegőpontos számokkal.
A hibákon kívül komoly probléma még a hardveres gyorsítás hiányából adódó nagy CPU igénye az ilyen műveleteknek (flasht is eszik rendesen a szükséges könyvtár). Ha lehetőség van rá, érdemesebb inkább integer műveletekre átalakítani a lebegőpontos számításokat, így a hibák mértéke és a CPU igény is erősen leszorítható. pl.: x = 10,051 * 2,63; => x = 10051 * 2630 / 1000; majd kiíratáskor a végeredmény x / 1000, ",", x % 1000 (%03d formában!). Ez a megoldás sokkal gyorsabb és kisebb kódot eredményez. A hiba pedig tetszés szerint megválasztható (sokszoros összeadásnál a túlcsordulás esetén növelhető egy másik számláló is).
Ha programlefagyás ellen is akarod védeni, akkor inkább megfelelően megválasztott ellenállás, kondi (sorosan!) és dióda kombinációval hajtod meg a linkelt képhez hasonlóan. Az alkatrészek értékei természetesen a kívánt bekapcsolási időtől függenek. Megj. Nálad gondolom nagyon rövid idők lesznek ezért a kondi kapacitása is kicsi lesz, nagyobb kondik esetén természetesen kellhet külön ellenállás a digitre, hogy védje az uC-t a túláramtól, amit a kinyitó dióda okoz.
A hozzászólás módosítva: Jan 3, 2017
Amikor a kondi a diódán keresztül kisül az uC felé, nem terheli meg nagyon az i/o portot minden korlátozás nélkül? Pl. az R-t kétfelé szedve az egyik felét a csomópont és a kondi közé rakva nem lenne biztonságosabb?
A hozzászólás módosítva: Jan 3, 2017
Jó lenne hardveresen is védeni, de sajnos ilyet még nem láttam így nem tudom hogyan is kéne használni. Mindek oda az a schottky? Hogy válasszam meg az értékeket? PWM 32Khz-en megy, 4 cső van multiplexálva. Eddig úgy gondoltam elég lesz egy watchdog timer. Mellékeltem a képet hogy eddig hogyan néz ki. Egyébként az optokapus trükköt Atosz90cikkjéből loptam, ő lehúzó ellenállásokat sem használt, bár nem tudom hogy van a PIC beállítva.
A hozzászólás módosítva: Jan 3, 2017
Mert csak akkor folyhat a kondenzátoron áram, amikor feltöltődik, vagy amikor kisül. Ez a védelem lényege, mert ha lefagy az AVR és magasban marad a kimenet, akkor is biztosan megszűnik az áram ami az optót hajtja. A dióda nélkül csak töltődni tudna a kondi, mert az optón csak egy irányban folyhat áram. A diódával, ha az AVR kimenete 0, akkor ki tud sülni, mert akkor a dióda felőli kivezetése negatív feszültségre kerül és így kisülhet a föld felé. Ha az AVR-en 5V-van, akkor a kondenzátor feltöltődhet kb. 4 V-ra, így az AVR felőli oldalon 5V lesz rajta, a másikon 1V. Amikor az AVR 0V-ot ad, akkor a kondi másik lábán ehhez képest lesz 4V-al kevesebb, így -4V. Ekkor a dióda kinyit és kisüti a kondit.
A hozzászólás módosítva: Jan 3, 2017
Szerintem ha szoftveresen alacsony szintre kapcsolod a vezérlő kimeneteket, az bőven elég lesz.
Köszönöm a felvilágosítást, szerintem maradok a wdt-nél, lehúzó ellenállással. Ez az 1k - 10k feszültség osztó is jónak tűnik, 5V tápfeszre 4,55V jut a ledre, ami 1k-s előtéttel 4mA áramot jelent, aminek elégnek kéne lennie.
Köszönöm a segítségeteket.
Na szóval nem csak program lefagyás ellen véd, hanem "hülyeség" ellen is. Ha pl. vmiért nem írja a programod a kimenetet de maga a uC fut. Egész egyszerűen nem tud egy bizonyos időnél tovább bekapcsolva maradni a nixie és csak egy alkatrésszel több mint a másik feszosztós megoldás.
Méretezése nem különösebben bonyolult. Tudni kell az optohoz szükséges áramot. Felírjuk az egyenleteket. U = 5V (mikrokontroller tápfeszültsége) t = nixie bekapcsolva tartási ideje = 1ms (mondjuk) = 0,001 s Ut = U - Ufd (Ufd a D dióda nyitófeszültsége, katalógusadat) = 4,7V (körülbelül) Uc= Ut * exp(-t/R * C) I = (Uc - Ufo) / R (Ufo az optokapu LEDjének nyitófeszültsége) = (Uc - 1,3V) / R = min. 4mA Ezután becslünk egy R-t. R = 680 Ohm Ebből kijön: Uc = 4V; I = 4mA ha C = 10µF (az egyezés véletlen és az értékek kerekítettek) Mivel ez a C nem is olyan kicsi (mint gondoltam), ezért a diódával érdemes sorba tenni egy védőellenállást. A hozzászólás módosítva: Jan 3, 2017
A watchdog nem véd hülyeség ellen, csak ha fagy is a progi....
Köszönöm a részletes leírást, egyenlőre maradok a WDT-nél, jó helyre téve a clear hívásokat véd a hülyeség ellen is. (Olyan állapotokban ahol a cső fel van kapcsolva, nem szabad törölni a számlálóját, így ha olyan állapotban túl sok időt tölt a program akkor ugyanúgy fagyásnak nézi a WDT és resetel, ez egyébként az összes olyan állapotra igaz ahol potenciálisan beragadhat a program.)
Sziasztok!
Először fordult elő velem ilyen: Új mikrovezérlőt kezdtem használni(ATmega16 helyett ATmega328P) és elkövettem azt a hibát, hogy mielőtt átírtam a fuse biteknél az órajelét belső 1MHz-ről belső 8MHz-re, nem változtattam meg a mikrovezérlő típusát. Utólag vettem észre, hogy ATmega 16 maradt beírva. A signature read gombról is elfeledkeztem előtte. Onnantól kezdve állandóan hibát ír ki bármit is csinálok: Nem tud belépni a programozási módba. Szerintetek tönkretettem a mikrovezérlőt örökösen? Van esetleg még valami megoldás? A hozzászólás módosítva: Jan 5, 2017
Már többször előkerült itt a fórumon ez a téma. Keress rá a fusebit doctor-ra.
Ha mázlid van, akkor csak külső oszcillátorra van beállítva.
ATmega16 lfuse: 0xE4 = Atmega328P lfuse: 0xE4 Az elsőnél ez csak 8Mhz belső oszcillátor, a másiknál már alacsony fekis külső oszcillátor. Adj neki külső forrásból órajelet (1Mhz) és úgy próbáld meg az olvasást. Ha megy, akkor újra tudod írni a biteket. Ha nincs mázlid, akkor az SPI és/vagy a Reset biteket is kiütötted. Ekkor jön csatti2 javaslata a: FuseBit Doctor.
Üdv!
Attiny2313-at külső 4Mhz rezonátorról szeretném járatni, de a fusebitek beállításánál nem látni, hogy melyik beállításkor mi lesz a frekvencia! Köszönöm!
Uj tag vagyok,most kapcslódom a fórumhoz.
És mindjárt egy kéréssel: STK500-as prograzóm van, és nem tudom életre kellteni, hogy az AVRStudió 4 felismerje. Biztosan kell valamilyen driver, de amivel próbálkoztam, avval nem sikerült. Segítséget szeretnék kérni a hozzáértőkhöz. Én kezdő vagyok az AVR-ek világában. Előre is köszönöm
Szia! Nem tudom pontosan milyen programozód van, de az STK500 alapvetően soros porton kommunikál. Ha nem a PC soros portjára kötöd, hanem USB-vel kötöd össze, akkor a soros-USB konverter IC-nek szüksége lesz driverre. Ha USB-n csatlakozol, akkor az eszközkezelőben azt is nézd meg, hogy melyik virtuális soros portot társította hozzá a gép és azt válaszd ki a Studio-ban. Szükség esetén írd át egy alacsonyabb számra (nálam pl. COM3) az eszközkezelőben.
Nekem más ötletem nincs, de az is fontos lehet másoknak a segítséghez, ha megírod milyen op.rendszert használsz és pontosan milyen programozód van (link). |
Bejelentkezés
Hirdetés |