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
Ezzel én is mindig így vagyok, ezért kérdeztem a többieket , de Topi megnyugtatott.
Tagolt írás, pontokkal, vesszőkkel, összeszedetten. Ezek azok, amiket a többiek hiányolnak a hozzászólásodból.
A következő ilyenért a figyelmeztetés színe kékről pirosra változik.
én sem értettem, emlékeztet egy régi osztálytársamra aki, - azután, hogy 1-est kapott mivel nem használt írásjeleket - minden szó után pontot tett....
Nekem nem az irasjelekkel van a gondom, azt meg hurisztikus ill. brute-force modszerekkel ki lehet talalni... Inkabb azt nem ertem ki kivel van, mit hova dugok es hogyan is kotom ossze, mert jomagam osszekotni a cipofuzomet szoktam
A masik gondom, hogy niincs elozmeny mivel nem 'Valasz'-ra kattintott Steven19, hanem az ' Uj kerdes felvetesere'. Azt is ki lehetne otolni persze, hogy mivel kapcsolatos ez az 'uj kerdes' de annyi idom sajnos nincs, amennyit a lustasaga miatt el kellene ezzel toltenem.
Ha leveszed a kvarcot es a kvarc kondijait, akkor elofordulhat h sikerul ujjaeleszteni, csak par percig nyomogatni kell a ponyprogban a fuse bitek irasat. Ill. azt is erdemes megprobalni, hogy az XTAL1 labat, ha szinten leszedtel rola mindent, csipesszel erintgeted. Ez a ket fele osszeszedett zavarjel mar segitett nekem parszor visszahozni.
Ha ez nem megy, es igy is ugy is veszel alkatreszt, akkor sokkal celszerubb egy 5V-os 4MHz-es kvarcosszcillatort venni, mint osszerakni darabokbol. Kb 160 forint, szerintem a probanyakon osszerakni egyet koltsegesebb es idoigenyesebb is...
En egy kis idotoltes utan rajottem, hogy mit is akar mondani Steven19. A topi fele programozo avrjenek a stk200 altali programozasat irta le, es kozelebe se jart annak, hogy az orajel hianya most a fo tema
AVR studióban próbálok olyan projektet farigcsálni, aminek lennének asm-es részei is. Az asm forrás ugye .s fileba kerül, próbából csináltam egy üres fügvényt, amit a c kód main()-jéből meg is hívok. A beépített szimulátorral próbálok boldogulni, a project options-ben kikapcsoltam mindenféle optimalizálást.
Azt tapasztalom, hogy lépésenkénti nyomkövetésnél az asm-ben írt függvénybe nem megy bele, holott az egész forrása rendelkezésre áll a projektben. Sőt, a .s file-t elővéve abba breakpointok sem helyezhetők el. Ha a nyomkövetésnél átváltok disassembly view-ba, akkor ott persze sikerül lépésenként végrehajtatnom az assembly rutinocskámat, viszont ilyenkor meg a c forrásbeli sorok elég borzasztóak, gépi utasításonként lépegetve őket. Van arra valami kényelmesebb módszer, hogy úgy tudjak a szimulátorban a saját programommal dolgozni, hogy a rendelkezésre álló összes forrásfile-ban történjen meg a lépésenkénti nyomkövetés?
Helló mindenkinek! Valakinek házilag sikerült már megcsinálnia a Topi féle AVR-es programozót STK200-al úgy hogy az eszköz telepithető? Mert én már új ATmega8-al csinálom és még mindig ugyanazt csinálja, most attól félek nehogy megint tönkretegyem, mert ha sikerül akkor nagyon felfog bosszantani. Csak tudnám miértnem Irja le ide Topi a megoldást arra hogy hogyan kell ponyprogba vagy bármibe ami STK200-al tud kommunikálni hogy fel lehessen végre programozni az ATmega8-at.
Szia!
Én ugyan nem építettem még meg a programozót, de PonyProggal szoktam Mega8-at programozni. Nem akarok hülyeséget mondani, de a procit a Topi féle programozóban akarod felprogramozni, vagy külön kivetted egy dugdosós próbapanelre, és abban próbálod? Mert az a kapcsolás nem úgy van megcsinálva, hogy a benne levő procit abban a panelban úgy tudjad felprogramozni. (max ha forrastasz vezetékeket a megfelelő lábakra...) Ha kirakod egy kis próbapanelrre, adsz keni tápot, meg teszel mellé egy kvarcot, és rádugdozod a miso mosi sck rst gnd vezetékeket, akkor menni fog STK200-al és ponyproggal. nekem a legmezeibb programozóval is teljesen jól megy (én csak lptport+ellenállás+vezeték változatú stk200-at használom) Remélem segítettem, Üdv
Helló Zoknee! Nekem mellékelt képen látható STK200-am van, csak én a célprocesszor lábaira ráforrasztottam a megfelelő vezetékeket, mikor meghülyült akkor csak simán beleraktam a panelbe amibe ott volt a 12MHz-es kristály és akkor visszatudtam hozni hogy helyrehozzam. Ha már te programoztál párszor ATmega8-at megkérhetlek rá hogy ird le nekem hogy kell?
Mert én még az analóg áramköröket megértem abban már annyira kezdő nem vagyok, de ebben nagyon kezdő vagyok első mikrovezérlős áramköröm lenne, aminek a felprogramozását én csináltam, majd ezután szeretnék ráirni programokat csak először az eszközök legyenek meg. Tudsz nekem segiteni?Segitségedet előre is köszönöm.
HAli
Olvass vissza másfél oldalt, pont én is hasonlókat éltem át. De sikerült Ahogy én csináltam, és jó lett: -STK200-ra mega8. Tápot, és kvarczot neki. (én az 5 drótossal csináltam) -Megfelelő Fuse bitek beállítása (visszább 1 oldallal, de ponyprog-al vigyázz, pont fordítva kell benne pipálgatni) -Flash feltöltése -Mőködés élvezése
Mégmielőtt belefutnál abba a hibába mint én...
PonyProg2000-ben megnyitod: Configuration and Security bits -Read CKOPT - ne legyen pipa CKSEL0 - ne legyen pipa CKSEL1 - ne legyen pipa CKSEL2 - ne legyen pipa CKSEL3 - ne legyen pipa A többit hagyd ahogy van. -Write -aztán mehet a flash betöltés. ui.: Azért innen olvasd el: link
Egy kis segítségre lenne szükségem:
ATTiny45-re szeretnék 5 gombot. (egyenlőre elég kettő is). Megszakítással simán megy egy gomb, de amikor többet akarok használni valahogy "nem érzékeli". Beállítom bascom-ban input-ra, majd megpróbálom lekérdezni: do if PORTB.2=0 then set led end if loop Próbáltam már mindenhogy: 10k-s felhúzó ellenállással, nélküle, +, - póluson, 0 helyett 1-el de semmi mintha nem bemenet lenne. ha int0-t használok akkor ugyanazzal a kapcsolássam működik, de ha másik lábra teszem és a fenti kódot használom semmi sem történik.
Nem ismerem a Bascom-ot, de nem "PINB.2"-t kellene írni, ha a bemenetet akarod olvasni?
Nem tudom teljesen össze vagyok zavarodva pedig csak két lábat szeretnék kapcsolóként használni...
Egy halom doksit megnéztem illetve mintaprogramot is, de mindenhol vagy 1 kapcsoló (int0-n) vagy pedig 3x4-es meg hasonló bonyolult kapcsolókat írnak le. Olyat, hogy mondjuk 4 láb=4 kapcsoló sehol sem láttam. Igazság szerint nem is érdekel annyira a hardver része inkább a szoftver ezért is idegesít, hogy ennyi időm elmegy rá. Minden készen várja a vevő az adó "adó" része csak ezek a kapcslók nem működnek. (Amúgy Infrával vezérelne egy szervót (két irányba) és egy motort előre-hátra)
A PORTB.2-vel a tároló tatalmát tudod lekérdezni (vagy módosítani), és mindig azt kapod eredményül, amit korábban bele írtál (vagy a reset utáni alapállapotot, ha még nem módosítottad). Szilvának igaza van, a bemenet fizikai állapotát a PINB.2-vel tudod lekérdezni.
Igazatok volt kicsit átgondolva (nem kapkodva) máris tiszta a kép.
Bemásolom ide, nagyon tanulságos a kezdők számára:
Helló Vzolee! Köszönöm szépen a segitségedet! Isten vagy! Örök hálámmal tartozom neked. 3db Mega8-ból 1db működik. Majdnem a fele. Majd csatolom és irom hogy hogyan kell elkövetni Ponyprogban ezt a műveletet. Ja és képpel illusztrálom a fuse bitek beállitását. Jó éjt.
És mindenkinek kellemes ünnepeket.
Sziasztok!
Elkezdtem írni egy nokia 3410 kijelző vezérlést mikropascalban Atmega8-ra. Az eddigi eljárások nagyon frankón lefordultak, de most egy ilyen hibába ütköztem mint ahogy a csatolt képen van. Az az érdekes hogy ha a szov változót kiveszem és globálisan deklarálom akkor például olyanba köt bele hogy az ord függvény (ami mellesleg egy beépített függvény) nincs deklarálva Előre is köszi a segítséget
A hibaüzenetek arra utalnak, hogy nem lehet változó hosszúságú string-et érték szerinti paraméterként átadni az eljárásnak. Vagy ki kellene írni szögletes zárójelekkel a hosszát, vagy pedig cím szerint kellene átadni (hú, de rég volt már pascal a kezemben: talán az eljárás fejlécébe kellene a "var" szócskát biggyeszteni a "szov" elé).
Közben próbálkoztam és bejött amit mondtál, a paraméterkénti átadás. köszi az ötletet, de még mindig van egy problémám. Az ord függvényt nem ismeri fel ha egy változónak akarom visszaadni az értékét. ha csak simán meghívom akkor nem problémázik, de hát önmagában nem ér semmit. Azt írja ki hogy: Ord not declared.
nem sajnos, azzal is próbálkoztam. bár azt írja hogy beépített rutin, de nem lehet hogy valamilyen unitot meg kell hívni hogy működjön?
esetleg valami más amivel lekérdezhetem egy adott karakter ascii kódját?
Egy elvi kérdés, csak hogy jól értem-e:
A számláló megszakítás minden órajelnél növeli a számlálóját amíg túl nem csordul utána az elejétől kezdi. Két int0 megszakítás között szeretném az időtartamot vizsgálni úgy, hogy kb 10-20ms után már nem lényeges. Vagyis utána már elég tudom, hogy túllépte a max időkorlátot. A mostani megvalósítás a timer0-t használná ami túlcsoruláskor beállít egy jelzőbitet, hogy lejárt az idő. Az int0 pedig lekérné ezt illetve, ha még nem járt le akkor az aktuális timer0 számértékét. Ez jó megoldás vagy inkább mást javasolnátok? (az int0-ban megállítani és újraindítani a számlálót azért nem lenne jó, mert másra is fel szeretném használni igazság szerint csak a túlcsordulást kell figyelnem) Amúgy infra jelátvitelt valósít meg 4 bitesen bár gyakorlatban még nem próbáltam, hogy mennyire működik.
sziasztok! remélem valaki tud segíteni ebben, a következő a dolog EEPROM-ba akkarok írni:
while(EECR & (1<< EEWE )); ebből az EEWE-t nem ismeri, így le sem fordítja a Codevision. Tudnátok erre egy megoldást? Köszönöm!>>
Mintha egy kis fogalomzavart éreznék a hozzászólásodban. Nem a számláló megszakítás növeli a számlálót, hanem az az órajel ütemében (illetve ha van előosztó, akkor annak túlcsordulása ütemében) növekszik. A számláló túlcsordulása okozhat megszakítást, ha úgy van beállítva.
Amit leírtál, az persze működhet, azaz a timer interrupt-ban lehet beállítani flaget, amit vizsgálsz. Arra azért figyelni kell, ha az int0 lekezelésében nem állítod a timert, akkor lehet, hogy akár a következő pillanatban "beüt" egy timer túlcsordulás, szóval eléggé át kell gondolni, hogy mikor elég a flaget figyelni és mikor nem. Egy másik megoldás lehet az, hogy a timer regiszteréhez még szoftveresen hozzáteszel 1-2 byteot, és mindig időkülönbségeket számolsz a 2-3 byte-os értékekből.
Tisztelt Hozzáértők!
Van egy MEGA8-asom, és egy USB-s bootloaderem AVG-GCC-ben. Ezt az 0x1800-as címtől égetem be, belefér a programmemória végéig (0x1FFF). Benne is van. Annyit kell róla tudni, hogy az első utasítások egyike bekapcsol egy BOOTLED nevű LED-et, hogy lássam, hogy ott van, és az utolsó előttiek egyike pedig kikapcsolja, az utolsó utasítása a 0x0000 címre való ugrás. Na most, ha bekapcsolom a mikrovezérlőt, a vezérlő a 0x0000-ás címtől eljut pár ms-on belül a 0x1800-ig, és ha nincs megnyomva a gomb, ahogy az lenni szokott, akkor nem csinál semmit, nem tölt le USB-n keresztül semmit. Ha megnyomom, le tudok tölteni egy programot, amit a 0x0000-ás címtől kezdődően beleír, ügyelve, hogy nehogy túl hosszú legyen a program, és saját magát is felül írja. EZ MŰKÖDIK IS. Lenne egy egyszerű programom, ami csak annyiból áll, hogy
Ebben csak annyi a gáz, hogy ezt egyetlen egyszer tudom beprogramoztatni a bootloaderral, mert hogy soha többé nem jut a vezérlő a 0x1800-as címre, ahol megnézné, hogy megvan-e nyomva a gomb. Most kísérleteztem, hogy a programba, amit a bootloaderral betöltök, abba beleírok egy ilyen trükkös dolgot, hogy:
Ezzel azt szeretném elérni, hogy egyszer menjen a 0x1800-as címre (jump_to_bootloader()), és nézze meg, hogy megvan-e nyomva a gomb. Ha nem, úgyis visszatér a 0x0000. De valahogy mégis végtelenszer beugrál a bootloaderhez, és nem tudom megoldani amit szeretnék. Remélem érthető amit írtam, remélem van erre valami formalizmus, hogy ezt hogyan szokás, de még nem dolgoztam a gcc compilerrel sem sokat, meg ez az USB-s bootloader is új még számomra. Köszönet minden segítőnek.
Ezt 2 gombbal szokták megoldani, bár lehet, hogy profibb körökben más a bevett szokás. Legalábbis! abban a sulis cuccban, amit mi használgattunk az előző félévben (NanoBoard), ott a következőképpen volt megoldva:
- egy gomb, amely egyszerűen direktben reset-et okoz - egy gomb, amely aktiválja a bootloader-t (továbbiakban BL) Eme két gombot fizikailag egymáshoz nagyon közel tervezték, így el lehetett azt érni, hogy amolyan "hullámszerű-megnyomással" aktiváljuk egyik gombot a másik után. Olyasmi mozgást gyakoroltunk a gombokra, mintha egy autógumi ment volna el az érintkezőkön Tehát először megnyomtuk a Reset gombot, aztán közben megnyomtuk a BL-t, és úgy vettük el az ujjunkat a gomboktól, hogy sorrendben, először a reset gombot engedtük fel, aztán a BL-t. Ezzel a módszerrel jutottunk el a Bootloader funkcióhoz. Ha csak simán Reset-et akartunk létrehozni, hogy a betöltött tesztprogramunk elölről fusson, akkor szimplán csak a Reset gombot nyomkodtuk. Ha viszont új programmal akartuk feltölteni az AMEGA-t, akkor a fentebb vázolt hullám-szerű ujjmozdulatokat kellett alkalmaznunk. Tul. képp a Reset gombot nyomtuk meg, és miközben azt felengedtük, még picit nyomvatartva hagytuk a BL gombot is. Ezt érzékelte a betöltött Botloader olyasformán, hogy most akkor ő következik, kommunikálva a PC-vel, új programot akarnánk tölteni majd a mikrovezérlőre. Nem tudom, mennyire volt világos, remélem, azért le lehet szűrni a lényeget
Netán a FuseBitesnél beállítani, hogy a Bootloaderen kezdjen?
És ha nem jön az USB-s holmin keresztül 0,5...1 sec-ig adat lépjen ki.... Ez mindenféle gombnyomogatásnál, resetelgetésnél elegánsabb.... |
Bejelentkezés
Hirdetés |