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
Sajna nem indul be az usb égetőm azt szeretném megkérdezni ,hogy az ATmega8-16 AVR-t milyen kapcsolással tudnám ellenőrizni,hogy jó e? A programot bele tudom írni egy LPT égetővel csak egy kis kapcsolás kéne mi ellenőrizné jó e az AVR A kapcsolásban 8MHZ-es kvarc van meg az lpt égetőben is szerintetek jó az ajánlott 12MHz helyett? Elindulni el kéne vele nem?
Ja! Szerintem ez egy szoftveres USB (LibUSB) kommunikáció, amin kommunikál az égető ATMega8-a. A szoftverben a meghatározó időzítések és megszakítások miatt szerintem csak az erdetileg előírt órajelen lesz képes ezt a kommunikációt működtetni az IC az USB-vel.
Ha itt laknál közelben intéznék feléd egy 12MHz-es OSC-t, mert teli vagyok vele, ilyen EM600-as mérőmodulokban vannak ilyenek...
Sziasztok!
Most ismerkedek a mikrovezérlők világával és úgy látom, hogy a nyolc lábú sorozat számomra nagyon jó kiindulási alap! Nagyon tetszik a dolog, eddig csak sikerélményeim vannak! Elkezdtem építeni egy miniPOV-ot. Amit egy bicikli kerékre szereltem. Mivel 5 LED-em van, gondoltam a hatodik porton egy reed-relével lehetne a kerék fordulatszámát figyelni és így pontosabban lehetne a LED villanásokat szabályozni. Egy kilométer óra reed-relét használok, de nem tudom, hogy kössem be az áramkörbe, hogy működjön. Elég, ha a bemeneti portra rákötöm az +5V feszültséget és a relé kapcsolgatná a lábat? Vagy ez nem ilyen egyszerű?
Hello!
A kezdeti sikereken túl vagyok, és most elhatároztam, hogy egy 1 digites számlálót csinálok. A problémáim a következők: - A TIMER0-t hogyan kell használni időzítésre? - Azt meglehet oldani, hogy az egyes értékek (1, 2, 3 ... stb.) táblába legyen rendezve, mint a PIC-nél? - És ha igen, akkor hogy olvasom ki, mert nem találtam ehhez hasonló parancsot RETLW. Valakinek van ilyen példaprogramja? (a google-t már keresztül kasul átböngésztem, és nem találtam olyat, ami assembler nyelven van)
Szia! Itt egy asm programrészlet 7-szegmenses kijelző kótáblázattal. A "digit2" nevű regiszter tartalmazza a a digit értékét (0...9) és az R18-as regiszterbe olvassa be a táblázatból a hozzá tratozó kóot. A TIMER-t megszakításos módon érdemes használni, az órajelnek és az időzítésnek megfelelő előosztást alkalmazva...
Szia! A legegyszerűbb az, ha a láb és a föld közé kötöd be a Reed-relét, a lábon pedig bekapcsolod a felhúzó ellenállást. Ha a relé bekapcsol, akkor 0, egyébként pedig 1 szint lesz a bemeneten. Ha szükséges, akkor a prellmentesítést szoftveresen (késleltetéssel) meg lehet oldani.
Kösz a gyors választ! Igy már működik, (relé kapcsol, villogás, stop-start) viszont valami nem tökéletes, mert ha a kódba beteszek egy ELSE ágat, akkor azt nem hajtja végre.
Lehet, hogy a felhúzóellenállással van a gond. A relé a PB5 lábon van ami RESET is egyben. Úgy olvastam, hogy ezen a lábon már van egy beépít ellenállás. Próbáltam egy 100K és egy 4.7K -t is, de nem változott a helyzet. Végül is nem gond, mert nem akarok az ELSE ágon semmit, csak bosszant egy kicsit
Köszi a segítséget!
Nagy lendületet adtál nekem! Mégegyszer köszi!
Nem lehet, hogy azért nem hajtja végre az else ágat, mert az utólag akartad bele írni, és ha egyszer már a reset lábat ki/bemenetnek állítottad, akkor utána már nem tudod programozni?
Szerintem az if végét lehagytad innen!
Ha az egész forráskódot becsatolnád, biztos meglenne a hiba.
C kódot így szurj be:
(code=c)kód(/code) persze szögletes zárójelekkel.
Így van! Csak a 12MHZ-es quartz-al fog menni. A szoftveres USB megy nagyobbal is, de azt a program fordításánál meg kell adni, mivel az USB különböző szabványai (1.0 2.0 stb) az adat továbbítására kötött bit időzítéseket használnak. Ezt a program adott quartz-hoz számolja. Nézd meg, hogy a program milyennel van lefordítva és olyat használj. Egy quartz ára kb 70HUF. Fontos, hogy ne cseréld fel a D+ és D- lábakat. Ja és az USB-kódba nem szabad megszakítást használni!
Köszi mindkettőtöknek! Majd beszerzek egyet sajna itt nem olyan egyszerű mert messze kell menni rendelni meg most rendeltem azt a hónapra elfogyott a keret . Nekiállok guberálni hátha találok valamiben egyet
Akkor beszúrom a teljes kódot, vzoole ajánlása szerint.
Mikrovezérlő: ATtiny45
Hm. Szóval nem fut le az else ág?
Próbáld meg így is : if (!bit_is_set(PINB, 5)) { ... } else { ... }
Én is kérdeznék, PWM-nél hogy lehet megadni, hogy melyik lábon jelenjen meg a kimenet?
Közben rájöttem, az OC0A lábon lesz a timer0 esetén.
Átállítottam a bemenetet egy másik lábra és felhúzóellenállásal lefut az else ág. De így csak 4 LED-em marad. Lehet, hogy rossz a mikrovezérlőm!?
Ja és a PORTB 5-öt tedd 1 be;
PORTB = 0x20;
Sziasztok!
Érdekes dologba botlottam bele, winavr-el fejlesztek. Írtam egy függvényt, ami összehasonlít 2darab stringet (fájl kiterjesztést), és ha egyezés van akkor 1-el tér vissza különben 0-val, eddig nem nagy cucc, ez a része működik.
Na most a mainben egyszer csak valahol meghívom
Mind a kettő lefut, pedig ha csak úgy kiíratom a függvények eredményét akkor helyesen az egyik 0 a másik 1-el tér vissza Most akkor találtam egy bug-ot vagy mit rontok el? Olyan egyszerű lenne, de már vagy két órája ezzel szenvedek.
Megoldódott, hozzá kellett rakni egy ==1-et, bár elvileg enélkül is működnie kellett volna, pedig ez előtt ez se segített
Néha a fordító az if feltételben nem ismeri fel a ! jelet vagy csak simán a benne található értéket. Valószínűleg csak bool típust tud felismerni (így is kellene működnie).
Tehát mindenkinek mondom WIN AWR esetén mindig!!! írja az if feltételbe, hogy a benne található érték mivel kellene, hogy egyenlő legyen. különben szívhat, mint itt már sokan.
Ezt már én is tapasztaltam... téptem is a hajam, hogy mit csesztem el.
Ez erdekes..
Rengeteg kod van pedig igy irva a halon gcc-re. A sajat kodjaim 100%ban igy vannak irva, es soha nem tapasztaltam semmi problemat. Lehetseges hogy nem mindegyik verzional van ez a hiba.
Tényleg érdekes. Valószínű valami optimalizációs dolog lehet. Masterfoxx! Küldj nekünk a kérdéses részről LSS-t!
Hadd tanuljunk a dologból. Én kipróbáltam most, és nekem teljesen jól megy a konkrét feltétel nélkül is. Sokat segítene, ha küldenél egy LSS-t mindkét fordított kódból a kérdéses részről és hogy milyen optimalizáció mellett keletkezett ez a kód. Én nagyon gyanítom, hogy optimalizáció lesz a bűnös. Én szinte kivétel nélkül Os és O1-el dolgozom. De optimalizáció nagyon problémás tud lenni. C kódjaimban ezért elég sűrűn található "asm volatile", naked isr, inline függvények. Borzalom miket művel az optimalizáció ha az ember vakon csak C-ben fordít mikrovezérlőre.
Valaki tudja a választ?
A következő problémám van AVR studiót használok WIN AVR fordítóval. Ha egy PL T0-ába egy változó értékét növelem (m_Wait++) és volatile WORD m_Wait; ,akkor a kódom kb 2k-val nagyobb mint akkor, ha elhagyom a volatile kulcsszót. Az m_Wait egy függvényben van felhasználva mint késleltető, ahol egy while nézi az értékét. Mi lehet az oka a horrorisztikus kódméret növekedésnek? Optimalizációtól független a növekedés. Ha viszont csak nyúlfarknyi a program, akkor volatile-val vagy anélkül sincs kódméret váltoizás. Ja és, ha nem volatile a T0-ban legalább 1db változó, akkor szimulátorban meny, de a valóságban nem megy a T0. Előre is köszönöm a válaszokat.
ha a _delay_ms-nek nem konstans paramétert adsz, akkor befordítja a float library-t. Emiatt növekszik meg a kódméret.
Nem szégyen az LSS fájl olvasása, abból sok turpisság kiderül.
Konstans paramétert használok a Wait(WORD wait) függvény bemeneti paraméterének, így nincs befordítva a float rész.
Nem a _delay_ms -fg-t hívogatom, hanem sajátot.
Sziasztok!
Szeretnék AVR-ekkel foglalkozni, de teljesen kezdő vagyok. Mit ajánlotok hol kezdjem az ismerkedést? Szeretnék először egyszerű kapcsolásokon keresztül megismerkedni a programozással. Ha van valakinek valami magyar nyelvű doksija erről a témáról azt szívesen venném. Előre is köszi a segítségeteket. |
Bejelentkezés
Hirdetés |