Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
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
Lapozás: OK   211 / 841
(#) gabi20 válasza ATtiny hozzászólására (») Ápr 19, 2010 /
 
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
(#) Steven19 válasza ATtiny hozzászólására (») Ápr 19, 2010 /
 
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.
(#) gtk válasza (Felhasználó 4577) hozzászólására (») Ápr 19, 2010 /
 
Teljesen OFF ez a tema.
(#) vzoole válasza Hujikolp hozzászólására (») Ápr 19, 2010 /
 
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ó.
(#) zacc válasza Kafka hozzászólására (») Ápr 19, 2010 /
 
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.

prog.jpg
    
(#) Suncorgo hozzászólása Ápr 19, 2010 /
 
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
(#) Kafka válasza zacc hozzászólására (») Ápr 19, 2010 /
 
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.

attiny13.JPG
    
(#) Suncorgo hozzászólása Ápr 19, 2010 /
 
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?
(#) (Felhasználó 4577) válasza Suncorgo hozzászólására (») Ápr 19, 2010 /
 
A középső sor:
  1. int V2=(V1/1024)*2.56;


Ha 2.56 helyett 2560-al szorzod, akkor mV-ban mérsz és már nem is kell lebegőpontos számolás.
(#) (Felhasználó 4577) válasza Suncorgo hozzászólására (») Ápr 19, 2010 /
 
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.
(#) zacc hozzászólása Ápr 19, 2010 /
 
Hát Igy sem megy. Neked milyen Bascomod van?

tiny13.jpg
    
(#) Suncorgo válasza (Felhasználó 4577) hozzászólására (») Ápr 19, 2010 /
 
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);
(#) Kafka válasza zacc hozzászólására (») Ápr 19, 2010 /
 
Á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).
(#) Suncorgo hozzászólása Ápr 19, 2010 /
 
A legjobban úgy látjátok ha felteszem az egész forráskódot:

4ch_homero.c
    
(#) zacc válasza Kafka hozzászólására (») Ápr 19, 2010 /
 
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
(#) Suncorgo válasza (Felhasználó 4577) hozzászólására (») Ápr 19, 2010 /
 
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:
(#) Kafka válasza zacc hozzászólására (») Ápr 19, 2010 /
 
Szívesen! Akkor most indulhat a lényeg, további jó programozást.
(#) Ideiglenes válasza Suncorgo hozzászólására (») Ápr 19, 2010 /
 
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.
(#) ATtiny hozzászólása Ápr 19, 2010 /
 
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.
(#) trudnai válasza Sir-Nyeteg hozzászólására (») Ápr 20, 2010 /
 
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...
(#) Amarton hozzászólása Ápr 20, 2010 /
 
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?
(#) ATtiny válasza Amarton hozzászólására (») Ápr 20, 2010 /
 
Í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.

  1. void shifter(uint16_t cim)
  2. {
  3.  uint32_t tmp = cim<<1; //1-el balra shifetljük
  4.  PORTA = (uint8_t)(tmp&0xff);
  5.  tmp>>8; //8-al jobbra shifetljük
  6.  PORTB = (uint8_t)(tmp&0xff);
  7.  tmp>>8; //8-al jobbra shifetljük
  8.  PORTC = (uint8_t)(tmp&0xff);
  9.  //PORTC = (uint8_t)tmp; //elvile ez is jó lehet az előző sor helyett. Kicsit gyorsabb talán.
  10. }
(#) trudnai válasza Amarton hozzászólására (») Ápr 20, 2010 /
 
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)?
(#) Amarton válasza trudnai hozzászólására (») Ápr 20, 2010 /
 
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.
(#) (Felhasználó 4577) hozzászólása Ápr 20, 2010 /
 
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:
  1. TCCR1A = (1<<FOC1A); // FOC be
  2. TCCR1B = (1<<CS10) | (1<<CS11); // 64-es előosztó
  3. TCNT1L = 0;
  4. TCNT1H = 0;
  5. OCR1AL = C;
  6. OCR1AH = 31;

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):
  1. MCUCR = (1<<ISC10) | (1<<ISC01);
  2. GICR = (1<<INT0);


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.
(#) ATtiny válasza (Felhasználó 4577) hozzászólására (») Ápr 20, 2010 /
 
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.
(#) (Felhasználó 4577) válasza ATtiny hozzászólására (») Ápr 20, 2010 /
 
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!
(#) labu01wx hozzászólása Ápr 20, 2010 /
 
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.

kod.png
    
(#) Suncorgo hozzászólása Ápr 20, 2010 /
 
Az ADC kihagyásra az előosztó 128-ra való beállítása volt a megoldás. 2-őn volt.
(#) Suncorgo válasza labu01wx hozzászólására (») Ápr 20, 2010 /
 
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á Gondolom akk van 1 adód és több vevőd(vagy lesznek,ha 1 van még).

Az elképzelésem csak vázlatosan írom! Nem programnyelven!!! Ahhoz újra bele kellene merülni az adatlapba de, már este van

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)"
Következő: »»   211 / 841
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem