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
Ez már megtörtént...de miután beégettem ATmega8 - ba, a PORTC olyan gyorsan változik, hogy LEDekkel nem tudom megnézni a PORTC - t. Csak egy 1s időzítés írásában szeretnék segítséget kérni
Akkor légy szives azt magyarázd el nekem hogy abban hogyan fordítsam le a kódot .HEX-be. mert nekem legalább 65 hibával áll le vagy néha többel is leáll.
Arra én is rájöttem hogy IAR-ra lett irva a forrás mert az már a main.c elején levan írva. És azért kértem ha lehet akkor vki mutassa már meg nekem azt hogy hogyan lehet megcsinálni AVR studiohoz mert abban otthonosabban mozgok, ahhoz képest hogy kezdő vagyok "nagyon kezdő" Köszi előre is.
Szia!
Jó a 13 helyett a 45. Programot szerintem nem kell módosítani (de ha kell akkor is csak minimálisan). 45-ösbe négyszer annyi a programmemória, így bőven beleférnek extra dolgok is, de még a 13-ba is befér a kisütés funkció.
Igazad van. 2 byte vagy 2 oktet, 2 a 16-odikont akartam írni.
Már egy egyszerű programnál kiadja a hibát. És igen a procit jol configuráltam.
Sziasztok!
Vajon mi lehet a hiba a következő kódban? int V1=ReadADC(); int V2=V1*((2560/1024)*10); int V3=V2/10; A mikrokontroller Atmega8 és az a cél hogy amennyi milivoltot (mV) kap az ADC lábára, azt az értékű egész számot írja bele V3-ba. referencia feszültség belső 2,56Vra állítva! előosztás 2 A tizes szorzás azért kell hogy ne kelljen lebegőpontos változókat használni. a segítségeteket előre is köszönöm szépen!! Üdv: Sunci
Esetleg így próbáld meg. B az byte nem bit. (osztás utáni maradékképzés). Ezt jelzi is a hibák között. Nekem ez lefordul. Az mondjuk érdekes, hogy a kevés az SRAM azt nekem egyáltalán nem hozta.
az miért van hogy 88 ADC egységről 79 ADC egységre ugrik. Mivel ebből van kiszámolva hőmérséklet is ezért a hőmérséklet felbontása is nagyot ugrik. Valamikor jó valamikor ilyen nagyot ugrik. ennek 2 tized C° pontosságúnak kellene lennie,
Multiméterrel mérve az LM35-ösön pedig szépen csökken a feszültség. Az ADCnek meg valamikor ilyen "darabos" a léptetése.... Vajon mitől lehet?
A középső sor:
Ha 2.56 helyett 2560-al szorzod, akkor mV-ban mérsz és már nem is kell lebegőpontos számolás.
Az adatlap szerint 1LSB ugrálás normális, a többi pl nem megfelelő NyÁK fólia miatt vagy tápfeszültség miatt lehet. Az AREF-en van 100nF? Az AVCC-n 100nF? Az AVCC és VCC-t egy 10 Ohm-os ellenálláson keresztül kösd össze.
ez így nekem 000-át mutat:
eloFinal=(ADC1/1024)*2.56; Final=eloFinal; int ADC1T = Final/100; int ADC1E = Final%100/10; int ADC1TD= Final%100%10; if(ADC1T>9) { ADC1T=10; ADC1E=10; ADC1TD=10; } multiplex(ADC1T,ADC1E,ADC1TD,ADC1/100,ADC1%100/10,ADC1%100%10,0,0,0,0,0,0);
Áhh, már látom. a HW stack/Soft stack/Framesize értékét vedd le és akkor jó lesz. (verzió:1.11.9.5, de szerintem ez nem gond - A stack-ek másra valók).
A legjobban úgy látjátok ha felteszem az egész forráskódot:
Köszönöm szépen! Akkor mégse configoltam jol be a procit
bocs az okoskodásért de már tiszta ideg voltam. Űdvv. zacc
A multiplex fv 12db egész számot kap bemenőként. 12db 7 szegmenses kijelző van a panelen. Kiíratnám vele a celsius-t és íratom vele az ADC értéket is hogy lássam mi hogy változik.
így van összerakva:
Szívesen! Akkor most indulhat a lényeg, további jó programozást.
int V1=ReadADC();
int V2=V1*((2560/1024)*10); int V3=V2/10; Hogy is történik a dolog részleteiben: 1. V1 felveszi a beolvasott ADC értéket ( 16 bites szám ) 2. Az zárójelek feloldása - 2560 / 1024 = 2 ( maradék - 512 - eldobva, mivel két egész osztása történik ) - 2 * 10 = 20 - V2 felveszi a V1*20 értéket 3. V3 felveszi a V2 / 10 értéket ( maradék itt nem keletkezik, de elvileg keletkezhetne , ami el is lesz dobva) Még nem értek az Atmega8-hoz és nem tudom, hogy valójában hány bites az AD átalakító felbontása. A fenti problémát 12bites AD esetén én úgy kompenzáltam az egész számokkal történő számolásnál, hogy osztásnál a maradék ne vesszen el. A részeredmény következő szozásánál előveszem a maradékot, amit szintén felszorzok és elvégzem rajta a korábbi osztás műveletet és ezzel az eredménnyel korrigálom ( hozzáadom ) a szorzás eredményét. Pl. A = 119 ; B = 10 C = ( A / B ) * 10 Korrekció nélkül: A / B = 11; C = 11 * 10 = 110 ( valami elveszett ) Korrekcióval: A / B = 11 ; A \ B = 9 ( ez a maradék ) C = 11 * 10 + ( 9 * 10 ) / B = 119 ( megvan minden ) Persze bizonyos esetekben ez sem ennyire tökéletes, de ez csak egy példa.
Van valakinek kedve tesztelni az AVR Atmega RTC (Valós idejű óra) könyvtáramat? Jól jönne egy-két tesztelő. Természetsen ha teljesen készen lesz, akkor publikálom. Talán egy cikk is készül majd. A könyvtár az Atmega AVR család belső RTC-jére épül, azaz kell hozzá egy 32,768Khz -es óra kavarc. Szerintem elég sok dolgot tud már most is a könyvtár. Kezdve a több független RTC indításától a szökőév és téli-nyári idő átállításig. Naptár funkció is van és több nyelvet is támogat.
A NavMan GPS-emben egy olyan vedelem volt, ami nagyon hasonlit a 3. rajzhoz. A fo kulonbseg azonban az volt, hogy a bemeneten levo dioda egy zener, igy a tulfesz ellen vedett, es a szokasos zeneres fesz oszto aramkor annyiban modosult, hogy az ellenallas helyett egy gyorsn olvado biztit raktak bele. Tehat akkor is, ha elerte a zener kuszob feszultseget, ill ha forward iranyban elerte a 0.6V-ot, akkor a dioda kinyitott es ugye a bizti szepen elszallt ezzel megovva az aramkor tobbi elemeit. Ja, es igy tulfesz ill forditott polaritas ellen is vedett...
Egy EPROM olvasót csinálok egy nagyon speciális EPROM-hoz.
17 biten kell címezni és 16 biten kell visszaolvasni az adatokat ugyan azokon a címzési lábakon. 2db portot használok az olvasáshoz és egy + bitet egy harmadik porton a címzéshez. A címzésnél nem használhatom a 0.bitet, emiatt egyel shiftelnem kell. PORTA = also8bit PORTB = felso8bit PORTC.3 = extra bit a címzéshez A feladatom a következő: C-ben hogyan tudok a leggyorsabban úgy shiftelni egyel, hogy a PORTA, PORTB is shiftelődjön, ugyan akkor a PORTC.3-ba is belekerüljön a shiftelés után a PORTB utolsó bitje?
Írtam neked egy kis függvényt. Ami elvileg azt csinálja, amit te szeretnél. Kipróbálni nem próbáltam. Azt nem írtad, hogy az egész PORTC rendelkezésre áll-e. Én az egyszerűség kedvéért feltételeztem, hogy nincs semmi másra használva a PORTC csak az extra bit kiküldésére.
Nem hiszem, hogy különösebben magyarázatra szorulna a függvény használata. Meg kell neki adni paraméterben a 16bites címet és kész.
En ezt nem ertem. Most akkor 18 bites, amibol csak 17 bitet hasznalsz? (tehat lefele/jobbra kellene shiftelni), avagy 16 bites a cim ami szavakat cimez es amibol shiftelessel kell elo allitani a 17 bites byte cimzest (ahogy azt ATtiny peldajaban is csinalja)?
27C1028 a ROM típusa.
16 bites a cím. De az AD0-át címzéshez nem használhatom. A shiftelés után lesz egy A16-os értékem. ATtiny példája szerintem jó lesz kiindulásnak. Egy picit azonban átírtam. Nemsokára leszimulálom.
Sziasztok!
Szeretnék egy max 500Hz-ig mérő frekvenciamérőt AVR-el. Nem szükséges, hogy pontos legyen, csak az a lényeg, hogy mérjen és ne legyen hőfokfüggő. Arra gondoltam, hogy egy külső oszcillátort kötök az AVR-re, ami 16 MHz lesz és egy ATmega16-ot fogok használni. A következő az alapötletem: A 16 bites Timer fut 100Hz-en. A külső interrupt minden felfutó él számolására van beállítva. A Timer és az interrupt megszakításában is egy-egy változót növelnék egyesével. A Timer1 beállításai a következők lennének:
Ez így pontosan 100Hz: 16000000/(2*64*(1+1249)) A külső megszakítás pedig így nézne ki (na ebben nagyon nem vagyok biztos, ilyet még nem csináltam):
Az elképzelésem működőképes és ha igen, akkor mennyire pontos? Mit kell írni C-ben a Timer és Interrupt megszakításokhoz az ISR-be? Negyed másodpercenként szeretnék friss frekvencia adatot kapni. Ebben az esetben hogyan kell számolni a main függvényben? Tehát ha elérte a timer-nél növelt változó értéke a 25-öt, akkor nullázom a timer változó értékét, kiszámolom a frekvenciát, majd nullázom az interrupt változót.
Szia!
Javaslom tanulmányozd át az adatlap Timer -ekkel foglalkozó részénél az Input Capture Unit -ot. Mivel az pontosan frekvencia mérésre van kitalálva. Én biztos ezt használnám. De a te elgondolásod is helyes, csak bonyolultabb. Én nem használnék külső órajelet. Egy 16Mhz-es kvarc -ot kötnék az AVR-re. az is elég pontos. Gyakorlatilag nincs nagy eltérés egy külső 16Mhz-es kvarc oszcillátor és egy sima 16Mhz -es kvarc között.
Köszönöm a választ!
Elnézést, kvarcot akartam írni! Futólag belenéztem az Input Capture Unit-ba, elsőre nekem magas, de ha több időm lesz jobban belemélyedek!
Sziasztok!
Nemrég elkezdtem az USART-tal foglalkozni, működött is minden, amíg nem próbáltam meg a több processzoros kommunikációs módot. Az elején bármi volt a cím a vevő mindent fogadott, később meg már semmit. Az adó és a vévő kódját(csatolva) is már töbször átnéztem, de nem találtam hibát, egyedül a 9.bit és a 2.stopbit használata nem teljesen világos. Bármilyen ötletet szívesen fogadok.
Az ADC kihagyásra az előosztó 128-ra való beállítása volt a megoldás. 2-őn volt.
Szia! Én is prószálgattam az USART-ot de én távirányítónak használtam volna inkább. Mondjuk a kísérlet félbe szakadt Más jött közbe de visszatérek majd rá
![]() Az elképzelésem csak vázlatosan írom! Nem programnyelven!!! Ahhoz újra bele kellene merülni az adatlapba ![]() ![]() Sztem adóba: USART írás (cím) delay USART írás (adat) delay USART írás (átvitelt befejez) delay USART írás (új cím) ................. Vevőbe: USART (olvas) if(nekem szól?) igen: USART (olvas) if(adatvége==olvas) igen: akk vissza az elejére nem: akk végrehajt és vissza "igen: USART (olvas)" |
Bejelentkezés
Hirdetés |