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
1, Nem C. Tényleg Bascom
![]() ![]() 2, 4K-ba ez a kód simán belefér... 3, Optimalizálás van. De ha a paremfentételek nem tisztázottak, akkor bizony bármi lehet.... ![]() MicroPascal, ASM is akár ![]() De a C nyelvben is megoldható a feladat. Egy kódnál nem a szépség számít. A működés, a hatékonyság.. Különben is amegrendelőt az érdekli, hogy működik ahogy evárja vagy sem. Szerintem ha nincs kikötve, akár bármi nyelvben is lehet (mondjuk van M2560-ra ARM emuláció ![]() A hozzászólás módosítva: Aug 24, 2013
Szia!
Egyetlen apro hiba van ezzel: Idézet: „PC5 - A, PC4 - B, PC3 - C, PC2 - D.” Meg kellene forgatni a biteket. Mondjuk jo sorrendben kellene bekotni a dekoder chip-et, de ha nem lehet, akkor egy 9 elemu tablazat is megteszi.. A legtobb hardver tervezesi hiba javithato szoftveresen.. A tablazat persze kiszamolhato papiron is, de azert van a C fordito es a preprocesszor, hogy szamoljanak ok. A tablazat meg azert jo, mert igy gyorsabb es rovedebb kod lesz belole.
A bemeneteknel egyszeru, mert csak and-eled a port-ot a megfelelo ertekkel, es a !! operator nullabol nullat csinal, minden masbol 1-et. Azaz, ha az adott port bit 1, akkor az eredmeny is egy lesz, egyebkent meg nulla. De ha neked nem fontos, hogy 1 legyen az eredmeny, ha a port bit magasan van, akkor a ket ! nem szukseges. A logikai donteseknel csak az szamit, hogy 0 vagy nem.
A kimeneteknel mar nem ilyen egyszeru a helyzet, mert a LED = 1 ertekadasbol az 1 az 1 marad, soha nem lesz belole 8 vagy 16 vagy akarmi. A PIC fordito bitfield-ekkel hivatkozik a hardver regiszterekre, ami nagyon leegyszerusiti a dolgodat, de a forditott kod ugyanaz lesz, mintha >> eket irnal. Azon felul ez egy kicsit gányolás, mivel a C szabvany szerint a C fordito nem garantalja, hogy a bitmezok definialasakor melyik iranyba lesznek igazitva a mezok. Egy ismeretlen kornyezetben senki nem definial hardver regiszterekre bitmezoket, mert nem tudod, hogy az elso mezo a 7-es vagy a 0-s biten lesz.. Ettol persze ez meg a PIC-en mukodik, mert a C forditohoz adott header-ek a forditonak megfeleloen vannak megirva. Mindenesetre olyat csinalhatsz, hogy pl:
Ebbol a kodbol is ugyanaz fordul, mintha a PIC-es bitfieldek lennenek, foleg, ha optimalizal a C forditod. A hozzászólás módosítva: Aug 24, 2013
Sziasztok!
A kapcsolás próbapanelen csücsül, tehát úgy módosítom ahogy szeretném... Csak szerettem volna megtudakolni, hogy kell le programozni. Amit zombee írt;
Azt értem,hogy portok iránya, végtelen ciklus. De a szám balra tolása aztán egy darab 2-es műveletet nem értem. Az if-ben a szam-hoz hozzá ad 1-et amíg 10 nem lesz, ha igen akkor szam=0. A balra tolásos dolgot elmagyarázzátok?
Köszönöm mindenkinek a javaslatokat!
Igaz nem írtam, hogy C nyelvről lenne szó és lehetőleg AVR Studio-ban (mert a munkahelyemen az van), ezért elnézést kérek ![]() A programok elég nagyok, csak egy néhány férne bele a 4k-ba, így a Bascom-os út nem járható. A példáitokkal és a javaslataitokkal nagyon sokat segítettetek, mindegyik módszert kipróbálom majd. Mégegyszer köszönöm mindegyikötöknek ![]()
be ki le fel meg el át rá ide oda szét össze vissza
Ha az igekötő az ige elött áll, egybe kell írni, azaz leprogramoz. A << 2 azt jelenti, hogy kettovel tolja balra. A << 17 meg tizenhét bittel tolja balra. Sot, mondok jobbat. Az a <<= 3; azt jelenti, hogy az 'a' valtozot harom bittel balra tolva vissza is teszi az valtozoba. Es ez igaz minden ketoperandusu operatorra, tehat a valtozo += 10; az hozzaad a valtozohoz 10-et. (+= -= /= *= %=)
AVR alatt a 4k-s program az már elég nagy és sokat is tud, kivéve, ha 3.5k adat belőle.
Vannak ökölszabályok, amiket programozásnál be kell tartani és akkor nem lesz tele a memóriád szeméttel. - float/double lebegőpontos típusok ne legyenek - a cos-t táblázatból számold közelítéssel, eszedbe ne jusson a beépített könyvtári rutinokkal - malloc-ot / free-t ne használj - ahol 8 bit elég, ott 8 bites adattípust használj (nézd meg mi lesz, ha egy for ciklusban a változót uint32-re írod át és szörnyülködj) Maradjunk annyiban, hogy 4k-ból már egy kerti öntözőrendszert ki lehet hozni, ami egy szivattyút és mágnesszelepeket vezérel időzítővel, nedvességméréssel,...
A LED makroban van egy kis hiba, bocsanat. helyesen:
A fenti peldaban a LED a C port 0-as bitjen van. Ha monjuk a PB5-on lenne, akkor igy nez ki:
Idézet: „Igaz nem írtam, hogy C nyelvről lenne szó és lehetőleg AVR Studio-ban (mert a munkahelyemen az van), ezért elnézést kérek” Dehogynem mondtad! Meg példákat is hoztál C-ben és írtad, hogy PIC C meg AVR studio. Vagy csak én nem érzem az iróniát???
Rendben, megfogadom a tanácsod.
Van egy projekt amit igaz nem én írtam, mert még csak nemrég dolgozok ott, ami majdnem megtölti egy ATmega32-nek a memóriáját:
Azt hiszem, hogy ez az egyik legnagyobb program ott, GPS modulról adatokat olvas, dekódolja, hőmérsékletet mér, egy teljes menüt jelenít meg soros porton a számítógépen egy Putty nevű terminál programban, ott be lehet állítani különböző paramétereket (hogy miket küldjön a kijelzőnek, hőmérséklet, szöveg, pontos idő, dátum, koordináták (GPS), sebesség, ...menetrendeket lehet beállítani, hogy melyik megálló következik, pl ha vonaton vagy autóbuszon használják a kijelzőt), a teljes belső eeprom memóriáját át lehet másolni egy külső eeprom-ba és fordítva, ezt ugyancsak abból a terminál menüből. Az egészet majd kiküldi egy 14x112 ledből álló kijelzőnek. Röviden ennyit tud, mindez 42 (c + h) állományból áll. ![]()
Igazad van, azok mind fel voltak tüntetve és ebből egyértelmű, hogy miben szeretném a megoldást, de attól még oda írhattam volna azt is biztos ami biztos alapon
![]()
Sziasztok! Egy BMP085 légnyomásmérővel küzdök. ATMEGA328P-vel olvasom, működik is minden, kiolvassa a légnyomást, hőmérsékletet. A gond az, hogy kevesebb légnyomást mutat. pl: a mai légnyomás a met.hu szerint 1011hPa, a szenzor nekem 996-ot mér. Kettő szenzorom van, a másikkal is ennyit mér. Nem tudok rájönni a hibára, többször átnéztem mindent. Az értékszámítás a szenzor adatlapja szerint van számolva. Felrakom a programot, vethetnétek rá egy pillantást, hátha valakinek szemet szúr a hiba. Köszönöm!
A met.hu szerintem a tengerszintre átszámított légnyomást közli. Az érzékelőd minden valószínűség szerint abszolút légnyomást mér. Ez az adott helyszín tengerszint feletti magasságától is függ. (Mikor a jelenlegi lakóhelyemre költöztem, egy légnyomásmérővel mértem meg, hogy az utcánk felső vége kb. 18-20 méterrel magasabban van, mint a házunk.) A légnyomás mellesleg az időjárási viszonyoktól is függ, frontok esetén elég nagy eltérések lehetnek egymástól pár tízkilométerre lévő, akár közel azonos magasságú helyek között is.
Most hogy mondod, igazad van. De még írják is, hogy: Tengerszintre átszámított légnyomás. Figyelmetlen voltam. Akkor adott a feladat, át kell számolnom nekem is tengerszintre, mert mindenhol így használják. Köszi!
Szevasztok,
Rendelnék egy Dragon programozó-debuggert (nem Magyarországon lakom ) , miket kéne még rendeljek főleg kábelekre, csatlakozókra gondolok tüskesor stb. tehát, hogy egyszerre megkapjak mindent és ne fizessek töbször postaköltséget ?
Gondolom tüskesort és IC foglalatot nem árt, mert egy részét ötletes módon nem forrasztják be. Kábelből szalagkábel és szalagkábel csatlakozó. Nem baj ha többet rendelsz, avatatlan kezekben fogyó eszköz ez is...
Naggyából én is tudom de nem tudom hogy mi a kódja például annak a csatlakozónak ami talál a Dragon tüskesoraira vagy hogy néz ki egy olyan fogó amivel a szalagkábelre szoritok egy ilyen anya csatlakozót. A képeken úgy néz ki hogy még USB kábelt se adnak hozzá az is milyen típusú kell hogy legyen ?
Én speciel satuval rakom össze a szalagkábeleket, de egy kisiparos üzemben a kalapács is előkerült a törékeny cucc összepattintásakor. De készen is lehet venni szalagkábelt lengő mama fejjel...
A hozzászólás módosítva: Aug 25, 2013
Sziasztok!
Van egy ilyen enkóderem: Bővebben: Link Ezen kód alapján működésre is bírtam: Bővebben: Link Szépen működik is csak nem értem pontosan, hogy hogyan és ebben kérem a segítségeteket, hogy világosítsatok fel. Az én kódom:
Első kérdésem: Valóban 1ms időközönként ellenőrzi a program a bemenet állapotát? Nem pazarlás ez a processzor időből? Aztán: A változó amiben az aktuális állást tárolom az int8_t viszont az LCD-re történő kiírásnál már int32_t van. És ha tekerem fel/le az enkódert nem csak -128 és +127 közötti értéket kapok vissza. Ez hogyan van? A megszakításban a new változó működését abszolút nem értem. Megszakítással vagy timerrel korrektebb kezelni ezt az enkódert? Szóval működik csak bizonytalan vagyok. A hozzászólás módosítva: Aug 25, 2013
IDE csatik kellenek hozzá (10 lábu), de utánna mindenféle átalakitokat magadnak kell megcsinálnod ( protoboard) mert a másik végén már egyáltalán nem egységes a csatlakozások kivitele. Nekem is egy sereg átalakitom van 10 > 6 pinre, de abbol is van vagy 3 fajta. Ezt nem uszod meg, s szerintem inkább rendelj szalagkábelt meg egy marék 6, 10 és 16 pines csatlakozot ( mindkét tipust F és M).
A hozzászólás módosítva: Aug 26, 2013
Bocs elirtam a csati nevét, nem IDE, hanem IDC.
Azt nem tudom, hogy mennyi idonkent ellenorzi, de az 1ms az teljesen normalis. Ha eleg gyorsan tekered, akkor surun jonnek ott a valtozasok. Nekem valami hasonlo ALPS encoder-hez meg annal is gyorsabb pollozasi ido jott ki.
A valtozo, amiben te tarolod a poziciot (val), az int32_t. A delta, amit az encode_read() visszaad, az valoban csak 8 bites, de arra eleg is. Mert az csak az elozo lekerdezes ota tortent elmozdulast adja mindig. AVR-en eleg draga dolog a 32 bites szamabrazolas, csak indokolt esetben hasznalnam. A new valtozo mukodeset ugy tudod a legjobban megerteni, ha felrajzolod egy papirra az A es B jelek mozgasat az enkoder elforgatasanak fuggvenyeben (ha nincs szkopod, akkor ket LED-et rakotsz, es nezed, hogy mit csinal, amikor forgatod), es megnezed, hogy mikor milyen erteket kap a new valtozo. Azt a harom sor programot, ami kiszamolja a new valtozo erteket, azt te is vegig tudod szamolni negyszer. Vagy mondjuk kiiratod a kijelzore a ket PHASE lab erteket es a new valtozot, es akkor latod, hogy mi tortenik. Amugy a new a tekeres iranyatol fuggoen 0-1-2-3 vagy 3-2-1-0 ertekeket vesz fel. Ha az elozo es az uj allapot kulonbsegeben az also bit 1-ben all, akkor valamerre elforgattak eggyel.
A masik bit erteke pedig megmondja, hogy melyik iranyba:
Ha megfigyeled, a diff also bitje minden lepes utan 1, a masodik bitje pedig a lepes iranyatol fuggon vagy 1 vagy 0. Ha csak ezt a bitet hagyod meg (diff & 2) az eredmeny vagy 0 vagy 2. Ha ebbol levonsz egyet, akkor vagy -1 vagy 1 lesz az eredmeny. Es ezt adja a delta-hoz, igy az egyik iranyba mindig eggyel csokkenti a deltat, a masik iranyba meg mindig noveli. Hogy aztan a vegen miert kell ezt neggyel elosztani (delta >> 2), azt nem tudom, de feltetelezem, azert, mert 1 enkoder lepeshez tobb fazisvaltas is tartozik. Ismerni kellene az enkoder pontos mukodeset, de az adatlapjabol szamomra nem derul ki egyertelmuen.
Köszönöm a kielégítő választ!
Kérdések: ![]() Idézet: „AVR-en eleg draga dolog a 32 bites szamabrazolas, csak indokolt esetben hasznalnam.” Akkor használhatnék akár mindenhol int8_t típust? Amire még nem jöttem rá az, hogy hogyan tudom LCD-re kiírni ezeknek a változóknak a tartalmát? A hozzászólás módosítva: Aug 26, 2013
Ha biztos vagy benne, hogy a változód nem vesz fel -128-nál kisebb és 127-nél nagyobb értéket akkor használd. Ha nem kell negatív érték használhatsz előjel nélküli változót is.
uint8_t 0..255-ig vehet fel értéket. 8 bites előjeles változó már nem vesz fel 128-as értéket. Értéktartomány: -128..127 Ilyenkor az első bit az előjel, és a maradék 7 biten megy a számábrázolás. Max értéke: 0111'1111 (64+32+16+8+4+2+1 = 127) Ha itt hozzáadsz még egyet akkor 1000'0000 (-128) eredményt kapsz. Itt már kicsit érdekesebb, mert ahol 1 lesz azt kell hozzáadni a -128-hoz, hogy meg kapd az eredményt. Pl.: 1000'0001 (-128+1 = -127) Ahhoz, hogy LCD-re kiírd a számokat át kell konvertálni karakterré, amihez a sprintf függvény kell. Itt volt róla szó: Bővebben: Link
Köszönöm.
A kiírást eddig is megoldottam, de nem tudom formázni:
Ebben a formában összecsúsznak a számok idővel. Nem tudom jobban megfogalmazni. Én viszont jobbra rendezve szeretném látni. Idézet: „Akkor használhatnék akár mindenhol int8_t típust?” Nem. De nem is azt mondtam, hogy ne hasznalj mast, hanem azt, hogy a 32 bites dolgok dragak AVR-en. Az AVR egy 8 bites processzor, aminek vannak 16 bites szamolasokra alkalmas utasitasai. A 32 bites muveleteket viszont eleg nehezkesen lehet vele megoldani. Ezert mondtam, hogy csak indokolt esetben hasznalnam. Az indokolt eset meg azt jelenti, hogy olyan ertekkel dolgozol, ami nem fer el 8 vagy 16 biten. Ahogy azt vzoole is irta, az int8 -128..127, az uint8 0..255 kozotti ertekek tarolasara elegendo. 16 biten mar 65536 kulonbozo ertek irhato le. int16: -32768..32767, mig az elojel nelkuli 16 bites uint16_t eseten 0..65535. Ha ez sem eleg, mert a feleadat ugy kivanja, akkor lehet hasznalni 32 bites tipust. Ha nem egesz szamokkal kell dolgozni, akkor jonnek a lebegopontos szamok, a float es a double. Ezek 32 ill. 64 bitesek (utobbiban nem vagyok biztos AVR gcc eseten). Ezekkel lenyegesen lassabban szamol, mint az eddigi egesz tipusokkal, viszont igen nagy tartomanyban irhatok le vele szamok, es nem mellesleg tortszamok is. Bar meg kell emliteni, hogy ez a temakor nem AVR, hanem 'C'.
Amiket itt leírtál, az már első hallásra is több, mint 4k.
Igazából arról beszéltem, hogy AVR alatt a 4k az nem kevés. Nagyon sok feladat megoldható vele (persze van, amihez 256k sem elég). Nálam a 4k azért fontos, mert az Atmega48p a legolcsóbb mega chip. Amit lehet, arra írok, amit nem, azt Atmega328P-re.
Látom ment itt a "vita" a kód méretről és AVR-ről.
Az egyik kódomban ami alapból 8187byte volt az egyik int változót módosítottam char-ra. Igazából nincs más szerepe mint 1 vagy 0. Lényegében logikai változóként használom. A lefordított kód viszont ilyen minimális változás mellett is 8130 byte-ra csökkent. Elgondolkodtam a kód optimalizáláson. Hogyan működik ez, mi kell hozzá? Bár eddig nem méret gondjaim voltak hanem I/O láb szám gondok. De ezeken már felül kerekedtem. |
Bejelentkezés
Hirdetés |