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   253 / 840
(#) (Felhasználó 4577) válasza vagnerjazon hozzászólására (») Júl 26, 2010 /
 
Szívesen.

Még azt elfelejtettem mondani, hogy az i változó teljesen felesleges, mert kezelheted a OCR1A-t is, mint egy változót.
Az i = i+5; helyére ezt kell beírni:
  1. OCR1A = OCR1A + 5;


Ezt le lehet rövidíteni ennyire:
  1. OCR1A +=5;


Tehát a
  1. OCR1A = OCR1A + 5;

ugyan az, mint a
  1. OCR1A +=5;


Minél kevesebb változót használsz, minél jobban odafigyelsz adattípusokra (pl ha nem kellenek a negatív számok, akkor int helyett usnigned int, vagy short unsigned int), annál több szabad memória marad másra.
(#) vagnerjazon válasza (Felhasználó 4577) hozzászólására (») Júl 26, 2010 /
 
Értem, köszönöm, odafigyelek rá. Tényleg egyszerűbb így. Át is írom.
(#) (Felhasználó 4577) válasza vagnerjazon hozzászólására (») Júl 26, 2010 /
 
Szívesen.
(#) killbill válasza (Felhasználó 4577) hozzászólására (») Júl 26, 2010 /
 
Szia Variszabi!

Biztos, hogy az a loop-os megoldas azt csinalja, amit irtal? Mert szerintem nem. Ha rendesen betabulalnad a kodot, akkor olvashatobb lenne. Szoval a loop++ minden alkalommal vegre fog hajtodni a vegtelen ciklusban, amig a gombot nyomjak. Igy aztan 256 ciklusonkent novelni fogja az 'i'-t. Vagy nem?

A masik, hogy a signed int es az unsigned int pontosan ugyanannyi memoriat foglal. Csak signed eseten a legfelso bit a signum bit.

Udv, Andor
(#) (Felhasználó 4577) válasza killbill hozzászólására (») Júl 26, 2010 /
 
Szia!

Nem értem, hogy miért növelné 256 ciklusonként az i értékét. Kérlek, mondd el.
Szerintem nem fog végrehajtódni az i növelése csak egyszer, mert a következő végtelenciklus lefutásakor már 2 lesz az értéke és így tovább.

Nem tudtam, hogy ugyan annyit foglal, de igazad van, mert tanultam is, hogy az egyik bit az előjel, de eddig sosem gondolkoztam rajta, csak mindig azt használtam, amire szükségem volt.

Üdv: Szabolcs
(#) killbill válasza (Felhasználó 4577) hozzászólására (») Júl 26, 2010 /
 
Ja, meg valami. A timer 16 bites regiszterei (pl:OCR1A) specialisan kezelendoek, azaz iraskor es olvasaskor nem mindegy a HI/LO sorrend. ATmega128 pdf-ben nekem a 112. oldal. (mert ugye valojaban az OCR1A az ket darab 8 bites regiszter, hiszen az AVR eleve 8 bites.) Marpedig a C fordito altal generalt kodban nem lehetsz biztos.
(#) Ricsi89 válasza killbill hozzászólására (») Júl 26, 2010 /
 
ha megfigyeled egy gombnyomás során csak egyszer fog hozzáadni 5-öt az i-hez, mert az feltétel szerint csak akkor adja hozzá, ha a loop egyenlő lesz 1-el. Tehát ha folyamatosan nyomjuk a gombot, akkor a loop értéke folyamatosan növekszik, de 1 csak egyszer lesz.
(#) (Felhasználó 4577) válasza killbill hozzászólására (») Júl 26, 2010 /
 
Arra gondolsz, hogy nem lehet változóként kezelni?
Például:
  1. OCR1A +=5;
(#) (Felhasználó 4577) válasza Ricsi89 hozzászólására (») Júl 26, 2010 /
 
Igen, én is így gondolom, ha folyamatosan nyomjuk a gombot, akkor i 4294967295-ig nő, bár ehhez már sokáig kell nyomni. Ha elérte ezt az értéket, akkor nem tudom mi történik. Nullázódik? Vagy eljön a világvége.
(#) killbill válasza (Felhasználó 4577) hozzászólására (») Júl 26, 2010 /
 
Abban igazad van, hogy nem 256 ciklusonkent fogja novelni az i-t. Ezt rosszul mondtam. A loop-ot unsigned int-nek deklaraltad, ami (gondolom) 16 bites, igy 65536 ciklusonkent fogja ujra elerni a 1-es erteket. A lenyegen nem valtoztat.
(#) killbill válasza (Felhasználó 4577) hozzászólására (») Júl 26, 2010 /
 
Komolyan nem tudod???
(#) (Felhasználó 4577) válasza killbill hozzászólására (») Júl 26, 2010 /
 
Téynleg nem tudom. :bummafejbe:
(#) killbill válasza (Felhasználó 4577) hozzászólására (») Júl 26, 2010 /
 
Igen, arra gondolok. Meg arra is, hogy az

  1. OCR1A = i;

nem feltetlenul lesz jo. Ezt a C sort a C fordito ket ertekadasnak fogja forditani, es szerintem semmi nem garantalja, hogy a felso byte-ot fogja irni eloszor. Itt az idezet a doksibol:
To do a 16-bit write, the high byte must be written before the low byte. For a 16-bit read,
the low byte must be read before the high byte.
(#) (Felhasználó 4577) válasza killbill hozzászólására (») Júl 26, 2010 /
 
Hogyan kell megfelelően kezelni?
Nem tanultam sehol sem, hogy hogyan kell, csak forráskódokból láttam, hogy mások is így kezelték és én is ezt láttam, nekem eddig nem volt vele gond, még akkor sem, amikor változóként kezeltem.
(#) vagnerjazon hozzászólása Júl 26, 2010 /
 
Most ugyanezzel a programmal tranzisztorral erősítve megpróbáltam vezérelni egy motort, az elején jó is, de nem sokkal azután, hogy már forog a motor(és nem sípol a kicsi feszültség miatt), elkezd összevissza változni minden rendszer nélkül. Pl.: felfut, és elölről kezdi, vagy visszaesik, vagy fölpörög-lelassul-fölpörög-lelassul egy darabig. Pedig a LED-del nem csinálta.
(#) (Felhasználó 4577) válasza vagnerjazon hozzászólására (») Júl 26, 2010 /
 
Én FET-et szoktam használni, mert nem kell neki bázisellenállás.
A motorral párhuzamosan raktál be diódát?
Nem tudom mekkora áramot fogyaszt a motorod, gondolom valami magnóból kiszerelt motor lehet, egy 1A-es dióda bőven elég.

Nem tudom miért bolondult meg, majd a nálam okosabbak megmondják.

Esetleg szkóppal nézz rá az AVR kimenetére, hogy mit csinál, amikor a motor megbolondul.

Egy kikötést rakhatnál bele, hogy ne érje el a regiszter értéke a 255-öt ne érje el és ha csökkented ne is mehessen 0 alá.
Én arra tippelek, hogy elérte a 255-öt a regiszter értéke.
(#) vagnerjazon válasza (Felhasználó 4577) hozzászólására (») Júl 26, 2010 /
 
Diódát nem tettem, de mindjárt teszek. Amúgy valami kis játékautóból, vagy hasonlóból(már nem emlékszem) kiszerelt motor. Megnézném én szkóppal, de sajnos nincs. Miért, akkor mi van, ha eléri a 255-öt?
(#) killbill válasza (Felhasználó 4577) hozzászólására (») Júl 26, 2010 /
 
Orulj neki, ha nem volt vele soha gondod. Az meg, hogy masok hogyan csinaljak, az semmit nem jelent. Te is igy csinalod, masok is tanuljak toled, mikozben nem tudod, hogy mi tortenik egy valtozoval, ha noveled...

Egyebkent nem is azt mondtam, hogy nem fog mukodni, csak azt, hogy lehet vele problema. Speciel az OCR1A olvasasa eseten nincs semmi problema, az irasakor meg a felso byte-ot kell elobb irni. Ha eppen igy fordit a C fordito, akkor mukodni fog az

OCR1A = 1234;

De ez a 'C' nyelv definicioja szerint nem garantalt. Speciel nekem a gcc 'jo' sorrendben teszi le a byte-okat, de emlekszem, hogy egy regebbi verzio (talan a 2.95-es) meg lo-high sorrendben tette le.

Megfeleloen ugy kell kezelni, hogy ket egymast koveto irassal irsz a regiszter felso es also byte-jara, csak ez nem eppen trivialis, ha volatile unsigned int-nek van eredetileg deklaralva az OCR1A. Ha van olyanod, hogy OCR1AH es OCR1AL, akkor az a megoldas. OCR1AH a felso byte, L az also.

tehat:
  1. unsigned int pwm;
  2.  
  3.  OCR1AH = pwm >> 8;
  4.  OCR1AL = pwm & 0xff;
(#) (Felhasználó 4577) válasza vagnerjazon hozzászólására (») Júl 26, 2010 /
 
255 lehet a maximum értéke, mivel 8 bites.
Ha nagyobb értéket asz neki nem tudom pontosan, hogy mi történik, én mindig tettem kikötést, de biztos összekócolódik valami.
(#) vagnerjazon válasza (Felhasználó 4577) hozzászólására (») Júl 26, 2010 /
 
Tettem rá diódát, és most nem őrül meg csak nem lehet elérni a maximum fordulatot. Kikötést mindjárt teszek a programba, jó lenne, ha csak az lenne a baj.
(#) (Felhasználó 4577) válasza killbill hozzászólására (») Júl 26, 2010 /
 
Köszönöm!
Ezt elraktározom!

És akkor ennek is ugyan így lehet értéket adni, mint a regiszternek? Mármint arra gondolok, hogy 100%-os kitöltési tényezőhöz így:
  1. unsigned int pwm = 255;
  2. OCR1AH = pwm >> 8;
  3. OCR1AL = pwm & 0xff;


Lehet, hogy most oltári hülyeséget fogok mondani, kérlek halkan nevess majd.
Azt vettem észre Atmega8-nál (még Attiny13 PWM-ével foglalkoztam, de arra már nem emlékszek, mert nagyon régen volt), mintha "invertálva" lenne az OCR2, tehát a 0 a 100%-os kitöltési tényező és a 255 a 0%-os.

Érdekesnek találtam, de írtam egy ilyen függvényt:
  1. int kitoltesi_tenyezo(unsigned int kitoltes)
  2. {
  3.         kitoltes *= 2.55;
  4.         kitoltes = 255-kitoltes;
  5.         OCR2 = kitoltes;
  6.  
  7.         return 0;
  8. }
(#) (Felhasználó 4577) hozzászólása Júl 26, 2010 /
 
Jajj...
Most esett le!
Hogy ez két regiszter. Nem figyeltem eléggé.

Először azt hittem, hogy az OCR2-re gondolsz, ami ugye a 8 bites PWM-ben van, de nem, mert a 10 bitesre gondolsz.

Akkor az előző hozzászólásomban a 100%-os kitöltési tényező ez:
  1. unsigned int pwm = 1024;
  2. OCR1AH = pwm >> 8;
  3. OCR1AL = pwm & 0xff;
(#) vagnerjazon válasza (Felhasználó 4577) hozzászólására (») Júl 26, 2010 /
 
Az a gondom a diódával, hogy mivel elemről megy az egész, nagyon sok áram megy rajta, azért olyan lassú a motor. Vagy felejtsem el az elemet, és használjak tápegységet, vagy trafót?
(#) killbill válasza (Felhasználó 4577) hozzászólására (») Júl 26, 2010 /
 
Eloszor is! A 255 szerintem nem feltetlenul a 100%-os kitoltesi tenyezo, de ezert most vegig nem olvasom a dokumentaciot. Legalabbis ATmega128-on a timer1 az 16 bites, igy a PWM is lehet nagyobb, mint 8 bit. Ez csak felprogramozas kerdese.

A peldaban, amit irtam, a 'pwm' csak egy lehetseges megoldas volt. Irhatod azt is, hogy

OCR1AH = 0;
OCR1AL = 255;

Ugyanazt csinalja. Ez az egesz azert kell, mert valahogy garantalni kell, hogy az OCR1A mind a 16 bitje egyszerre valtozzon meg, amikor irsz bele. Mivel a processzor egyszerre csak 8 bitet tud irni, igy ket irassal kell megoldania a 16 bites regiszter irasat. Ez egy sima valtozonal nem erdekes (de lehet az, ha pl. interrupt is hasznalja azt a valtozot), viszont egy timer pwm regiszternel igenis gondot okoz. Egy pelda: mondjuk eddig az OCR1A erteke 0x1ff volt
es most novelni akarod 0x200-ra.

Tehat jelenleg OCR1AH = 0x01, OCR1AL = 0xff,

Ha csak ugy siman elkezded ket irassal megvaltoztatni,
akkor fals ertek lesz benne, amig meg nem valtoztatod mindket 8 bites reszt:

eddig:
OCR1AH = 0x01 OCR1AL = 0xff ( = 0x01ff)
elso iras utan:
OCR1AH = 0x02, OCR1AL=0xff ( = 0x02ff)
masodik iras utan:
OCR1AH = 0x02, OCR1AL = 0x00 ( = 0x200)

Lathato, hogy egy nagyon rovid idore OCR1A 0x2ff erteken volt, ami nem kivanatos, hiszen a timer kozben dolgozik. Azert, hogy ez ne fordulhasson elo, a timer-ben van egy atmeneti regiszter, amivel ez a problema kikuszobolheto. Nem akarom hosszan magyarazni, a mukodese erthetoen le van irva az Atmel doksiban.
(#) morgo válasza zombee hozzászólására (») Júl 26, 2010 /
 
Zombee! Meg tudnád adni a com0com mellett futtatandó progi nevét? (esetleg link?)
Most ugyanis ott tartok, hogy látja a windóz, de nem ismeri fel, a com0com-ot telepítettem, meg a libusb-t is, de kevés...
Úgy érzem én is váltani fogok, de jó lenne kipróbálni, ha már megépítettem.
(#) v alaki hozzászólása Júl 26, 2010 /
 
Sziasztok,
Lenne egy kérdésem. (LCD-k HD44780 kompatibilis)
Olvasgatva a
[url=Az intelligens LCD modulok használata - I. rész ]
cikket valmit nem látok tisztán.
Ahhoz, hogy beállítsam az LCD-t 4 bites üzemmódba,kell a 8 adatvezeték(mert szerintem a parancsok 8 bitesek)
Ha kell a 8 bit a vezérléshez, akkor meg mi értelme van a 4 bit-nek? (gondolom indítás után senki se forrasztgatja le a másik négy vezetéket az AVR-ről )
Le lehet "csonkolni" az alsó 4bitet? (fel-le lehet-e ellenállásokkal húzni?)
... vagy ha egyszer offline beállítom 4 bitesnek megjegyzi?
Előre is köszi.
(#) Fizikus válasza v alaki hozzászólására (») Júl 26, 2010 /
 
Olvassad el a cikk 2. reszet is es akkor minden vilagos lesz! (a 4 bites adatatvitel fejezetet nezzed meg)Bővebben: Link
(#) novarobot hozzászólása Júl 26, 2010 /
 
Sziasztok!

STK200-as LPT programozóm van, melyet XP-n használok WIN-AVR el.

Fel telepítettem 4 másik XP-s gépre, de egyik gépen sem működik, mert programozás közben a WIN-AVR azt a hiba üzenetet adja, "faled to open LPT1".

Természetesen az userport nevű programmal engedélyeztem az lpt hozzáférést XP alól, és minden más LPT portot használó programom működik, csak a WIN-AVR nem fér hozzá a porthoz, de a 5 gépből csak 1 gépen jó, a másik 4 gépen ugyan olyan beállítások mellet nem.

Mi lehet a probléma? Újra szeretném telepíteni a gépemet, de míg nem jó egy másik gépen is az AVR- égetőm nem merem.

Novarobot
(#) vagnerjazon válasza novarobot hozzászólására (») Júl 27, 2010 /
 
Idézet:
„A telepítés végeztével menjünk be a C:\WinAVR....\bin könyvtárba, majd ott futtassuk le a giveio.bat-ot; ez azért kell, hogy majd fel tudjuk programozni az AVR-t az AVRdude programmal.”
Megcsináltad ezt? Az oldalon lévő WinAVR-es cikkben van, amikor még STK200-at használtam, én is bajlódtam vele, bár nem emlékszem, nekem mit írt ki. Remélem, tudtam segíteni.
(#) vagnerjazon hozzászólása Júl 27, 2010 /
 
Hogyha van a főprogram részben egy while ciklus, ami nem végtelen, hanem addig fut, amíg egy változó értéke 0, és a ciklusban van egy feltétel, ami ha teljesül, egyre állítja a változót, és van mégegy ciklus a fő részben, ami pedig akkor fut, ha a változó értéke 1, és abban is van egy feltétel, ami 0-ra állítja, ha teljesül, akkor miért nem fut újból az első ciklus, amikor a második 0-ra állítja? Legalábbis nekem nem akar futni, pedig szerintem kéne neki.
Következő: »»   253 / 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