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
![]()
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 |