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   511 / 837
(#) csabeszq válasza zombee hozzászólására (») Jan 23, 2013 /
 
Én fényérzékeny ellenállással mértem.

2k ellenállással sorbakötöttem egy fényérzékeny ellenállást, a közepe ment az ADC-re.
(#) kurosaki válasza zombee hozzászólására (») Jan 23, 2013 /
 
Ha jol értem akkor a SIMA led amit vettem azt forditva kötöm be akkor érzékeli a fényt és áramot ad le? lehet Noob kérdés ADC az az AVR ben van benne ugye? (most köveznek meg sokan).

ATTINY45-20PU van ADC de Attiny 2313 ban meg nincs:/// pont az utobbival fejlesztek hurrá.
A hozzászólás módosítva: Jan 23, 2013
(#) zombee válasza kurosaki hozzászólására (») Jan 23, 2013 /
 
Fogj egy multimétert, kösd rá a LED-re(feszmérés), majd fordítsd jobbra-balra, fény/árnyék felé.
Amit látsz(vagy épp nem látsz) a multiméteren, mindenre választ ad ami a LED-et illeti.

AVR: pontosan, a t2313-ban nincs ADC, a t45-ben meg van. Elsőre szivacs, aláírom.
Szerezz be egy ATMega8-at, most nagyon olcsón dobálják(itt az aprón is árul valaki ~3-500Ft-ért).

Ha mindenképp t2313, a legegyszerűbb ha az analóg komparátort használod.
Statikus mód: a komparátor egyik bemenetét egy potival beállítod, a másikra megy a LED.
A komparátor kimenetén(ACSR regiszter ACO bit) azt látod, hogy a beállított értéknél
nagyobb/kisebb fény éri a LED-et.
Dinamikus mód: a komparátor egyik bemenetére kötsz egy kondit, a másik bemenetén ugyanúgy LED. Egy másik portlábbal felhúzod a kondis lábat, közben méred az időt, amíg a komparátor átbillen. Az eltelt időből kvázi-kiszámítható a LED feszültsége. Ezután kisütöd a lábat, és újrakezded.
A hozzászólás módosítva: Jan 23, 2013
(#) kurosaki válasza zombee hozzászólására (») Jan 23, 2013 /
 
egyszerűbb ha az T45 öm méri a ledet és az ad Jelet a Attiny 2313 omnak.két AVR között lehet adatot küldeni? pl: T45 ön int valami = 2 és ezt át küldeni a T2313 ba?
HB-1025-MR-2C ez a fajta led kel ugye?
Bővebben: Link
(#) blackdog válasza kurosaki hozzászólására (») Jan 23, 2013 /
 
Nem értem miért vergődsz ennyit ezekkel az MCU-kal. Miért nem veszel olyan AVR-t ami a célnak megfelel. Bár a pontos célt sem írtad le csak, hogy "világosság" mérés. Mert amit akarsz az ennyi nem több.
Fotoellenállás lenne a te barátod. Amúgy javaslom ezt a cikket: Bővebben: Link
(#) csabeszq válasza blackdog hozzászólására (») Jan 24, 2013 /
 
Hát, én egyre inkább azon a véleményen vagyok, hogy a célnak megfelelő DIP-es AVR az ATtiny13, az ATmega48, vagy az ATmega328P.

Gondolom nem véletlen, hogy az ATmega48 a legolcsóbb az összes IC közül. Az Atmel gondolom szűkíteni akarja a termékkészletét, ezekből gyárt rengeteget, ezért ezek az olcsók, a többit meg megpróbálja szépen lasssan az árpolitikájával kivezetni.

Legalábbis nekem nagyon úgy tűnik.
(#) Mikee91 hozzászólása Jan 24, 2013 /
 
Sziasztok!

Egy távirányítós autó építésén dolgozom, és egy USB-s gamepad-ból szeretném hozzá megépíteni a távirányítót. Örülnék viszont annak, ha nem kellene kibelezni a gamepadot, hanem az közvetlenül AVR-el (ATmega8 vagy 328) kommunikálna. Ez azért is lenne jó, mert ha később egy másik kontrollerrel szeretném vezérelni akkor nem kellene azt is szétszedni.
Ehhez gondolom egy USB hostot kellene megvalósítani AVR-ben, amit neten hosszas keresgélés után sem találtam.
Csinált már valaki hasonlót, esetleg van valami egyszerűbb megoldás? PC-n figyelve a gamepad folyamatosan ugyan azt a byte sorozatot küldi, benne a gombok, karok állását. Valamint csatlakozáskor egy nagy adag információt.
(#) sikolymester válasza csabeszq hozzászólására (») Jan 24, 2013 /
 
Digikey árak:
Attiny13: 0,84 USD
Atmeg48A: 1,14 USD
Atmega48: 1,58 USD
Atmega328: 2.77 USD

Az Atmega328 pedig a 32K flash miatt drága. Az Atmega48-ban csak 4K van.
(#) sikolymester válasza Mikee91 hozzászólására (») Jan 24, 2013 /
 
Kell egy AVR, ami hardveresen viszi az USB-t. Szoftveres USB host nincsen rájuk.
Ez gyakorlatban az AT90USB647 vagy AT90USB1287.

Majd nézz itt körül: LUFA Van HID host projekt, azt kicsit át kell írnod és kész is vagy.
A hozzászólás módosítva: Jan 24, 2013
(#) kiborg hozzászólása Jan 24, 2013 /
 
Hali mindenkinek!
Van esetleg köztetek kecskeméti illetőségű segítőkész emberke, akinek van olyan programozója, amivel vissza lehet hozni egy félhalott ATMega16-t az élők világába? HVPP?
Üdv Kiborg
A hozzászólás módosítva: Jan 24, 2013
(#) kiborg válasza Mikee91 hozzászólására (») Jan 24, 2013 /
 
Hali!

Én is hasonló projekten dolgozom. Én egy régi analóg (GAME PORTOS) joy-t kötöttem egy Mega16 ADC-jére. Viszont az a problémám, hogy eléggé zajos a benne lévő 100kohmos poti. Kis elmozdulásra is nagy feszültségváltozás jön létre, ezért nem volt az igazi. Cseréltem 25k-s potira, javult, de nem az igazi. A rendes távirányítókban 5ks poti van. A célre nekem jobban megfelelt a joy, mert gamepadnál sokkal kisebb a poti mozdulása, nagyon érzékeny lesz. Szerintem legalábbis.
Mivel oldod meg a rádiós átvitelt?
Üdv Kiborg
(#) Mikee91 válasza kiborg hozzászólására (») Jan 25, 2013 /
 
Szia!

Egyenlőre nekem is így van megoldva, hogy kivezettem az analóg kar potijainak lábait, és ADC-vel dolgozom fel azok állását. A Gamepad-ben amit használok 5kOhm-os potik vannak, viszont tényleg nagyon érzékeny. Nem kell sokat mozdítani, hogy a végső állásban legyen.
Az átvitelt egy 868Mhz-es RFM01 és RFM02 adó-vevő párral oldottam meg. Ez az első rádiós adatátvitelt igénylő projektem, így a biztosra menve vettem egy ilyen párt hestore-ból. 1-2 órát szenvedtem vele mire működésre bírtam, de az adatlapokon levő mintapélda jó kiindulásnak.
(#) csabeszq válasza sikolymester hozzászólására (») Jan 25, 2013 /
 
De ha egy ATtiny26-ot nézel, az már drágább, mint az ATmega48 és kevesebbet is tud.
Ezzel fürdöttem be legutóbb, mert a tudás és az ár köszönő viszonyban sincs egymással.
(#) sikolymester válasza csabeszq hozzászólására (») Jan 25, 2013 /
 
Elképzelhető, akkor amit mondasz.
(#) zombee válasza csabeszq hozzászólására (») Jan 25, 2013 /
 
Ráadásul a Tiny26 nem túl gyakori típus, inkább ipari felhasználásnál találkozni vele.
A lábkiosztása és a Timer is teljesen különbözik a többitől, ez az IC hobbicélra szívás.
(#) zamatőr hozzászólása Jan 25, 2013 /
 
Üdv!
USBASP USB ISP AVR Programmer USB ATMEGA8 ATMEGA128 , ezzel a programozóval próbálkozom.Sikerült több atmega8a-ból kizárni magam a képen mutatott beállítással. Extreme Burner-AVR programot használtam . Mi lehet a hiba ,és hova ne tegyek pipát soha ,hogy ne zárjam ki magam.
(#) csabeszq válasza zamatőr hozzászólására (») Jan 25, 2013 /
 
http://www.engbedded.com/fusecalc

Konkrétan nem értem a dolgot, mert az első esetben kellene téged kitiltani, a másodikban pedig 4 MHz-n menne az IC. Ennek éppen a fordítottját írtad.



Szerintem egyébként egy 50%-os PWM-mel az XTAL1 lábon életre kelthető lenne az IC.
A hozzászólás módosítva: Jan 25, 2013
(#) zamatőr válasza csabeszq hozzászólására (») Jan 25, 2013 /
 
Az elsőt már többször égettem és midig jó volt , a második soha. Volt amikor az égető a másodikhoz tartozó hex-et nem olvasta be de egy rendszer-visszaállítás után beolvasta(igaz-még nem tudtam ellenőrizni a működést mert a kész áramkörben nem csinál semmit).
Az XTAL-ra 4MHz sem vezetett eredményre.
(#) nemesimi hozzászólása Jan 25, 2013 /
 
Sziasztok!

SPI-n keresztül kommunikálnék egy MCP3202 ADC ic-vel!ATmega8 használok belső 8Mhz órajellel!
Az lenne a bajom hogy az spi-n sikerül lekérdezni az eredményt UART-on kiiratom de viszont 8-10 van amikor 2-3 lekérdezés után megáll (szerintem) a kommunikáció valami olyasmi lehet hogy nem érkezik meg a megfelelő számú bit és a while ciklusban míg várom át megy végtelenbe mert elszáll a kommunikáció!

Egy külső reset vagy watchdog után szintén elküldi egy párszor és szintén megáll!

Szerintetek bár nem hiszem hogy szoftveres baj lenne esetleg valaki találkozott-e spi kommunikáció során ilyen problémával!

Köszönöm!
(#) Ladoz hozzászólása Jan 25, 2013 /
 
Sziasztok!

ATXmega128D3 boot szekciójában hozok létre egy ugrótáblát, amely tábla, függvények belépési pontjára mutató ugró utasításokat tartalmaz. A tábla pici assembly forrásban van definiálva jmp utasítások sorozataként. A problémám, hogy a fordító a "közeli" címekhez rjmp (2 bájt), míg a távoli címekhez jmp (4 bájt) utasítást fordít. Hogyan lehetne rákényszeríteni a fordítót, hogy minden esetben jmp utasítást használjon? - de az is jó lenne, ha az rjmp után berakna egy nop-ot, a lényeg, hogy 4 bájtot foglaljon egy ugrótábla elem, mint pl. a megszakítási vektortábla esetében.
Köszönöm!
(#) viktorio333 hozzászólása Jan 25, 2013 /
 
Sziasztok!
Szeretnek epiteni egy ermes idozito aramkort ami ugy mukodik hogy a penzvizsgalo szerkezetbe beledobok egy ermet es ad egy inpulzust ez elindit egy idozitot ami bevan allitva egy bizonyos idore. Eddig en is eljutottam de ugy kellene megoldani hogy az ido alatt amig az idozito szamol bedobok meg eggy ermet a beallitott X ido hozza adodjon a meg hatralevo idohoz .
Probaltam az aramkort szimulacios programmal megtervezni de mindig volt benne valami hiba aminn elakadtam . Akinek volna valami hasznalhato otlete vagy mar epitett ilyesmit az segithetne nekem .
Mikroprocesszoros megoldas lenne a legjobb szerintem csak kene hozza program is.
Elore is koszonom a segitseget .
(#) sikolymester válasza Ladoz hozzászólására (») Jan 25, 2013 /
 
Csak a tisztánlátás végett, ugye AVR GCC -t használsz?
Amúgy ha innen nem lesz válasz, akkor javaslom túrd fel az avrfreaks.net -et. Ott laknak a hardcore AVR geekek .
(#) zebra85 válasza viktorio333 hozzászólására (») Jan 25, 2013 /
 
Nagyon egyszerű megírni hozzá egy programot, és egy ilyen feladatot csak uC-rel lehet megoldani. Ajánlom az AVR-t olvass el pár cikket itt vagy könyvet valamit és 2 nap tanulás után magad is meg tudod írni. Ez a topik teljesen felesleges mivel bármilyen mikrovezérlős topikban elfért volna ezért záratom.
Üdv!
(#) Ladoz válasza sikolymester hozzászólására (») Jan 26, 2013 /
 
Igen, avr-gcc-t. A forrás, amelyen dolgozom c nyelvű, csak az ugrótábla szekciót tartalmazó kód assembly.
A fordításkori -relax elhagyása nem oldotta meg. Most az assembly kódban kísérletezem
- .align nem segített, az .align 4 2 db nop-ot szúrt be egy helyett
- az .if direktíva utáni kifejezésben pedig nem akarja elfogadni az és-t (&):

jmp fn_1
jmp fn_2
.if (. & 2 == 2)
nop
.endif
jmp fn_3

de most látom, hogy ez 0, 4, 8 címek esetén nem lenne jó.

Valahogy tudnom kellene az előzőleg lepakolt utasítás címét és akkor már lehetne számolni vagy esetleg bekérni az operandust és megnézni, hogy rjmp-e...

Minden ötletet szívesen fogadok, köszönöm.
(#) nemesimi hozzászólása Jan 26, 2013 /
 
Sziasztok!

SPI-n keresztül kommunikálnék egy MCP3202 ADC ic-vel!ATmega8 használok belső 8Mhz órajellel!
Az lenne a bajom hogy az spi-n sikerül lekérdezni az eredményt UART-on kiiratom de viszont 8-10 van amikor 2-3 lekérdezés után megáll (szerintem) a kommunikáció valami olyasmi lehet hogy nem érkezik meg a megfelelő számú bit és a while ciklusban míg várom át megy végtelenbe mert elszáll a kommunikáció!

Egy külső reset vagy watchdog után szintén elküldi egy párszor és szintén megáll!

Szerintetek bár nem hiszem hogy szoftveres baj lenne esetleg valaki találkozott-e spi kommunikáció során ilyen problémával!

Köszönöm!
(#) sikolymester válasza nemesimi hozzászólására (») Jan 26, 2013 /
 
Én stack túlcsordulásra tippelek.
(#) benjami válasza Ladoz hozzászólására (») Jan 26, 2013 /
 
Nem lehet hogy a -w fordítási opcióval kellene kísérletezni (-w Relative jumps are allowed to wrap for program ROM up to 4k words in size [ignored]) ? Az .if meg szerintem itt azért nem működik, mert a fordító még nem tudja hogy milyen címre kerül az utasítás, azt majd a linker fogja eldönteni.
(#) Ladoz válasza benjami hozzászólására (») Jan 26, 2013 /
 
Igaz, a fordító valóban nem tudja még a pontos címet (majd a linker fogja tudni a linker script alapján vagy -Wl,--section-start= kapcsolókból), de minden szekció esetén használ egy location countert, amely nulláról indul és minden kompilált item esetén annak hosszával növekszik az értéke. Ebből következik, hogy az általam említett .if (. & 2 == 2) kifejezést ki tudja értékelni és jó eredményre is jut, csak a linker az object fájlban elhelyezett infókat felülbírálja. Ettől függetlenül az előző kifejezés, mint írtam is, nem lenne megoldás a problémára, mert minden második esetben hibás eredményt produkálna.
Viszont próbáltam, hogy címkét helyezek az utasítások elé és az aktuális location counter (. jel) és a címke közötti "távolságot" mérem és ez alapján helyezem el a töltelék nop-okat, de ez sem segített, pedig ennek, véleményem szerint, jónak kellene lennie:

lfn1:
jmp fn_1
.if (. - lfn1 < 4)
nop
.endif
lfn2:
jmp fn_2
.if (. - lfn2 < 4)
nop
.endif

és így tovább (mindezt persze makróba lenne érdemes tenni), de
a fenti megoldás esetén sem pakolta be a nop-okat az rjmp utasítások mögé, pedig az lfn_x labelek definiálásakor felveszik az aktuális location counter értékét, azaz a kivonásnak jó eredményt kell adnia... A linker persze itt is felülbírált/optimalizált.

Node, a sok szöveg végén jöjjön az egyszerű megoldás. A linker optimization fül alatt bekapcsolva maradt az -mrelax kapcsoló. Ezt kikapcsolva már long jmp-ket fordított.
Sajnos ott is, ahol fordíthatott volna rjmp-t, mert így nőtt a kód mérete.
Idő hiányában most nem próbálgatom tovább, de izgat a probléma, mert pl. látom, hogy a libc forrásában lévő vektortábla esetén is hasonló (. - tábla_eleje > valami) makróval dönti el, hogy __bad_interrupt szimbólumra legyen-e kicserélve a megadott szimbólum, de nekem nem jött össze. Bocs, ha hosszú volt...


>
(#) Reggie válasza Ladoz hozzászólására (») Jan 26, 2013 /
 
Az assembly kodban hasznalj rjmp-t es a cimeket .org -al add meg. En igy csinaltam sajat kivetel- es megszakitaskezelot a 32bites AVR-re. Ime egy reszlet:

  1. .section  .exception, "ax", @progbits
  2. .balign nn
  3.         .org  0x004
  4.         // TLB Multiple Hit.
  5. _ep_TLB_Multiple_Hit:
  6.         rjmp _handle_TLB_Multiple_Hit
  7.  
  8.         .org  0x008
  9.         // Bus Error Data Fetch.
  10. _ep_Bus_Error_Data_Fetch:
  11.         rjmp _handle_Bus_Error_Data_Fetch
  12. ...
A hozzászólás módosítva: Jan 26, 2013
(#) Ladoz válasza Reggie hozzászólására (») Jan 26, 2013 /
 
Köszönöm! Az org kézenfekvő, nekem mégsem jutott eszembe...
Ki is próbáltam. A __jumptable elejéhez relatívan képeztem az org-nak megadott új location counter értékeket:
__jumptable:
jmp fn_1
.org __jumptable + 1 * 4
jmp fn_2
.org __jumptable + 2 * 4
.
.

de mintha ott sem lettek volna, simán pakolta egymás után az rjmp utasításokat.
Majd abszolút címként adtam meg az értékeket:
__jumptable:
.org 0x21F00
jmp fn_1
.org 0x21F04
jmp fn_2
.org 0x21F08
.
.
így pedig nem fordult le. Kifogásolta, hogy a .jumps szekció nem része a .text-nek, pedig a linker scriptben az alábbi módon vettem fel:
.jumps :
{
__jumps_start = . ;
*(.jumps)
KEEP (*(.jumps))
__jumps_end = . ;
} > text

Majd kipróbáltam és beraktam a .fini szekciók után. Ekkor lefordult, de nem a megfelelő címre.

(Némi magyarázat: Ez a jumptable a boot szekció végén helyezkedik el, elég messze a boot kódjától. A boot 0x20000-ben kezdődik, míg a jumptable 0x21F00 címen. Ezt az ugrótáblát az applikációs részben futó progi használja a boot részben található függvények meghívására: eeprom kezelés, self-programming, crc16 rutinok.)


Következő: »»   511 / 837
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