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   461 / 840
(#) zombee válasza mario1111 hozzászólására (») Júl 24, 2012 /
 
Üdv!

Nálad az lehet a gond hogy a stack túlcsordul.
Magyarul: a programod túl sok memóriát zabál fel a változók számára. Igaz, egy double csak 8 bájt(AVR GCC-ben lehet hogy inkább 4),
de a műveletek alatt(szorzás-osztás, stb.) ennek sokszorosát is használja. Ugyanis a fordító először
fixpontossá alakítja át a lebegőpontos értékeket, azt a memóriában(stack-ban) tartja, kiszámol, visszaalakít,
majd felszabadítja a helyet. Ha túl sok helyet foglal akkor belelóghat a stack a változókba.
Mivel a stack-en tárolódik a függvényhíváskor a visszatéréshez szükséges cím, könnyen elszállhat a programod.
(#) zombee válasza sgt hozzászólására (») Júl 24, 2012 /
 
AVR-GCC esetében szerintem tökmindegy, ugyanaz mindkettő.
(#) blackdog hozzászólása Júl 24, 2012 /
 
Sziasztok!

Szeretem bonyolítani az életem és a kapcsolásaim.
Szeretném készülő vezérlőmet órával és dátummal ellátni, hogy óra:perc/nap alapján is programozható legyen. Ehhez mire lenne szükségem?
Én arra gondoltam, hogy kapna az AVR 5V tápja egy 1F puffer kondit áramkimaradás esetére: Bővebben: Link
Valamint tennék bele egy RTC IC-t pl. ezt: Bővebben: Link
Milyen hardverre lehet még szükségem?
(#) sgt válasza zombee hozzászólására (») Júl 24, 2012 /
 
Mindig tanul valamit az ember . Mi ilyenkor a teendő?
(#) sgt válasza blackdog hozzászólására (») Júl 24, 2012 /
 
Ehhez programozói gyakorlatra , mert én fölöslegesnek találom az RTC IC-t főleg, ha a mikrokontrollered csak óraként funkcionálna. Ha szeretnéd bonyolítani, akkor csináld meg rá a DCF77-t. A nagy puffer kondi okos gondolat csak figyelj arra, hogy legyen sorosan ellenállás, mert a tápod nagyon meg fog örülni a pillanatnyi rövidzárlatnak. Nem olvastam az előzményeket, de gondolom 32 kHz-es kvarcot használnál.
(#) mzozo95 válasza Stefan hozzászólására (») Júl 24, 2012 /
 
Kösz, ezt észre sem vettem! Tényleg igazad volt!
(#) zombee válasza sgt hozzászólására (») Júl 24, 2012 /
 
Én pl. alapból kerülném a lebegőpontos számokat és műveleteket. Lehet 32 és 16 bites fixpontos értékekkel
is dolgozni, igaz, egy kis odafigyelés nem árt a pontosság és optimalizáltság megőrzése érdekében.
(#) sgt hozzászólása Júl 24, 2012 /
 
Végtelenül érdekes dologgal találtam szemben magam. Megépítettem ezt az ISP mkii klónt. Sikerült feltöltenem rá a hexet minden oké volt. Csatlakozott is. Oh mondom végre először minden klappolni fog. Mint kiderült a nagy túrót, mert az entering és leaving mode failed. Csodás! Természetesen minden lábat végig néztem, hogy nincs-e összeforrasztva, vagy kimaradt forrasztás (tanultam a legutóbbi esetből), de nem volt. A DMM-el működés közben néztem, hogy a reset lábat lerántja-e, és erre frankón elkezdett működni. A próbapanelen 27k felhúzó ellenállás volt, és a reset lábra pár Mohmmal húztam le földre a DMM keresztül, de ettől miért kezdett el rendesen működni?

Fényévekkel gyorsabb mint a Doper. Amikor az egyik dopert programoztam a másikkal, akkor még a fürdőbe is ki tudtam menni inni, és még mindig égette , most ugyanaz a hex az isp klónnal feállni sem volt időm .
(#) mzozo95 válasza sgt hozzászólására (») Júl 24, 2012 /
 
Köszönöm, az interruptot módosítottam, ISR re, használtam szemafor szerű dolgot, az igazi szemafor hogy működik? Nem találtam rá példát avr-ben. Vagy csak egy PORT bitet kellene "billegtetni"? Az a megoldás azért nem lenne jó, mert nem nagyon akad felesleges láb majd az avr-en.

Végül sajnos még mindig nem akart működni a dolog. Ezt már észrevettem máskor is, hogy ha a végtelen ciklust megszakító interruptban megváltozik egy globális változó, akkor a végtelen ciklusban a változót használó folyamatban nem mindig töténik változás... Ez miért van? Vagy a C nyelv hiányossága?

bool változótípus nincs a c-ben? mejnek értéke 0 vagy 1? Mert az lenne a legegyszerűbb szemafor, és nem foglalna sok helyet(mint a mostani char-os megoldás) Ha így próbálon definiálni:
  1. bool a=0;

hibát ír a fordító...

Így néz ki a mostani, működő program, kicsit csúnya elemzéssel az s_pwm függvényben.


  1. #define F_CPU 8000000
  2. #include <avr/io.h>
  3. #include <util/delay.h>
  4. #include <avr/interrupt.h>
  5. #include <inttypes.h>
  6.  
  7. ////////////////////////////////
  8. #define BAUD 38400///38400bps
  9. #define UBRR ((F_CPU / (BAUD * 16L)) - 1)
  10. ////////////////////////////////
  11. //váltoizók
  12. unsigned char rec[15];//string buffeer
  13. unsigned char buffer; //byte buffet
  14.  
  15. unsigned char stat=0;//string karakter
  16.  
  17. int se[18];
  18.  
  19. int servo=0;
  20.  
  21. char echo=0; //visszhang(0-1)
  22.  
  23. char inter=0;
  24. ////////////////////////
  25. void uart_init(void)
  26. {
  27. /* Aktivieren des Empf?ngers, des Senders und des "Daten empfangen"-Interrupts */
  28. UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
  29. // baud rate
  30. UBRR0H = (unsigned char) (UBRR>>8);
  31. UBRR0L = (unsigned char) UBRR;
  32. //  format: 8data, 2stop bit
  33. UCSR0C = (1<<UMSEL01)| (1<<USBS0) | (3<<UCSZ00);
  34. }
  35.  
  36.  
  37. ///////UartKüld
  38.   void UARTKuld(unsigned char c){
  39.                 while((UCSR0A & (1<<UDRE0)) == 0) {}
  40.        
  41.             UDR0 = c;
  42. }
  43.  
  44. ///////szövegküld
  45.    void UARTSzovegKuld( char *p)
  46. {
  47.         while(*p)
  48.         {
  49.           UARTKuld( *p++);
  50.         }
  51. }//szövegküld vége
  52.  
  53. void delrec(void){
  54.  for(int i=0; i<50;i++){
  55.   rec[i]=' ';
  56. stat=0;};
  57.  }
  58.  
  59. void kuldrec(void){
  60. for(int i=0; i<stat ;i++){
  61.  UARTKuld(rec[i]);}
  62.  }
  63.  
  64. //decimális szám küldése:
  65. void outdec(long data, unsigned int ndigits) { //integer to dec=>string, és érték kiírása
  66.     static char sign, s[12];
  67.     _delay_us(10);
  68.     unsigned int i;
  69.             i=0; sign=' ';  //alapvetően nincs előtte semmi
  70.             if(data<0) { sign='-'; data = -data;} //ha minusz, akk elé: -
  71.             do {
  72.                     s[i]=data%10 + '0'; //integer átírása ASCII ba
  73.                     data=data/10;
  74.                     i++;
  75.                     if(i==ndigits) {s[i]='.'; i++;}
  76.             } while(data>0);
  77.             UARTKuld(sign);
  78.             do{
  79.                       UARTKuld(s[--i]); //összes karakteren végigmenni
  80.             } while(i);
  81. }
  82.  
  83. uint8_t comm( char *p){
  84. char azonos=1;
  85. int szam=0;
  86. while(*p)
  87.         {
  88. if (rec[szam]==( *p++)) {azonos=1;} else {azonos=0;};
  89. szam+=1;
  90. }
  91. return (azonos);}
  92.  
  93. uint16_t strtoint(int szam){
  94. int ertek=0;
  95.  
  96. if (rec[szam]>='0' && rec[szam]<='9') {ertek += (rec[szam] - '0')*1000;};
  97. szam+=1;
  98. if (rec[szam]>='0' && rec[szam]<='9') {ertek += (rec[szam] - '0')*100;};
  99. szam+=1;
  100. if (rec[szam]>='0' && rec[szam]<='9') {ertek += (rec[szam] - '0')*10;};
  101. szam+=1;
  102. if (rec[szam]>='0' && rec[szam]<='9') {ertek += (rec[szam] - '0');};
  103. return (ertek);}
  104.  
  105.  
  106. void init_servo(void){//servo init
  107. //16bit pwm
  108. DDRB|= _BV(DDB1)|_BV(DDB2)|_BV(DDB1);   //pwm portd1 2 3
  109.  
  110. TCCR1A = (1<<COM1A1)| (1<<COM1B1);
  111. TCCR1B = (1<<WGM13) | (1<<CS11) ;//Posztás 8al
  112. ICR1 = 10000;//periódus: 20ms
  113. OCR1A = 750;//servo1 1500us
  114. OCR1B = 750;//servo2 1500us
  115. }
  116.  
  117. void delay_5us(uint16_t delay_data) {//5us es késleltetés(így kevés memóriát foglal)
  118.          while(delay_data--) _delay_us(5); }
  119.  
  120. void s_pwm(void){
  121. ///////////////software pwm
  122. PORTB=2;
  123. _delay_ms(1);
  124. if (buffer=='='){
  125. if (rec[0]=='a'){servo=strtoint(2);};
  126. UARTSzovegKuld("Servo modified!");
  127. delrec();
  128. buffer=0;
  129. }
  130. delay_5us(servo);
  131. PORTB=0;
  132. }
  133.  
  134. int main(void){
  135.  
  136. //init_servo();
  137.  
  138. DDRB=255;
  139. PORTB=0;
  140.  
  141. uart_init();
  142. UARTSzovegKuld("Uart Online! Ready To Serial communication!");
  143.  
  144. sei();
  145.  
  146. PORTB=1;
  147. ///////
  148. while(1){
  149.  
  150. s_pwm();
  151. _delay_ms(18);
  152. if (inter==1){
  153. PORTB=1;
  154. _delay_ms(5);
  155. PORTB=0;
  156. inter=0;
  157. };
  158. }
  159. }
  160.  
  161. ISR(SIG_USART_RECV)
  162. {  
  163.    if(UCSR0A & (1 << RXC0)) {
  164.         buffer = UDR0;}
  165.  
  166. rec[stat]=buffer;
  167. stat+=1;
  168.  
  169. if (echo){UARTKuld(buffer);};
  170.  
  171.  if (buffer==8){
  172.  delrec();
  173.    }
  174.  
  175.  
  176.    if (buffer=='?'){
  177.     kuldrec();
  178.    }
  179.  
  180. if (buffer=='!'){
  181.   if (comm("alma")) {UARTSzovegKuld("alma fogadva!");}else
  182.   if (comm("echo")) {UARTSzovegKuld("Echo ON!"); echo=1;}else
  183.   if (comm("eoff")) {UARTSzovegKuld("Echo Off!"); echo=0;} else
  184.   if (comm("info")) {UARTSzovegKuld("Uart Online! "); UARTSzovegKuld("| 38400bps | atmega48 | string.c");}
  185.   }
  186.  
  187. if (buffer=='%'){
  188. int number=strtoint(1);
  189. outdec(number,0);}
  190.  
  191. inter=1;      
  192. }
(#) sgt válasza mzozo95 hozzászólására (») Júl 24, 2012 /
 
Szemaforra egy példa:
  1. #include <stbool.h>
  2.  
  3. volatile bool semafor = false;
  4.  
  5. ISR(UART_RX_vect) //megszakítás forrásának a neve nem ugyanaz mint a SIGNAL-ban használtéval
  6. {
  7. semafor = true;
  8. }
  9.  
  10. int main(void)
  11. {
  12.  
  13. if(semafor == true)
  14. {
  15. //lefut az amit az intteruptba tennél
  16. semafor = false;
  17. }
  18.  
  19. }
A C-ben ahogy helyesen megállapítottad nincs bool változó, viszont a gcc ismeri a C++-t is amiben már van, de ez a te szempontodból lényegtelen. A kód nem tudom, hogy lefut-e, mert jelenleg nincs működő fordítóm a gépen, és pluszban nagyon fáradt vagyok már. Ha nem fordulna le, akkor unsigned char típusú változóval ugyanezt megcsinálhatod 0-kal és 1-kel. (Igazából a két módszer között nincs megvalósításában különbség, mert mindkettő 1 bájtot foglal le, viszont az előbbi módszer evidensebb, hogy mire használod fel.)

Továbbra sem látok volatile-t , és még mindig túl sok a globális változó.
(#) mzozo95 válasza sgt hozzászólására (») Júl 25, 2012 /
 
Avr studiot használok, ott csak sima C van sajnos, és nem használható benne a bool. Megteszi majd a char is.
A volatile pontosan mit csinál?
Találtam róla egy leírást:
Idézet:
„Bár ritkán használjuk érdemes tudni, hogy van még egy módosító kulcsszó:
volatile. Ez a kulcsszó azt mondja meg a fordítónak, hogy a változó értéke úgy is
megváltozhat, hogy a fordító nem szerez róla tudomást. (Például több szálú,
threading, programfuttatás során.)”

De ez pontosan miért is jó nekem, így ez a while-os bug megszűnik?
(#) mzozo95 válasza mzozo95 hozzászólására (») Júl 25, 2012 /
 
Valóban, így minden bug eltűnik ami a while hoz köthető... Tehát célszerű minden változót ellátni ezzel a volatile-val, aminek köze van a végtelen ciklushoz és globális változó.

Egyébként, pl ha egy függvényben kellene nekem egy változó, aminek az értékére a függvény lefutása után is szükségem lesz, de csak ugyanebben a függvényben, akkor is globális változó kell. Jól gondolom?
(#) zombee válasza sgt hozzászólására (») Júl 25, 2012 /
 
Elmondom mi a baj: MAX3002.
Szerintem már leírtam ebben a topikban, hogy mire jutottam ezzel az IC-vel. Kb. fél éve.
Sajnos túl nagy a csatornaellenállása(~6kOhm), ami a RESET 10kOhm felhúzó ellenállásával is összeveszik.
Maga az IC sem valami stabil, kóboráramok miatt képes beragadni. Nem AVR-programozókhoz találták ki.

Ha egyszerű áramkört akarsz akkor ellenállásos leválasztást(~220Ohm minden vonalra),
ha korrektre vágsz akkor FET-es megoldásra, vagy GTL2003 IC-re lesz szükséged.

És igen, nagyságrendekkel gyorsabb mint a Doper, de még a gyári STK-500 is alulmarad.
A munkahelyen is inkább a házi készítésű mkII-t használom ha sokat kell égetni...
(#) zombee válasza mzozo95 hozzászólására (») Júl 25, 2012 / 1
 
Igazából bármi lehet globális. Csak annyi a különbség hogy az végig a memóriában marad,
és nem a stack-en foglal helyet. Sok ideiglenes, vagy azonos nevű változót használó függvényeknél
nem ajánlott. Ha kritikus az időzítés vagy a kódméret, a volatile-t csak az interruptban használt
változókra használd, ettől függetlenül odateheted bárhová. Én azért nem használom ész nélkül,
mert nagyobb lesz tőle a kód, és processzoridőt is elvesz a programodtól.
(#) trudnai válasza mzozo95 hozzászólására (») Júl 25, 2012 / 1
 
Idézet:
„Valóban, így minden bug eltűnik ami a while hoz köthető... Tehát célszerű minden változót ellátni ezzel a volatile-val, aminek köze van a végtelen ciklushoz és globális változó.”


Az, hogy vegtelen ciklus van nem azt jelenti, hogy egy 'volatile' nevu varazsszo azt meg fogja neked oldani! A vegtelen ciklusnak rengeteg oka lehet! De most koncentraljunk az eredeti temara!

A volatile pusztan az optimalizalast kapcsolja ki az adott valtozora. Mert mi is tortenik? Ahhoz, hogy a kodod kicsi es gyors legyen, a fordito csomo trukkot csinal. Tobbek kozott nezi, hogy a valtozod nem valtozik. Tehat a while feltele sohasem fog valtozni (gondolja a fordito), ezert felesleges azt figyelni -- egyszeruen kihagyja a vizsgalatot a kodbol es a ciklusod egy egyszeru vegtelen ciklussa degradalodik le. De mas miatt is lehetnek problemak amik szinten az optimalizaciobol erednek, pl egy RAM-ban tarolt valtozot athelyezhet regiszter teruletre a gyorsabb feldolgozas miatt, es ugy gondolhatja, hogy mivel sokszor kerdezgeted le a valtozot, felesleges ujra es ujra beolvasni azt a RAM teruletrol. Tehat a megszakitas a RAM teruleten modositgatja ugyan a valtozod, de azt a ciklus fejleceben nem olvasgatja ki...

Az ilyen optimalizalasok legtobb esetben eszrevehetetlen a kodod logikaja szempontjabol, a program hiba nelkul fogja csinalni azt amit kigindoltal. Azonban ebben az esetben Te megiscsak azt szeretned, hogy a while feltetele vizsgalva legyen, hisz tudod, hogy ha a ciklus magban nem is, de a megszakitasban az a valtozo igenis valtozhat. Ezt mondod meg a forditonak a volatile kulcsszoval, es ennek hatasara a fordito nem fog buveszkedni es kioptimalizalni a valtozo figyeleset, azt minden esetben ki fogja olvasni a megfelelo RAM teruletrol es ellenorizni annak erteket.

Ebbol kovetkezik, hogy 'volatile' mindenhova kell, ahol ilyen jellegu hibakra lehet szamitani -- mashova felesleges, persze hibat nem okoz, csak lassbb es nagyobb kodot, mivel nem lesz szepen optimalizalva. Itt a kontrollerek vilagaban a megszakitas az elso szamu gyanusitott, de ha bele nezel a header fileokba a regiszterek definicioiba, ott mar gyarilag figyelnek erre (hisz pl egy port valtozasat vagy timer, vagy egyeb modul valtozasat szeretned figyelni, akkor nem lenne jo ha a fordito ezeknek a regisztereknek a figyelgeteset kioptimalizalgatna). Ezen felul ha RTOS-t hasznalsz (Real-Time Operating System, azaz Valos Ideju Operacios Rendszer), akkor ott is elofordulhatnak hasolo bukfencek a parhuzamos programvegrehajtasbol eredo problemak miatt.
(#) Csépe Zoltán válasza Csépe Zoltán hozzászólására (») Júl 25, 2012 /
 
Valaki tudna segíteni?

Idézet:
„Sziasztok! Az miért van ha áramot adok az attiny45-nek akkor a PB0-n lévő led felvillan de PB4-en lévő nem?”
(#) mzozo95 válasza trudnai hozzászólására (») Júl 25, 2012 /
 
Köszönöm válaszod, tényleg hasznos volt! Örülök ennyi jó magyar szaki van a témában!
(#) sikolymester válasza norbigal hozzászólására (») Júl 25, 2012 /
 
Adatlap 236. oldal

Idézet:

If the user has a fixed voltage source connected to the AREF pin, the user may not use the other reference voltage options in the application, as they will be shorted to the external voltage.


Ezért mér mindig egy referencia ellenében.
(#) sikolymester válasza Csépe Zoltán hozzászólására (») Júl 25, 2012 /
 
Azért mert olyan program fut benne, aminek ez a működése.
(#) sikolymester válasza mzozo95 hozzászólására (») Júl 25, 2012 / 1
 
Idézet:
„bool változótípus nincs a c-ben? mejnek értéke 0 vagy 1? Mert az lenne a legegyszerűbb szemafor, és nem foglalna sok helyet(mint a mostani char-os megoldás) Ha így próbálon definiálni:”

A bool ugyanúgy 1 byte-ot használ az AVR-ben.

Amúgy tartalmazza a standard c is.
  1. #include <stdbool.h>

aztán mehet is.
(#) mzozo95 válasza sikolymester hozzászólására (») Júl 25, 2012 /
 
Nagyszerű, köszi!
(#) norbigal válasza sikolymester hozzászólására (») Júl 25, 2012 /
 
OOOOOooooooooooo, pedig ezt vagy kétszer már átolvastam, át is futott bennem, hogy mit is ír pontosan, de valamiért mégis figyelmen kívül hagytam.... :| Akkor szinte tuti h ez lesz a probléma. Kipróbálom. Köszönöm a segítséget, valszeg ez lesz a kulcs
(#) norbigal válasza norbigal hozzászólására (») Júl 25, 2012 /
 
Hozzászólásom javítom: Hirtelen felbuzdultam, hogy az AVCC-ről ír az adatlap, de nem, hanem AREF-ről. Az pedig a földre van kötve - még valahol írta is az adatlap, hogy a földre ajánlott kötni, szal tutira nem kötöttem máshova. Tehát a lehetetlen helyzet továbbra is fenn áll... Amúgy működik az AD átalakító meg minden, csak a 0-5V-os tartomány miatt az a 2-300 mV-os feszültség roppant gagyi felbontásban jelenik meg, és másfél-két °C fok változás is kell, hogy az AD átalakító akárcsak egyetlen értékkel is változzon. Gondoltam már arra is, hogy nem-e a 3-szoros átszerelés/forrasztástól megzakkant a chip :| Végülis ez az Atmega128-as már 3 panelben is volt, szóval ilyen téren "viharvert".
(#) sikolymester válasza norbigal hozzászólására (») Júl 26, 2012 /
 
Most nincsen keznel nekem az adatlap, de szerintem rossz otlet az AREFet foldre kotni. Az adatlap nem egy kondit emlit az AREF es fold kozott?
(#) zombee válasza norbigal hozzászólására (») Júl 26, 2012 /
 
Tipp: az AREF-re köss kisebb feszülstéget(~1V), ezzel megnöveled az érzékenységet(de a zajt is).
Fontos hogy a referencia stabil legyen, és a mérendő fesz is 0V-AREF közé eshet!
Ezután már csak annyi a dolgod, hogy az ADC-ben a referenciát AREF-ről veszed(ADMUX) és kész vagy!
(#) norbigal válasza sikolymester hozzászólására (») Júl 26, 2012 /
 
Igen,igen úgy gondoltam, csak nem írtam a kondit. De azért köszi.
Zombeee
Ha a panelemmel viszonylag sok barbárkodás nélkül meg bírom oldani, akkor mindekép megpróbálom.
(#) mario1111 válasza zombee hozzászólására (») Júl 26, 2012 /
 
Üdv!

Én is erre gondolok, de még nem teljesen értem, hogy miért. Az a furcsa, h program memóriával áll összefüggésben. Ha belefordítok olyan C fájlokat, amik már nem kellenek és nem is használom őket akkor is megnő a program mérete és akkor fagy. Volt már hasonló. Még csak nem is függvények meg program, hanem program memóriában tárolt képek miatt. Mivel a műszer, amit fejlesztek egyszerre 3 nyelvet kezel, ezért 3 nyelven vannak benne BMP-ből átalakított képek. Amikor viszont elértem a plusz képekkel az ATXMEGA192-flash-ének a 75%-át kb, akkor el se indult, mindig resetelt. Ekkor elkezdtem kivenni képeket a kódból egyenként és egyszer csak ment. Tehát volt egy éles határ ahol meghalt.

Márió
(#) blackdog hozzászólása Júl 26, 2012 /
 
Sziasztok!

24 VAC feszültséggel fogom vezérelni az AVR-t. Erre van három lehetséges megoldásom. Szerintetek melyik vagy milyen megoldás lenne a legbiztonságosabb hosszútávon?

24VAC-BE.JPG
    
(#) zombee válasza blackdog hozzászólására (») Júl 26, 2012 /
 
Hello!

Azt kellene figyelembe venni hogy egy mezei optocsatoló bétája általában 1-nél kisebb. Tehát a legalsót
preferálnám, és a D22-re (szerintem) nincs szükség, a D23 és a kondi megfogja az ellenfeszültségű komponenst.
(#) blackdog válasza zombee hozzászólására (») Júl 26, 2012 /
 
TLP621/GB amit használok ennek a CTR értéke az én esetemben, ha látom akkor 100%. 10 mA kívánok használni bemeneti oldalon. Ekkor az AVR kell, hogy menjen nem? Mondjuk nem néztem, hogy az atmega128 hány mA-t használ.
Következő: »»   461 / 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