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
Ne a fuse bitek között keresgélj, mert ott maximum lassítani lehet a CLKDIV8-al.
Lapozz vissza a cikkben és nézd meg hogy van beállítja a projekt / options. Ott kell CPU sebességet beállítani és ott kell processzor, plusz optimalizációt állítani. Helytelen fordító optimalizáció miatt gyorsabb.
Bővebben: Link
^^ Ezt nézd meg... csinálsz 1 másodperces megszakítást. A megszakításban növeld a változó (sec) értékét A main programba meg mehet a kijelzés, stb...
Pontos egy masodperc: 8 bites timer kulso 32.768KHz orakvarccal es 128 -as eloosztoval.
Nem szoktak a megszakitasba "tul sok" kodot rakni, csak flag-eket . A flag-ekkel jelzel a foprogram fele hogy mikor mi fusson. (idezett kodnal persze nem a futasido miatt nem lehet sok kod a megszakitasban,..) Pl:
Miert hasznalsz 16 bites valtozokat? 0-255 decimalis ertekig mehet 8 bites valtozo. Torekedj 8 bites valtozok hasznalatara.
Ha nem két kristályt használsz csak egyet, és az nem kettő hatványa, akkor a következőt célszerű csinálni:
Egy define-ba még a fordítóval kiszámoltadod, mi a timer MAX - 1mp. Tehát ha egy timer 16bites, proci órajele 4MHz, és az előosztás 256, akkor a következőképpen megy a dolog: F_timer = 4 000 000 / 256 = 15 625. Tehát, 15625-et számol a timer másodpercenként. Ezután semmi más teendő nincs, define-ba kiszámolni, hogy:
Ezekután:
Lényegében annyi a trükk, hogy minden interruptban annyit állítunk csak be, hogy hol kell állnia a timer counternek ahhoz, hogy az overflow pont 1 mp múlva következzen be. Nincs kerekítés, nincs nagy pontatlanság. Maximum napi pár ms csúszás az utasítás végrehajtás miatt.
Az abaj hogy akkor meg ezt a hibaüzenetet adja ki nekem, és még annyira sem fut a program mint ahogyan eddig :no:
Ne a programozóba állítsd órajelet. Senki nem mondta. Én a project / options-ről beszéltem, ahol a Frequency-t kell állítani.
Ha segítséget szeretnél kapni, vedd a fáradtságot és olvasd el rendesen azt, amit mások írnak Neked, hogy segítsenek.
Hjajj.
Optionsba tedd vissza a 8 000 000-t. Ez fontos, ez van a cikkben is. Ne maceráld, ha nem tudod mit macerálsz. Processzor típus, megfelelően legyen kiválasztva. Majd fordíts! Nyisd meg a programozót, állítsd ott a programozás órajelét az "ISP xxxx"-nél 110KHz környékére. Menj a fuses oldalra, ott hajtsd végre azokat amiket a cikk is leír. Majd vissza a programozó fülre és égesd be a programot. Bővebben: Videó Szerk: Hozzászólást törölte Grebi.
Akkor én valamit nagyon elnéztem....
Projet/ confugariton optionsban állítottam átt az órajelet 8000000-ról 1000000-ra és így megfelelően megy az időzités, de a hibaüzenet akkor is megmarad... Ismét elnéztem valamit?
A delayekkel kapcsolatosan:
A _delay_us, -ms () _delay_loop_1() es _delay_loop_2() fuggvenyeket hasznalja. Ezek igy neznek ki:
Lathato hogy mindketto volatile, ezert nem szabadna az OPT level-tol fuggjon a delayek pontossaga. Idézet: „Lathato hogy mindketto volatile, ezert nem szabadna az OPT level-tol fuggjon a delayek pontossaga.” Kapcsold ki az optimalizációt és meglátod mi a valóság
Segítség kéne... nem értem mi a gond ezzel a kódrészlettel:
Ezt a hibaüzenetet kapom: ../main.c:68: error: expected '}' before ';' token Ha kiveszem, kikommentezem akkor nincs hibaüzenet. Ezt szeretném vele kiváltani:
Megvan a hiba oka... (csak 5300 másodpercbe telt, azóta megy a számláló )
A gond az volt, hogy itt minden sor végére tettem pontosvesszőt:
Ez így nem hinném, hogy jó lesz. Egy uint8_t tömbben bytokat tudsz eltárolni. Te viszont ilyesmiket akarsz benne eltárolni, hogy PORTD = 0b00111111. Ez pedig egy komplett értékadó utasítás.
Pörög a fórum, így én is kérdezek :
Hogyan lehet/érdemes eepromba beírni helymegtakarítás végett a define-okat? Mint pl az előttem levő hozzászólásában is szereplőket. Vagy szoktak ilyesmit csinálni? Elvileg ez teszi ki a programom kb 30-40%-át. Egy define tartalmazza a 16 segmenses kijelzőhöz szükséges kimenetek állapotát: Port A-B-C-t is. Illetve ennek az eepromba való beírása fizikailag hogyan történik?
Pedig működik és jól.
MOD: #define NO_0 PORTD = 0b00111111 ebből csak ezt hagytam meg: #define NO_0 0b00111111 De mindkét féle megoldás működik.
A
eepromba tarolhatsz konstans ertekeket, peldadnal maradva a kijelzore kiirando ertekeket. 1. lassubb mint ha flashbol dolgozna 2. egy rakas plusz muvelet es kod Pl. szovegnel erdemes eepromot hasznalni, vagy mikor kulso esemeny hatasara szeretnel elmenteni valamit.
Amugy meg kell adni a section -t ahhoz hogy eepromba keruljon.
eeprom-nal ugy emlekszem hasonlo:
A második eset működik, az nem is kérdéses. Az első esetben pedig ezek kerülnének a tömbödbe
Ha ez lefordul, és véletlenül jó is akkor ez csak a compiler jóindulatán múlik.
Ez tenyleg kemeny
De hol hasznalja a "tomb[elem]" -et? Mert az hogy switch-elt a makrok kozott, az ok, de ennek mi koze e "tomb[]"-hoz?
Értem, egyszerű konstanst már írtam eepromba, ill olvastam onnan ki következő bekapcsoláskor.
Csak a célom pl az lett volna, hogy pl egy kijelzéshez a számokat ne a flashbe írjam be minden alkalommal, hiszen ez lényegében konstans, amit úgyis csak meghívok, de nem írom felül soha. Eepromba be lehet írni pl azt hogy 0xFF? És akkor ezt hívom meg: PORTB= ezzel... Ekkor egyszerűsödne talán, hisz define-ok helyett eeprom címek szerepelnének a flashben. Tudom, hogy nem egyszerű és lassú is lenne a kiolvasás, de ezzel lehet hogy nem is spórolnék helyet talán a flashban... Nah jó, ezt hagyjuk... Új kérdés: Ha előre be szeretnék írni az eepromba, az hogy oldható meg? Én erre gondoltam: flashben írok egy progit, hogy írjon a megfelelő helyre értéket, ezt lefuttatnám, majd törlés nélkül beleírnám a programot a flashbe. Ezt nem lehetne kiváltani valamivel? Hogyan lehet eepromba írni egyből?
Szerintem vzoole az én 7szegmenes ébresztó óra kódomat próbálja átdolgozni Mert abban van így megoldva a kijelzés. Bővebben: Link
Erre is valaszoltam az elozo oldalon: #375658
Valóban az órád kódját tanulmányozom, átírom, tesztelem, mi hogy és miért működik.
Miután a tömb működött, mentem tovább... és akkor már láttam hogy értelmetlen a "PORTD = 0b00111111" kifelyezés a tömbben, ezért lett belőle "0b00111111". De mégis működött, talán kedvel a fordító Köszi mégegyszer a forrást... mióta topi cikkjei letették az alapot bennem, ebből tanultam a legtöbbet.
Örülök, hogy valaki hasznosnak találja a publikált projektjeimet. Lenne még bőven mit közkincsé tenni, de azért elég sok idő egy olyan anyag összeállítása amit ki tudok rakni a netre. Azért a következő cikk már egész jól áll. Shift regiszteres többszinü LED mátrix vezérlés lesz. Illetve már készül az ezt a mátrixot felhasználó spektrumanalizátor is, bár ez utobbi még odébb van.
Hellósztok.
Szeretnék egy tapasztalt segítőkész embert keresni aki napkollektorom ventillátorjához programot írna. Sajnos anyagiakkal 2000 forinton belül tudok szolgálni egy ilyen munkáért. Nagy segítség lenne ha valamilyen csevegőn keresztül segítene. Egy Atmega88-as nanoboardom van. A részletekért keress fel légyszíves. Előre is köszönöm a segítségeteket!
1., Jól láthatjuk, vagy csak elírtad? 2000, azaz kettő-ezer Ft?
2., Hirdetés-feladáshoz van egy külön felülete az oldalnak. 3., Elektronikai témakörök csevegőcsatornán való megbeszélését szigorúan elítéljük itt az oldalon, kollektíven.
Hali!
Lenne egy kérdésem... A "Nyolc láb" cikksorozat alapján próbálok AVR-t programozgatni... A következő lenne a problémám: Írok egy C forráskódot, de hogyan tudom .hex -re fordítani, mert végigolvastam a leírt instrukciókat, meg a videót is többször átnéztem, stb... de nekem nem sikerül hexre forditani, és a C kódból, ha jólértelmeztem a leírtakat akkor egyből nem lehet AVR Studio 4 -el Ckódból az AVR-be programozni... Légyszi segítsetek! Üdv! Barbár
AVR Studio4 az csak IDE. Azaz egy felület, ami megkönyíti a fejlesztést. Ahoz, hogy tudjál C-böl fordítani, kell egy fordító, ami képes AVR -re kódot fordítani. Javaslom a teljesen ingyenes WinAVR -t. Ami be is épül az AVR Studio4 alá. Azaz tudsz olyan projektet csinálni az AVR Studio 4 alá, ami C forrás fájlt használ. Ha bevan állítva az AVR Studio 4-nek, hogy az aktuális projekt C compilert használjon, akkor simán lehet fordítani hex-et az AVR Studio4 alol is. Meg debuggolni is lehet, sőt egyből lehet programozni is az IC-t. Persze csak ha van olyan programozód, amit támogat az AVR Studio.
Igen, valami ilyesmire gondoltam én is az olvasottak alapján, de nem jöttem, rá h hogyan kell ezt beállítani...
Jelenleg úgy állok h kész hex fájlt bele tudtam írni az IC-be az AVR Studio 4 -el, de igazából saját fájl szeretnék. (Már feltettem az Win Avr-t, de azzal sem jutottam igazából sokra) Az említett beállításokban tudnál esetleg segíteni? Előre is köszi! Üdv! Barbár |
Bejelentkezés
Hirdetés |