Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
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
Lapozás: OK   86 / 840
(#) Dudus válasza Steven19 hozzászólására (») Dec 17, 2008 /
 
Ezzel én is mindig így vagyok, ezért kérdeztem a többieket , de Topi megnyugtatott.
(#) Moderátor hozzászólása Steven19 hozzászólására (») Dec 17, 2008
 
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.
(#) wg_kezdo hozzászólása Dec 17, 2008 /
 
é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....
(#) trudnai válasza (») Dec 18, 2008 /
 
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.
(#) Reggie válasza vzoole hozzászólására (») Dec 19, 2008 /
 
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...
(#) Reggie válasza trudnai hozzászólására (») Dec 19, 2008 /
 
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
(#) szilva hozzászólása Dec 19, 2008 /
 
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?
(#) Steven19 hozzászólása Dec 20, 2008 /
 
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.
(#) zoknee válasza Steven19 hozzászólására (») Dec 20, 2008 /
 
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
(#) Steven19 válasza zoknee hozzászólására (») Dec 20, 2008 /
 
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.
(#) vzoole válasza Steven19 hozzászólására (») Dec 20, 2008 /
 
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
(#) vzoole válasza Steven19 hozzászólására (») Dec 20, 2008 / 4
 
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
(#) wg_kezdo hozzászólása Dec 20, 2008 /
 
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.
(#) szilva válasza wg_kezdo hozzászólására (») Dec 20, 2008 /
 
Nem ismerem a Bascom-ot, de nem "PINB.2"-t kellene írni, ha a bemenetet akarod olvasni?
(#) wg_kezdo válasza szilva hozzászólására (») Dec 20, 2008 /
 
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)
(#) vegyészmérnök válasza wg_kezdo hozzászólására (») Dec 20, 2008 /
 
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.
(#) wg_kezdo válasza vegyészmérnök hozzászólására (») Dec 21, 2008 /
 
Igazatok volt kicsit átgondolva (nem kapkodva) máris tiszta a kép.
Bemásolom ide, nagyon tanulságos a kezdők számára:
  1. Led1 Alias Portb.1
  2. Led2 Alias Portb.2
  3. Config Portb = Input
  4. Config Portb.1 = Output
  5. Reset Led1
  6. reset led2
  7. Disable Interrupts
  8. Do
  9.  If Pinb.2 = 0 Then
  10.    Set Led1
  11.    Waitms 100
  12.    Reset Led1
  13.  End If
  14.  
  15.  If Pinb.3 = 0 Then
  16.    Set Led2
  17.    Waitms 100
  18.    Reset Led2
  19.  End If
  20. Loop
  21. End
(#) Steven19 válasza vzoole hozzászólására (») Dec 21, 2008 /
 
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.
(#) Istike88 hozzászólása Dec 21, 2008 /
 
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

hiba.JPG
    
(#) szilva válasza Istike88 hozzászólására (») Dec 21, 2008 /
 
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é).
(#) Istike88 válasza szilva hozzászólására (») Dec 21, 2008 /
 
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.
(#) szilva válasza Istike88 hozzászólására (») Dec 21, 2008 /
 
Kisbetű/nagybetű nem zavarhat?
(#) Istike88 válasza szilva hozzászólására (») Dec 21, 2008 /
 
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?
(#) Istike88 válasza Istike88 hozzászólására (») Dec 21, 2008 /
 
esetleg valami más amivel lekérdezhetem egy adott karakter ascii kódját?
(#) wg_kezdo hozzászólása Dec 21, 2008 /
 
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.

(#) zsuscsinyo hozzászólása Dec 21, 2008 /
 
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!>>
(#) szilva válasza wg_kezdo hozzászólására (») Dec 21, 2008 /
 
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.
(#) deguss hozzászólása Dec 22, 2008 /
 
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
  1. for(;;){
  2.    wdt_reset();
  3.    PORTC |= (1<<PC4);
  4.    _delay_ms(100);
  5.    PORTC &= ~(1<<PC4);
  6.   _delay_ms(100);
  7. }


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:

  1. uint8_t look_for_bootload = 1;
  2. ...
  3. if (look_for_bootload){
  4.    look_for_bootload=0;
  5.    jump_to_bootloader();                       
  6. }


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.
(#) Norberto válasza deguss hozzászólására (») Dec 22, 2008 /
 
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
(#) TavIR-AVR válasza deguss hozzászólására (») Dec 22, 2008 /
 
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....
Következő: »»   86 / 840
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem