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
Írd le azt is, hogy mit néztél el.
Hátha később más is okulhat belőle.
Hát...
A AvrStudioba a csatlakozás után a Fuses fülnél a verify-t nyomogattam csak. Én magam sem értem, hogy miért hittem, hogy azzal fogja beállítani. Azt hiszem fáradt voltam/vagyok... Szóval a CKDIV8 pipa kiszedése után program gomb, aztán átállítottam az ISP frekit és működött. Üdv.
Atmelék csak úgy hirtelen felindulásból megduplázták az áraikat? Oké, hogy gyenge a forint, de ez ~20% emelést indokolna, nem 100%-ot.
Le vagy maradva... a téma ki lett beszélve a HEStore topicban is, meg itt is már. Válságkor leálltak a gyártással, kifogytak a készletek, és ezt csak most érezzük... Megjelentek a kínai AVR hamisítványok, és van amelyik procinak négyszeres lett az ára.
OFF:
De jó is ez a (v)álság, hogy minden áremelést van mire fogni :boxer: (Most itt nem a HEStore-ra gondolok konkrétan) ON:
Sziasztok, kivételesen most én kérdezek...
Adott az AVRStudio4, és C-ben írok programot ATMega16-ra. Ha két "unsigned char" számot kivonok, összeadok, vagy egyiket csökkentem/növelem 1-el egy while ciklusban, hirtelen több mint 3000 byte-al nő meg a kód. Optimalizálás: "Os" - a többinél még nagyobb lesz. miért?
Sziasztok.
Előre annyit, hogy azért kérdezek kicsit általánosan mert rá szertnék jönni a problémám megoldására, de egy ideje nem jutok előbre. (ha kell felrakom a kódot is) Feladat, hogy az ADC-re potmétert kötök. A feszültséget egy másik lábon PWM-en keresztül vissza adja. A tünet; KB fél-táp feszültségig minden jó utánna a szépen világosodó LED kialszik. Korrektül játszik minden oda-vissza. A fél-táp nagyon gyanús, de az ADC referenciájának a tápfesz van beállítva. Néztem jobbról-balra, elölről-hátulra, de mindig ugyanezt csinálja. Mit néztem be?
Forráskód nélkül kevés az információ. Biztosan kiszúrják a hibát, akár többen is, ha felrakod.
Elég nagy a kód, megpróbálom a problémát jelentő kb 10 sorra leegyszerűsíteni, új projektben.
Gondoltam, más is találkozott már vele, de úgy néz ki hogy valamit nem tudok .
Ez így elsőre nekem úgytünik hogy nem egyezik az AD átalakító és a pwm felbontása. Ha nem állítasz rajta akkor a pwm 8 az AD pedig 10 bitesen üzemel. Ha egyformára állítod mennie kéne. Persze lehet hogy hülyeség amit írok
Íme egy forráskód amit leegyszerűsítettem kevesebb 20 sorra.
A lényeg, hogy "Os" optimalizálással 3848 byte-ot ad, az adatszegmensben pedig 264 byte-ot foglal. Valahol a delay_ms -nél van a gebasz, mert ha konstanst adok neki, vagy olyan változót aminek a while ciklusban nem változtatom az értékét, akkor alig növeli a kódot... A kód innen letölthető!
A _delay_ms float tipussal megy, tehat ha azt hasznalod akkor automatan berantja a float rutinokat, attol no meg a kod.
Szóval hívjam meg 1 értékkel egy for ciklusba?
Mert ha konstanst adok át neki akkor nem nő a kód... Egyébként érdekes, hogy a delay_us is hasonlóan viselkedik.
Ha úgy működik, akkor ez egy lehetőség a megoldásra, és örülni kell neki.
De például az az út is járható, hogy saját késleltető rutint kreálsz, vagy keresel a neten, ami nem float-okkal küszködik. Esetleg assembly szárnyasbetétet is ki lehetne próbálni, ha sok időd van és szeretsz kísérletezgetni. (A szárnyas nem célzás, csak humorizálás.) Idézet: „Szóval hívjam meg 1 értékkel egy for ciklusba?” Latom hamar raerzel a lenyegere Ahogy Norberto mondta, ezt a for ciklusos dolgot beteheted a sajat fuggvenyedbe, aminek a parametere egy int, azt csokkentgeted a for helyett egy while-al ameddig nulla nem lesz. Es akkor kesz is vagy, van egy nem float-os delay_ms -ed. Valahogy igy:
Az elv a lényeg, nem a kód 100% helyssége.
Eddig for ciklussal játszottam, végülis a while is jó. Egy külön függvénybe szebb is lesz...
Sziasztok!
Mi lehet a hiba az alábbi kódban?
Amit szeretném ha csinálna: A PORTB1 kimenetként van beállítva. Ezt a kimenetet egy gombot közbeiktatva rákötöm a bemenetként konfigurált PORTB4-re. Ha gombot lenyomom azt várnám, hogy a PORTB0-ra kötött LED kigyulladjon. De nem ezt teszi. Mit rontottam el? Köszi szépen! Idézet: „Mit rontottam el?”
Például a megjelölt részt: 1. Bitet törölni ÉS művelettel lehet, nem VAGY-gyal! 2. (0< Én ezzel próbálkoznék:
A forráskód nem látszik rendesen, mert a fórum motor html tag-ként kezelte.
Látom, s sajnos a javítás sem sikerült. Szóval elmondom szóban: az utolsó taggal van probléma. Nem Vagy kapcsolat kell, s nem a nulla léptetése kell, hanem a balratolt egyes komplementálása (maszk)
Még egy megjegyzés: ha értékadással történik DDRB megadása, akkor az összes bitjét illene tisztességesen beállítani...
Én mindig csak és kizárólag vagy kapcsolattal és 0-1-gyel állítottam a ki és bemeneteket, sosem volt vele gondom...
Most egy kicsit összezavarodtam a post-ok közt. Hol is van tulajdonképp a hiba? Nem türelmetlenkedni akarok csak a portok logikai állapotának olvasása nagyon fontos lenne nekem most mert írok egy programot és hiába van kész az algoritmus elve ha már itt megakadok
Sajnos nem tudom jobban átgondolni mert nagyon az elején járok ennek az egésznek ezért is kérek segítséget. Hidd el kérlek, hogy alaposan átgondoltam én ezt mielőtt postoltam.
De azért leírom mit gondolok: Beállítok 3db portbitet. Kettőt kimenetnek egyet bemenetnek. Nyitok egy végtelen ciklust. A portb 1. bitjére kiadom a logikai egyest. Ha ezt a logikai egyest a portb 4.-edik bitjén "viszontlátom" akkor az if törzsében az utasítás végrehajtódik. 250-es delay a pergés miatt. Kinyitom a pb0-t amina led van. Ez ég 1,5 sec-ig aztán kezdődik minden elölről. Ebben az elgondolásban én sajnos nem tudom mi a hiba. :no:
Ez nem port kiolvasás, vagyis nem megfelelő... Egyszer már írtam egy példát a port kiolvasásra, de úgy látom feleslegesen jártattam a számat. A PORTB1-et nem fogod kimenetnek beállítani, mert olyan nincs. PINB1, másnéven PB1 van. Nem értem mi értelme van annak, hogy az egyik portot a másikra kötöd. Írok Neked egy main függvényt a gombnyomásra LED bekapcsolásra:
Kimenetnek nem kell beállítani semmit se. Minden bit értéke a DDR regiszterben alapból nulla, azaz bemenet... Olyat, hogy
nem írunk regiszter címzéskor. A fenti példaprogramban láthatod, hogy mit írunk helyette. Remélem tudtam segíteni.
No kipróbáltam. Sajnos nem jó ez sem nálam. A LED haloványan világít csak és folyamatosan. Ha megnyomom a gombot elenyészően nő a fénye. Egyébként kipróbáltam azt is amit a múltkor írtál de nem jött be sajnos. Azért kötöm egyik portot vissza a másikra mert mátrixbillentyűzetes kapcsolást akarok építeni és az pontosan ugyanezen az elven működik.
A hasznos infókat köszömöm!
Sziasztok!
Kérdésem a következő lenne: Létezik ez az AVR DMX nevezetű pc-s fényvezérlő, ez végülis mindegy hogy micsoda. A lényeg hogy abban egy AT90S8515 van. Ezt lehetne helyettesíteni egy AT89S52-vel (azért ezzel, mert ez van nekem itthon)? Ahogy néztem az adatlapokat a lábkiosztás nekem egyformának tűnt. Program átírása nélkül lehetséges a csere? Sajnos csak a hex file van meg, forrást nem találtam. Köszönöm a válaszokat!
variszabi peldajaban van egy apro hiba, PB1-et teszi kimenetnek, de PB0-t kapcsolgatja -- gyakorlatilag az a felhuzo ellenallast fogja csak kapcsolgatni a PB0-n. Ja es a masik apro hiba, hogy lekapcsolja a felhuzast a PB4-en, ha a gombot megnyomod. A felhuzas amugy 20k kornyekere teheto, tehat a halvagy vilagitas aktiv modban megmagyarazhato ha a PB0-n van a LED-- de passziv modban nem tudom mi van -- melyik portra kototted a LED-et?
Nem próbáltam ki, csak miután megírtam újra átnéztem, működnie kell. Trudnai, kérlek javíts ki, ha nem.
Csatoltam egy kapcsolási rajzot és egy forráskódot. Véletlenül bukkantam rá az Interneten, "Majd jó lesz valamire." címszóval. Nézd át, értsd meg a logikáját és halászd ki a lényeget. |
Bejelentkezés
Hirdetés |