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   360 / 840
(#) yoman917 hozzászólása Szept 18, 2011 /
 
Sziasztok!
Építettem még régebben egy hőmérőt Attiny24-el, viszont praktikusság szempontjából úgy lenne a legjobb, hogyha a külső hőmérsékletet mérő termisztor vezetékét nem kéne kivezetni az ablakon, hanem rádiójeles, vagy valamilyen hasonló mechanizmussal menne. Tudnátok ebben segíteni, vagy egy linket beszúrni, ahol tudnám tanulmányozni?
Üdv,
yoman
(#) sikolymester válasza yoman917 hozzászólására (») Szept 18, 2011 /
 
Itt a hobbielektronikán találsz néhány cikket, ami 433Mhzes adó-vevővel foglalkozik. Próbálkozhatsz zigbee modulokkal esetleg. Vagy veszel kész bluetooth modulokat, amiket egyszer egymásra konfigolsz, majd azután mindkét végén UART vezetéket rákötsz és észre sem veszed, hogy köztük van egy bluetooth híd.
(#) H2opok hozzászólása Szept 18, 2011 /
 
Üdv
Egy kis segítség kellene.
Kellene nekem 2-3db ATtiny10-es smd kontroller. Ha lenne valakinek fölösben, megvenném. Azért itt érdeklődöm, mert be is kellene programozni, így a shop-pos-rendeléses miatti ide-oda postázgatás kimaradna.
Sürgős lenne, így ha lenne valakinek, (pü-ben jelezze) és be is tudja programozni (az állományokat elküldöm) azt megköszönném. Természetesen mindent fizetek.
Előre is köszönöm.
(#) pityu_lite hozzászólása Szept 19, 2011 /
 
Sziasztok ismét
AVR GCC fordítóban (avr studio) ha 2dimenziós tömböt szeretnék használni akkor hogy deklaráljam hogy bármikor bárhol elérhessem és fel is tölthessem ?
Egyenlőre az include és define -ok utána van berakva egy
unsigned char tomb[max_oszlop][max_sor] ;

^viszont max 2szer olvasok ki belőle olyat amit beírtam :S Tudtok segíteni ? Ez valószínű kimaradt a suliból
(#) zombee válasza pityu_lite hozzászólására (») Szept 19, 2011 /
 
Sajnos a kérdésed nem igazán értem. Ha az include és define részek után teszed akkor mindenhol látni fogod,
kivéve azokban a header fájlokban amelyeket beszúrsz de gondolom ez nem probléma.
Remélhetőleg a max_oszlop és max_sor fix érték, én most számokat használok ha nem baj.

Ha már deklaráláskor értéket adsz neki akkor így teheted meg:
  1. unsigned char tomb[3][3] = {{1,2,3},{4,5,6},{7,8,9}};


Futás közben így használhatod:
  1. tomb[x][y] = z;
  2. fuggveny(tomb[x][y]);
  3. u = tomb[x][y];


Ha nem akarod hogy a tömb az SRAM-ból csípjen le de futás közben nem kell módosítani:
  1. #include <avr/pgmspace.h>
  2. prog_uchar tomb[2][2] = {{2,2},{2,2}};


Egyébként nagy tömböknél ez utóbbival a programmemórián és az indulási időn is spórolhatsz
hiszen a deklaráláskor fel kell tölteni az értékekkel ami programkód, és ez még a main() fv. ELŐTT lefut!
(#) pityu_lite válasza zombee hozzászólására (») Szept 19, 2011 /
 
Igen , köszönöm pont így használom , és azt reméltem hogy így lesz , de csinál érdekességeket néha meghívás után. Próbálkozom még vele egy kicsit , előbb utóbb csak össze jön. Lehet hogy az általab írt példákban pl az 'x' és 'y' helyére ha matematikai összefüggéseket írok ( + - * / ) akkor ott keveredik el valami. Ezt még talán ma kikisérletezgetem.

Üdv
P.
(#) sikolymester válasza zombee hozzászólására (») Szept 19, 2011 /
 
Mindenhonnan nem fog látszódni.

Ha mondjuk foo.c -ben deklarálva van így:
  1. unsigned char tomb[3][3] = {{1,2,3},{4,5,6},{7,8,9}};


Akkor ha bar.c -ből el szeretnéd érni, akkor először valahol rá kell akadni a compilernek a következőre:
  1. extern unsigned char tomb[3][3]

Máskülönben nem fogja tudni, hogy amikor hivatkozol rá, hogy létezik-e egyáltalán a tomb nevű tömb.

Ideális esetben a foo.h -ban áll a
  1. extern unsigned char tomb[3][3]

És ez a foo.h van includeolva a bar.h -ban. A bar.h természetesen a bar.c-ben van includeolva.
(#) zombee válasza sikolymester hozzászólására (») Szept 19, 2011 /
 
Köszönjük, ez olyan "PT. Zolis" megfogalmazás volt, már nagyon hiányzott!
Valószínűnek tartom hogy az illető nem írt olyan külső könyvtárat ami használná a tömböt.
Például az extern miatt le se fordulna meg egyéb nyalánkságok.

Az "elkeveredik valami" dolgot úgy hívják: "stack overflow(túlcsordulás)".
Azaz, a tömböd miatt olyan kevés memória marad az alkalmazásodnak, hogy a stack néha bele-belelóg
a tömbödbe és a magasabb sorokban katyvaszt kapsz vissza. Ha ezalatt írod is a tömböt akkor elszáll a program.
Ezért is írtam hogy ha elegendő egy olvasható tömb akkor azt a pgmspace-ben érdemes megadni.

Nézd meg mennyi "Data" memória marad szabadon! És azt se felejtsd el hogy az AVR GCC-s függvények
is eszik a memóriát rendesen, de ezt nem látod mert a stack-et használják amit képesek nagyon kitolni!
A rekurziókat pedig - AVR-ek esetében - felejtsd el, ahogy a függvényekben(de még a main-ban) se
deklarálj nagyobb struktúrákat, pl. nagy tömböket és sztringeket!
(#) chocob hozzászólása Szept 20, 2011 /
 
Üdv!
Segítséget kérnék a következő esethez:
Kizártam magam egy atmega8-ból, de "szerencsére" csak az órajelet állítottam rosszul, ezért egyéb megoldást szeretnék találni a párhuzamos programozó helyett.
Ponyproggal töltöttem le a programot, az avr-hez 4MHz kerámia rezonátort használok. Eddig az összes fuse bit pipálatlan/1 volt. Átállítottam mind a négy CKSEL-t 0-ra és mindkét SUT-ot szintén 0-ra és most nem férek hozzá az isp programozóval. Tudnám ezt úgy helyrehozni hogy másik, megfelelő kristályt/rezonátort rakok bele, és ha igen melyik felelne meg az új beállításoknak?
(#) qvasz2 válasza chocob hozzászólására (») Szept 20, 2011 /
 
Ha DIP tokos az IC, és pesti vagy, akkor tudok neked segíteni, mert én is elállítottam egyszer az enyémet, és ezért csináltam hozzá egy "sírbólvisszahozót".
(#) zombee válasza chocob hozzászólására (») Szept 20, 2011 /
 
xtal1-re köss minimum 500khz vagy 1mhz órajelet és akkor már adja ...
(#) Fish hozzászólása Szept 21, 2011 /
 
Sziasztok!

Soros kommunikációval kapcsolatban lenne kérdésem: soros-porton keresztül szeretnék parancsokat adni AVR-nek. Melynek a formátuma a következő:

  1. .start[enter]
  2. .status[enter]
  3. .stop[enter]



kerestem már mindenütt, de mindenhol csak az alap dolgokat találtam, azaz leütök egy billentyűt és a kontroller csinál valamit. De én úgy szeretném, hogy egy ponttal kezdődik a parancs, és enter végjelig tart. Én úgy okoskodtam, hogy a sztringet beolvasom egy karakterláncba, és enter leütés esetén feldolgozom azt

nos jól okoskodom? Ha egy kódrészlettel segítenétek megköszönném. Köszi a válaszokat
(#) TavIR-AVR válasza Fish hozzászólására (») Szept 21, 2011 /
 
  1. dim a as string*40
  2. do
  3. input a
  4. if a=".start" then
  5. .
  6. endif
  7. if a=".status" then
  8. .
  9. endif
  10. if a=".stop" then
  11. .
  12. endif
  13. loop

Bascom AVR alól....
(#) richard hozzászólása Szept 21, 2011 /
 
Sziasztok!
Egy kérdésem lenne felétek nem tudok rájönni egy dologra...Tavir oldalon a versenyen(2011) megszületett egy ablak emelős kapcsolás na már most én nem tudok Basic-ben programozni, csak C-ben a programnak az a része nem világos mikor a nyomógombokat lekérdezi egy sima if utasítással csak hogy a bene lévő: 1_a_lent, 2_a_lent stb. bit értéke hogy lesz nulla?
mert csak így teljesülhet a feltétel így léphet bele a if-be és így majd törli az egyik bitet(pl:1_a_lent) és elindítja a motorokat...oké is lenne csak nem tudok rájönni hogy első indulásnál hogy lehet nulla ez bit hogy be tudjon lépni a if igaz ágában...
ha valaki tud segíteni akkor megköszönném..
(#) TavIR-AVR válasza richard hozzászólására (») Szept 21, 2011 /
 
A verseny a 2010-es volt. A 2011-es most van kiírva Idén még nem jött pályamunka


Ha definiálsz egy változót, alapban a helye 0-val van feltoltve.

A gomb az 1_a_fel és a különálló letárolt bit az 1_a_fent névre hallgat. Ez 2 külön dolog! A 1_a_fent adathalom/memóriaérték, míg a 1_a_fel a program elején aliassal a pinx.y lábat reprezentálja.
(#) richard válasza TavIR-AVR hozzászólására (») Szept 21, 2011 /
 
Igen valójában elírtam az évet...

A változó deklarálása volt a gond mert C-ben bármit felvehet és így nem volt világos az egész gombkezeléses rész. Gondolom ez Bascomban van írva és az alapból a bitnek 0 ad (amit én nem tudtam eddig) ahogy írtad.

kösz így már világos a müködése!
(#) abcdabcd hozzászólása Szept 21, 2011 /
 
Sziasztok, valakinek nincs véletlenül egy működő , assembly, timer1 inicializáló rutinja másodperc alaphoz, megszakítással, attiny2313-ra? Akárhogy próbálkozok, meg a neten talált kódokat próbálom beillesztgetni nem sikerül eredményre jutnom...
(#) sikolymester válasza abcdabcd hozzászólására (») Szept 21, 2011 /
 
Nem vagyok erős assembly írásban, de szerintem ott nem lehet preprocessor macrokat csinálni, amivel az F_CPU definiált értéke alapján compile time-ban el lehetne dönteni, hogy milyen leosztást csináljon a beállított órajelhez.

Summa summarum: kellene tudnunk, hogy milyen órajelen ketyeg az attiny2313 -d.

De még egyszerűbb lenne, ha elmondanád, hogy mi nem sikerül.

Adatlapot fellapoztad már? Mert ha még nem, akkor én javasolnám azt első körben.
(#) abcdabcd válasza sikolymester hozzászólására (») Szept 21, 2011 /
 
20MHz-n megy a proci, elvileg kiszámoltam, hogy mennyinél kéne a compare megszakításnak bejelezni, elvben beállítottam minden bitet meg mindent azok alapján az infok alapján, amiket a neten találtam, meg az adatlapból kihalásztam, de egy egyszerű teszt se megy, ami a kimeneten egy ledet villogtatna másodpercenként, szóval valamiért valószínű nem megy a megszakítás... nekem nem kell kész kód a programomhoz, egy váz, vagy leírás ha lenne, hogy (akár konkrétan a 2313-hoz) melyik biteket mire kell állítani, hogy a 16bites számláló compare módban működjön, és így 1másodpercet számláljon és megszakítást kezdeményezzen...
(#) sikolymester válasza abcdabcd hozzászólására (») Szept 21, 2011 /
 
Nem tudom hol írod az assembly kódod, de feltételezem, hogy az AVR Studio 4-ben. Amennyiben a feltételezésem helyes, akkor ott tudsz szimulátort futtatni.

Oldalt szépen láthatod a regisztereket, tudod lképtetni a kódot, stb.

Nos futtasd a kódod a szimulátorban és nézd meg jobb oldalon, hogy a kívánt regiszterek, amik szerinted kellenek az adott timer működéséhez tényleg sikeresen be lettek állítva.

Illetve még egy fontos dolog:
A globális interruptot beállítottad?
(#) sikolymester válasza abcdabcd hozzászólására (») Szept 22, 2011 /
 
Ja még annyi, hogy írd le légyszi, hogy miket számoltál ki, és miket állítottál be, akkor biztos rájövünk, hogy mit néztél el.
(#) zombee válasza abcdabcd hozzászólására (») Szept 22, 2011 /
 
be kell állítani:
- TCCR1A/B - CTC mód+előosztó, OCR1A - pontos osztó
- TIMSK: Output Compare 1 A engedélyezés(1 bit)
- sei - globális interrupt engedélyezés
- interrupt táblában ki kell keresni a helyét(OC1A) és ha nincs más akkor onnan kezdődjék az interruptod.
Ja és az interrupt táblát mindig át kell ugorni, azaz a $0000 címen "rjmp RESET" legyen!
A stack pointert sem árt beállítani, ha az SRAM-ot is használod.
(#) chocob válasza qvasz2 hozzászólására (») Szept 22, 2011 /
 
Köszönöm a lehetőséget, ha minden kötél szakad akkor megköszönném.
(#) chocob válasza zombee hozzászólására (») Szept 22, 2011 /
 
Értem köszönöm.
(#) abcdabcd válasza zombee hozzászólására (») Szept 22, 2011 /
 
Köszönöm a választ neked és 'sikolymester'-nek is, mindjárt megkeresem, mit írtam a kódomban...
(#) abcdabcd válasza sikolymester hozzászólására (») Szept 22, 2011 /
 
Mellékelem a kód szerintem releváns részeit, de mindjárt magamnak is ellenőrzöm, a zombee által ajánlottak szerint a kódot:
(#) zombee válasza abcdabcd hozzászólására (») Szept 22, 2011 /
 
Ööööööö! Köpni-nyelni nem tudok! Több 4 éve AVR-ezek, de ilyet még nem láttam.
Elismerem hogy bennem van a hiba, amiért nem vagyok képes értelmezni ezeket:
  1. LDS R16, TCCR1B
  2. SBR R16, ((1 << WGM12) | (1 << CS12) | (1 << CS10))
  3. STS TCCR1B, R16


Aztán rájöttem hogy az I/O műveletekkel(in/out) IS címezhető regisztereket memóriaprogramozással(lds/sts)
éred el. Ezt végülis lehet csinálni, de nem a 2-szeres időigény(2 órajel 1 helyett) a legnagyobb hibája.
A "TCCR1B" és társai olyan definíciók, amelyek I/O címekre vannak leképezve, így csak I/O műveletekkel
illik őket használni! Példaként a TCCR1B I/O címe 0x2E, míg a memória(SRAM-beli) címe 0x4E.
Azaz korrekt is lenne a programod ezen része, ha:
  1. LDS R16, TCCR1B
  2. //helyett:
  3. LDS R16, 0x4E
  4. //lenne


DE: vannak olyan regiszterek amelyeknek nem jutott I/O cím, de nem ebben a kontrollerben!
Pl. ATMega48-ban a "TCCR1B" már ilyen, ott tényleg csak az LDS/STS mehet!
Tipp: adatlap - Register Summary! Amelyik regiszter az "SREG" alatt van, az "in/out", ami fölötte ez "lds/sts".
Az AVR Studio úgyis figyelmeztet ha "in/out"-ot használsz "lds/sts" helyett, de fordítva már nem!

De nézzük a többi apróságot. Az "eleje" címke nincs kint sehol. Ezen sor ELÉ kéne tenni:
  1. LDI     temp1,(RAMEND)


Aztán ott a "SEI", utána pedig az - egyelőre - üres interrupt rutinod. A SEI-től nem fog megállni a program,
hanem folytatódik: lefut egyszer az interrupt rutin anélkül,
hogy a hardver(timer) meghívta volna. Inkább nem mesélném el a stack-et, nem fárasztalak vele,
de amint a főprogramod ráfut a "reti"-re, el is fog szállni az egész, egyszerűen lefagy és/vagy megbolondul.

Ezért a SEI után ezt is be kéne tenni:
  1. loop:
  2. rjmp loop


Tudom hogy nehéz az interrupt, de kell pár rossz tapasztalat és majd Te is nevetsz rajta amikor megérted.

Amivel okosabb lettem:
Elolvasva az adatlapot rájöttem hogy az SBR-el és CBR-el nem csak egy hanem bármennyi bit módosítható,
én pedig abban a tudatban éltem hogy csak egyetlenegyet lehet velük birizgálni.
Több bit módosítására az "and" és az "or" használatos, az SBR/CBR a szokásjog alapján "egybitesek".
Egyébként SBR/CBR helyett nyugodtan használhatsz "ldi"-t is, és akkor nem kell beolvasni a TCCR1B
regisztert és társait. Az összes bitet beállítod és meg is van:
  1. ldi r16, ((1 << WGM12) | (1 << CS12) | (1 << CS10))
  2. out TCCR1B, r16
(#) abcdabcd válasza zombee hozzászólására (») Szept 22, 2011 /
 
A timer kód nagy része egyébként nem saját szerzemény: azaz szerzemény, csak nem én írtam az eredeti elvileg mega168-ra készült csak a megfelelő regiszterek neveit cserélgettem ki a tiny2313-ban találhatókra, az igazság az, hogy megszakítást még nem használtam eddig...

A főprogram létezik és nem is üres, van benne vagy 500 sor kód... meg az interrupt rutin sem üres természetesen... Írtam is, hogy csak a timer szempontjából, legalábbis általam, relevánsnak tartott részeket írtam a fájlba

De akkor amúgy a kódban magában nem látsz kivetnivalót, a "stilisztikai" kifogásokon kívül?
Valamit esetleg kihagytam?

Ja az eredeti kód itt:
Bővebben: Link
(#) zombee válasza abcdabcd hozzászólására (») Szept 22, 2011 /
 
Az atmega168 mindent magyaráz, az atmega48 nagytestvére. Van benn SRAM-címzéses regiszter dögivel!

Én inkább egy ATMega16-ot ajánlanék kezdésnek, annak kódja többé-kevésbé kompatíbilis az ATTiny2313-al,
és nincsenek benne ilyen szörnyűségek sem, minden regiszter címe az SRAM alatt van.
Például a timer0/1 regiszter-és bitszinten ugyanaz!

Több lába is van így lehet pazarolni! Egy kezdő még nem ismerheti az összes trükköt a lábszám spórolásra!
Bejön egy 4x8 szegmenses kijelző vagy egy háttérvilágításos HD44780 és már el is fogytak a lábaid!
(#) abcdabcd válasza zombee hozzászólására (») Szept 23, 2011 /
 
Amúgy egy elgépelés volt a kódban két helyen a
TCCR1B-t --> TCCR1A-ra kellett cserélni, lentebb mindenhol az A-t használom...
Illetve a 2 sts-st kellett out-ra cserélni...
Következő: »»   360 / 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