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   333 / 840
(#) sikolymester válasza yoman917 hozzászólására (») Jún 21, 2011 /
 
Persze!

Az ADMUX regisztert bitenként éseli a 11110000 bitsorral.

Ha az ADMUX tartalma pl 10010111 volt, akkor az eredmény 10010000 lesz.
(#) tursaba válasza yoman917 hozzászólására (») Jún 21, 2011 /
 
Az alsó 4 bitet nullára írja (törli), a felső 4 bitet változatlanul hagyja.
(#) kovacsj hozzászólása Jún 21, 2011 /
 
Sziasztok!

Van egy nagy problémám. GSM modult illesztenék egy Atmega16-hoz, egyelőre próbapanelen. A képen látható értékeket mérem, és így nem merem összekapcsolni a kontrollert a GSM modullal, mert annak a bemenő feszültsége max 2.8+03V lehet.

Jól van ez így? Mi lehet a hiba? Azt a 4.4V-ot sokallom és miatta nem merem. A másik feszültség rendben is lenne.

Köszönöm előre is a segítséget!
(#) kovacsj válasza kovacsj hozzászólására (») Jún 21, 2011 /
 
Elfelejtettem mondani, hogy a modul felől az RX és TX lábak szabadon vannak,. ha ez jelent valamit.
(#) kovacsj válasza kovacsj hozzászólására (») Jún 23, 2011 /
 
Sziasztok!

A bekeretezett OR és NM feliratok (nanofarad?, mikrohenry?, vagy micsoda egyáltalán?) jelentését szeretném megtudni.
Tudna valaki segíteni?
Köszönöm előre is!

antenna.jpg
    
(#) Massawa válasza kovacsj hozzászólására (») Jún 23, 2011 /
 
Igy az semmi - valoszinüleg a szövegben találsz erre utalást.
(#) trudnai válasza kovacsj hozzászólására (») Jún 23, 2011 /
 
Nem hinnem, kulonben lenne elotte ertek is, de en csak L201 es L202 stb jeloleseket latok ott.
(#) kovacsj válasza trudnai hozzászólására (») Jún 23, 2011 /
 
Az pedig 200 és 2000 mikroHenry? Vagy milliHenry? Ezt honnan lehet megtudni? Katalógusból?
(#) trudnai válasza kovacsj hozzászólására (») Jún 23, 2011 /
 
Nem, az L201 az egy jeloles en szerintem, ami az alkatreszt azonositja be a kapcsolasi es a beultetesi rajzon. Az 'L' a tekercsek jelolesere hasznalatos, a 'C' a kondenzatorokera, 'D' dioda stb.

Hogy mekkora az erteke ugy velem nincs feltuntetve, lehet a szovegben targyalja, lehet csak iranymutatokat ad es neked kell kiszamolnod magadnak az igenyeidnek megfeleloen -- nem tudom mi az a PDF ugyhogy fogalmam sincs, csak a kep alapjan amit mellekeltel ezt gondolom.
(#) kovacsj válasza trudnai hozzászólására (») Jún 23, 2011 /
 
Csak abból gondoltam, hogy bizonyos SMD ellenállásoknál is hasonló a jelölés. 202 az 2000, 103 meg 10000. Az utolsó szám értéke mutatja meg, hogy hány nullát kell még hozzátenni. Az L,C és D jelentéseit ismerem, és ez egy Quectel M10-es adatlapja lenne.
De lesznek még itt egyéb gondok is.
(#) kovacsj válasza trudnai hozzászólására (») Jún 23, 2011 /
 
Jobban megnézve az adatlapot neked van igazad. (Mint mindig. )A beültetéshez szükséges jelölések lesznek. Marad az eredeti probléma: mi a fene lehet az OR és az NM?
(#) mazso1988 hozzászólása Jún 23, 2011 /
 
Sziasztok
Most ismerkedem az AVRSTUDIO programmal és érdeklődnék hogy már egy meglévő hex állományt hogyan tudok mountolni, és utána a cél AVR-be programozni?
(#) yoman917 hozzászólása Jún 23, 2011 /
 
Sziasztok
Lenne egy kérdésem, de egy kicsit bonyolult. Egy akksitöltőt építettem, és szerettem volna kiíratni hozzá 7 szegmensű kijelzőkkel az aktuális volt és amper értéket. Az áramerősséget egy 0,1R 5W-os ellenállással oldottam meg, amelyet egy műveleti erősítővel kötöttem az AVR-re, a feszültséget pedig egy fesz.osztóval. A referencia feszültség 5V. Ennek megfelelően állítottam be mind a kettőt. Viszont a programmal gondban vagyok, mert a kijelző mindhárom értéke 9-et mutat. Float típusú változót nem tudok beleírni, mert nem fér rá az AVR-re (Attiny 24 2k Flash). Tudnátok segíteni a programban?
Üdv,
yoman
(#) Ricsi89 válasza kovacsj hozzászólására (») Jún 23, 2011 /
 
Az az OR az nullaR, vagyis nulla Ohm. Az NM meg a kondenzátor fajtája lehet, bár nem biztos.
(#) Massawa válasza Ricsi89 hozzászólására (») Jún 23, 2011 /
 
Az biztosan nem mert itt müterhelésröl ill antennacsatolásrol van szó.
Az sem biztos (ilyen frekvencián nem szokásos), hogy azok diszkrét alkatrészek, hanem a NYÁK megfelelö kialakitása adja a csatolást ugy induktiv mint kapacitiv szempontból.
(#) sikolymester válasza yoman917 hozzászólására (») Jún 24, 2011 /
 
Szükségünk lenne kapcsolási rajzra, illetve forráskódra, különben nem tudunk semmi konkrétat mondani, maximum nagy szólamokat, hogy állíts be mindent helyesen és írj jó kódot, amit persze feltételezünk, hogy igyekeztél, csak valami nem sikerült.

Egy kis pontosítást viszont hadd kérjek külön: A 7 szegmenses kijelzőre ki tudod íratni a számokat ? Tehát egy ilyen egyszerű ellépteti a számokat 0-tól 9ig az működik?

Amennyiben ez megy, akkor persze marad a kérdés, hogy az ADC helyesen működik e? Ha erre is igen a válasz, akkor valszeg valami típuskonverzió hiba lesz, amit a forráskódodból tudhatunk csak meg.

(Ha nagyon hosszú a kódod, akkor illeszd be csatolt fileként, de lehetőleg mindent amiben lehet fontos dolog a számunkra)
(#) mazso1988 válasza sikolymester hozzászólására (») Jún 24, 2011 /
 
Köszi
Ezt el is felejtettem megnézni!
(#) yoman917 válasza sikolymester hozzászólására (») Jún 24, 2011 /
 
Szia
Igen a 7 szegmensű kijelzővel foglalkoztam már, építettem már motorba üzemóra mérőt, és kifogástalanul működik. Persze attól még lehet, hogy itt nem működik. Beírom a forráskódot, szerintem elfér, és magyarázgatok hozzá.
  1. #include <avr/io.h>
  2. #include <math.h>
  3. #define F_CPU 8000000UL
  4. #include <avr/delay.h>
  5.  
  6.  
  7. void ADInit()
  8.        {
  9.                 ADMUX|=  (1<<ADLAR);
  10.                 ADCSRA|= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
  11.                 }
  12.  
  13. unsigned char Beolvas10BitADC(unsigned char csatorna)
  14.                 {
  15.                 ADMUX = (ADMUX & 0b11110000) | csatorna;
  16.                 ADCSRA |= (1<<ADSC);
  17.                         while (ADCSRA & (1<<ADSC));
  18.                                         ADCSRA |= (1<<ADSC);
  19.                         while (ADCSRA & (1<<ADSC));
  20.                         return (ADCL | (ADCH<<8));
  21.                 }
  22.  
  23.  
  24.  
  25.  
  26.         int main (void)
  27.         {
  28.                
  29.        
  30.                 DDRA=0xEC;
  31.                 DDRB=0xF;
  32.                                
  33.                                
  34.                                 uint8_t U1, U2, U3 erositesvolt;
  35.  
  36.                                 erositesvolt=(2400/(6800+2400)); // feszültségosztó miatt fel kell szorozni                         
  37.  
  38.                                 U1=((5*Beolvas10BitADC(4)/1024)/erositesvolt); //volt elso digit
  39.                                 U2=((U1)/10)-((int)U1)/10; //volt masodik digit
  40.                                 U3=((U1)/100)-((int)U1)/100; //volt harmadik digit
  41.  
  42.                        
  43.                                
  44.                        
  45.                         while(1)
  46.  
  47.  
  48.                         {
  49.                        
  50.                                
  51.                                
  52.                                                 //1. digit beállítása volt
  53.                                 PORTA|=0x80;
  54.                                 PORTB|=U1;
  55.                                 _delay_us(1300);
  56.                                 PORTA^=0x80;
  57.  
  58.                                                 //2. digit beállítása volt
  59.                                 PORTA|=0x40;
  60.                                 PORTB|=U2;
  61.                                 _delay_us(1300);
  62.                                 PORTA^=0x40;
  63.                                                 //3. digit beállítása volt
  64.                                 PORTA|=0x20;
  65.                                 PORTB|=U3;
  66.                                 _delay_us(500);
  67.                                 PORTA^=0x20;  
  68.  
  69.                                 /* A lábak konfigurálásánál volt még egy két extra dolog: a 7 szegmensű kijelző egyik pontja világít,
  70.                                  egy led mutatja, ha az akku feltöltött teljesen áramerősség mérés is, de kivettem a programból, mert
  71.                                  előszőr csak a feszültségmérést szeretném kivitelezni */
  72.  
  73.  
  74.                                
  75.  
  76.                        
  77.                        
  78.  
  79.                
  80.                        
  81.  
  82.                
  83.                                
  84.  
  85.                                
  86.                
  87.                        
  88.  
  89.                        
  90.  
  91.  
  92.                        
  93.  
  94.  
  95.                         }
  96.         }


A portB 4 kimenete egy 74LS47-es 7 szegmens meghajtóra megy rá. A referencia feszültség 5V, és úgy állítottam be, hogy az Aref lábra kötöttem az AVR tápfeszültségét ( tudom hogy máshogy is meg lehet oldani), és ennek megfelelően próbáltam konfigurálni. A feszültségosztón max feszültségnél 4,9V megy az AVR 4-es csatornájába (PA4).
Remélem érthetően írtam le
Üdv,
yoman
(#) zolee1209 válasza yoman917 hozzászólására (») Jún 24, 2011 /
 
Szia!

A kódhoz nem tudok hozzászólni, mert assembly-ben programozok.
Ha 5V-ot használsz referenciának, akkor elég, ha kiválasztod referenciának az AVCC-t, és akkor nem szükséges az AREF lábat bekötni. Persze ettől még működnie kell. Továbbá az AREF lábon legyen kondi a test felé.
(#) kiborg válasza zolee1209 hozzászólására (») Jún 24, 2011 /
 

Szia!

Akkor nem csak én vagyok ilyen elvetemült, hogy assemblyben nyomom ? Kezdek megnyugodni.


Grafikus felületet LCD-re írtál már? (vonal húzás, kör rajzolása?)

Üdv Kiborg
(#) Istvanpisti válasza yoman917 hozzászólására (») Jún 24, 2011 /
 
Szia !

Én több problémát is felfedezni vélek.
Az "erositesvolt" változó 1 bájtos egész, emiatt a (2400/(6800+2400)) értéke 0 lesz. De, ha ez rendben lenne akkor az U1-gyel lenne baj, mivel az U1 változó is ugyanilyen típusú, ez is csak egész értéket vehetne fel. Tegyük fel, hogy a Beolvas10BitADC(4) függvény visszatérési értéke pl. 100 (ezzel a függvénnyel is baj van ezt majd mindjárt), amit öttel szorozva kapsz 500-at, majd elosztod 1024-gyel és az U1 értéke máris 0.
Visszatérve a Beolvas10BitADC(4) függvényre, mely egy előjel nélküli 1 bájtos adatot adna vissza, bár a return argumentumában 2 bájt szerepel. Célszerű lenne ha a fv. visszatérési típusa unsigned int lenne, ekkor már 0..1024 közötti értéket kapnál vissza.
Gondold végig nem lenne-e célszerű mV-ban számolni Volt helyett ?

Üdv Istvanpisti
(#) zolee1209 válasza kiborg hozzászólására (») Jún 24, 2011 /
 
Jutyub videóim között vannak grafikus kijelzős cuccok, de ezek egyikében sincsenek ilyen rajzolós dolgok. Kissé bajban vagyok a vektorokkal és szögfüggvényekkel.
(#) kiborg válasza zolee1209 hozzászólására (») Jún 24, 2011 /
 
Szia!

Néztem youtub-os videóidat, nem semmik.(számomra legalábbis)
Másik része a dolognak, hogy ott is vannak egyenesek, lekerekítések, azok fixen letárolt helyen vannak, vagy hogyan oldottad meg a rajzolását?

Nekem az lenne a célom, hogy ASM-ben írjak egy olyan rutint, aminek megadom a kezdő és cél koordinátát és ő meg megrajzolja a vonalat, körnél meg a középpont és sugár kellene. Szép feladat lesz ahogy egy-két alkalommal hozzáfogtam...
Én a matekos résszel vagyok meglőve, hogy egy gyökvonást hogy tudok elvégezni egy ilyen Mega16-al, ha tudnák gyököt vonni, már nem lenne semmi problémám, és szögfüggvény se kellene hozzá.

Üdv Kiborg
(#) yoman917 válasza Istvanpisti hozzászólására (») Jún 24, 2011 /
 
Szia
Alapvetően a programot float tipusu változókba tömörítettem, hogy törtekben is tudjon számolni, és számítottam rá, hogy ezzel a megoldással már az első osztásnál az eredmény 0. Igazából az a bajom, hogy a float nem fér rá, mert a hex fájl egyből 10K-s lesz. AVRStudioval programozok. De elméletben ezzel a módszerrel is ki kéne írnia hogy 0, nem?
Üdv,
yoman
(#) Istvanpisti válasza yoman917 hozzászólására (») Jún 24, 2011 /
 
Szia !

Szerintem nem kellene kiírnia a nullát, mert nullával nem szorzol, hanem osztasz, ez pedig nem értelmezett művelet a matematikában. Nem tudom az AVR mit csinál nullával való osztásra.
Próbáld meg a Beolvas10BitADC(4) függvény visszatérési értékét unsigned int-re módosítani, majd először hagyd a feszültségosztót csak lépésről lépésre haladj.
Az U1 is legyen unsigned int és tedd ebbe e változóba a Beolvas10BitADC(4) függvény értékét és ezután nézd meg mit ír ki. Ekkor az ADC 0..1023 közötti értékét kellene ábrázolnia. Multiméteterrel meg tudod mérni a feszültségosztó alsó tagján mekkora a jel és milyen viszonyban van ez az ADC által mért értékkel.Ha ez már jó, akkor kellene azzal foglalkozni, hogyan kezeld a feszültségosztó hatását. Ha nem lesz jó, akkor az ADC-nél kell tovább keresni a hibát.

Üdv: Istvanpisti
(#) Fizikus válasza yoman917 hozzászólására (») Jún 25, 2011 /
 
Most csak gyorsan atfutottam a kodod, de nekem ugy tunik hogy az ADC-t beallito ADInit() fuggvenyt sehol sem hivod meg a foprogramban. Addig az ADC sem fog mukodni...
(#) vagnerjazon hozzászólása Jún 25, 2011 /
 
Sziasztok!
Van egy ilyen szervóm. És ez a program fut egy ATtiny2313-on, ami szoftveres PWM-et állít elő. Ha a szervót ezzel a jellel szeretném működtetni, akkor miután beáll a kívánt pozícióba, "remeg". Eddig egy helyet találtam(az egyik végállás közelében), ahol normálisan megáll. Az ilyen szervók viszont normálisan mennek vele.
A szervó elvileg jó, mert ha AVR-rel hardveresen előállított PWM-ről megy(8 bitessel próbáltam), akkor nincs ilyen gond.
Vajon mi lehet a hiba oka?
(#) sikolymester válasza yoman917 hozzászólására (») Jún 25, 2011 /
 
Nekem a következő gondom van, ami nem lett említve:

Rögtön az elején ez áll:
  1. ADMUX|=  (1<<ADLAR);

Miközben az ADMUX-ban nincsen ADLAR érték. Erre gondtoltál vajon?
  1. ADCSRB|=  (1<<ADLAR);


A kérdéses tört műveleteknél, amik nem működnek, ha jól értem a következő a helyzet:
Van neked egy feszültségosztód, ami 6.8k és 2.4k ból áll. Ez ad neked egy ~0,26 értékű korrekciós tényezőt. Tehát, ha mondjuk 15V -ot olvasol be, akkor abból ~3,91V lesz. Ezt a feszültséget beolvasod az ADC modullal, 5V-os referencia fesszel ez ~801 érték lesz. Nos ebből kellene fabrikálni a 15V-ot. Hát lássuk:

  1. #include <avr/io.h>
  2. #define F_CPU 8000000UL
  3.  
  4. //Azert van UL a szamok mogott, hogy jelezzuk a forditonak, hogy ez unsigned long
  5. //Maskulonben nem lenne helyes a szamolas veluk (ki lehet probalni)
  6. #define ELTOLAS 100
  7. #define VREF 5
  8. #define FESZOSZTOFELUL 6800UL
  9. #define FESZOSZTOALUL  2400UL
  10. #define MINTA_ADC       801UL
  11.  
  12. //Ezek azert volatilek, mert akkor a debuggolas kozben mindig latni lehet oket a watch windowban
  13. volatile uint8_t helyiertek2, helyiertek1, tortertek1, tortertek2;
  14. volatile uint32_t ValosFeszultseg;
  15.  
  16.  
  17. //Balra igazitas nem kell szerintem az ADC eredmenyenel, max akkor, hogyha az also 2 bit
  18. //nem fontos neked. (ekkor balra tolod el az ADLAR-ral es csak az ADCH -t hasznalod)
  19. void ADInit()
  20. {
  21.         ADCSRA|= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
  22. }
  23.  
  24. uint16_t Beolvas10BitADC(uint8_t csatorna)
  25. {
  26.         ADMUX = (ADMUX & 0b11110000) | csatorna;//Csatorna valasztas
  27.         ADCSRA |= (1 << ADIF);                                                                  //ADIF bit torlese, ha aktiv lenne esetleg
  28.         ADCSRA |= (1<<ADSC);                                                                            //konverzio inditas
  29.         while ( !(ADCSRA & (1<<ADIF)) );                                //Megvarjuk, amig kesz a konverzio
  30.         return ADC;
  31. }
  32.  
  33.  
  34. int main (void)
  35. {
  36.         ADInit();
  37.  
  38.         //Demonstralas miatt van ez itt:                
  39.         ValosFeszultseg =  (uint32_t) ((MINTA_ADC * VREF * ELTOLAS / 1024 * (FESZOSZTOFELUL + FESZOSZTOALUL)) / FESZOSZTOALUL);
  40.  
  41.         helyiertek2 = ValosFeszultseg / 1000;
  42.   helyiertek1 = ValosFeszultseg / 100 % 10;      
  43.         tortertek1      = ValosFeszultseg / 10  % 10;
  44.         tortertek2      = ValosFeszultseg / 1   % 10;
  45.                  
  46.   TCNT0 = 100;      
  47.  
  48.         while(1)
  49.  
  50.   {      
  51.                 //Valami ilyesmit meghivsz: (persze elegansabb az egeszet egy fuggvenybe tenni, ami egy structtal ter vissza, de demoba jo lesz
  52.                 ValosFeszultseg =  (uint32_t)((Beolvas10BitADC(4) * VREF * ELTOLAS / 1024 * (FESZOSZTOFELUL + FESZOSZTOALUL)) / FESZOSZTOALUL);
  53.                 helyiertek2 = ValosFeszultseg / 1000;
  54.           helyiertek1 = ValosFeszultseg / 100 % 10;      
  55.                 tortertek1      = ValosFeszultseg / 10  % 10;
  56.                 tortertek2      = ValosFeszultseg / 1   % 10;
  57.  
  58.                 //Majd itten van a kiiratas a 7 szegmensekre
  59.   }
  60. }


Nagyon erősen javaslom, hogy ha fura dolgok történnek, akkor futtasd le azokat "demo" körülmények között az AVR szimulátorban. Jelen esetben pl ha lefuttattad volna, akkor kiderül, hogy a erositesvolt értéked kapásból 0 lesz, tehát rögtön hiba van, amit javítani kell.
Az én kódomon, ha beteszed szimulátorba, akkor látni lehet, hogy milyen manuálisan beállított ADC eredményre milyen értékek alakulnak ki. Ha ezek jók, akkor lehetsz biztos abban, hogy a függvények helyesek, és élesben már csak azzal kell törődni, hogy az ADC koverzió jó legyen, illetve a kijelzés is.

Amúgy a megoldásom kb annyi, hogy "meghekkeljük" kicsit a rendszert. A matematikai könyvtár sok helyet foglal, ha használod, arról nem is beszélve, hogy a float változók aztán végképp... Tehát megkerüljük a dolgot. Egész számokat használunk és kitoljuk cselesen a tört értékeket, miszerint felszorozzuk az egészet 100-zal.
Ha pl ezt a műveletet kellene csinálnod, hogy 4/8, akkor az 0 eredményt adna 0,5 helyett. De ha kitoljuk elösszőr 10-zel, tehát 4 -> 40 lesz és azt osztjuk el 8-cal, akkor 5-öt kapunk. Mivel mi tudjuk, hogy az egyes helyiérték helyén a tizedes van, ezért szépen kitesszük ezt a tizedesek kijelzőjére.
(#) sikolymester válasza sikolymester hozzászólására (») Jún 25, 2011 /
 
Elnézést, már nem sikerült módosítanom a hozzászólásom.

A TCNT0 = 100 sor csak azért van ott, mert oda raktam a breakpointot. Mert amikor üres a while loop, akkor egy kicsit megőrül a szimulátor, hogyha az utolsó while loop előtti művelet utánra szeretnék lépni.
Következő: »»   333 / 840
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