Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
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
Lapozás: OK   756 / 837
(#) Max26 hozzászólása Dec 25, 2016 /
 
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?
(#) zombee válasza Max26 hozzászólására (») Dec 25, 2016 /
 
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...
(#) vorosvar hozzászólása Dec 30, 2016 /
 
Ü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!
(#) kiborg hozzászólása Jan 2, 2017 /
 
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
(#) Kovidivi válasza kiborg hozzászólására (») 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.
(#) rascal válasza kiborg hozzászólására (») Jan 2, 2017 / 1
 
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ó.
(#) kiborg válasza rascal hozzászólására (») Jan 3, 2017 /
 
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
(#) rascal válasza kiborg hozzászólására (») Jan 3, 2017 /
 
Nincs mit! Köszi, de nem egyedüli az érdem.
(#) Kovidivi válasza kiborg hozzászólására (») Jan 3, 2017 /
 
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.
(#) helltp hozzászólása Jan 3, 2017 /
 
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.
(#) rascal válasza helltp hozzászólására (») Jan 3, 2017 /
 
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.
(#) helltp válasza rascal hozzászólására (») Jan 3, 2017 /
 
Köszönöm a gyors és pontos választ! Akkor inkább felrakom őket a nyákra, biztos ami biztos.
(#) csatti2 válasza Kovidivi hozzászólására (») Jan 3, 2017 /
 
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).
(#) csatti2 válasza helltp hozzászólására (») Jan 3, 2017 / 1
 
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
(#) rascal válasza csatti2 hozzászólására (») 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
(#) helltp válasza csatti2 hozzászólására (») 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

opto.jpg
    
(#) rascal válasza helltp hozzászólására (») 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
(#) morgo válasza helltp hozzászólására (») Jan 3, 2017 /
 
Szerintem ha szoftveresen alacsony szintre kapcsolod a vezérlő kimeneteket, az bőven elég lesz.
(#) helltp válasza rascal hozzászólására (») Jan 3, 2017 /
 
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.
(#) rascal válasza helltp hozzászólására (») Jan 3, 2017 /
 
Szívesen!
(#) csatti2 válasza helltp hozzászólására (») Jan 3, 2017 /
 
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
(#) zombee válasza csatti2 hozzászólására (») Jan 3, 2017 /
 
A lusták erre watchdogot használnak.
(#) csatti2 válasza zombee hozzászólására (») Jan 3, 2017 /
 
A watchdog nem véd hülyeség ellen, csak ha fagy is a progi....
(#) helltp válasza csatti2 hozzászólására (») Jan 4, 2017 /
 
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.)
(#) Robi98 hozzászólása Jan 5, 2017 /
 
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
(#) csatti2 válasza Robi98 hozzászólására (») 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.
(#) Sick-Bastard válasza Robi98 hozzászólására (») Jan 6, 2017 /
 
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.
(#) gerry hozzászólása Jan 6, 2017 /
 
Ü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!
(#) uedit hozzászólása Jan 6, 2017 /
 
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
(#) Ivan93 válasza uedit hozzászólására (») Jan 6, 2017 /
 
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).
Következő: »»   756 / 837
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem