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 / 842
(#) 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 / 842
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