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   592 / 840
(#) kapu48 válasza Vfr72 hozzászólására (») Márc 1, 2014 /
 
É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.
(#) zombee válasza Vfr72 hozzászólására (») Márc 2, 2014 /
 
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!
(#) drogba7 hozzászólása Márc 2, 2014 /
 
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?
(#) eyess válasza drogba7 hozzászólására (») Márc 2, 2014 /
 
Nem kell kidobni egy magasabb szintű programozóval helyre lehet hozni , vagy Fuse bit Doctorral.
(#) szucsip hozzászólása Márc 2, 2014 /
 
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!
(#) Massawa válasza szucsip hozzászólására (») Márc 2, 2014 / 1
 
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
(#) kapu48 válasza szucsip hozzászólására (») Márc 2, 2014 / 1
 
(#) Peugeot67 hozzászólása Márc 3, 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!!
(#) vzoole válasza Peugeot67 hozzászólására (») Márc 3, 2014 /
 
(#) esemve válasza esemve hozzászólására (») Márc 3, 2014 / 1
 
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...
(#) szucsip válasza Massawa hozzászólására (») Márc 3, 2014 /
 
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
(#) Massawa válasza szucsip hozzászólására (») Márc 3, 2014 /
 
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.
(#) Massawa válasza Massawa hozzászólására (») Márc 3, 2014 /
 
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)
(#) szucsip válasza Massawa hozzászólására (») Márc 3, 2014 /
 
Hmm köszönöm, azt majd megpróbálom megkeresni.
(#) kapu48 válasza szucsip hozzászólására (») Márc 3, 2014 /
 
ATmega128 adatlap

16-bit Timer/Counter>

Setup and Use the AVR® Timers
A hozzászólás módosítva: Márc 3, 2014
(#) szucsip válasza kapu48 hozzászólására (») Márc 4, 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 )
(#) kapu48 válasza szucsip hozzászólására (») Márc 4, 2014 /
 
A nevezet Biteket 1-be állítja, majd betölti R16 Regiszterbe.
Es ki küldi R16 értékét > Tccr1 regiszterbe.
  1. ldi r16,(1<<CS02)|(1<<CS00)
  2. out TCCR0,r16 ; Timer clock = system clock/1024

Table 1. Overview of the Clock Settings
A hozzászólás módosítva: Márc 4, 2014
(#) killbill válasza szucsip hozzászólására (») Márc 4, 2014 /
 
A << operator a bal oldalan allo szamot balra shifteli a jobb oldalon allo ertekkel. Azaz az
  1. 1 << 5
azt jelenti, hogy az 1-et balra shifteled 5-szor. Ez gyakorlatilag az otodik bit egybe allitasat jelenti. Mert vagy ugy deklaralod egy regiszter bitjet, hogy
  1. #define VALAMI 0x40

vagy azt mondod, hogy inkabb a bitpoziciot deklaralod, hogy
  1. #define VALAMI 6
de akkor az
  1. (1 << VALAMI)
lesz 0x40.

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
(#) Peugeot67 válasza vzoole hozzászólására (») Márc 4, 2014 /
 
Köszi a választ, de ez nem a WINAVR-hez van?
(#) poznamokus hozzászólása Márc 4, 2014 /
 
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
(#) TavIR-AVR válasza poznamokus hozzászólására (») Márc 5, 2014 /
 
Nem nagyon.
Nehezen sikerült vennem 6, 8, 10 csatlakozósat. Nem olcsó
(#) Vacok válasza kapu48 hozzászólására (») Márc 5, 2014 / 1
 
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
(#) csabeszq válasza Vacok hozzászólására (») Márc 6, 2014 /
 
Hát, ezek szerint csak én vagyok ilyen lusti, mármint a CKDIV8 pipát illetően.

  1. CLKPR = (1<<CLKPCE);
  2. CLKPR = 0;


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
(#) zombee válasza csabeszq hozzászólására (») 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.
(#) pluto válasza zombee hozzászólására (») Márc 6, 2014 /
 
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 ...
(#) Massawa hozzászólása Márc 6, 2014 /
 
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
(#) vzoole válasza Massawa hozzászólására (») Márc 6, 2014 /
 
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.
(#) Massawa válasza vzoole hozzászólására (») Márc 6, 2014 /
 
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. )
(#) olivér0327 hozzászólása Márc 9, 2014 /
 
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.
(#) zombee válasza olivér0327 hozzászólására (») Márc 10, 2014 /
 
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.
Következő: »»   592 / 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