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
Valamit félreértesz, nagyon is! Az egység egy szó(2 bájt).
A flash tartománya így 0x0000-0x7fff.
Sziasztok!
Szerettem volna készíteni egy olyan programot ami szoftveres PWM segítségével egy másodpercenként megváltoztatja egy led fényerejét. A a TCNTx-et és az OCRx-et két változó helyettesíti. A program nem sikerült, a led nem világít. Az áramkört ATmega8 mikroprocesszorral és 1MHz órajellel készítettem el. A kód:
A hozzászólás módosítva: Jan 5, 2013
Üdv! Szeretnék készíteni egy egyszerű I2C-s eszközt vezérlő programot a TWI interrupt vektor kihasználásával. Van valami ötletetek erre? Az ADC interrupt vektor már megy, de ezzel még nem tudtam zöld ágra vergődni. Minden válaszért köszönet!
![]()
Arduino alatt nagyon egyszerű:
wire.begin(cím) A mögöttes függvénykönyvtárból mindent ki lehet puskázni, ha natív C-ben akarod...
Simán C-ben szeretném.
![]()
A "normál" I2C megy? Egy egyszerű(pl. nyomógombos vagy időzítős) interrupt is?
Ha bármelyikre NEM a válasz akkor az garantált szívás lesz az elejétől a végéig. De a legtöbb esetben értelme sincsen, mert az a "szokás" hogy a program bevárja az I2C eszközt. Talán EEPROM égetőnél. Egyszerűbb ott is ha egyedül csak az USART-ra van interrupt, meg két ringbuffer. A "főciklus" meg mást nem csinál mint bevárogatja a TWI-t.
Felmész a www.atmel.com-ra.
Rákeresel az AVR310, AVR311, AVR312, AVR315-re. Ráklikkelsz a download software-re. Ezek mintapéldák. Attiny: TWI slave USI-ra, TWI master USI-ra Atmega: TWI slave, TWI master Az Attiny hardverből kevésbé támogatja a TWI-t, oda kell az USI és egy kicsit több szoftver. A hozzászólás módosítva: Jan 6, 2013
A normál I2C megy, Peter Fleury I2C libraryjével, ahol megvárja a TWI-t. A timeres interrupt is okés, épp most írtam meg hozzá egy progit. Lehet jobban járok ha maradok annál, hogy szépen megvárja a TWI-t...
Ha nincs FELTÉTLEN szükség az interruptolásra, akkor a bevárást ajánlom.
Nagyon sok művelet - és most nem csak AVR-ről beszélek - arra épül hogy az I2C kommunikáció sikeressége vagy eredménye (válaszul kapott érték) határozza meg a későbbi teendőket. Persze lehet olyan alkalmazás - pl. webszerver - ahol az I2C kommunikáció mellékes, de ezek már a felépítésükből fakadóan jóval bonyolultabbak mint egy mezei hőmérő vagy EEPROM égető.
Áhhh, tudtam, hogy elsiklottam valami felett...
![]() Köszi! Így már tiszta.
Helo!
Remélem jó topic-ba teszem fel a kérdést, hol tudok beszerezni AVR Pocket programmer-t, és hozzá azt a kisebb panelt, ami a szalagkábel másik oldalára megy, és 6 tüske van rajta. Most kezdem a programozást AVR-el, úgyhogy elnézést ha valamit hülyén írtam le.
Ez igaz, itt ADC és DAC lesz majd rajta, egy DAC-rel vezérelt labortápot szeretnék összerakni. Na majd meglátjuk mi sül ki belőle.
![]()
Köszönöm szépen mindenkinek a segítséget!
Most már tudok haladni a kódommal. Tesztelni még nem tudom, várok pár alkatrészt HS-ból, aztán meglátom mit is alkottam. SB
Sziasztok.Az elözö probléma megoldodott véletlen rosszul néztem a bekötést pedig ugyan ugy volt a fej ahogy a képen is... na szoval kérdésem az hogyan tudom üresen jaratni az AVR mig nem kap 1 jelet él lefut a program?irok egy példát:
PB1 en kap egy pillanatnyi jelet erre elindul a program. azonositasi példa: PB1 jel be észleli hogy 1 esre vált vagy épp az indito mezö 1 ekkor az indito parancs lefut. Erre tudtok kod részletet? mert a neten nem nagyon találtam ![]()
Sajnos a kérdésed második részét nem értem, az első meg olyan egyszerű hogy már le se merem írni:
Köszönöm igen sajna ^^ bonyolultan fogalmazok. Nekem csak a bemenet vizsgalat kellet köszönöm a segitséget. Irok majd ha sikerült a projectem.Köszönöm.
Őszintén megvallom, az "AVR Pocket programmer" kifejezést most hallom először,
általában ilyen kompakt klónokat érdemes keresni: STK500, AVRISP(-mkII), JTAG ICE, stb. IC-s adaptert szerintem elég könnyű építeni, lévén csak 6 vezetéket kell bekötni.
Ha esetleg meg is akarnád ismételni a leállítást akkor interrupt kell.
Pl. az INT0-t beállítod FEL-futó élre, az interrupt kezelőjében ugyanezt a lekérdezős várakozást teszed be, így LE-futó élnél folytatódik a program. Újabb FEL-futó élre megint meg fog állni. Hadd ne írjam le a kódot, plusz 3 sor!
Rendben nem kell
![]() ![]()
Sziasztok!
A segítségeteket szeretném kérni. Atmega16a-val egy sinusz jel digitalizálása. void adc_init() { ADCSRA=0b10000111; } int read_voltage() { ADMUX=0b01000000; ADCSRA|=(1<<6); while(ADCSRA & (1<<6)); return ADC; } Az interrupt: SIGNAL(SIG_OUTPUT_COMPARE2){ y=read_voltage(); x=(y*5000)/1023; } Valakinek otlete? Sajnos nem mukodik.>>>> A hozzászólás módosítva: Jan 7, 2013
Én konkrétan ISR-t szoktam használni interruptra.
ISR(TIMER2_COMP_vect) { ... } Milyen megfontolásból használod a SIGNAL formát? Van itt egy link, ami szerint állítólag ez régi jelölés. Mindenesetre ha a lefordított kódot megnézed, láthatod benne, hogy ki van-e töltve az interrupt vektor rendesen. Ha nincs, akkor az a baj. És miért nem az ADC_vect-et használod, amit akkor küld, amikor az ADC-t befejezte? A hozzászólás módosítva: Jan 7, 2013
Hát ez így sem jó. Leírom az egész kódot. A display() függvény 4 darab 7 szegmentesre ír ki....
Az ISR-ven abszolút nem megy.
Na így működik, csak nem mutat helyes értéket.
Megvan! Működik. Csak sajnos a szinusz jel negatív értékeire. A pozitívakra miért nem?
Lehet hogy a (Vpoz-Vneg)*GAIN*512/Vref konverziot kellene hasznalni?
Hali!
Leakadtam az ADC használatával. Adott egy 25kOhmos poti, közepe ADC0 csatorna, két vége GND és +UT=4,8V. A ADC0-án mérek 1,825V-t. Nálam AREF=AVCC= RC szűréssel +UT. ADMUX-ban csak ADLAR=1, és REFFS1=1, és REFS0 =1,többi 0. Tehát referenciafeszültségem 2,56V. Kimeneten ott a 100nF kondi. Ezáltal a ADC értékének (ADC=Vin*1024/Vref) 2DA hex-nek kellene lennie. Viszont nálam 1D8 hex az érték. Miért nem annyi, mint amennyinek lenne kellene? Máskor már használtam azt a szerencsétlen ADC-t és nem volt ilyen problémám. Tud valaki valami okosat mondani? Kipróbáltam azt is, hogy AREF-t vagy AVCC-t állítottam be, az eltérés akkor is megvolt az előírttól. Másik kérdés: AVCC és AREF össze van kötve és 10kOhmos ellenállás +UT-re húzva és egy 100nF kondival GND felé hidegítve. Okozhat ez gondot? Üdv Kiborg ui: ATMEGA16 az alany A hozzászólás módosítva: Jan 7, 2013
Nálam azzal ment el három nap, hogy ADC0 helyett ADC5-öt mértem. Az áthallás meglehetősen jó volt, csak sok volt hozzá a zaj.
Reagált a potméterre rendesen. ![]()
Köszi, de ezt kizártam már.
Több csatornát is használok, ahol ugyanez a jelenség van. Csak egyet írtam le az egyszerűség kedvéért.
Szia !
Idézet: „Nálam AREF=AVCC= RC szűréssel +UT.” Szerintem az AREF láb és a test közé 100nF kondenzátor kell, ha az UREF=AVCC, vagy, ha az UREF=Internal reference (2,56V). Ha külső referencia feszültséget akarsz használni , akkor azt kell oda kötni. Az AREF és az AVCC ellenállással való összekötése eltolhatja a referencia feszültségét az ADC-nek. Kérdés : miért kötöd össze az AVCC és az AREF lábat ? A mellékelt első kép nagyon beszédes, ha REFS0 értéke 0, akkor külső referencia feszültségről megy az ADC. Ha a REFS0 értéke 1 akkor, vagy AVCC a referencia, vagy a belső 2,56 V (a REFS0-hoz tartozó FET vezet), ekkor REFS1 értéke dönti el melyik, ekkor nem célszerű az AREF lábat külső potenciálra kötni. A második képen az AVCC szűrése látható. A hozzászólás módosítva: Jan 7, 2013
|
Bejelentkezés
Hirdetés |