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   110 / 840
(#) Slope válasza BlueFox hozzászólására (») Márc 15, 2009 /
 
BlueFox szimulátorban nézted?
(#) BlueFox válasza Slope hozzászólására (») Márc 15, 2009 /
 
Hello!

Igen néztem, és ott működik.
(#) Slope válasza BlueFox hozzászólására (») Márc 15, 2009 /
 
Akkor nem hiszem, hogy a programmal van a gond. Inkább a konfigurációt kell átnézni.
Pl honnan tudod, hogy a DDR regiszterállítás megtörténik abban a bizonyos init(); függvényben? Mármint az MCU-ban
(#) BlueFox válasza Slope hozzászólására (») Márc 15, 2009 /
 
Csak sejtem, illetve, ha magába az init függvénybe, a DDR regiszterállítás után írom be azt, hogy PORTB=0xF0; akkor a ledek kivillannak. Úgyhogy helyesbítek, nem sejtem, hanem tudom. Az init() függvény lefut.
(#) Slope válasza BlueFox hozzászólására (») Márc 16, 2009 /
 
És mi van most ezzel az optimalizációs dologgal? Nem igazán értettem...
Miért nem jó neked a "-Os" ?
(#) BlueFox válasza Slope hozzászólására (») Márc 16, 2009 /
 
azért, mert bizonyos dolgokhoz nem jó az optimalizálás, vezérléshez, öszetetteb dolgokhoz. Ez még a kisebb baj lenne
de nagy programoknál optimalizálva is ez a hiba jön elő, 4-5 száz soros programoknál.
(#) Slope válasza BlueFox hozzászólására (») Márc 16, 2009 /
 
Lehet triviálisat kérdezek, de a függvényeket ugye rendesen deklarálod, pl. egy header fájlban?
A main() függvényed végére tegyél egy return 0-t, ha már egyszer van visszatérési értéke...

Végezetül a linker opciókkal "játszottál" (mármint elállítottál valamit)?

még annyit, hogy már fent van a legújabb WinAVR 20090314
(#) BlueFox válasza Slope hozzászólására (») Márc 16, 2009 /
 
a linker az nem igazán tudom micsoda, részleteznéd kérlek?
a többit úgy teszem/tettem, és a return itt lemaradt, de az eredet nagy programban nem.
(#) Slope válasza BlueFox hozzászólására (») Márc 16, 2009 /
 
a makefile-t fel tudod dobni?
(#) Slope válasza BlueFox hozzászólására (») Márc 16, 2009 /
 
A linker egy a fordítóprogrammal együttműködő program. Amikor megírtad a kódod akkor és azt lefordítod gép kód keletkezik, ez az *.o (object fájl). Ezeket az objektumokat fűzi össze a linker amiből létrejön maga a futtatható program.
(#) BlueFox válasza Slope hozzászólására (») Márc 16, 2009 /
 
ittenvan

esetleg ami fontos lehet, JTAG-el programozom.

Makefile
    
(#) Slope válasza BlueFox hozzászólására (») Márc 16, 2009 /
 
Nem látom az órajel beállítását:
  1. -DF_CPU=8000000UL
ez 8Mhz

Ezt tedd bele a
  1. CFLAGS +=
sorba.
(#) BlueFox válasza Slope hozzászólására (») Márc 16, 2009 /
 
Most benne van, de semmi hatás, ugyan az, mint eddig. én arra gondoltam, égetésnél lehet még a hiba.

paraméterek ahogy égetek:
JTAG

Biztik (ezekhez én nem nyúltam, alap beállítás):

M103C pipa
JTAGEN pipa
SPIEN pipa
BOOTSZ --> Boot Flash size = 4096 words start adress=0$F000
BODLEVEL --> Brown-out detection level at VCC=2,7V

amit nem írtam, az értelemszeűen nincs kipipálva.

Csatolom az új makefile-t


Makefile
    
(#) Slope válasza BlueFox hozzászólására (») Márc 16, 2009 /
 
Kipróbálnál egy egyszerű LED villogtatást simán a main-ből?
(#) Slope válasza BlueFox hozzászólására (») Márc 16, 2009 /
 
Ja beugrott valami, nekem anno M128-nál gondom volt a mega103 kompatibilis mód miatt.
Ahogy látom Te abban vagy, de m128-ra fordítasz. Ez jelenthet még problémát.

Az M103C mellől vedd ki a pipát, M128-ként használd.

ui. lehet kompatibilis módban máskép kezeli az ugrásokat
(#) BlueFox válasza Slope hozzászólására (») Márc 16, 2009 /
 
Roppant érdekes az eredmény.
ezzel a kóddal helyettesítettem a main függvény taralmát:


  1. int i;
  2.         DDRB=0xF0;
  3.  
  4.         while(1)
  5.         {
  6.                 for(i=0;i<=500;i++)
  7.                 {
  8.                         PORTB=0x40;
  9.                 }
  10.                         for(i=0;i<=500;i++)
  11.                 {
  12.                         PORTB=0x80;
  13.                 }
  14.         }


akármit csinálok, csak az első for ciklus hajtódik végre, a második sose, kivéve persze, ha megint optimalizálom a fordítást.

tudom, az időzítés elég bugyuta, és rövid, de skóppal mértem ki, hogy tényleg nincs jel csak a 0x40-es lábon (próbáltam más számmal is, akkor meg az világított).
(#) BlueFox válasza Slope hozzászólására (») Márc 16, 2009 /
 
Bocsi, ezt most olvastam. Így már tökéletesen működik, hogy kivettem azt a pipát. Köszi a segítséget, és a fáradtságot, hogy ilyen későn válaszolgattál nekem

(#) Slope válasza BlueFox hozzászólására (») Márc 16, 2009 /
 
Semmi probléma, bár kezdhettünk volna a fusebitekkel Én szóltam h konfig hiba lesz
(#) BlueFox válasza Slope hozzászólására (») Márc 16, 2009 /
 
énis gondoltam rá, de aztán elvetettem, azt gondoltam, alap beállítás biztosan jó. tévedtem, nagyot.
(#) wg_kezdo hozzászólása Márc 16, 2009 /
 
Adatátvitelt szeretnék megvalósítani hangkártyán keresztül. (A sebesség nem lényeges).
Azért hangkártyán mert ez a laptopomon az egyetlen normális benemet. (USB-t inkább nem programoznék, ágyúval verébre esete lenne).
Az alapötlet az, hogy egy sima jackdugóval csatlakozom a hangkártyára. Az AVR pedig binárisa 1-0 sorban szépen elküldi. A kódolás programzás stb...stb... nem probléma egyik oldalon sem viszont, ha jól sejtem nem lehet csak úgy az egyik lábra (+5V) meg a földre rákötni szerencsétlen jackdugót.
Valahol találtam már hasonlót ahol frekvenciát lehetett mérni, de nem most találom, hogy mekkora fesz és áramerősség mehet rá a jack-ra.
(#) gabep válasza wg_kezdo hozzászólására (») Márc 16, 2009 /
 
Én Schmitt-trigger-ben gondolkodnék, bár várj még, hátha más ötlet is jön.
Azt most nem tudom, hogy ez sebességben mit tud, de ha nem számít, akkor szóba jöhet.
(#) szilva válasza wg_kezdo hozzászólására (») Márc 16, 2009 /
 
Az 1-eket és a 0-kat mindenképpen le kéne kódolni valami impulzusokra, ugyanis a hangcsatornák általában nem DC-csatoltak. Gondolj bele, sok egyforma bit átvitele mit okozna, a vevő oldalon nem tudnád kitalálni, hogy azok most nullák-e vagy egyek. Szerintem nagyjából valami olyasmit kellene csinálnod, mint amit annak idején a kazettás magnókra történő mentéskor és visszatöltéskor csináltak a számítógépek, pl. a C64 vagy a Spectrum.
(#) Sir-Nyeteg hozzászólása Márc 16, 2009 /
 
Üdv!
AVR belső oszcillátora mennyire stabil?
(CKOPT bepipálva)
Csináltam egy stoppert, később egy órát is majd akarok. Azt vettem észre, hogy a belső oszcillátor nem pontos. De ez kiküszöbölhető azzal, hogy pl a timert nem 50000-ig számláltatom, hanem mondjuk 50500-ig, és így az 1 mp tényleg 1 mp lesz De ez egy járható út, vagy inkább külső kvarcot kéne használni? Az pontosabb és stabilabb? Vagy a belső is tökéletes lesz, ha egyszer belövöm a timer-t?
Köszi!
(#) szilva válasza Sir-Nyeteg hozzászólására (») Márc 16, 2009 /
 
A belső a hőmérséklet- és tápfeszültségfüggése miatt nem igazán alkalmas óraalapnak, ahhoz mindenképpen érdemes lenne külső kvarcot alkalmazni.

PIC-es tapasztalataim alapján azt kell mondjam, hogy a legpontosabb órákat a direkt óra célra tervezett, 32768Hz-es kvarcokkal sikerült csinálni (az egyik ilyen órám most áprilisban lesz egy éve, hogy folyamatosan jár - 3db AA elemről - és azóta még nem siet 2 percet). Persze ez a freki a program működéséhez lehet, hogy túl lassú lenne, ezt én PIC-nél úgy kerültem ki, hogy az óraalap (timer) ment a kvarcról, a CPU pedig a belső oszcillátorról. Azt hiszem, ilyen jellegű működést az AVR-eknél is elő lehet idézni.
(#) gtk válasza vzoole hozzászólására (») Márc 16, 2009 /
 
Azert nezd meg hogy melyik megoldassal rovidebb a kod ( ha ez szamit).
Bocs a pontosvesszoert, avr-gcc nem szolt miatta, igy ott maradt..
(#) wg_kezdo válasza szilva hozzászólására (») Márc 16, 2009 /
 
Hmm...., ezt nem teljesen értem.
Na mind1 kipróbálom.
Azt olvastam, hogy 0,7V-ot lehet maximum rákötni.
Csinálok egy fesz-osztót, ha jól gondolom akkor egy 1K és egy 10K-s elég lesz az 5V-ra ekkor lesz 0,5V az 1-es a 0 meg 0 V.
Bár az igaz, hogy nem tudom mit csinál mondjuk 1mp 1-es jelre. Akkor a wav file-ban is majd 1mp-ig valami magas jelet kapok?
(#) Slope válasza wg_kezdo hozzászólására (») Márc 16, 2009 /
 
Szilva kolléga jelezte, hogy a hangkártyák nem szeretik az egyenáramú komponenseket (AC csatolt).
Tölts le egy hangkártyás szkóp programot, és mérd meg a hangkártya bemeneti időállandóját. Pl logikai 1 szintet kötsz a bemenetre, és megnézed mennyi ideig marad kiértékelhető a logikai magas szint. Ezek után értelemszerűen úgy írod a programot, hogy ennél hosszabb ne lehessen egy logikai magas szint. Több 1-es átviteléhez, pedig impulzust kell használnod.
Szerintem a legjobb lenne modulálni a digitális jelet és úgy átvinni.
(#) icserny válasza wg_kezdo hozzászólására (») Márc 16, 2009 /
 
Idézet:
„Hmm...., ezt nem teljesen értem.”

Pedig egyszerű. Kell valamilyen moduláció, hogy a jel akkor is változzon, amikor csupa 1 vagy 0 jön egymás után. Fázismoduláció, frekvencia-moduláció vagy amplitúdó-moduláció.

Mellesleg egy USB-soros átalakító egyszerűbb és hatékonyabb volna.
(#) fecus hozzászólása Márc 16, 2009 /
 
Sikerült életet lehelnem az asm i2c kommunikációba. Az egyetlen ami nem megy az a folyamatos olvasás eepromból, amikor nem kell újra címezni, csak olvasni. A gond, hogy én 125us-onként szerettem volna egy byte-ot beolvasni. Nekem 0-kat hoz így be. Ennyi idő alatt "elfelejti" az állapotát az eeprom? Próbált már valaki ilyet?

Ha stoppal lezárom és újra kiadom a konfig byte-ot és olvasom akkor megy. Ez a "CURRENT ADDRESS
READ". Így is spórolok 3 byte-ot de még egyet spórolnék a "SEQUENTIAL READ" funkcióval.
(#) fecus hozzászólása Márc 17, 2009 /
 
Egy másik kérdés. Van arra lehetőség az AVR Studióban, hogy a szimuláció során átugorjon szubrutinokat? Azért kérdezem mert az i2c olvasást nem szimulálja, így ha az benne van akkor a progi többi részét sem tudom szimulálni. Nem lehet valami konstans visszatérő értékkel kijelölni rutinokat?
Következő: »»   110 / 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