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
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
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.
Ü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.
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
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:
Futás közben így használhatod:
Ha nem akarod hogy a tömb az SRAM-ból csípjen le de futás közben nem kell módosítani:
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!
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.
Mindenhonnan nem fog látszódni.
Ha mondjuk foo.c -ben deklarálva van így:
Akkor ha bar.c -ből el szeretnéd érni, akkor először valahol rá kell akadni a compilernek a következőre:
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
És ez a foo.h van includeolva a bar.h -ban. A bar.h természetesen a bar.c-ben van includeolva.
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!
Ü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?
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".
xtal1-re köss minimum 500khz vagy 1mhz órajelet és akkor már adja ...
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ő:
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
Bascom AVR alól....
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..
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.
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!
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...
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.
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...
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?
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.
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.
Köszönöm a lehetőséget, ha minden kötél szakad akkor megköszönném.
Köszönöm a választ neked és 'sikolymester'-nek is, mindjárt megkeresem, mit írtam a kódomban...
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:
Ööööööö! 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:
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:
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:
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:
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:
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
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!
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... |
Bejelentkezés
Hirdetés |