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   725 / 837
(#) killbill válasza cimopata hozzászólására (») Feb 27, 2016 /
 
Amikor az adatlap azt irja, hogy 0.7xVDD, meg azt is irja, hogy 0-70 fok, de neked a szobaban eppen az a peldany mukodik 3.2V-tal, attol meg egyaltalan nem biztos, hogy mindig, minden korulmenyek kozott is mukodni fog. Az adatlapot nem utolag irjak, hanem a tervezesi adatok vannak benne. Szoval a 0.7xVDD az nem szigorusag, hanem tervezett adat. Lehet, hogy mukodik alatta is, de ha jot akarsz, akkor nem leped tul azokat a hatarokat. Ez igaz a hatarfrekvenciakra, idozitesekre, feszultsegekre, mindenre.
(#) csatti2 válasza csatti2 hozzászólására (») Feb 27, 2016 /
 
SN74LVC4245A verzió, bocs.
(#) killbill válasza cimopata hozzászólására (») Feb 27, 2016 /
 
Miert kell a BUSY-t visszaolvasni? A legegyszerubb dolog, ha van RAM-ban egy 2x16 byte-nyi tombod es onnan szepen mondjuk 1ms-onkent kiviszed a kijelzore a soron kovetkezo karaktert. Ha elertel a vegere, kezded elolrol. Igy neked csak egy valtozoba kell irni a betuket, szamokat, a kijelzon meg megjelenik. Ettol kezdve nincs szukseg a ketiranyu adatatvitelre es meginkabb a varakozo ciklusokra sem.

A timer() fuggveny a lenti peldaban egy szabadonfuto timer erteket adja vissza. Az US2CLK() makro pedig mikroszekundumokat szamolja at orajelekre.

  1. unsigned char display[32];
  2.  
  3. /*
  4.  * Ciklikusan hivogatni kell. 1ms-onkent kikuldi a
  5.  * kijelzonek a kovetekezo karaktert.
  6.  */
  7. void    LcdRefresh(void)
  8. {
  9. static unsigned char   cmd;
  10. static unsigned char   *dp = display;
  11. static unsigned int      lcdtime;
  12.  
  13.     if(timer() - lcdtime < US2CLK(1000))
  14.         return;
  15.                
  16.     if(!cmd && dp == display + 16){
  17.         lcd_cmd(0xc0);
  18.         cmd = 1;
  19.     }
  20.     else if(dp == display + 32){
  21.         lcd_cmd(0x80);
  22.         dp = display;
  23.     }
  24.     else{
  25.         lcd_dat(*dp++);
  26.         cmd = 0;
  27.     }
  28.  
  29.     lcdtime = timer();
  30. }
(#) cimopata válasza csatti2 hozzászólására (») Feb 27, 2016 /
 
Köszi, nem lenne rossz az sem, de végül rájöttem, hogy felesleges.
Valószínűleg beteszek egy 74HCT244-et ami már 1,6V-nál billen és rákötöm az 5V-tápra.Igazából csak a Busy Flag bitet kell olvasni azt pedig visszafelé megoldom úgy, hogy egy ellenállással összekötöm a buffer be-kimenetét a proci minden lábán van belső dióda a tápra az pedig majd megfogja kicsivel 3,3V felett ha az 5V jel jönne vissza az ellenálláson.
(#) cimopata válasza killbill hozzászólására (») Feb 27, 2016 /
 
Nem atmegát használok hanem STM-et csak ide írtam, de végülis mindegy. A lényeg hogy ezer más dolgot kell csinálni és nem akarok várakozni. Arra gondoltam igazából, ha lehet amikor megvan az adat átküldés átállítom a lábat külső megszakításra felfutó élre és ha jön a jel akkor a megszakítás visszaállítja a bemenetet kimenetté és küldi a következő karaktert majd megint vissza bemenetté.

Legalábbis ez a terv majd meglátom megy e.
(#) csatti2 válasza cimopata hozzászólására (») Feb 27, 2016 /
 
Az STM32-ön gyakran vannak 5V toleráns inputok is (STM8-at nem ismerem). Csak oda kell figyelni a konfigjukra. Gyakorlatilag szinte bármilyen 5V-ot tudó bus transceiver jó lehet akkor.
(#) killbill válasza cimopata hozzászólására (») Feb 27, 2016 /
 
A fenti fuggveny meg LPC-n (szinten ARM) fut. Es pont az a lenyeg, hogy ezer mast is csinal, ezert nincs ideje varni. Meghivod, es ha letelt az elozo kuldes ota 1ms, akkor kiviszi a kovetkezo karaktert, ha nem telt el, akkor visszater. De sehol nem varakozik. Pontosan annyit fut, amennyit kell. Es mivel 1ms-onket visz ki egy byte-ot a kijelzonek, semmikeppen nem kell a BUSY-t figyelni, nem kell ra se varni, se mast csinalni vele. Ezert eleg az egyiranyu kommunikacio, ami csak 6 vezetek (RS, E, D4..D7). Nekem egy 74HCT245 illeszti a 3.3V-os uC-t a kijelzohoz ugy, hogy meg a kontraszt feszultseget is ez allitja elo PWM-mel. Es meg igy is maradt egy szabad vonal, arra esetleg ratehettem volna a hattervilagitas fenyeroszabalyzasat.
(#) cimopata válasza killbill hozzászólására (») Feb 27, 2016 /
 
Minden főciklus lefutásakor meghívod a függvényt ellenőrizni letelt e az 1ms?

Most adtál egy jó ötletet.
STM32F030F4P-t használok van benne 5 timer akkor akár azt is csinálhatom hogy valamelyiket belövöm 1ms-re és global interrupt-al automatikusan meghívja az LCD frissítés függvényt ha lejárt az 1ms periódusidő, és akkor még a számlálót sem kell figyelgetni.
(#) killbill válasza cimopata hozzászólására (») Feb 27, 2016 /
 
Igen, meghivom, mert ez volt a legegyszerubb. Mert a fuggveny kb. 4 utasitas utan visszater, tehat idoben nincs semmi veszteseg. Interruptbol nem csinalok semmit, amit nem kifejezetten onnan kell csinalni. Ez hatareset lenne, mert maga a fuggveny gyorsan lefut, es nem hasznal semmi olyan eroforrast, amit masok. Vegulis mehet onnan is, ha nincs egy orokke korbejaro fociklus a programban. Nekem volt, ezert egyszerubb volt oda betenni.
(#) cimopata válasza killbill hozzászólására (») Feb 27, 2016 /
 
Értem köszi akkor ez lesz.
(#) zombee válasza cimopata hozzászólására (») Feb 28, 2016 /
 
GTL2003 az elég kétirányú, jobb mint a FET-es megoldások és csak 1 IC kell hozzá meg felhúzó.
De nem is értem miért használ valaki kétirányú kommunikációt LCD-hez...
(#) roland8811 hozzászólása Feb 28, 2016 /
 
Sziasztok!
Az lenne aszerény kérdésem (mint kezdő)
Hogyan tudok arduino-val 12V és akár 18A hasonlóan növelni vagy csökkenteni mint egy potméterrel?
Példa: fényerő csökkentés , növelés.

Köszi!
(#) kameleon2 válasza roland8811 hozzászólására (») Feb 28, 2016 /
 
pwm-el. Vannak rá példaprogramok, mintakapcsolások. Az a lényeg, hogy az Arduinó külön tápon legyen a szabályzotthoz képest. Mint ebben a megoldásban is..
(#) roland8811 válasza kameleon2 hozzászólására (») Feb 28, 2016 /
 
Thx kameleon2.
(#) zombee válasza kameleon2 hozzászólására (») Feb 28, 2016 / 1
 
Ehhez annyit hozzátennék hogy a FET gate meghajtásához kevés lesz az Arduino 5V
tápfeszültsége, még egy kifejezetten "low gate treshold" típussal is. 18A az nem kevés.
A másik hogy folyamatos üzem esetén a FET-et többszörös áramra kell méretezni, hacsak
nem akarsz méretes hűtőbordát rászerelni. A TO-220 tokot ebben az esetben felejtsétek el!
Én IRFP064N típust rendeltem, eddig meg vagyok elégedve vele.
A 8mOhm csatornaellenállás reális, de kell neki 10-12V gate feszültség is; másképp nem megy!
18A-es folyamatos üzem mellett 2.6W teljesítmény esik egy ilyen tranzisztoron, azaz kell egy
kisebb hűtőborda vagy hűtőzászló. De két tranzisztor párhuzamosításával akár el is hagyható!
Aztán kell védődióda is, ekkora áramnál egy lámpa is "visszarúg". 14A-es DC villanymotorhoz
én MBR1645 diódát tettem bele, és közös hűtőzászlóra került 2 darab IRFP064N tranzisztorral.
A vicces, hogy nem a tranzisztoroknak kell a hűtőborda, hanem a diódának, aminek hőjét a két
MOSFET vezeti el. A FET gate feszültséget kettős(NPN+PNP) open-collector kapcsolással oldom meg.
A hozzászólás módosítva: Feb 28, 2016
(#) cimopata válasza zombee hozzászólására (») Feb 28, 2016 /
 
Már megoldódott, nem lesz kétirányú.
(#) Szabi1 hozzászólása Feb 28, 2016 /
 
Sziasztok! Eléggé kezdő vagyok AVR programozásban, és akadt egy kis gondom. Adott egy attiny13a MCU, amire egy electret microfon, egy led és egy piezzo van kötve. Ha érzékel egy állathangot (pl kakas) akkor létre hoz egy 20khz feletti PWM jelet amit egy FET (jelen esetben IRFZ44N) kapcsolgat a piezzóra, felkapcsol egy ledet ami viszajelzi hogy épp ultrahangot generál, és vár pár egy kis ideig, majd kikapcsolja a ledet és a PWM dutty-t 0-ra állítsa, majd kezdődik az egész előről.
A probléma az hogy még a led sem villan fel, és azt sem tudom biztosan, hogy érzékel-e a mikrofonnal valamit.
  1. #define F_CPU 8000000UL //8 mhz CPU
  2. #include <util/delay.h>
  3. #include <avr/io.h>
  4.  
  5. void adc_setup (void)
  6. {
  7.     // Set the ADC input to PB2/ADC1
  8.     ADMUX |= (1 << MUX0)| (1 << MUX1);
  9.     ADMUX |= (1 << ADLAR);
  10.  
  11.     // Set the prescaler to clock/128 & enable ADC
  12.     ADCSRA |= (1 << ADPS1) | (1 << ADPS0) | (1 << ADEN);
  13. }
  14.  
  15. void pwm_setup(void)
  16. {
  17.                
  18.         // prescaler 1  FOR 31,25 khz pwm      
  19.         TCCR0B = _BV(CS00);  
  20.        
  21.         // Set to 'Fast PWM' mode
  22.         TCCR0A |= (1 << WGM01) | (1 << WGM00);
  23.        
  24.  
  25.         // Clear OC0B output on compare match, upwards counting.
  26.         TCCR0A |= (1 << COM0B1);
  27.        
  28. }
  29.  
  30. int adc_read (void)
  31. {
  32.     // Start the conversion
  33.     ADCSRA |= (1 << ADSC);
  34.  
  35.     // Wait for it to finish
  36.     while (ADCSRA & (1 << ADSC));
  37.  
  38.     return ADCH;
  39. }
  40.  
  41. int main (void)
  42. {      
  43.         // I/O SETTINGS, ALL I/O is input by default
  44.  
  45.         DDRB = _BV(PB2); //PB2 kimenet PWM
  46.         DDRB = _BV(PB4); //PB4 kimenet LED
  47.                
  48.         pwm_setup();
  49.         adc_setup();
  50.        
  51.         //variables
  52.         unsigned int adc_value;
  53.        
  54.         OCR0B = 0;
  55.         adc_value=0;
  56.        
  57.         while(1)
  58.         {
  59.                
  60.                 adc_value=adc_read();
  61.                 if(adc_value>31)
  62.                 {
  63.                
  64.                                 PORTB |= _BV(PB4); // LED BE
  65.                                 OCR0B = 127;    //PWM piezzonak
  66.                                 _delay_ms(5000); // varakozas
  67.                                 OCR0B = 0;              //PWM ki
  68.                                 PORTB &= ~ (1<<PB4);// LED KI
  69.                 }
  70.  
  71.         };
  72.          // végtelen ciklus vége;
  73. }
  74.  // foprogram vege;
A hozzászólás módosítva: Feb 28, 2016
(#) tkovacs válasza Szabi1 hozzászólására (») Feb 28, 2016 / 1
 
Helló!
Láss és tanulj ebből. A 7. perctől lehet neked érdekes.
Üdv.
(#) gabi20 válasza Szabi1 hozzászólására (») Feb 28, 2016 / 1
 
Szia az OCR0B a PB1 porthoz van kapcsolva, ezt nem állítottad be kimenetre. Másrészt szerintem túllépted a delayt. A delayt a helyedben így csinálnám:
  1. for(unsigned char i = 0; i < 100; i++) _delay_ms(50);
(#) tkovacs válasza gabi20 hozzászólására (») Feb 28, 2016 / 1
 
A jelenlegi hardver alkalmatlan a kondenzátor mikrofon jelének feldolgozására! Majd ha kijavította a videóban javasolt minimális hardverkörnyezettel, gondolkodhat a szoftveren.
(#) Szabi1 válasza gabi20 hozzászólására (») Feb 28, 2016 /
 
Próbáltam mérômûszert dióda állásba rakni, gnd-re raktam a fekete szondát, a pirosat a bemenetre, és a LED bekapcsolt majd egy pár másodperc múlva elaludt, de viszont tényleg nemjó portbitet állítottam kimenetre a PWM-nek, a videót máris megnézem. Aki segített, mindenkinek küldök egy zöld kezet
A hozzászólás módosítva: Feb 28, 2016
(#) kameleon2 válasza zombee hozzászólására (») Feb 29, 2016 /
 
Szia! Nekem IRF830-as FET-ről megy az 500W-os motorom - igaz 110V-ról. Egyetlen FET viszi és hűtés nélkül sem volt még langyos sem. 10cmx10cm-es hűtőkockára szereltem fel a tesztek után és 23 órát dolgozott végig a motor a cnc-n 1/3-ad fordulattal PWM-el. A hűtőborda szobahőmérsékletű. A meghajtás nem 5, hanem 12V-ról OC-ról megy (555 kimenete). Ha kevés 1 FET - többet kell párhuzamosan kötni, vagy IGBT.
(#) zombee válasza kameleon2 hozzászólására (») Feb 29, 2016 /
 
Az 555 sajnos nem egyenlő AVR-el, ha programból akarja változtatni a PWM kitöltését akkor nincs mese, meg kell csinálni a 12V-os konverziót is. Itt egy kép az enyémről.

A 110V-os motorral vigyázz, mert ha tényleg 500W-ot (4.5A) vesz fel akkor egy 1.5Ohm csatornaellenállású tranyóval ez 13.5W maximális hőleadást jelentene 100% kitöltés mellett, 1/3 fordulattal 4.5W. Azért nem melegszik, mert a motoron az idő nagy részében nincs terhelés, jó csapágyazású motoroknál az áramfelvétel szinte nulla. Próbáld meg folyamatosan terhelni, pl. fúrj át vele egy 5mm-es acéllemezt. Lehet hogy a tranyó jobban fog melegedni mint a fúrófej.

pwm.png
    
(#) kameleon2 válasza zombee hozzászólására (») Feb 29, 2016 /
 
Idézet:
„23 órát dolgozott végig a motor a cnc-n”
Amikor a gép dolgozik - anyagban halad javarészt a fej. Nem robot aerobikozik.
A hozzászólás módosítva: Feb 29, 2016
(#) csatti2 válasza zombee hozzászólására (») Feb 29, 2016 /
 
Szerintem elszámoltál valamit. 4,5A és 1,5Ohm esetén 30,375W-ot kell eldiszipálni 100%-os kitöltési tényező mellett. Persze a 1,5Ohm elég nagy, ennél sokkal kisebb ellenállások a jellemzőek a teljesítmény FET-eknél. Viszont ha nem 100% a kitöltési tényező, akkor oda kell figyelni a kapcsolási veszteségekre is.
(#) killbill válasza zombee hozzászólására (») Feb 29, 2016 /
 
Egy olyan FET-nek, aminek 5V-on garantaljak a minimum Rdson erteket, teljesen felesleges 12V gate feszultseget adni. Sot, ami azt illetei, csak ront a helyzeten, mert a lezarasa csak lassabb lesz, mert felesleges toltest kell kivenni a gate kapacitasbol. Hogy mennyire kell nagyaramu meghajtas a gate-hez az pedig a PWM frekvencia fuggvenye. Ahol a te 680 ohm-os passziv lezarasod elegendo, ott egy 5V-os AVR kimenet is az lesz, ha logic gate-ű a FET. Pl. IRL540. 10V a max Vgs... Gondolom, vannak nagyobb aramu peldanyok is ilyen gate-tel.
(#) fecus válasza fecus hozzászólására (») Feb 29, 2016 /
 
Idézet:
„Építgetek egy termosztátot. Rádióval kellene kommunikálnia a Pi-n futó OpenHAB-bal, gateway-en keresztül. C-ben, Studióban programozom. Találtam egy csomó library-t a MYSensors projektben cpp-ben amit tudnék használni. Tudom használni a programomhoz vagy nekem is át kell állnom cpp-re?”


Erre valaki? Nagyon hülyét kérdeztem? Még sohasem használtam cpp-t.
(#) kapu48 válasza fecus hozzászólására (») Feb 29, 2016 /
 
Talán ez a kisfilm segít neked!

Create a New C Project for GCC in Atmel Studio:
Bővebben: Link


Annyi a különbség, hogy a GCC C++ menüpontok közül választod valamelyiket.
Alkalmazást vagy Lib-et akarsz fordítani.

És hozzáfűzi a megfelelő lib.eket a projectedhez.

Igaz 8bites AVR-eknél nem igen használjuk, mert pazarolja a memóriát!
A hozzászólás módosítva: Feb 29, 2016
(#) fecus válasza kapu48 hozzászólására (») Feb 29, 2016 1 /
 
Akkor nem írtam világosan. Már majdnem kész a program C-ben.
Tudok C++-os lib-et használni, vagy
a, újra kell írni az egész programomat C++-ban, vagy
b, át kell írnom a lib-et C-ben?
(#) FDAssasin hozzászólása Feb 29, 2016 /
 
Sziasztok!
Mondhatni erősen kezdő vagyok az elektronika terén, eddig csak ledeket, meg motorokat forrasztgattam ide-oda, tehát nincs nagy tapasztalatom. Viszont a C nyelv, közel áll hozzám és szeretnék egy Arduino-t. Viszont az úgy nem érdekes ha csak megveszem a boltban tízszeres áron, jó lenne összerakni egyet. Szóval:
Adott, egy ATmega328-as IC. Elvileg, 16MHz-es sebességen 5V kell neki és kb 40-50mA. USB-ről szeretném működtetni, de elvileg zajos a PC-n lévő usb, illetve a telefontöltők is (4.8-5.2V között ingázik talán, de ez nem 100%). Hogy tudnám stabilizálni 5V-ra a feszültséget? Nem szívesen sütném meg az IC-t. Illetve problémás ezt a kis eszközt egy 800mA-es Sony telefontöltőről működtetni? Vagy csak annyi áramot vesz fel amennyi épp kell neki?
A válaszokat előre is köszönöm!
Következő: »»   725 / 837
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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