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   262 / 840
(#) vilmosd válasza ambruzsg hozzászólására (») Aug 29, 2010 /
 
Hali
Hasznalj PIC18Fxx80-t. Van valasztek es olcso. Bocs, de nem tudtam kihagyni.
Udv Vili
(#) echo11 válasza Ricsi89 hozzászólására (») Aug 30, 2010 /
 
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
(#) Ricsi89 válasza echo11 hozzászólására (») Aug 30, 2010 /
 
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.
(#) Robi98 válasza echo11 hozzászólására (») Aug 30, 2010 /
 
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.
(#) TyeDa hozzászólása Aug 30, 2010 /
 
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!
(#) echo11 válasza Robi98 hozzászólására (») Aug 31, 2010 /
 
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...
(#) icserny válasza TyeDa hozzászólására (») Aug 31, 2010 /
 
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.
(#) TyeDa válasza icserny hozzászólására (») Aug 31, 2010 /
 
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.
(#) Robi98 válasza echo11 hozzászólására (») Aug 31, 2010 /
 
Köszi!
(#) icserny válasza TyeDa hozzászólására (») Aug 31, 2010 /
 
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.
(#) mukievil hozzászólása Szept 1, 2010 /
 
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
(#) mukievil válasza mukievil hozzászólására (») Szept 1, 2010 /
 
Rájöttem a megoldásra!

Köszönöm mukievil!
(#) Fizikus válasza IMi hozzászólására (») Szept 2, 2010 /
 
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
(#) FerrGhini hozzászólása Szept 2, 2010 /
 
Ü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
(#) FerrGhini hozzászólása Szept 2, 2010 /
 
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!
(#) IMi válasza FerrGhini hozzászólására (») Szept 2, 2010 /
 
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.
(#) Fizikus válasza FerrGhini hozzászólására (») Szept 3, 2010 /
 
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
(#) zsozsoX hozzászólása Szept 3, 2010 /
 
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)?
(#) zsuscsinyo válasza zsozsoX hozzászólására (») Szept 3, 2010 /
 
É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.
(#) tibi0531 válasza zsuscsinyo hozzászólására (») Szept 4, 2010 /
 
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.
(#) dawe hozzászólása Szept 4, 2010 /
 
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!
(#) dawe válasza dawe hozzászólására (») Szept 4, 2010 /
 
Így gondoltam, ahogy a mellékelt képen van.

rele.gif
    
(#) Sir-Nyeteg válasza dawe hozzászólására (») Szept 4, 2010 /
 
(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
(#) luxmanpower válasza dawe hozzászólására (») Szept 4, 2010 /
 
A védődiódát ne felejtsd ki!
(#) Sir-Nyeteg válasza luxmanpower hozzászólására (») Szept 4, 2010 /
 
Be ne rakd a védődiódát, mert akkor leégeted az AVR-t az fix
Ide maximum egy supresszor lehetséges.
(#) luxmanpower válasza Sir-Nyeteg hozzászólására (») Szept 4, 2010 /
 
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?
(#) Ricsi89 válasza luxmanpower hozzászólására (») Szept 4, 2010 /
 
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!
(#) luxmanpower válasza Ricsi89 hozzászólására (») Szept 4, 2010 /
 
Na igen, azon átsiklottam hogy bistabil relé...
(#) dawe válasza luxmanpower hozzászólására (») Szept 5, 2010 /
 
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?
(#) Robi98 hozzászólása Szept 5, 2010 /
 
Sziasztok!
Lenne egy kérdésem.
Hogyan lehet HID módban programozni AVR Studió4-gyel?
Előre is köszi!
Következő: »»   262 / 840
Bejelentkezés

Belépés

Hirdetés
XDT.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