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   590 / 840
(#) killbill válasza Szabi1 hozzászólására (») Feb 14, 2014 /
 
Igen kellene. De elobb probald meg, hogy MAX232 nelkul mukodik-e a loopback, ugy hogy osszekotod a PC Rx-Tx labait. Ha nem megy, akkor esetleg a terminalban a flow control-t (nem tudom, hogyan nevezik magyarul) ki kell kapcsolni, vagy a PC-n az RTS/CTS jelek osszekotni es a DTR/DSR-t is.
Ha kap 5V-ot a MAX232, akkor azokon a bizonyos + es - 8.5V labakon merhetsz feszultseget.
A hozzászólás módosítva: Feb 14, 2014
(#) Szabi1 válasza killbill hozzászólására (») Feb 14, 2014 /
 
OK köszönöm szépen, most forraszgatok egy kicsit, azis meglehet a rs 232 txd rxd huzalokat cseréltem fel. A loopback működött a PC-n de 2400 bps től más sebességen nem, lehet a több nem össze kötött láb miatt.
(#) Szabi1 válasza Szabi1 hozzászólására (») Feb 14, 2014 /
 
Nos bekapcsoltam a labortápot, terhelés alatt 5,2V ot kapott az IC, a 2 es lábon 3,8V ot mértem a GND-hez képest, a 6 os lábon pedig 2,2V ot
Ha jol látom a minusz ágban nemjó a kondi, mert diódavizsgáló szerint egyik irányba rövidzárlatba van másikba meg állandóan ellenállást mutat.
A hozzászólás módosítva: Feb 14, 2014
(#) fecus hozzászólása Feb 14, 2014 /
 
Router 3,3V-os soros portját szeretném 5V-os Atmel Tiny soros portjára kötni. Egyszerűen összekötve nem megy aztán ha bemelegszik elindul.
Találtam sok okos kapcsolást a Neten, de nekem kipróbált kellene. Nem kell kétirányú szinteltolás csak egy oda és egy vissza. Gondolom az 5V-ről +3,3V-ra jó az ellenállás osztó. A vissza irány érdekes.
Van valakinek gyakorlati tapasztalata?
(#) killbill válasza Szabi1 hozzászólására (») Feb 14, 2014 /
 
Ez nagyon furcsa, hogy csak 2400bps-en mukodik. Nem hinnem, hogy koze van a tobbi labhoz, bar minden elofordulhat.

A mert feszultsegek totalisan nem jok. Kondikat csereld jora. Aztan merd meg a 2-es es 6-os on a feszultsegeket, de ugy, hogy a 7, 8, 13 es 14 labak ne legyenek bekotve. Mind a negy kondi fontos. Es a tapfeszultsegen is legyen, ahogy a rajz is mutatja.
(#) killbill válasza fecus hozzászólására (») Feb 14, 2014 /
 
Az 5->3 az valoban mehet ellenallassal, bar nem a legszebb megoldas. De ha van egy 74HCT125-od, akkor azzal mindket iranyba meg tudod csinalni korrektul. A HCT (fontos, hogy T a vege) tapja 5V. A driverek bemenetei foldre mennek. A kimenetek felhuzo ellenallassal arra a tapra, amirol a meghajtott IC vagy modul jar. Egy a 3.3V-ra, egy meg az 5V-ra. A driverek engedelyezo labai pedig mennek a "szintattenni" kivant jelre. Itt egy hevenyeszett rajz, kicsit gyenge a kontraszt, de olvashato. Azert fontos, hogy HCT legyen, mert annak a bemenetei 0.8V alatt L, 2V folott H, igy a 3.3V-os logika is meg tudja hajtani. Esetleg lehet mas Tri-state driver vagy akar nyitott kollektoros driver benne. HCT07, ha letezik olyan. Ja, a HCT125 van egykapus otlabu SMD valtozatban is, ha szamit kis helyigeny.
A hozzászólás módosítva: Feb 14, 2014
(#) Szabi1 válasza killbill hozzászólására (») Feb 14, 2014 /
 
Na kicseréltem a gyanús kondit, most a + ágában 8,9 v van a minuszban 9,1 így megfelelő?
4,6V ot kap az IC. Minden kontakt ellenőrízve, a TTL kimenetet összekötöttem loopback céljából, de nem működik, csak ha az rs232ct zárom rövídre, de megvan az 5V
(#) killbill válasza Szabi1 hozzászólására (») Feb 14, 2014 /
 
A feszultsegek jok, felteve, hogy a minuszon -9.1 volt van.

Kosd le rola a PC-t, mikrokontrollert, csak az IC maradjon a kondikkal. Ha tapot adsz neki, akkor a te megad is meg tudod merni, hogy jo-e az IC. Ha a TTL bemenetet (10 vagy 11 lab) lefoldeled, akkor a hozzatartozo RS kimeneten (7 vagy 14 lab) kb. +9 volt kell legyen. Ha a TTL bemenetet 5V-ra kotod, akkor a hozzatartzo RS kimeneten -9V kell legyen.

Visszafele ugyanez. Ha az RS bemenetet (8, 13 lab) osszkotod a 2-es labbal (V+), akkor a TTL kimenet (9, 12) lemegy 0V-ra. Ha az RS bemenetet a 6-os labbal (V-) kotod ossze, akkor a TTL kimenet fel kell menjen 5V-ra.

Merd meg legyszives, hogy a PC sorosportjan a 2 es 3-as labon mekkora a feszultseg nyugalmi helyzetben. Az egyiken 0V kell legyen (Rx) a masikon -5..-12V kell legyen. 9-es vagy 25-os csatlakozo van a PC-n?
(#) fecus válasza killbill hozzászólására (») Feb 14, 2014 /
 
Köszi. A RET-ben AHCT van. Az is jónak tűnik.
(#) killbill válasza fecus hozzászólására (») Feb 14, 2014 /
 
Nincs mit. Igen, az AHCT is tokeletes.
(#) Sick-Bastard hozzászólása Feb 15, 2014 /
 
Üdv!

Egy kis gondom akadt az ADC-el.

Amit szeretnék:
LM335-el hőmérséklet mérése.

Ahogy elképzeltem:
AREF = 2,56V (ez a cél), valóságban multiméterrel 2,565-2,57V-ot mérek. A referenciát egy TL431 adja.
Mivel a(z) LM335 25fokon ~3V-ot ad, ezért 2db 3kOhm-os ellenállással feleztem az értéket. Képet mellékeltem.

A gondom, hogy nagyon ugrál a kapott érték. Szobahőmérsékleten 20-27 fokot kapok.


  1. void ADC_Init(char mux)
  2. {
  3.         // Digital Input Disable Register 0
  4.         DIDR0 |= 0xFF;
  5.         // ADC enable, prescaler
  6.         // 16000/50 = 320, 16000/200 = 80
  7.         ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADEN);
  8.         // reference voltage = external (2,56V)
  9.         ADMUX |= (0<<ADLAR)|(0<<REFS0);
  10.        
  11. }
  12.  
  13.  
  14. int LM335(void)                        
  15. {
  16.         // works only with LM335 AREF@2,56V
  17.         int adc_value = 0;                                              // temp 16bit variable
  18.         for(char i=0;i<5;i++)                                   // reading temp 5 times
  19.         {
  20.                 ADCSRA |= (1<<ADSC);                            // start conversion
  21.                 while(!(ADCSRA & ( 1<<ADIF)));          // wait for measurement
  22.                 adc_value += ADC;
  23.                 adc_value -= 546;                                       // -546 => ADC value for 273Kelvin
  24.         }
  25.         return(adc_value);
  26. }


Tehát, 5x kiolvasom az ADC regiszterek értékét, amit minden egyes kiolvasáskor egy adc_value változóba mentek le és kivonok belőle 546-ot (ez a 273Kelvin ADC érétke 2,56V-os referenciával).

SB

lm335.jpg
    
(#) zsuscsinyo válasza Sick-Bastard hozzászólására (») Feb 15, 2014 /
 
Szia!

Differenciát mérj, kell egy feszültség osztó amivel az offsetet eltolod 2,7315V-ra azaz 0°C-ra, ezt a negált bemenetre kötöd. 0°C esetén a differencia 0mV lesz, 25°C esetén 250mV, az ADC értéke ennek függvényében: 2,56V referencia 10bit-nél 2,5mV 1LSB, azaz 1000 lesz, viszont így a max mérhető hőmérséklet tartományod -12,8 és +12,7°C ami nem túl szerencsés. Ezért más referencia kell, vagy külső vagy táp (a tápot viszont meg kell szűrnöd és nagyon stabilnak kell lennie!). Újraszámolva: 5V ref. 10-biten 1LSB->4,88mV ami megközelítőleg 0,5°C felbontás ami már elég lehet, így a tartomány majdnem megduplázódik. Ha viszont negatív tartományt nem akarsz mérni akkor a negált bemenetre kötött potival eltolhatod a mérés tartományt 24,576°C-al azaz 2,97726V-ra, így a 0°C-nál mért érték -512 lesz, 49,5°C-nál 511, 24,576°C nál pedig az ADC=0 lesz. Differencia mérésre a negált benetet az ADC0-ra (poti), a ponált bemenetet viszont az ADC1-re kell kötni, és az ADMUX-ban a 16-os csatornát kell választani. Ha nem akarsz vele ennyit bajlódni, akkor az LM35DZ hőmérőt javaslom (10mV/°C).
A hozzászólás módosítva: Feb 15, 2014

diff_adc.png
    
(#) zsuscsinyo válasza zsuscsinyo hozzászólására (») Feb 15, 2014 /
 
Bocsánat kicsit elszámoltam magam. Teszteltem egyet és így kapod meg a hőmérsékletet:
A kapcsolás marad, poti értéke 2,73V, 5V-os referencia, 16-os csatorna mérése, és a kapott értéket egész °C-ban jeleníti meg. Az adc mérést uint16-os visszatéréssel add meg int16-os változónak castolva:

lemértem működik

  1. int16_t celsius;
  2. while(1)
  3. {
  4. celsius = (int16_t)ADC_Read(16);
  5. if(celsius>511) celsius = celsius-1024;  //negatív érték
  6. }
(#) Sick-Bastard válasza zsuscsinyo hozzászólására (») Feb 16, 2014 /
 
Üdv!

Ez a módszer nekem még új. Differenciát még nem mértem. Nem is tudom, hogy feltétlen kell e ehhez...

Jelenleg csak annyi a gond, hogy valamiért nagyon ugrál a kapott ADC Data regiszterben az érték.
Arra tippeltem, hogy az AREF nem kap elég áramot, mivel a feszültség ott ~5mV-ot ugrál(multiméter szerint). Mennyi áramot vesz fel az AREF ill. az AVCC max?

A tápot egy 7805-ös(1,5A) adja, aminek elég stabilnak kell lennie.
Tekercset nem raktam az AVCC-re, csak 100nF-os kondit.

Ami zavaró tényező lehet:
A próbapanelen van még egy 24MHz-es órajel generátor, amit elosztok kettővel, hogy a szintén panelen lévő USBtiny programozónak adja meg a 12MHz-es órajelet.
(#) zsuscsinyo válasza Sick-Bastard hozzászólására (») Feb 16, 2014 /
 
Nem kell félni az új dolgoktól!
Itt semmi más nem történik, minthogy 2,73V-tól méred a feszültséget, és nem 0V-tól. Amit ténylegesen mérsz az a két láb közti különbség. Gondolom ismered a negatív számábrázolást (2-es komplemens képzés) a negatív korrekció csupán azért kellett mert nem 16-bites az ADC hanem 10bit (0..1023) negatív tartományban ez -512..511-ig amit int16_t változóba nem tudsz csak úgy beletenni. Én csak ajánlani tudom, hogy próbáld ki, lehet hogy sok új ötletetd ad.

Üdv!
(#) Addye hozzászólása Feb 17, 2014 /
 
Sziasztok!

Tud segíteni valaki Budapesten felprogramozni egy ATMega644-et? Nincs programozóm, ezért szeretnék segítséget kérni. Előre köszönöm bármi nemű segítséget!
(#) zombee válasza Addye hozzászólására (») Feb 17, 2014 /
 
Csak nem SD2IEC készül?
(#) Addye válasza zombee hozzászólására (») Feb 18, 2014 /
 
Nem, Megadrum
(#) gazi válasza Topi hozzászólására (») Feb 19, 2014 /
 
Hi! Megoldódott az AVR-es KIT problémám! De még hogy...nem volt felprogramozva az AVR. A szép a dologban az, hogy úgy derült, hogy felhívtak a HEStore-ból, elnézést kértek, mert véletlenül program nélküli AVR-t küldtek. Megküldték a cseredarabot, helyére raktam és egyből életre kelt! (pedig már kezdtem magamban kételkedni) Tökéletes ügyintézés
(#) fifadani hozzászólása Feb 20, 2014 /
 
Sziasztok!
ADC méréssel szenvedek...
Hogy tudnám megcsinálni azt, hogy 2 ms-enként mérek 5-ször.
S ezek átlagát küldöm lcd-re?
Gondolom for ciklus, de ugye mindig ADCH-ba kapom az értéket vissza...
(#) vzoole válasza fifadani hozzászólására (») Feb 20, 2014 /
 
  1. for(i=0; i<5; i++)
  2. {
  3.   adc += ReadADC(1);
  4.   _delay_ms(2);
  5. }
  6. adc /= 5;
A hozzászólás módosítva: Feb 20, 2014
(#) fifadani hozzászólása Feb 20, 2014 /
 
Így sikerült megcsinálni.

  1. int i,adch;
  2.                         int osszeg;
  3.                         float atlag;
  4.                         osszeg=0;
  5.                         atlag=0;
  6.             for(i=1;i<=5;i++)
  7.             {
  8.                         printf("%d Ertek: ",i);
  9.                         scanf("%d", &adch);
  10.                         osszeg += adch;
  11.             }
  12.             atlag /= 5;
  13.                         printf("Osszeg: %d",osszeg);
  14.                         printf("\n");
  15.                         printf("Atlag: %f",atlag);
  16.                         printf("\n");
  17.                        
  18.                        
  19.                         system("pause");
  20.                         return 0;


De a lényeg ugyanaz.. Köszi azért
(#) fifadani hozzászólása Feb 20, 2014 /
 
Elírtam. Mindegy..
(#) Simon Balázs hozzászólása Feb 20, 2014 /
 
Sziasztok! Van egy hobbielektronikás AVR doperem és eszközillesztői telepítve vannak, de mégse tudom használni. Próbáltam HID üzemmódban is, de úgyse ment. Próbáltam az AVR studio 4-et és 6-ot is, de egyikben se sikerült használni. Valakinek van ilyen jellegű tapasztalata, esetleg tanácsa? Privátban hosszasan megbeszélhetjük a dolgokat. E-mail: ha4sb1@gmail.com Köszönet mindenkinek.
(#) pluto válasza Simon Balázs hozzászólására (») Feb 20, 2014 / 1
 
Szia!

Én a helyedben itt tenném fel a kérdést. Ezt meg töröld. (Rád szólnak a modik, hogy egy kérdést csak egy helyen teszünk fel ...)
(#) hthom hozzászólása Feb 21, 2014 /
 
Sziasztok! Van egy napelemem ami egy szivattyút hajt. az lenne a problémám hogy hogyan tudnám a napelem változó áramát az AVR-be jelként befogni, hogy pl. 2A-nál induljon csak el a szivattyú, az alatt ne terhelje? A feszültség mindig fix, csak az áram változik. Tud valaki erre megoldást?
(#) szili83 válasza hthom hozzászólására (») Feb 21, 2014 /
 
Teszel az áramkörbe, azaz a motorral sorban egy ellenállást. (kicsit, pá tized ohmot), és a két sarkán mérhető feszültség az ellenállással arányos. Ugyanaz, mint az A mérők sönt ellenállása.
(#) hthom hozzászólása Feb 21, 2014 /
 
Köszi!
Bocsi de kezdő vagyok. Gyors rajzoltam egy elvi kapcsolást. Úgy gondoltam hogy ADC-vel mérném a bemenő feszt és aszerint kapcsolná be-ki a szivattyút. Csak hát a fesz állandó, az áramerősség változik. Hogy és mit kössek rá az ADC-re?
Előre is köszi a segítséget!

001.jpg
    
(#) kendre256 válasza szili83 hozzászólására (») Feb 21, 2014 /
 
Hát az érdekes lesz....
Van egy nyitott áramköröd, azon nézed, hogy mennyi áram folyik (mindig 0 fog folyni...), majd ha nagyobb 2 Ampernél, akkor zárod a kört?
(#) icserny válasza hthom hozzászólására (») Feb 21, 2014 /
 
Idézet:
„hogyan tudnám a napelem változó áramát az AVR-be jelként befogni, hogy pl. 2A-nál induljon csak el a szivattyú, az alatt ne terhelje?”
Ez így elég értelmetlenül hangzik, mert ugyan hova folyna el a 2 A áram, ha a motor nincs bekapcsolva? Ha már bekapcsoltad a motort, akkor egy soros ellenálláson eső feszültséget könnyen meg lehet mérni. De ha lekapcsoltad, mert kicsinek találtad az áramot, akkor nincs ami jelezze, hogy mikor kapcsolható újra be.
Következő: »»   590 / 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