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
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:
Ezt le lehet rövidíteni ennyire:
Tehát a
ugyan az, mint a
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.
Értem, köszönöm, odafigyelek rá. Tényleg egyszerűbb így. Át is írom.
Szívesen.
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
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
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.
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.
Arra gondolsz, hogy nem lehet változóként kezelni?
Például:
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.
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.
Téynleg nem tudom. :bummafejbe:
Igen, arra gondolok. Meg arra is, hogy az
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.
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.
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.
É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.
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?
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:
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.
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.
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:
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:
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:
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?
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.
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.
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.
Olvassad el a cikk 2. reszet is es akkor minden vilagos lesz! (a 4 bites adatatvitel fejezetet nezzed meg)Bővebben: Link
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
Idézet: 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. „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.”
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.
|
Bejelentkezés
Hirdetés |