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
Ebben a témában én is kezdő vagyok, de azok a gombok csak akkor aktívak, ha fut a szimuláció (Build and Run CTRL+F7 után).
Idézet: „Tehát, ha C-ben így írom if((x & y)), tehát nem &&-t írok közéjük, akkor azt bites logikai műveletnek veszi?” Igen, erdemes lenne valami C konyvet elovenned, vagy valami ehhez hasonlo tutorialt olvasgatnod Idézet: „Tehát tömbként akarom azt kezelni. És a tömb minden elemét a for-ban rávagyolom a portra. PxOUT = ~PxOUT | maszk[i];” (az [i] -t mar en tettem oda) Szerintem egyszerubb lenne elobb ossze rakni azt amit ki szeretnel rakn a portra, azutan azt egyszeruen kimasolni. Amugy amit jelenleg csinal, hogy negalod a PxOUT-ot es ahhoz rakod a maszkot, majd megint negalod (tehat 2. lepesben vissza kaptad az eredeti erteket... nem tudom pontosan mi volt a cel, ezert nem tudom hogy ezt akartad-e). LED kijelzon amugy (met ebbol indultunk ki) ugy szokas csinalni, hogy veszed a digitet, tombbol kiolvasod a karakter kepet es kiteszed a portra. Masik lehetoseg, hogy elagazol a program futasban a megjelenitendo karakternek megfeleloen es a megfelelo rutin kirajzolja a megjelenitendo karaktert, mint ahogy ez a tutorial is teszi: 7-SEGMENT DISPLAY INTERFACING WITH AVR
hmm, tenyleg kiszedi a [ i ] -t -- remelem igy egymastol szetvalasztva mar megeszi?
Idézet: „LED kijelzon amugy (met ebbol indultunk ki) ugy szokas csinalni, hogy veszed a digitet, tombbol kiolvasod a karakter kepet es kiteszed a portra.” Igen, ez nekem is eszembe jutott, egy jegyű számnál nincs is vele probléma, de mi van akkor ha több számjegy van? Esetleg sztingként kéne kezelni és karakterenként megfeleltetni a tömb adott elemének? Mert két digitnél se lenne igazából probléma mert a port 8 bitjére pont kiférne a két bcd kód, de én legalább 3mat szeretnék. PxOUT = ~PxOUT | maszk i; végiggondolva ez tényleg hülyeség, igazad van. Köszi a linkeket, megnézegetem majd mindenképp. Idézet: „két digitnél se lenne igazából probléma mert a port 8 bitjére pont kiférne a két bcd kód, de én legalább 3mat szeretnék.” Ha sima BCD atalakitot hasznalsz, akkor ugye mindegyik digit kulon byte-ra tarolodik. Ha pakolt BCD-vel dolgozol, akkor az also ket digit az elso byte-on van (also es felso nibble-eken), a 3. pedig a masodik byte also nibble-jen... Sima BCD jobb lenne most neked, de a pakolt sem akadaly: 1. Kimaszkolod az also nibble-t, es kirakod a portodra 2. leshifteled a felso nibblye-t az alsora es kirakod a porta... 3. kimaszkolod a kovetkezo byte also nibble-jet.. es igy tovabb...
Mondjuk úgy nem lehetne, hogy a kijelzőn megjelenő számok kódját értékek sorrendjében letárolod egy char tömbben, és ha van a kétjegyű számod (praktikusan tároljuk unsigned char-ban, mert belefér), akkor a tízes helyiértékre a számod / 10 (div, gyk egészosztás) kerül, míg az egyesekre a számod modulo 10 (10-el való osztás maradéka) kerül. És az így kapott két értékkel választjuk ki a kijelzettek kódok közül az éppen aktuálisat. Pl vmi unsigned char seg[10], amiben a seg[0] a nullát adja ki a kijelzőn, míg a seg[9] a 9-est. És ebből válogatunk az egészosztással meg a maradékképzéssel.
Mindkét megoldás tetszik, kár, hogy ilyen trükköket nem tanítanak nekünk... Habár végül is, ha már lesz egy kis gyakorlatom, biztos jönni fognak magától is az ilyen ötletek.
Köszi a segítséget!
Üdv!
Felesleges mégegy AVR. 74HC245: Tiltható kimenet, állítható irány ("A" port "B"-re, vagy "B" port "A"-ra), A és B port egymással szemben van.
Sziasztok!
A segítségeteket szeretném kérni. Most ismerkedek az ATmega164P mikrovezérlővel, építettem hozzá panelt, programozót, minden okés. Most az AD konverterét próbálgatom, ismerkedés gyanánt gondoltam csinálok egy olyat, hogy potméter az egyik ADC be lábra (ez a PORTA0 lett), LED sor a D portra, tekergetem a potit és nő a led világító oszlop... Már egy napja szenvedek vele, kutatgatok neten, de nem tudok rájönni mit rontok el. Kérném tehát a segítségeteket, hogyan lehetne kijavítani a kódot? ADC beállításai: ADMUX: 0100 0000 azaz Vcc referencia feszültség, 0-ás csatorna ADCSRA: engedélyezem az ADC-t a 7-es bittel, frekiosztás 64-gyel, így az eredeti 11,059 MHz-ből ~172 kHz-es AD órajel freki lesz. ADCSRB: csupa nulla, free running mode... Jelenleg a programmal egyik problémám, hogy nem folyamatosan fut. Ha a resetet nyomogatom akkor rááll újabb értékekre, de csak a poti egy kis szakaszán van változás. Tartomány felén 4 led világít, majd gyorsan tovább ugrik 8 ledre. Vajon mi okozza azt, hogy nem konvertál újra és újra, azaz változik valós időben a világító ledek száma? Illetve gondolom rosszul kezelem a konvertált értéket a main részben. Hogyan vizsgáljam az U értékét, hogy attól helyesen változzanak a ledek? Én úgy gondolom, hogy az U-ban 0 és 1024 közötti érték lehet decimálisan a 10bit felbontás miatt. Avagy mégsem? Használt fejlesztőprogram: AVR Studio Előre is köszi a segítséget! A program:
Helló!
Ezzel tudom kezelni a DS1972-es ibuttont? Ha megy, akkor az eepromba hogy kell beírni az ID-t? Ugyanúgy sorrendben kell, mint az ibutton-on van felírva, esetleg fordított sorrendben? Ez nem derült ki számomra. Mert megcsináltam a kapcsolást attiny45-el, beírtam már többféle képpen az ID-t, de semmi reakció nincs. A programban a device ID-t átírtam az én ibuttom-éra, de semmi. Szóval a kérdésem, hogy a két eszköz kezelése megegyezik, vagy van eltérés az ID kiolvasásban és ezért nem megy? az ibutttonom azonosítója egyébként 000000532286. A device ID pedig 2D, amit át is írtam a programban.
Látok pár dolgot így ránézésre ami nekem nem tetszik. Bár egyik sem okozhatja a leírt jelenségeket, de azért jó lenne kijavítani. Tehát az első, hogy felesleges a varázslás az ADC alsó és felső eredmény byte -jával. Van ADCW is a WinAVR-ben. Ami ezt a 2 byte -ot egy 16bites szónak mutatja. A másik, hogy az ADC_read(void) fügvényed int -et ad vissza. Pedig a logikus az lenne ha unsigned lenne. Fölleg, hogy a main kódban már egy unsigned U váltózónak ad értéket ez a fügvény. Ez persze magával hozza, hogy az ADC_read(void) belső változóit is át kéne írni mind unsigned -re. Illetve azt sem értem minek leállítani az AD konvertert az ADC_DISABLE -el. Mikor a freerunning mode -nak pont az lenne a lényege, hogy nyugodtan pöröghet folyamatosan. Így az ADC_ENABLE is csak 1x kéne nyilván. Valamikor a main kód elején. Na meg az a sok else if sem szerencsés. Másképp jobb lenne megoldani. Mondjuk pl. az U változót kéne maszkolni.
1. Nem ártana némi várakozás a főciklusba
2. A számkonverzió eléggé veszélyes megoldás, vagy művelet értelmesebb lenne a += helyett. 3. 10 bites felbontás mellett bőven elég lenne egy unsigned short változó is (ami ugye 16 bites). 8 AD-zás után sem fog túlcsordulni, és optimálisabb is. (Mellesleg bőven elég lenne a 8 bites felbontás is...)
int szinten 16 bites...
Sziasztok!
Köszi a segítséget. Ma tiszta fejjel inkább újrakezdtem saját kútfőből és nem egy kész progit írtam át, így kicsit egyszerűbb lett És már működik is A kérdésem annyi lenne még, hogy miért kell a while(1) ciklusomon belül az ADSC bitet mindig 1-re állítanom, hogy folyamatos legyen a konverzió? Úgy értem a free runban nem folyamatosan konvertál magától? Bár most olvastam utána az adatlapban, azt írja, ez a konvverzió végeztével mindig nullára áll...tehát akkor a kérdésem érvényét veszti @ATtiny: U változó maszkolására tudnál példát mondani nekem? A későbbi felhasználásban elég sok feltételnek kell majd alávetnem ezt a konvertált jelet, bizonyos tartományain kell kimeneteken 1-re vagy 0-ra állítgatni. És ép ezért a sebesség is kulcskérdés lesz. De gondolom maszkolással sem fog gyorsabban futni a program, mint az else if-ek tömkelegével. Vagy valakinek vmi jobb ötlet az ifeknél? Még egyszer kösz mindenkinek. a kód: Idézet: „ #include #include int main(void) { //ADC inicializalasa ADMUX=0x40; //VCC=5V referenciafesz, 0: PORTA0 csatorna kivalasztasa ADCSRA=0xC6; //enable, start konverzió, 64-es osztó ADCSRB=0x00; //free running mód DDRD=0xFF; //PortD kimenetre allitasa unsigned int U; //Feszültség konvertált értéke while(1) { ADCSRA|=(1< U=ADCW; //konverzió eredménye. 10 bit if (U>=0 && U<128) PORTD=0x01; else if (U>=128 && U<256) PORTD=0x02; else if (U>=256 && U<384) PORTD=0x04; else if (U>=384 && U<512) PORTD=0x08; else if (U>=512 && U<640) PORTD=0x10; else if (U>=640 && U<768) PORTD=0x20; else if (U>=768 && U<896) PORTD=0x40; else if (U>=896 && U<1024) PORTD=0x80; else { PORTD=0xAA; //hibajelzés 10101010 a ledek _delay_ms(500); PORTD=0x55; //01010101 a ledek állapota _delay_ms(500); } _delay_ms(2); } } ”
Hello,először írok ide.
Keresek egy egyszerű soros porti programozót ,amivel tudnék égetni Attiny13-ba. Tudnátok ajánlani valami olcsót lehetőleg?
Sajnos nincs LPT portom,de ha jobban belegondolok akkor ott a húgom gépe,csak hát mégsem azt kéne ilyen dolgokra használni
Ezt a programot kellesz beleégetni majd. Igazából mikrovezérlők terén még nagyon kezdő vagyok.
Én így oldanám meg:
Igen, ez így elég tetszetős
Csak az a problémám, hogy ezt nem tudom alkalmazni majd tartományokra, csak bizonyos értékekre, szóval ahhoz maradni fog azt hiszem az if-es szisztéma.
Ez a megoldás is tartományokra működik. Mivel kishiftelem az alsó 7 bitet így pontosan 128 -as (decimális) a tartomány amit kezel. Pont ahogy a példádban van. Nyilván ha nem egyforma tartományokat kell kezelni majd a végleges kódban, akkor ez a megoldás nem jó.
igen, ezt nem írtam... tehát nem egyformákat, és szám szerint sem nyolcat mint itt, hanem mintegy 32-40-et
Idézet: „igen, ezt nem írtam... tehát nem egyformákat, és szám szerint sem nyolcat mint itt, hanem mintegy 32-40-et” Az rendben van, de par dolgot erdemes eszre venni: ugye ez volt az eredeti kodod:
1. Nos, mivel az U unsiged, ezert a 0-nal nagyobb vizsgalat teljesen felesleges (valoszinuleg a compiler ki is szedi azt, vagy talan meg warningot is ad erre) 2. Mivel mindig if..else reszben van a vizsgalat, teljesen felesleges masodszor is vizsgalni, hogy a port nagyobb-e, hiszen elozoleg ezt mar megallapitottad. Tehat le lehet egyszerusiteni a kodot:
Azonkivul ha ilyen speci szamokkal dolgozol, akkor jogos az eszrevetel, hogy erdemesebb lenne shiftelgetni es csak az ertekes biteket vizsgalni. Ha mas nem azert erdemes leshiftelni, hogy byte-ba bele ferjen a vizsgalt ertek, igy a compilernek van eselye, hogy kisebb kodot varazsoljon az egeszbol, tehat:
...es akkor mar rogton latszik is, hogy hoppa, a szamok elegge specialisak, egymast kovetik, tehat siman lehetne switch...case-be berakni, tehat:
Namost ez forrasban talan hoszabbnak tuni, de nem az, sot a compiler ha minden igaz egy ugro tablat csinal ebbol osszehasonlitasok helyett, tehat a kod kisebb es gyorsabb lesz...
Értem Arról a bizonyos dupla vizsgálatról én is tudom, hogy felesleges, először én is olyan összehasonlítást csináltam, mint amit te hoztál ki belőle, csak én az íráskor már a későbbi tartományokat tartottam szem előtt, nyilvánvalóan feleslegesen ehhez a programhoz
Egyébként egy abszolút szöghelyzet jeladó analóg jelét kell digitalizálnom, és adott tartományain megfelelő elektromágneses működtetésű pneumatikus szelepeket húzgálni - csak hogy ne legyek már ennyire titokzatos Viszont örülök, hogy egy ilyen hozzáértővel akadtam össze, mint Te, mivel nekem csak halvány elképzeléseim vannak arról, a fordító hogyan dolgozik, és mi az optimális a számára...így tehát ki fogom próbálni a későbbiekben a te módszeredet a gyorsabb futás érdekében. Köszöntem a segítséged! Gyanítom, még visszatérek
Sziasztok!
Légyszi segítsetek, AVRDude-t kellene frissíteni 5.8-ra (AT90USB1287-es vezérlő miatt, mert azt a pony már nem ismeri, és be kéne állítani a kristály frekijét, arra meg a FLIP nem képes, így 2 Mhz-ről ketyeg 16 helyett), de a cygwin alatt nem megy a dolog. A leírás szerint meg kell adni az install elérési útvonalat, de nem sikerül: $ set PREFIX= esetén szintaktikai hibát ír ki, ha ( set PREFIX=
Sikerült összeraknom egy akkufesz őrt attiny45-el és egy kétszínű leddel. Ez az első dolog, amit csináltam. Ez most 6V-os rendszerű motorokhoz készült. A kétszinű led jelzi, hogy milyen feszültség van az aksiban. 6V alatt pirosan világít, 6v és 6,8v között narancs színű, ami az aksi normál állapotát jelzi, 6,8v és 7,4v között zölden világít jelezve a megfelelő töltést. Efölött pirosan villog, figyelmeztetve a túltöltésre. A mérendő feszt egy ellenállásosztóval osztom a felére, így tökéletesen mérhető a fesz. Próbapanelon, trimmerrel változtatva a feszt szépen működik. Az alapot Topi akkutöltős cikkéből vettem. Mit szóltok hozzá?
Sziasztok!
Most ismerkedem az AVR-ekkel, és már az első programommal adódott egy gond, amit nem értek. Egy Nokia3310-es LCD-t izzítottam be. Ez itt a program-kezdeményem..
Amikor csak az LCD modult izzítottam be, kb. 33% volt a programmemória foglaltsága. Ez korrektnek tűnt, mert ebben vannak a karakterek megrajzolva, ami sok memóriát eszik. Utána jött a dtostrf fv., ami egészet konvertál sztinggé. Ekkor felugrott 55%-ra a prgmem. foglaltság. Utána a második dtostrf használatakor már 66%-ra emelkedett ez az érték, miközben a regiszterek használata 75 %. Még igazából nem csináltam semmit, és lassan tele van az ATMega8-as 8K-ja. AVRStudio+WinAVR-t használok, az optimalizáció -Os, ami azt hiszem, a legkisebb kódot generálja. PIC-kel ez lényegesen kisebb kóddal volt megoldható emlékeim szerint. Azt sem értem, ha egy függvényt kétszer hívok meg, a második hívásnál miért növekszik jelentősen a prog.mem. foglaltsága. Azt hittem, hogy 8K elég mindenre (Bill után szabadon ), de most már nem tudom. Mit csinálok rosszul?
C kódot úgy kell berakni, hogy a code után beírsz egyenlőségjel után egy c betűt. Így kell kinéznie, persze szóközök nélkül. [ code = c ] Lezárás marad a régi.
Köszi.
Biztos nem először írtátok már le, csak hát vannak lusta emberek...
Szia!
Remélem tudok neked segíteni. Amikre felfigyeltem: Ez szerintem itt nem teljesen tökéletes: #define LED_ON() PORTD |= (1< Ez pedig nem ennyi lesz, mert 65 ms-nél nagyobbat nem tud késlelteni. : _delay_ms(100); Órajeldefiniálás megvolt? Üdv!>
A sornak nem látszik a vége mert rosszul szúrtam be először. Ez a rész jól működik, a led villog. Így néz ki igazából:
A késleltetés rész nem kritikus, de kösz hogy szóltál, észben tartom. A freki beállítás a Project/Configuration Options/Frequency helyen megvolt. A program warning nélkül rendesen fut, a bajom, hogy zabálja a programmemóriát. Még egy dolog van, ami zavar. Fordításkor ha valami baja van, kiír két-három warningot. Eddig rendben. Utána néha ha változtatás nélkül újrafordítom, előfordul néha, hogy eltűnnek a figyelmeztetések, 0 warninggal fordul. Utána változtatok valamit, erre újra előtűnnek az előbbi warningok. Miért tűnik el néha újrafordításkor egy-két figyelmeztetés anélkül, hogy javítottam volna? (AVRStudio 4.17 + WinAVR 20090313) Ja, és sikerült a kódbeszúrás. Csodálatos! |
Bejelentkezés
Hirdetés |