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
Hali
Hasznalj PIC18Fxx80-t. Van valasztek es olcso. Bocs, de nem tudtam kihagyni. Udv Vili
Hello!
Amit leírtál, az jó de amikor ráraktam az avr-re, akkor nem egyből aludt el a led, gondolom mert alaphelyzetben nem a 0 kerül rá a lábra. Arra szeretnélek megkérni, hogy ha van időd, akkor valami kis "firkát" csatolnál arról, hogy hogyan is kössem be a kapcsolót, meg a fel-le húzó ellenállások sem teljesen tiszták. Természetesen ettől függetlenül én is olvasgatok. És mielőtt hülyének néznél, szeretném megjegyezni, hogy az avr nekem már nem annyira új (pl.:megcsináltam a boci-boci tarkát...), de eddig csak kimenetként használtam az avr lábait. Előre is köszönöm: echo11
Helló!
Igen a port irány beállítás után alacsony szintre lehetett volna állítani a lábat és akkor induláskor nem világított volna. Mellékelek egy képet a felhúzó és lehúzó ellenállás és kapcsoló bekötéséről. Az első rész a felhúzó, másik a lehúzó ellenállást mutatja. Itt annyi a lényeg, hogy amikor a nyomógombot nem nyomod, akkor a bemenet fix szintet kapjon, mert ha nincs ott az ellenállás, akkor a bemenet úgymond lebeg, nincs fix szinten. Viszont az avr-ekben minden lábon van belső bekapcsolható felhúzó ellenállás, így neked csak a kapcsolót kell bekötni a vezérlő lába és test közé. Így a kapcsoló nyitott állapotában a bemenet magas szinten van, megnyomáskor alacsony szintre vált.
Amit az első hozzászólásodban írtál azt linknek szántad?
Mert ha igen, akkor valami oknál fogva nem sikerült linkberakni.
Sziasztok! Kezdő vagyok még AVR-ben, impulzusszámlálót szeretnék megprogramozni C nyelven (Atmega8), a bemenetre 50...250Hz-es impulzusok jutnak, és ezt egy regiszterben folyamatosan eltárolni egy arányos számként. (A szám alapján sorra kezdenek világítani LED-ek, mint egy kivezérléslejző.)
Két elméleti megoldást látok: -az impulzus megszakítást generál, elindul egy számláló, a köv. imp. megállítja -pörög egy számláló, és az impulzus kiveszi az értékét, a köv. imp. is, majd kivonjuk egymásból a két számot Hogy szokták AVRben ezt a kis frekvenciás impulzusszámlálást megoldani? Példaprogramért, segítségért hálás lennék, köszönöm!
Nem, nem linknek szántam, csak próbáltam kiemelni azt, hogy ezen az oldalon egy csomó dolog van, csak jó helyen kell keresni. De most megkönnyítem a dolgodat: mert rákerestem és itt meg is találtam...
Nem tudom, hogy jól értem-e a feladatot, de ha az a cél, hogy leszámlálod a bejövő impulzusokat, akkor az interrupttal már nem kell számlálót indítani. Egy változót inkrementálsz (pl. igy: n++, s a változó értéke szerint frissíted a kijelzést.
Lehet, hogy rosszul fogalmaztam tulajdonképpen egy tengely fordulatszámát szeretném monitorozni. Minden fordulat egy impulzus, és a LED-ek pl. 1000 imp./perc osztásúak.
Kell egy óra, ami az időt méri (lehet periodikus interruptot kelteni egy timerrel). A timer periodikus megszakításait szoftveresen számláljuk (nt).
Ha a fordulatjelző impulzusok is megszakítást okoznak, azokat is számláljuk (nf). Bizonyos időközönként (célszerűen minden valahányadik periodikus órainterrupt bekövetkeztekor) frissíteni kell a kijelzést. A percenkénti fordulatszám: f = k * nf/nt ahol k az egy perc alatt bekövetkező timer megszakítások száma. Megjegyzés: Természetesen a számlálókat időnként törölni (vagy legalábbis csökkenteni) kell. Érdemes ez úgy megoldani, hogy ne mindig nulláról kezdjük, hanem valami gördülő átlagolást valósítson meg a program.
sziasztok! Az lenne a kérdésem, hogy miért nem működik a timerem pwm csatornájának A fele, a B tökéletesen működik!
$regfile = "ATtiny2313.dat" $crystal = 3276800 $baud = 9600 ' use baud rate $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 Config Portd = Output Config Portb = Output Config Pinb.3 = Output Config Pinb.4 = Output Config Pinb.0 = Output '**********************TIMER 1 BEALLITASA 16 BIT --> mode 14 - fast pwm - 1 prescale ********************************** Tccr1a = 10100010 '8bit Com1a1 7bit Com1a0 6bit Com1b1 5bit Com1b0 4bit - 3bit - 2bit Wgm11 1bit Wgm10 Tccr1b = 00011001 '8bit icnc1 7bit ices1 6bit - 5bit wgm13 4bit wgm12 3bit cs12 2bit cs11 1bit cs10 Tcnt1h = 00000000 'egyéb beállitások Tcnt1l = 00000000 'egyéb beállítások Tccr1c = 00000000 'egyéb beállítások Icr1h = &HFF 'pwm top beállítása felsö 8 bit Icr1l = $hff 'pwm top beállítása also 8 bit Do Pinb.0 = 1 Ocr1ah = &HCC Ocr1al = &H0C Ocr1bh = &H0F Ocr1bl = &HFF Loop End
Rájöttem a megoldásra!
Köszönöm mukievil!
Köszönöm a segítséget IMi és gtk!
Sikerült végre az ATMega8-ason a TWI-t (I2C) működére bírni. Üdv. Gábor
Üdv!
A következő problémát szeretném megoldani, és mivel kezdő vagyok csak külső segítségre számíthatok: Adott egy ATtiny45-ös AVR és egy RC szervó motor amit n számú fix állás között szeretnék léptetni, úgy, hogy két nyomógombot használok, az egyik felfelé a másik lefelé léptetné... Ha megnyomom a felfelé gombot, akkor a szervó a következő állásba ugrik, ha a másik gombot akkor az előzőbe. Továbbá azt is szeretném megoldani, hogy egy adott állás tovább "finomítható" lenne további két nyomógombbal. Valahogy úgy képzeltem el, hogy a program elején definiálnék n számú, adott időtartamú impulzus (ha jól tudom szervóknál ez 1-2 ms) és amikor megnyomom a "felfelé" gombot akkor a következő előre definiált impulzusértéket adja ki a vezérlő. a finombeállítást pedig úgy gondoltam, hogy az előre definiált impulzusértéket állítgatom egészen kicsi lépésközökkel, egy le-fel gombbal. Na ezt szeretném valahogy használható programba foglalni csak az a kérdésem, hogy hogyan? Hogyan induljak el? Teljesen kezdő vagyok..:S
Mivel már korábban is próbáltam feltenni a fentebb felmerült kérdésemet de sem erre sem a mostanira nem érkezett válasz, gondoltam megpróbálom szeletekből felépíteni a programomat.
Szóval, először is szeretnék egy olyan programot, amely egyszerűen generál egy olyan jelet, amely 1 és 2 ms közötti impulzust ad ki (annyit amennyit majd a programban beírok) hogy egy adott pozícióba állítson egy RC szervómotort. Az AVR egy ATtiny45-ös lenne. Később majd persze tovább fogom építgetni a programot ez most csak azért kell nekem ilyen egyszerűen, mert teljesen kezdő vagyok, és látni szeretném, hogyan épül fel egy ilyen egyszerű program... Kérem aki tud, segítsen nekem! Köszönöm!
Szia!
Ajánlom Topi Nyolc lábbal című cikk sorozatát! A második részben találsz is egy rc szervóval foglakozó részt (Bővebben: Link), persze az cikkeket azért olvasgasd át, sokat segít.
Ahogy neztem, az ATtiny45-nek csak 8 bites Timer-en alapulo PWM kimenete van. Ezt hasznalva csak kis felbontasu szervo kontrollert tudsz kesziteni (kb 15-18 lehetseges pozicio).
Szervo alapok: Bővebben: Link Timer es PWM alapok: Bővebben: Link Szervovezerles ATmega8-on Timer2-vel: Bővebben: Link
Sziasztok
Olyan problémára keresek megoldást, hogy van egy 50kHz-es jelem amit figyelnék egy avr-el és ha meg szünik a jel akkor az egy kimentet emljen magasra. Erre mit használjak, megszakítást (int)?
Én úgy csinálnám meg a dolgot, hogy egy Timert kb 20-25kHz-re állítanék, ebben benne van min 1 külső 50kHz-es megszakítás, a megszakításban törölném a Timer számlálóját, így nem tud túlcsordulni. Azonban ha nem érkezik az 50kHz az INT-re akkor a Timer túlcsordul, és a függvényében magasra váltod a kimenetet. Hogy visszaálljon a kimenet alacsony szintre, ha visszatér a jel, akkor a külső megszakítás függvénybe, ahol a Timert törlöd, ott állítsd alacsony szintre.
Ez csak egy ötlet, ha valakinek van más énis szívesen meghallgatom.
Szia!
Én is hasonlóképpen oldanám meg, csak a külső INT megszakítás helyett a Timer1 ICP megszakítását használnám e célra (már ha van ilyen funkciója a vezérlőnek). A timer1-hez két megszakítás rutint rendelnék, az "Capture" rutinban törölném a timert, a "Compare" rutinban pedig figyelném, hogy van-e jel. Az elv teljesen megegyezik, csak így meg lehet spórolni egy INT-et.
Sziasztok!
ATtiny2313-mal kellene kapcsolgatnom egy egytekercses bistabil relét, pontosan ezt: Bővebben: Link A tekercse kb 75 ohmos -> 5 volton 66mA-t vesz fel. Olyat szerintetek szabad csinálni, hogy 3-3 AVR portot párhuzamosan használva közvetlenül adok rá megfelelő irányú feszültséget? Először H-hídra gondoltam, de jó lenne ezt minél kisebb helyen megoldani. Köszi!
Így gondoltam, ahogy a mellékelt képen van.
(Egyes?mind?) AVR-ek 40mA-t bírnak leadni lábanként.
Én csináltam már olyant, hogy két láb közé tettem be a relét, és kikisérleteztem a minimális időt, ahol még stabilan átkattan a relé, ez valami 40-50ms volt. másodpercenként átkattintottam a relét tesztelésként. Ez kb 4-5 óráig ment, aztán leállítottam. Nem lett baja az AVR-nek sem. Az a relé is valami 55mA-t vett fel. De ezt kizárólag saját felelősségedre
A védődiódát ne felejtsd ki!
Be ne rakd a védődiódát, mert akkor leégeted az AVR-t az fix
Ide maximum egy supresszor lehetséges.
Kifejtenéd bővebben hogy miért ne?
Az hogy az avr kap vissza egy 15x nagyobb feszt nem nyírja ki? Idézek egy relé katalógusból: Amikor egy ohmos terhelést kapcsolunk, az áram azonnal követi a feszültséget.(1. ábra). Ha relétekercset kapcsolunk, a tipikus feszültségáram jelleggörbe, amely eltérő az ohmos terheléstől, a 2. ábrán látható. Amikor a relétekercset feszültség alá helyezzük (gerjesztjük), először a mágneses mezőnek fel kell épülnie (a 2.ábrán a relétekercset az L induktivitással és az R ellenállással képeztük le). Az ellenmágnesező hatás következtében az áram késve követi a feszültséget. Amikor kikapcsoljuk a feszültséget, az áram folyása megszakad és a mágneses mező összeomlik. Ez feszültséget indukál, ami ellenirányban hat a hálózati feszültséggel szemben. A kikapcsolási feszültség csúcsok körülbelül 15-ször magasabb értéket érhetnek el, mint a tápfeszültség. Ezek a csúcsok csatolás révén megzavarhatják, de akár tönkre is tehetik az elektronikus készülékeket. Ahhoz, hogy ellensúlyozzuk ezt a hatást, a relé tekerccsel diódát, varisztort vagy RC védőmodult kell párhuzamosan kapcsolni a működtető feszültségtől függően (az egyes modulok működési jellemzőit lásd a funkcionális leírásnál). Bővebben: Link Mondjuk azt sem értem hogy egy tranzisztor meg egy ellenállás akkora helyet foglal?
Ez egy bistabil relé, amire ha egyik irányba bekötnénk a diódát, akkor egyik irányban védene, viszont ha átkapcsolnánk(fordított polaritás) akkor a diódán keresztül zárlatba menne az avr két kimenete. Szóval ide sima dióda nem köthető be!
Na igen, azon átsiklottam hogy bistabil relé...
Köszi szépen, akkor így fogom csinálni. Szerintem összekötök 3-3 portot, úgyis van belőle bőven. Védődióda helyett meg arra gondoltam, hogy szembefordítok egymással két 5,1V-os zenert, ami így mindkét áramirány esetén olyan 5,7V körül megfogja a feszültséget. Vagy van esetleg valakinek okosabb ötlete?
Sziasztok!
Lenne egy kérdésem. Hogyan lehet HID módban programozni AVR Studió4-gyel? Előre is köszi! |
Bejelentkezés
Hirdetés |