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
Én 1 utasításra makrót írnák, nem szubrutint!
Gyorsabb és kevesebb helyet foglal. Különben is Megszakításból nem hívunk szubrutint, túl hosszú. Megszakításban nem dolgozunk fel adatokat, az a főprogramba való. A letiltót megszakítás közben jövő karakterekkel mi történik? Mikor újra engedélyezed a megszakítást, már van a pufferben adat, ami rögtön generál neked 1 megszakítást.
Az elég baj, ha a CLI hatástalan. Ha a megszakításrutin hívja meg a CLI-t akkor felejtős a dolog,
mert egyrészt a megszakítások alatt ALAPBÓL tiltva vannak, és amikor véget ér, engedélyezi őket. Miért is kell külön függvény, mikor csak simán beszúrhatod ezt a sort: "cli();" ? Ha a megszakításrutin alatt akarsz tiltani(senki nem mondta hogy nem lehet), az USART megszakítását tiltsd, ez egy nagyon elegáns megoldás. Én is ezt használom amikor a ringbufferek valamelyike betelik, csak a hozzá tartozó megszakítást tiltom le!
Sziasztok! FUSE biteket állítottam AVR-ben és most már nem engedi magát felprogramozni ISP programozóval. AVRdude-al állítottam a fuse biteket és véletlenül rossz értékeket írtam be és felprogramoztam. Ezzel dobhatom a kukába az AVR-em vagy van rá megoldás?
Nem kell kidobni egy magasabb szintű programozóval helyre lehet hozni , vagy Fuse bit Doctorral.
Sziasztok!
Van T-bird 2 panelem, meg kijelző modul is van hozzá (kiizzadtam a rávalót, mivel a Kandón ezt tanultuk prog2-n és úgy vagyok vele hogy szeptemberben majd eladom). A problémám az,hogy egyáltalán nem értek az időzítők használatához. Konkrétan a timer1 használata és "lelki világa" érdekelne, mivel azzal meg lehet valósítani a 16bites számlálót. Amit gyakorlásképp meg szeretnék csinálni: egy függvény figyelné az egyik gombot (PORTG.1), és ha az magas szintre vált (1) akkor kiolvasni Timer1 értékét (és egy másik változóba eltenni az értéket), majd Time1 -et resetelni. Azt hiszem, hogy 64-es előosztás jó is lenne. Magyarán egy periódusidő mérést szeretnék megvalósítani. Hogyan lehet nekikezdeni? Timer1 -en belül ki kinek a kicsodája, hol milyen értékek vannak eltárolva? Honnan lehet és honnan nem lehet kiolvasni a számláló aktuális értékét? Ami még fontos: csak a C programozáshoz értek (az összevont operátorokkal pedig hadi lábon állok) , és egy nagyon kicsit az AVR Assembly -hez. AVR Studio 4 van jelenleg a számítógépemen. Bármilyen kis magyarázatér hálás köszönet!
Ha tudsz idegen nyelven Itt megtalász mindent lépésröl lépésre és minden idevágo magyarázattal. Az AvR leirását megtalálod magyarul is. A többit magadnak kell kiötlened. Az elsö linken van egy sereg müködö példa is, amiket bövithetsz vagy változtathatsz.
A hozzászólás módosítva: Márc 2, 2014
Sziasztok!
Új vagyok itt, ezért szeretnék röviden bemutatkozni: Keresztnevem Zsolt, 47 éves, elektronikai végzettséggel amit hosszabb-rövidebb ideig gyakorolgattam is, de az elmúlt 25 évben többnyire programozásból éltem (PC-DELPHI). Elhatároztam (mert érdekel), hogy megtanulok MCU-t programozni, választásom az ATMEL-re esett. Mivel az egyetlen ingyenes (tudtommal) eszköz az Atmel Studio, most ezzel küzdök C-ben. De C-ben nem nagyon vagyok gyakorlott, így aztán bőven akadnak gondjaim. Most éppen az "sprintf" függvénnyel ami egy double típusból nem hajlandó csak egy kérdőjelet előállítani, mint stringet. Mit csinálok rosszul? Segítség!! ![]()
Ha valaki később rátalálna erre a fórumra: végülis kipróbáltam, gond nélkül. Persze nem is tudom miért aggódtam emiatt...
Köszönöm, de sajnos ettől szájbarágósabbra lenne szükségem. Legjobb lenne szétválasztva, tehát egy oldal elmondja hogy melyik változó (vagy regiszter, amit ott az AVR studioba meg tudok nézni) micsoda, másik oldal meg foglalkozik a használatukkal.
Kapu48: köszönöm neked is, de németül még annyit sem tudok, mint angolul. Pozitívum,hogy C-vel foglalkozik
Ettöl szájbarágosabbrol nem tudok ( én is ilyen helyzetben voltam mint te, megépitettem 2113-mal majdnem minden kapcsolást, csak ugy, hogy tanuljak.) ha további anyag kell, akkor töltsd le a chapter 6. avr advanced assembly language programming, ott megvan minden ami az elöbbi anyagbol hianyzik.
Meg van egy sokrészes video is ( c nyelven) a youtube-n ( azt hiszem vagy 2 tucat film van fent és tényleg lepéseröl lépésre mondja el a programozást angolul- de nagyon egyszerü formában ( gyerekeknek lett szánva)
Hmm köszönöm, azt majd megpróbálom megkeresni.
ATmega128 adatlap
16-bit Timer/Counter> Setup and Use the AVR® Timers A hozzászólás módosítva: Márc 3, 2014
Köszönöm, a "Setup and Use AVR Timers" doksit már megtaláltam, de nem volt 100%-ig emészthető. Van néhány utasítás, amit nem tűnik konvencionálisnak. ("ser", "com").
Ez a jelölés amúgy mit jelent: "ldi r16,(1<<CS02)|(1<<CS00)" ? Megszorozza 2-vel CS02 értékét és CS00 értékét is, majd a kettő (bitenkénti) vagy kapcsolatát tölti r16-ba? (Ezek azok az un. összevont jelölések, amiket már nehezebben fogok fel )
A nevezet Biteket 1-be állítja, majd betölti R16 Regiszterbe.
Es ki küldi R16 értékét > Tccr1 regiszterbe.
Table 1. Overview of the Clock Settings A hozzászólás módosítva: Márc 4, 2014
A << operator a bal oldalan allo szamot balra shifteli a jobb oldalon allo ertekkel. Azaz az
vagy azt mondod, hogy inkabb a bitpoziciot deklaralod, hogy
De barmit shiftelhetsz barmivel, nem csak 1-et. A | meg igen, bitenkenti vagy kapcsolat. Ezek alapvetoen C nyelvi operatorok, de mara majdnem minden magasabb szintu nyelvben megtalalhatoak, es sok esetben meg az assemblerek is megertik, vagy egyszeruen a C elofeldolgozon atnyomjak a forrasszoveget mielott az assebler nekiall forditani. A hozzászólás módosítva: Márc 4, 2014
Köszi a választ, de ez nem a WINAVR-hez van?
Sziasztok! Lehet rossz helyre jön a kérdés, de nem tudom melyik topicba kéne, és hát alapvetően AVR-hez (meg ARM-hez) kellene: lehet itthon kapni pc/104 vagy ahhoz hasonló foglalatot ("hosszú lábú hüvelysor")? Arra kellene, hogy egymásra (ba) toronyszerűen lehessen nyákokat dugni, ugyanazon buszon keresztül (bme mitmóthoz hasonlóan). Farnellen csak 1000 huf felett láttam darabját. Angolul elevated socket névre hallgat, Harvin, samtec vagy gct gyártmányokat lehet farnellen rendelni. Még ebayen is ritka
![]()
Nem nagyon.
Nehezen sikerült vennem 6, 8, 10 csatlakozósat. Nem olcsó ![]()
Szia!
Sikerült életre keltenem, 0ms késleltetés, a pipát pedig kivettem a "CKDIV8" elől. Köszi a segítséget. ![]() A hozzászólás módosítva: Márc 5, 2014
Hát, ezek szerint csak én vagyok ilyen lusti, mármint a CKDIV8 pipát illetően.
Ezzel a kóddal szoftverből kiütöd a CKDIV8-at, felpörög a mikrokontroller 8MHz-re. Valamelyik projektemben azzal szórakoztam, hogy gombnyomásra pörgettem fel és le az órajelet. Ki van ez találva, még ütemezőt is lehet rá írni, hogy az órajelet a terhelés függvényében változtatod. ![]() A hozzászólás módosítva: Márc 6, 2014
Videót renderelni tuti nem fog, melegedni vagy jóval többet fogyasztani sem "terhelés alatt".
A SLEEP módot szokás választani, ha éppen "nincs semmi". Távirányítóban láttam ilyet: az AVR folyamatosan kapja a tápot, de gombnyomásig nem vesz fel még 1 uA-t sem.
Távirányító másik értelmezésben (nagyon elmés) a Telcoma ipari kapuknál. Az AVR nem kap áramot. Megnyomod a megfelelő gombot, Vcc bekapcsol, felfut a program, gyújtja a visszajelző LED-t, lekérdezi melyik gomb az, majd küldi a megfelelő jelet. Tehát csak addig kap tápot, amíg nyomod a gombot. Egy apró késleltetés érzékelhető - ha nézed a LED-t - de nem zavaró. Egy csomó embernek fel sem tűnik.
Tudom, hogy nem ez volt a kérdés, de legalább ötletadónak ...
Eltudná valaki egyszerüen magyarázni az interrupt funkciot. Van egy progim ( ami már részben müködik) ahol 10 ms-ként le kellene kézdezni a nyomogombokat. Kb tudom mit kell csinálni, csak nem tudom hogyan kellene beilleszteni a programba.
Az irq vektorok megvannak, a nyomogombok egy alprogramban vannak. Most a föprogrambol kérdezem le a nyomogombokat. Ezt kellene valahogyan interrupba rakni. Kösz
Bővebben: Link
Ez egy másodperces megszakítás, de ki tudsz belőle indulni. A megszakításban is lekérdezheted a gombokat, de még szebb lenne, ha ott csak egy Flag-et állítanál be, amit a main-ben figyelnél és ott kérdeznéd le a gombokat.
Kösz a C nyelvet nem nagyon értem ( a progim asm-ben van), de már kezd derengeni, hogy mit hova kell tenni.
Azaz az ISR ugrálna rendszeresen a gombos rutinra meg vissza, lekérdezi milyen gomb van lenyomva. Csak azt nem tudom most, hogyan kerül ez az informacio a fö programba, ahol szükség van rá. (Most onnan kérdezem le, azaz tudom mit kérdezek és mit kezdek a kapott infoval. Ezt a összefüggést nem értem az interrupt esetében. ![]()
Valaki tudna segíteni!
ATtiny2313-at véletlen Ext. Clock; Start-up time: 14 CK + 0 ms-ra állítottam. Hogyan tudnám visszaállítani, illetve külső órajelet szolgáltatni neki.
XTAL1 lábra rákötsz egy 1-4MHz-es TTL jelet, majd a lehető legkisebb ISP frekit használva
visszaállítod a FUSE biteket. |
Bejelentkezés
Hirdetés |