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   648 / 837
(#) Szabi1 válasza kapu48 hozzászólására (») Feb 13, 2015 /
 
Valahogy a kimenő adatot is ketté osztani, és úgy meghajtani. Csak nem tudom hogy oldható meg.
(#) benjami válasza Szabi1 hozzászólására (») Feb 13, 2015 /
 
Miből gondolod, hogy 2db 10 bites ADC-vel 16bites ADC-t tudsz csinálni? Ha normális minőséget szeretnél, léteznek direkt arra készült I2S buszos audio A/D és D/A átalakítók. Persze ehhez nem árt ha a mikrovezérlőn is van I2S lehetőség. Ilyet csak 16 vagy 32 bites vezérlőkben találsz, a 8bitesek teljesítménye nem is lenne elegendő ehhez (gondolom azért nincs egyikben sem).
(#) Szabi1 válasza benjami hozzászólására (») Feb 13, 2015 /
 
Akkor marad a direkt digitális végfokokhoz tervezett IRS2092, köszönöm szépen a válaszokat.
(#) tursaba válasza zombee hozzászólására (») Feb 14, 2015 /
 
Ezt találtam:
(#) zombee válasza tursaba hozzászólására (») Feb 14, 2015 /
 
Na épp ez a bajom, mert a 16 lábú CH340G pont nincs benne...
Ezt is csak egy kínai lapon. Inkább feltöltöm mert az URL-ben is kínai betűk vannak. Nem hiszem el hogy egy ilyen gyatra támogatottsággal rendelkező cuccost képesek az Arduino-ba beépíteni!
A hozzászólás módosítva: Feb 14, 2015
(#) csabeszq válasza Szabi1 hozzászólására (») Feb 14, 2015 /
 
A 16 bites ADC-ről. Vásároltam egy chipet, ami 13 bites ADC-re képes (MCP3302).

A chip működött is rendesen, hozta az ADC-t 9 bit pontossággal. Az AVR ADC-je kevésbé volt zavarérzékeny, ott azért 9.5 bitig el lehetett jutni breadboard-on.

Ezzel kb. azt akartam mondani, hogy a 16 bites ADC-hez kell már egy kicsit edzeni zavarszűrés terén.
(#) zombee válasza csabeszq hozzászólására (») Feb 14, 2015 /
 
Meg egy atomstabil táp sem árt az A/D konverterhez. Zavarszűrő tekercs, stabilizátor, műverősítő, utóbbi körébe "lassító" kondi, a végén zavarszűrő kondi a táplábakon. Nem nagy cucc, de egy kis ingadozás tényleg hazavágja a 16 bitet.
A hozzászólás módosítva: Feb 14, 2015
(#) Massawa válasza zombee hozzászólására (») Feb 14, 2015 /
 
Söt a 16 bites ADC-hez már az alkatrészeket is válogatni kell a minimális alapzajra. Utovégre 90 dB-s dinamika körül kell dolgozni.
(#) kapu48 hozzászólása Feb 17, 2015 /
 
Ingyen letölthető: A C++ Programozási nyelv.pdf
Bővebben: Link
(#) csabeszq hozzászólása Feb 17, 2015 /
 
Az USB RS232 átalakítókról kérdeznék. A problémám, hogy ezek az eszközök tesznek a szabványra és a [-15V - -3V, +3V - +15V ] helyett [0V, 5V]-ot adnak ki. A 0V pedig tiltott érték RS232 alatt. Bemértem multiméterrel és nincs negatív feszültség rajtuk.

A kérdés, hogy mondjuk ezek az eszközök képesek-e a MAX232-t fogadni, ami -9V +9V-ot tesz a buszra, vagy az ellenállás-zener kombót is kispórolták belőlük?

(HL-340 átalakító, CH340G chip)
(#) zombee válasza csabeszq hozzászólására (») Feb 17, 2015 /
 
Sírjak vagy nevessek? Kedves URAM, Ön hol volt az utóbbi 2-3 évben? Tudja mit jelent a TTL?

Akkor az AVR-nek is +/- 15V-ot kéne kiadnia/fogadnia a TxD/RxD lábakon? Azért ez vicces lenne.
Létezik olyan is hogy "USB to Serial" ami nem tévesztendő össze az RS-232 szabvánnyal! Az RS-232 (többek között) +/- 3 és 15V közötti feszültségszinteket definiál, ahol a -3V-nál kisebb feszültség a "logikai 1" illetve az "idle" állapotot jelentheti. A TTL esetében az 5V jelenti ugyanezt!

A MAX232 pedig pont arra való, hogy az RS-232 és a TTL között átjárást biztosítson. Az "USB to Serial" IC-k szinte mindig TTL feszültségszinttel kommunikálnak(köztük az FT232 is!) ahogy az AVR is.

A TTL azért van mert bármilyen irányban olcsó a kivitelezése, a kapcsolódó áramkörök, kapcsolók egyszerűek lehetnek, és nem igényel "szélsőséges" tápfeszültségeket. Az RS-232 a nagy feszültségszintjeivel azért létezik, mert eredetileg modemekhez tervezték hosszú kábelekkel ahol a 0-5V már elfogadhatatlan mértékű adatvesztést produkálna. Nem utolsósorban az analóg telefonvonalak feszültségszintje (a csengetést leszámítva) +/- 24V körüli.
A hozzászólás módosítva: Feb 17, 2015
(#) kala1982a válasza csabeszq hozzászólására (») Feb 17, 2015 /
 
Fizikus írt erről egy cikket 5 éve. Ebben szépen le vannak írva a miértek és a hogyanok is:Bővebben: Link
A hozzászólás módosítva: Feb 17, 2015
(#) csabeszq válasza zombee hozzászólására (») Feb 17, 2015 /
 
átalakító itt

Úgy tudtam, hogy a DSUB9 nem TTL-lel megy, ennek ellenére 5V és 0V-ot ad ki a lábakon.
A hozzászólás módosítva: Feb 17, 2015
(#) zombee válasza csabeszq hozzászólására (») Feb 17, 2015 /
 
Az hogy ki mit köt DSUB-9 csatira az magánügy, pl. az EGA monitorok is ilyet használtak TTL jelekkel.
De ha valamit "RS-232 compliant" - ként hirdetnek miközben TTL jeleket használ, az nem
csak termékhamisítás, hanem az eszközök tönkremenetelét is okozhatja! Főleg az átalakítóét.
Hol láttad hogy 5V? Esetleg vásároltál és kimérted? Az 5-ös és a 3-as tüske között kell mérni.
Ezekben az átalakítókban még szokott lenni egy konverter IC, hasonló mint a MAX232 csak több csatornája van.

És elnézést kérek a személyeskedőnek tűnő bekezdésért, nem volt szándékomban megsérteni.
Csak olyan mértékben keveredtek a fogalmak mint Egely György irományaiban a Maxwell-egyenletek.
A hozzászólás módosítva: Feb 17, 2015
(#) TavIR-AVR válasza zombee hozzászólására (») Feb 18, 2015 /
 
Nono. Az RS-232 az a Recommended for Standard. Azaz közelítek a szabványhoz és nem mindenütt tartom be (de nem mondom meg, hogy hol nem).
Ha szabványos portot akarok, az az EIA-232!
Ezen a feszszintek adáskor +/- oldalon 5...15V, vételkor 3...15V-ot ismer. Sebességek is a szabványban megadottak (1200, 300, 9600 stb). Meg az időzítések, felfutások, stb.

Az RS-232ben eltérek. valamiben. Pl. ha PC compatible, akkor a szintek:-.15....+0.7V és +1.8V...+15V. Ezért egy régebbi PC-n sima TTL jelekkel (ha az invertálás megvolt) simán kommunikálom. Egy EIA-232-es eszköz esetén a tiltott tartományban vagyok, és minden lesz csak nem kommunikáció!

Csakugye a szakmai szleng e két dolgot összemossa. Miközben nem kéne...
(#) zombee válasza TavIR-AVR hozzászólására (») Feb 18, 2015 1 /
 
Csak egy mai cuccnak nem kéne (még invertálással sem) TTL jeleket kiadnia, ebben remélhetőleg egyetértünk.
(#) csabeszq válasza zombee hozzászólására (») Feb 18, 2015 /
 
TTL jelet adnak ki, kimértem, 0V és 5V van a vonalakon. Egy CH340G IC van benne és kész, nincs mellé MAX232, ami a vonali szintillesztést végezné.

Jóformán csak a PCI kártyákon van szintillesztés, mert a buszon ott eleve kinn van a +-12V szemben az USB-vel.

Működni persze működik. Lehet, hogy nem kellene vele problémáznom, mert amíg megy, addig ne érdekeljenek a részletek.
A hozzászólás módosítva: Feb 18, 2015
(#) zombee válasza csabeszq hozzászólására (») Feb 18, 2015 /
 
Idézet:
„Jóformán csak a PCI kártyákon van szintillesztés”

Ne ijesztegess!
Eddig minden USB illesztővel amivel dolgom volt abban volt valamilyen szintű illesztés,
ha nem is +/-12V, de minimum +/-5V biztosan. És nem 0-5V, mert a -3V - +3V egy tiltott sáv.
Most gyorsan elő is vettem a Quectel-es csomaghoz kapott noném kínai kábeleket, +/-6.5V megvolt rajtuk.

A Te CH340G-s cuccod egyszerű hamisítvány, de mintha korábban Prolific-eset linkeltél volna be...
Egyébként ezekben az USB-RS232 kábelekben (legtöbbször) olyan IC-ket alkalmaznak manapság amelyekben a szintillesztő is benne van, az egycsipes megoldás mégiscsak olcsóbb mint beépíteni egy összcsatornás MAX213 IC-t. Akárhogy is nézzük, a tiéd teljesen megerőszakolja a szabványt.
A hozzászólás módosítva: Feb 18, 2015
(#) csabeszq hozzászólása Feb 19, 2015 /
 
Nézegettem a WS2812-es LED szalagokat, mert programoznék szórakozásból párat.

A speckó azt írja, hogy egy chip 0.3W-ot fogyaszt. Ha 5m-es szalagot veszek, akkor azon 150 chip lesz, azaz ha fehéren világítunk, akkor 45W-ot megeszik.

Ezzel eddig nem is lenne baj, de mindezt 5V-on csinálja, így barátok között is 9A kell neki.
Ez a 9A nekem kicsit keménynek tűnik. A szalagon végigvezetett táperek elbírnak ilyen mosógép nagyságú áramot vezetni?
(#) killbill válasza csabeszq hozzászólására (») Feb 19, 2015 /
 
Idézet:
„Ez a 9A nekem kicsit keménynek tűnik. A szalagon végigvezetett táperek elbírnak ilyen mosógép nagyságú áramot vezetni?”
Elvezetni elvezetik, csak jelentos feszultsegeses lesz rajta. Nem eppen uzemi allapot. Ami LED-szalag adatlapot olvastam, ott mindig megadtak a maximalis hosszt. Az 5m altalaban a 12V-os RGB szalagokra volt jellemzo, esetleg a surubb, de 24V-osokra.
(#) zombee válasza csabeszq hozzászólására (») Feb 19, 2015 /
 
Végighúzol a szalag mellett mindkét oldalt 1-1 vezetéket, és néhol rá is forrasztod...
(#) csabeszq válasza zombee hozzászólására (») Feb 19, 2015 /
 
Igen, ez jó ötletnek tűnik.
(#) zombee válasza csabeszq hozzászólására (») Feb 19, 2015 /
 
És mivel szeretnéd megoldani a kommunikációt? Pár száz ns-okat várakozni szerintem necces lehet, ezért én is elgondolkodtam rajta. Valami hardveres cuccot kellene az AVR-en munkára fogni, és valószínűleg az USART lesz erre a legalkalmasabb. Az egy bit átvitelére szolgáló időt 3 egyenlő részre kell osztani, 400ns szerintem jó lehet. Az első rész mindig HI, a harmadik mindig LO, és a középső az ami meghatározza hogy logikai 1 vagy 0 lesz a bit. USART-nál ha 20MHz-es az AVR, és aszinkron módot választunk akkor U2X=1 és UBRR=0 esetén a 2.5 MBaud szimbólumsebesség pontosan 400ns bitidőt jelent. Az AVR TxD vonalára egy invertert kell kötni(elég egy NPN tranzisztor felhúzóval), mivel a nyugalmi állapot itt a 0V, míg az USART-nál az 5V. Ezzel egy USART keretbe pontosan 3 bitnyi WS2812 információ fér bele az alábbi séma szerint:
- az adatbitek száma 7 bit, 1 stopbit, nincs paritás
- a start bit a legelső alkalommal átküldött bit első harmadát jelenti(HI)
- a 0. bit hordozza az információt(INFO1), az 1. bit mindig LO
- a 2-4. bit a második információs bitet viszi át. 2.=HI; 3.=INFO2; 4.=LO
- az 5. bit mindig HI, 6.bit=INFO3, utána jön a stop bit ami mindig LO.
Ha az átküldés alatt már bemásoltad a következő 3 bitnyi információt az UDR-be akkor az átvitel folyamatos.
(#) csabeszq válasza zombee hozzászólására (») Feb 19, 2015 /
 
Bit-bang. Mialatt a ledeket frissítem, értelemszerűen semmi mást nem csinálok.

1.25 us jut egy bitre, 150 LED * 24 bit * 1.25 = 4.5 ms.

Lehetne még PWM-mel is megoldani, az OCRB mozgatásával, de semmi értelme, mert azzal sem fogok semmit sem csinálni, magyarul a bit-bangnél semmivel nem jobb.

Az UART-ról: nem gondoltam át, hogy valóban megy-e amit leírtál, elfogadom, hogy 3 bitet át lehetne küldeni. Ez 60 órajel. Az interrupt meghívása, egy JMP, RETI az lehet 10 órajel, az interrupt lekezelése meg 30, ha hiperokos vagyok. Hiába szórakozunk UART-tal, a mikrovezérlő akkor sem lesz képes érdemleges munkát végezni.

Emellett semmiből nem áll egy másik mikrovezérlőt berakni, amelyik nem a LED szalag bizgetésével foglalkozik.
(#) csabeszq válasza csabeszq hozzászólására (») Feb 19, 2015 /
 
De mondjuk egy 72MHz-s arm cortex 1200 Ft az ebay-en, ami 32 bites és DMA-zni is tud. Képes hardverből tolni az egészet. Csak győzzem kitalálni, hogy hogyan...
(#) zombee válasza csabeszq hozzászólására (») Feb 19, 2015 /
 
A bitbang működőképességében nem lennék ennyire biztos. Egy _delay_us(1) az már majdnem egy komplett bitidő, assembler nélkül már elég problémás lenne. Az USART-ot nem azért hoztam fel hogy az átvitel ideje alatt érdemi munkát végezzen a processzor, hanem a pontos időzítés és az egyszerű(bb) programszervezés miatt. Míg az átvitel tart, lehet foglalkozni a következő elküldendő bithármas átkonvertálásán, majd várni míg az UDRE 1 lesz és ezt addig csinálni (egy ciklusban) amíg van átküldendő adat.

Ha mégis bitbang lenne akkor használnám valamelyik időzítőt CTC módban, melynek körbefordulási ideje 400ns lenne és akkor két beágyazott ciklussal megvalósítható az átvitel. Persze egy 20MHz-es kristály itt is jól jön. A kérdés mindig az, hogy mire szeretnéd használni, hány LED-et használnál egy sorban, milyen színmélységeket akarsz elérni.

Én máris VGA megjelenítésben gondolkodom ahol az adatátvitelre (soronként) elég lenne egy AVR sebessége és memóriája. De ezt a memóriát nehézkes lenne feltölteni közvetlenül az A/D konverterről ami 40-120MHz is lehet.
A hozzászólás módosítva: Feb 19, 2015
(#) csabeszq válasza zombee hozzászólására (») Feb 20, 2015 /
 
Bővebben: Link

A kód a Commodore-os időkből megszokott ciklusszámlálási módszerre épül.
Bit-bang, pontosan órajelre szinkronizálva, assemblyben.
A hozzászólás módosítva: Feb 20, 2015
(#) zombee válasza csabeszq hozzászólására (») Feb 20, 2015 /
 
Azok a "régi" szép idők amikor AVR-el hajtottam VGA monitort, és a teljes képidő minden órajelére le volt osztva hogy éppen mit csinál a cucc. Igen, ciklusokkal és elágazásokkal együtt. Tele volt a kód időkiegyenlítő szakaszokkal, be voltak számozva az utasítások. Mindezt assemblerrel, máskülönben szétesett volna a kép.
(#) wbt válasza csabeszq hozzászólására (») Feb 20, 2015 /
 
Szia!
Én az 5m-es szalagokat 5V/2.5A-es kis kapcsolóüzemű tápról hajtottam, tökéletesen ment. Mondjuk a programokban nem volt 100% fehér. Amiket én írtam, azokban 0xE0 volt a legnagyobb PWM érték, felette már nem láttam fényerőnövekedést csak fogyasztott.
Egy pontról volt csak megtáplálva (bár mindkét végén ki van vezetve a táp is szerencsére) és
nem tapasztaltam besárgulást.
Az adatkivitelen én is agyaltam, de a bitbillegtetés lett a vége, mert nincs DMA az alkalmazott prociba és kevés a RAM is. Semmi gondom nem volt vele, bár 1 ember panaszkodott, hogy téved, de ott Ő bizergálta a uC belső oszcillátorát valamivel-valamikor, nekem belsővel is megy tökéletesen, na jó, illene a külső kvarc. A soros perifériák alkalmazásának csak akkor látom értelmét, ha van DMA vagy pl. beépített TFT vezérlő (ilyen megoldással is találkoztam). Különben olyan gyorsan megy ki a byte, hogy felesleges visszamenni a főprogramba, majd újra INT-push stb.
JAni
(#) videokartyab hozzászólása Feb 20, 2015 /
 
Sziasztok

Hogyan oldható meg az hogy 8MHz-es belső órajelet leosszam legalább 2MHz -re az LCD kijelző számára?
Sajnos ha eleve 2MHz-et állítok be akkor pedig fura pici sípoló hangot ad a venti(PWM).
Előre is köszönöm a segítséget.
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>
  4.  
  5. /*LCD function declarations */
  6. void LCD_send_command(unsigned char cmnd);
  7. void LCD_send_data(unsigned char data);
  8. void LCD_init();
  9. void LCD_goto(unsigned char y, unsigned char x);
  10. void LCD_print(char *string);
  11. void LCD_blink();
  12. void LCD_scroll(unsigned char direction);
  13.  
  14. #define LCD_DATA_PORT   PORTD
  15. #define LCD_DATA_DDR    DDRD
  16. #define LCD_DATA_PIN    PIND
  17.  
  18. #define LCD_CNTRL_PORT  PORTB
  19. #define LCD_CNTRL_DDR   DDRB
  20. #define LCD_CNTRL_PIN   PINB
  21.  
  22. #define LCD_RS_PIN              0
  23. #define LCD_RW_PIN              1
  24. #define LCD_ENABLE_PIN  2
  25.  
  26. void InitPWM()
  27. {
  28.    TCCR0|=(1<<WGM00)|(0<<WGM01)|(1<<COM01)|(1<<CS00);
  29.    DDRB|=(1<<PB3);
  30. }
  31.  
  32. unsigned int venti(unsigned char csatorna)
  33. {
  34. ADMUX = (ADMUX & 0b11110000) | csatorna;   // ADC csatorna kivalasztasa    //ADC csatorna kivalasztasa(ADC0)
  35. ADCSRA |= (1<<ADSC);    // ADC konverzio elinditasa
  36. while (ADCSRA & (1<<ADSC));    // varas az atalakitasra
  37. ADCSRA |= (1<<ADSC);         // konverzió elindítás
  38. while (ADCSRA & (1<<ADSC));    // varas az atalakitasra
  39. return (ADCH);    // ADC ertek kiolvasasa
  40. }
  41.  
  42.  
  43. void SetPWMOutput(uint8_t duty)
  44. {
  45.    OCR0=duty;
  46. }
  47.  
  48.  
  49. void main()
  50. {
  51.    
  52.    //ADC CONFIG
  53.         ADMUX |= (1<<REFS0)| (1<<ADLAR);    // Vcc mint referencia
  54.         ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);  // ADC engedelyezese, ADC eloosztas = 128 (125 KHz)
  55.  
  56.    //Initialize PWM Channel 0
  57.    InitPWM();
  58.          
  59.  
  60.         LCD_init();
  61.         LCD_goto(1,4);
  62.         LCD_print("Venti kijelzes");
  63.        
  64.        
  65.  
  66.    while(1)
  67.         {      
  68.                                 SetPWMOutput(venti(0));
  69.                                 LCD_goto(2,4);
  70.                                 LCD_print("venti(0)");
  71.  
  72.         }
  73.  
  74.  
  75. }//main vége
  76.  
  77. /* This function sends a command 'cmnd' to the LCD module*/
  78. void LCD_send_command(unsigned char cmnd)
  79. {
  80.         LCD_DATA_PORT = cmnd;
  81.         LCD_CNTRL_PORT &= ~(1<<LCD_RW_PIN);
  82.         LCD_CNTRL_PORT &= ~(1<<LCD_RS_PIN);
  83.  
  84.         LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
  85.         _delay_us(2);
  86.         LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
  87.         _delay_us(100);
  88. }
  89.  
  90. /* This function sends the data 'data' to the LCD module*/
  91. void LCD_send_data(unsigned char data)
  92. {
  93.         LCD_DATA_PORT = data;
  94.         LCD_CNTRL_PORT &= ~(1<<LCD_RW_PIN);
  95.         LCD_CNTRL_PORT |= (1<<LCD_RS_PIN);
  96.  
  97.         LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
  98.         _delay_us(2);
  99.         LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
  100.         _delay_us(100);
  101. }
  102.  
  103. void LCD_init()
  104. {
  105.         LCD_CNTRL_DDR = 0xFF;
  106.         LCD_CNTRL_PORT = 0x00;
  107.         LCD_DATA_DDR = 0xFF;
  108.         LCD_DATA_PORT = 0x00;
  109.  
  110.         _delay_ms(10);
  111.         LCD_send_command(0x38);
  112.         LCD_send_command(0x0C);
  113.         LCD_send_command(0x01);
  114.         _delay_ms(10);
  115.         LCD_send_command(0x06);
  116. }
  117.  
  118. /* This function moves the cursor the line y column x on the LCD module*/
  119. void LCD_goto(unsigned char y, unsigned char x)
  120. {
  121.         unsigned char firstAddress[] = {0x80,0xC0,0x94,0xD4};
  122.  
  123.         LCD_send_command(firstAddress[y-1] + x-1);
  124.         _delay_ms(10)
  125. }
  126.  
  127. void LCD_print(char *string)
  128. {
  129.        
  130.         unsigned char i;
  131.         while(string[i]!=0)
  132.         {
  133.                 LCD_send_data(string[i]);
  134.                 i++;
  135.         }
  136.        
  137. }
  138.  
  139. void LCD_blink()
  140. {
  141.         LCD_send_command(0x08);
  142.         _delay_ms(250);
  143.         LCD_send_command(0x0C);
  144.         _delay_ms(250);
  145. }
  146.  
  147. void LCD_scroll(unsigned char direction)
  148. {
  149.         if(direction == 0)
  150.                 LCD_send_command(0x18);
  151.         else
  152.                 LCD_send_command(0x1C);
  153.         _delay_ms(1000);
  154. }
Következő: »»   648 / 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