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
Köszi! Ez egy nagyon egyszerű, és tökéletes megoldás volt a problémámra! .
Másik kérdés: program memóriában tárolt számot kellene összehasonlítanom egy változó értékével, és csak if-el működik. Ha switch-el próbálom akkor hibát dob. Meg lehet oldani switch-el is?
A portok kezeleset az IC doksijaban talalod meg C peldakkal, sot nagyon sok periferia kezeleset ott talalod meg.
Az AVR-libc-ben ertelemszeruen nem fogod megtalalni ezeket, mert ezek IC specifikus dolgok, mindossze header fajlokban definialva vannak a regiszterek es egyebb konstansok, hogy tudjad hasznalni.
A case utani reszt nem ertekeli ki, igy oda fuggveny nem mehet(csak konstans).
En valahogy igy csinalnam:
Csak félig értlek.
Az miért IC specifikus, hogy hogyan kell egy portot be-ki kapcsolni vagy H/L szintet adni?
Ezekszerint ez nem működik minden esetben? Az alap definíciókról nem találok semmit, hogy: PORTx ?? =?? PB??? Ezt olvashatóbban nem is lehet beállítani? Pl.: 0x14 (Bocs, de még láma vagyok)
Ahogy a kolléga is írta azért ez nem annyira egyszerű.
Elsőnek is van olyan regiszter ami azt hivatott tárolni, hogy az aktuális port melyik "lába" (DDRx, x a port betűjele) bemenet vagy kimenet e. És persze van még egy pár regiszter, ami meghatározza hogy milyen bemenet vagy kimenet, bekapcsolt felhúzó ellenállás az adott lábon, stb. Ezek bizony típus specifikusak, de sok a hasonlóság, tehát nem fogysz benne elveszni. Ajánlom neked az AVR mintaprogramok-at, illetve sok-sok c kód nézegetését !
Röviden valaki tudná vázolni nekem elméletben, hogy assemblyben hogyan kéne egy 8 bites változót kipréselnem 3 darab 7 szegmenses kijelzőre? A kijelzőkre BCD kódban megy az adat, tehát a 8 bites számot kellene felbontani decimális helyiértékekre aztán ezt BCDben elküldenem, de nem nagyon boldogulok a felbontással.
Nem ismerem pontosan a problemat amin dolgozol, de pl olyat lehet, hogy:
Magyaran a ROM-ba tarolando ertekeket macro-val definialod es akkor lehet case-be tenni. Ha kesobb az 'egy'-et 0-ra akarod valtoztatni akkor csak egy helyen kell modositanod a programodat, a constans tombodben is jo lesz es a case agban is...
Mukodik minden esetben, csak ez egy alacsonyszintu muvelet igy az IC doksija targyalja, az avr-libc pedig egy fokkal magasabbszintu muveleteket tamogat. (Pl. ilyen eeprom programozasa mar osszetettebb muveletsort igenyel, ezert is van ra fuggveny az avrlibc-ben.)
Az alap definiciok azok, amik az IC-k doksijaban is le vannak irva, mint pl. PORTB, ami konkretan egy regiszter. A regiszter tartalmanak kezeleset es ennek fuggvenyeben az I/O labak viselkedeset ertelemszeruen a gyarto dokumentalja, mivel ok gyartjak az ic-t, az avr-libc keszitoinek erre nincs rahatasuk, ok csak megcsinaljak a definiciot, hogy te a PORTB regisztert tartalmat a PORTB definicioval tudd elerni. Ezen nincs mit dokumentalni, egyedul azt fedik el eloled, hogy I/O cimen vagy memoria cimen ered-e el, de ez felhasznaloi oldalrol(foleg kezdoknek) teljesen mindegy. A PORTB=0x14 is mukodik, ha neked erre van szukseged, bar egyes helyzetekben a PBx olvashatobb. Akkor es azt hasznalod amelyiket szeretned, a lenyeg, hogy minden regiszter 8 bites, igy 8 bites erteket kell adni neki (nehany 16 bites regiszter is van).
Sziasztok!
A következő kóddal próbálkozom, de fordításkor hibát kapok.
Hiba: ../Ledes1.c: In function '__vector_1': ../Ledes1.c:20: error: 'TIMSK' undeclared (first use in this function) ../Ledes1.c:20: error: (Each undeclared identifier is reported only once ../Ledes1.c:20: error: for each function it appears in.) ../Ledes1.c:20: error: 'OCIE0' undeclared (first use in this function) ../Ledes1.c: In function '__vector_21': ../Ledes1.c:29: error: 'OCR0' undeclared (first use in this function) ../Ledes1.c: At top level: ../Ledes1.c:32: warning: 'TIMER0_COMP_vect' appears to be a misspelled signal handler ../Ledes1.c: In function 'main': ../Ledes1.c:60: error: 'GICR' undeclared (first use in this function) ../Ledes1.c:64: error: 'OCR0' undeclared (first use in this function) ../Ledes1.c:65: error: 'TCCR0' undeclared (first use in this function) ../Ledes1.c:66: error: 'TIMSK' undeclared (first use in this function) ../Ledes1.c:66: error: 'OCIE0' undeclared (first use in this function)
Uram + isten!
Tessék behúzni a kéziféket, mert ebből fának menés esete lesz.... A LEDvillogóba kell: kimenetkezelés, delay(normál) időzítés. INT, ADC, TIMER minek? Ezeket majd később! És nem is a legmagasabb/legnehezebb szintem kezelni előszörre! Szerintem indulj el a 8 lábbal AVR sorozaton. Mottó: "Ha kalapács van a kezedben, mindent szögnek nézel...."
Leszögezem nem saját agyszülemény!
Copy - Paste egy oldalról és csak látni szerettem volna a működését. De le sem fordul. Amúgy pont a Timer0 miatt érdekel mert a _delay funkciókkal nem tudk 1sec-5sec időzítést beállítani. Vagy tévedek? :hide:
Több delay_ms() egymás után?
Így fokozható a késleltés sokáig....
Valoszinuleg az a baj, hogy nem jo uC-re forditod, vagy nem arra keszult amire szeretnel forditani. Nezd meg milyen tipusu timert hasznalt az eredeti kod az eredeti ic-vel es a te icden ugyan olyan timerre ird at. (TISMK-> TIMSK0 vagy TISMK1 , stb.)
Gondolom ez is jó:
A másik ami miatt érdekel az uC időzítője, hogy a delay függvények függnek az IC órajelétől. Én viszont ettől független időzítésre gondoltam. Ezért próbáltam Time0 -t piszkálni.
Hali
Néhány hete már írogattam ide az AVR programozó kiválasztásával. AZóta döntöttem - és rendeltem - egy TAVIR féle MKII-es programozót. Bár még nem érkezett meg de sztem jövőhéten kézhezveszem és ZH időszak után azonnal neki is fogok kisérletezgetni, de ehhez még lenne pár kérdésem. Nyilván nem ezzel a programmal kezdek majd, de nem hagy nzugodni a dolog így hát megkérdem, hátha bírtok segíteni: Szeretnék egy digitális órát készíteni 4db 7 szegmenses kijelzővel(óra és perc kijelzés). Atmega 8-at használok majd - vagy 128-at bár utasításkészlet terén majdnem tök mindegy melyiket. ELképzelésem már elég konkrétan van arról, hogy mégis hogy írjam ezt meg, de pár dolgot nem értek. Assembly-ben írnám a programot. Azt viszont nyilván figyelembe kellene venni, hogy az 1 másodperces késleltetések nem fognak pontosan lefutni, ha maga a program utasításai is felzabálnak jónéhány órajelet. Ezért szerintem a gyári 16MHZ helyett pl. 50-100MHZ között kellene működtetnem a mikrokontrollert, hogy az utasításokból adódó időeltolódás ne okozzon jelentős hibát. Neten keresgéltem is az után hogy lehet bekötni oszcillátort a mikrokontrollerbe, és az alábbit találtam: az XTAL2 és XTAL1 közé kell tenni a kvarc kristályt egy-egy kondenzátorral, és végül ezt a 2 lábat összekötni a földdel. A kérdésem az lenne, hogy így helyesen lenne bekötve? Másrészről pedig ez a bekötés azt jelentené, hogy a mikrokontroller belső oszcillátorát nem venné figyelembe, hanem helyette automatikusan a 50MHZ-en futna a chip? A másik nagy kérdés bennem, hogy ugyebár minden utasításnak van meghatáropozott ideje, hogy hány órajel alatt hajtódik végre. De azt hogy birom kiszámolni, hogy pl. 50MHZ-en egy olyan utasítás ami két órajel alatt fut le, pontosan hány secundumot jelent? EGyszerűen csak kiszámolom a periódusidőt a frekvenciából és pl. a fenti példánál maradva ez 1/(50x10^6) =2x10^-8 és ezt megszorzom 2-vel mivel az említett utasítás 2 órajelet igényel?!?! EZt így kell számolni?!?! Azért lenne fontos, mert majd egy 1sec-os késleltetést/számlálót mindképp be kell iktatnom, ami az egész óra alapját képezi - még ha a többi utasításból adódó órajelektől az 50MHZ-es nagyságrend miatt el is tekintek.
50MHz?
Szóval a chipet nitrogénnel hűtöd... Egyszerűbb: Ott a Timer2 ami fogad órakvarcot. Így ezt leosztva 1 sec időalapod lesz, ami lépteti az órádat (INT-ben). És a kijelzés meg a főprogramodban fut. Így nem a lineáris programozásban kell elfedni a időcsúszást, hanem az INT megszakítja a főprogramot, végrehajtja az időléptetést, és utána a főprogramod meg a szegmenseket kezeli. Na bumm, az egyik ilyen szegmenskijelzésed hossza megugrik 5-10 usec-l ... Javaslat: szedd több részre a feladatot: 1: gombkezelés, mert be kell állítani az órát 2: 7szegmenses kijelzés, illetve multiplexelélés 3, Timer2 és az óra kezelése 4, esetleg I2C vagy külső óraIC, hogy áramszünet után ne villogjon, hanem legyen egy pontos időd... A kvarc alap pontossága 30 ppm. Ez ha órakvarcról beszélgetünk, akkor ~ napi 1-4 sec eltérést okoz... Az órádon van mp kijelzés? Ha tutira mész: - DCF77 vevő (frankfurti atomora) - NTP ethernet: netes pontos idő. - GPS Nem rossz megoldások ezek sem.... Max ágyú-veréb esete.
Hűteném ha tehetném Na de komyolra fordítva kajak hülyeséget írtam (de szoktam hülyeségeket beszélni)
Na de ami a témát illeti: nem vagyok nagy igényű: -egyrészről full kezdőnek érzem magam, és feltehetőleg az is vagyok - másrészről nem kell nekem hűde pontos óra, csak a sikerélmény miatt akarom csinálni, még az sem zavar ha napi 5-8 másodpercet késik - Ráadásul nem ma lesz, de nemis heteken belül mire azt megcsinálom , hisz addig még annyi apró, primitív de érdekes dolgot akarnék összerakni. Igazából csak a kiváncsiság nem hagy nyugodni. A bökkenő azzal van, hogy nem tudom hogy működnek ezek a megszakítások, szóval én primitív de működő megoldásra gondoltam: -elsőként is ugye mindenképp külön akarom szedni a programot (ezalatt én a szubrutinokat értem) - másodszor olyan ötletem támadt - lehet hogy elmebetegség , mivel megszakításokhoz még abszolúte nem értek , így arra gondoltam, hogy minden egyes szubrutin illetve macro ugyan annyi órajelet venne igénybe - a késletetést kivéve persze. És ehhez a "referencia órajelszámhoz" ki számolnám az eltelt időt, és ennek függvényében csinálnék egyetlen késleltetést, ami ezen referencia-órajelből-származó időt kiegészítené pontosan 1 másodpercre. Ergó a delay-t minden egyes szubrutinban meghívnám. Vagy ez így kivitelezhetetlen?!?! (bár én inkább a maceráns jelzővel illetném)
Hidd el nekem, a megszakitasokhoz is pont annyira ertesz mint a tobbihez. Nem kell felni, neki kell ugrani, nehany apro kulonbseg van csak, de errol rengeteg cikk van. De tomoren osszefoglalva: a megszakitas elejen elmented a regisztereket, a vegen visszaallitod es ret helyet iret-tel tersz vissza. Kb. ennyi a kulonbseg, minden mas szempontbol olyan mint egy eljaras, ami nem kap parametert.
De ha nem szeretnel megszakitast, akkor eleg csak az idozito flag-jet figyelni, es nem kell az utasitasok idozitesevel bibelodnod. A flag pedig periodikusan fog beallni a kod futasidejetol fuggetlenul.
Én akkor sem programoznék assemblyben, hogyha pisztolyt szorítanának a fejemhez.
Fogadj meg egy jó tanácsot, és inkább programozz C-ben, vagy felőlem akár Basicben. Assembly manapság arra való, hogyha egy baromi időkritikus függvényt, vagy megszakítást akarnak megvalósítani, akkor azt használják. De hangsúlyozom, ennek csak akkor van értelme, ha valaki tényleg assembly guru. Ezt a lineáris programozási őrületet pedig felejtsd el. Hogyha egy pontos órát szeretnél, akkor használd az atmega8-t, amire tudsz külső 32,768 kHz-es kvarcot tenni, amivel bitang pontos másodperc alapot kaphatsz. Ami az egy másodperces késleltetéseket illeti: hidd el az interrupt lefutása, ami kezeli majd a másodperc alapot sokkal rövidebb idő alatt lefut annál, hogy akár a legjobb kristály pontosságát képes lenne ténylegesen rontani.
Sziasztok!
Azt hiszem én is megfertőződtem az AVR-el. Nem foglalkoztam azelőtt mélyen elektronikával, inkább csak magasszinten programoztam (PC-t). A lényeg, hogy szeretnék egy bluetooth-os távirányítást ez alapján: http://uzzors2k.4hv.org/index.php?page=blucar Avr programozásról annyit tudtam, hogy kell egy programozó hardver hozzá. Olcsón lehet kapni itt: http://www.hestore.hu/prod_10024859.html A hozzá tartozó leírásban szerepel, hogy "ISP felületű" Avr programozható vele. Kiválasztottam egy Avr-t a feladathoz ami hasonló a leírásban szereplőhöz: http://www.hestore.hu/prod_10024915.html Viszont a kép alapján más a tokozása(?) és szemmértékkel mérve ez nem illik a programozóba. Jó irányba haladok a feladat megoldásával vagy mellékvágányra tévedtem? Helyre rakna valaki? (Nem tudom volt-e előttem hasonló jellegű kérdés, nem volt kedvem 367 oldalt végiglapozni) A segítő szándékú válaszokat előre is köszönöm.
A programozó amit kinéztél az AVR-Doper névre hallgat. A véleményeket a fórumban olvasdf el - eléggé érzékeny sokmindenre. Én inkább az önálló USB illesztővel ellátott STK500-at vagy MKII-t nézném ki (árban kicsit több (pl. nálam is ). De az AVR nem az USB emulációval _és_ a programozással foglalkozik ekkor...
A chipből NEM tiny hanem ATMega chipet néznék ki. Pláne nem SMD-t ... Inkább egy ATMega 8 vagy ATMega16 családból választanék. A Tinyben nincs pl. Analog resz (megvilagitasmero, feszultsegmero). A Mega chipekben minden van, es arban is kb. itt van... A programozas ISP-n at (ez a programozasi felulet, az 2*5 vagy 2*3 tuskesor. NEM foglalatba kell rakni az AVR-t es ugy programozni. Celaramkorben. Azaz ISP : In System Programming - a celhelyen programozhato.
Reggie
Hát magamtól nem vettem volna rá magam erre, de ha valóban ennyire érthető a megszakítás kezelés most már biztos hogy végére járok Ezt a peridodikusan belallithato flag-et nem értem, de majd keresgélek ez után is. Sikolymester MAximálisan megértelek, elvégre is még egy olyan nehéz, "szétszórt" és nyakatekert nyelvet mint assembly ritkán lát az ember. Mindenkitől ezt hallom. Néha még a saját - régebben megírt 8051-es - relatíve egyszerű progjamjaimat is újra kellett értelmeznem, hogy pontosan kihámozzam azt amit ÉN írtam meg... De egy dolgot szerintem kezdőként szem előtt kell tartanom: a mikrokontroller programozást alapoktól kezdve kizárólag assembly-ben tanultam, és bármennyire is hangzik hülyén: nekem kezelhetőnek tűnik. Másrészről pedig megint egy elméleti szálat elkezdeni elég demotiváló lenne a "mikrokontrollerek gyakorlatának küszöbén állva"...(ez elég irodalmi volt) Nekem személy szerint fontosab hogy elkészüljön valami, mint az hogy milyen környezetben készül el. Mindenkinek az a legkönnyebb amit éppen megért. Persze létszükségletnek érzem áttérni majd C-re, hisz végülis átlag felhasználói szinten tudom használni a C-t - de szerintem leghamarabb is csak hónapok múlva fogom a mikrokontrollerekhez alkalmazni
Sziasztok.
Szeretnék építeni egy PWM-es LED fényerő szabályzót, aminek a fénye nő és ha eléri a maximumot csökkenni kezd.A gond csak az, hogy nem tudom milyen előosztásnál, milyen gyors lesz a timer számlálása.(8Mhz-es órajelre gondolok). [/OFF]Még sosem PWM-eztem.[OFF]
Ha van otthon AVR-ed, és hozzávaló programozó, akkor ki kell próbálni, és próbálkozni, állítgatni az értékeket és vizsgálni a hatást!
És ezután már elmondhatod magadról, hogy már PWM-eztél. :yes:
Pedig nem olyan bonyolult az...
Pl. ha a procid 8MHz-en megy es az eloosztas 1, akkor 1 masodperc alatt 8 milliot lep a Timer. 8-as eloosztasnal 8millio/8-at, azaz 1 milliot, es igy tovabb... Idézet: „Néha még a saját - régebben megírt 8051-es - relatíve egyszerű progjamjaimat” Hmmm... de hát abban is van megszakítás...!
A kulcs:
Adatlap bogarászás Egyszerűbb eset: AVRCalc illetve KAVRCALC segédprogram. Ezek kiszámolják, és kiírják...
Igen abban valóban van, de nem véletlenül használtam az"egyszerű" jelzőt --> Ergó nincs benne megszakítás
Sziasztok!
Az lenne a kérdésem, hogy a Topi féle AVR-Doper, USB-s ISP programozóval - http://www.hestore.hu/prod_10024859.html - lehet-e programozni egy LPC2146-os chipet? |
Bejelentkezés
Hirdetés |