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   704 / 840
(#) killbill válasza zombee hozzászólására (») Nov 13, 2015 /
 
A frekvenciától nem függ a kitöltési tényező! A PWM felbontását kell növelni. Ha a 8 bit kevés, akkor 16-ra.
(#) zombee válasza killbill hozzászólására (») Nov 14, 2015 /
 
Na igen, ez a másik, hogy 16 bites PWM-re váltani és úgy frekit növelni.
(#) Kovidivi válasza fecus hozzászólására (») Nov 14, 2015 /
 
Rakj a LED elé egy soros ellenállást, amivel a maximális áram kisebb lesz, így a minimális is.
(#) fecus válasza Kovidivi hozzászólására (») Nov 14, 2015 /
 
Utána van, de az sorosan mindegy. Ha növelem, akkor meg a nyitott állapot fényereje lesz kevés.
zombee: Attiny25. Nincs neki csak 8 bites számlálója.

Marad a szoftveres érték módosítás az alsó tartományban.

Köszi.
(#) Kovidivi válasza fecus hozzászólására (») Nov 14, 2015 /
 
Csinálhatsz szoftveres PWM-et is, főleg, ha nem sok dolga van a mikrovezérlőnek. Vagy a két 8bit-es timer-t egymás után kötöd, és lesz 16bitesed. AVR-rel szinte nincs lehetetlen!
A hozzászólás módosítva: Nov 14, 2015
(#) csabeszq hozzászólása Nov 15, 2015 /
 
Összetákoltam egy NeoPixel I2C konvertert.

A probléma az, hogy ha NeoPixel protokollal LED-eket vezérelsz 8 bites AVR-rel, akkor sajnos semmi mást nem csinálsz, mert az Arduino lassú ahhoz, hogy emellett még mintavételezzen is, vagy egyéb dolgot csináljon. Kézenfekvő, hogy I2C-n keresztül kiadjuk a feladatot egy Attiny85-nek. Ez a chip minimális helyet foglal, 8 lába van és ezután a kommunikáció mehet hardveres I2C-vel is.

Ez igazából csak játék, mert erősebb DMA-zó IC-vel kellene mindezt megoldani (STM32), de nekem kissé nehézkesnek tűnt az egész az Arduino mellett, a Nodemcu (ESP8266) környezetet meg még nem ismerem eléggé. Majd rendelek fejlesztőpanelt.

Favágóztam egyet és egy 300 Ft-os Attiny85-nek kiadom, hogy csinálja a Neopixelt, az Arduino meg azt csinál, amit akar eközben, akár audio jelet is mintavézelezhet.
(#) wbt válasza csabeszq hozzászólására (») Nov 15, 2015 /
 
Szia!
Miért nem bírja egy uC az egészet? Ha egyszer kiadtál egy sorozatot, akár évekig is megmarad az adat, addig azt csinálsz amit akarsz. Szűkös esetben még a byte-ok kiküldése között is van 10-30usec időd, de az már tényleg agyon optimalizált cuccnál kellhet. (vagy valamit nagyon benéztem a project-nél) Nekem 100 LED-et hajt T85 dinamikusan, mintavételezve, effektezve (nem kisebbíti a dolgot, hogy benéztem a dolgot máshol és újra kell vésnem, de ez a hülyeségem miatt van)
(#) csabeszq válasza wbt hozzászólására (») Nov 15, 2015 /
 
800 kHz-en megy a NeoPixel. Ez azt jelenti, hogy két bit között 20 órajelciklus telik el. Minthogy hardveres támogatás nincs hozzá, ezért ezidő alatt nem történhet semmi más. Sok LED esetén jelentős idő eltelhet, amíg ezzel foglalkozom.

Audio-t szeretnék mintavételezni (39 kHz), utána FFT, utána NeoPixel.

Persze lehet, hogy mintavételezek 128 byte-ot, FFT, NeoPixel, utána megint mintavételezek. A kérdés, hogy probléma-e, ha két egymást követő mintavételezésnél kiesnek értékek.
(#) wbt válasza csabeszq hozzászólására (») Nov 15, 2015 /
 
Igen, byte kivitele közben nagyon pontosan kell időzíteni, semmi INT meg egyéb nyalánkságok, de szoros esetben byte-ok között van valamire idő, különben meg csak frame-ek között. Így a mintavétel=>feldolgozás=>kijelzés fog csak menni. Szerencsére eléggé pörögnek ezek a uC-k, szerintem a 20-30Hz ciklus lazán fog menni. (bár én még FFT-t nem csináltam). Tegnap találtam Basic-ben írt FFT-t LCD-re de ránézésre be volt áldozva a pontosság a sebességnek. Többi meg ASM, amit láttam...
(#) tursaba hozzászólása Nov 15, 2015 /
 
Szevasztok!
Szeretnélek megkérdezni benneteket, mert a frekimérőmmel elakadtam.
Atmega16, 16.384MHz. Timer1 számol, portb, bit1, 41-es lábon megy be a frekvencia.
TCCR1A=0x0, TCCR1B=0x7, majd 1 sec. múlva TCCR1B=0x0.
Ha a TCCR1B=0x5 (/1024), a kijelzőn 16000Hz, ha =4 (/256), akkor 64000Hz, tehát jó.
Ha TCCR1B=0x7(external, felfutó él), akkor 8Hz bemenő jelnél a kijelzőn 370~520 -ig mindenféle értéket kapok.
Az Atmega lábon ott a 8Hz !
Mit rontottam el szerintetek?
Köszönettel.
(#) Kovidivi válasza tursaba hozzászólására (») Nov 15, 2015 /
 
Túlcsordul a számláló?
(#) tursaba válasza Kovidivi hozzászólására (») Nov 15, 2015 /
 
8Hz-nél még messze van a 65535-től 1 sec alatt !
(#) csabeszq válasza tursaba hozzászólására (») Nov 16, 2015 /
 
Kód nélkül nehéz látni, de én is túlcsordulásra gyanakszom.

Azt gondolnám, hogy a TCNT1-ből valahogy Hz-et kellene varázsolnod. Nézd meg, hogy a köztes számolásnál nincs-e túlcsordulás. Nem használsz-e előjeles int-et, ahol a 64000 már túlcsordulásnak számít.

Gondolj bele, 65535/10 az nem ugyanaz, mint -1/10.
(#) tursaba válasza csabeszq hozzászólására (») Nov 16, 2015 /
 
Írtam a probléma felvetésnél. A varázslás megtörtént. Ha órajelet mérek előosztóról, jó eredményt kapok ! TCCR1B=0x00 leállítja a számlálást, de portról vezérelt kapuval ua. a probléma és a kijelzett eredmény is.
1 sec mérés, kijelzés xxxHz, TIMER1 nullázás, ismét u.a. 8 Hz-nél elő sem fordulhat 1 sec alatt túlcsordulás, főként úgy, hogy 370~520 -ig mindenféle értéket kapok. Túlcsordulás,- ennek ellenére-, ha előfordulna 0-65535-ig mindenféle értéket kapnék, vagy 0-32768-ig. Szerintem.
Már néztem az asm. kódot is. Atmegán belüli valami kehére gondolok, de tanácstalan vagyok.
Remélem nem a MikroC szívat valamivel. Az unsigned long int-et kipróbálom, hátha ez......
(#) rolandgw válasza tursaba hozzászólására (») Nov 16, 2015 /
 
MikroC ?! A futottak még kategóriában sem jegyzik avr fordítóként.
(#) tursaba válasza rolandgw hozzászólására (») Nov 16, 2015 /
 
Melyik, amelyik fut avr fordítóként?
(#) rolandgw válasza tursaba hozzászólására (») Nov 16, 2015 /
 
Avr gcc. Ha fizetni is akarsz érte,akkor határozottan Codevision avr.
(#) Csillagnyee hozzászólása Nov 16, 2015 /
 
Sziasztok!
Igen csak elakadtam egy AVRC program írásában TBirdre.
Tasztatúrakezelést szeretnék megoldani, melyben _delay nem lehet.
Egy megszakításom van, ami a 7szegmens kijelzőket villogtatja fel, ebbe illesztettem egy számláló változót, amit figyelgetek _delay helyett, de ez zsákutca.
Tippeket, kódrészleteket szívesen fogadnék.
(#) killbill válasza Csillagnyee hozzászólására (») Nov 17, 2015 /
 
Miert zsakutca?
(#) Droot válasza Csillagnyee hozzászólására (») Nov 17, 2015 /
 
Volatile-ként deklaráltad a változót?
Pl.: volatile unsigned int cnt = 0;
(#) fecus hozzászólása Nov 17, 2015 /
 
Normál Li-ion akkuról szeretném táplálni az Attiny2313-at. Termosztát lenne a garázsban. Kellene az időt mérnie, meg hőmérsékletet, meg rádión kommunikálnia.
Ha tartom az akkun a 3-4,2V-ot (kisütött - töltés alatt) akkor ráköthetem egyenest az akku kapcsaira az áramkörömet? Ha kvarcról megy, hibázhat valami időzítés stb.?
(#) killbill válasza fecus hozzászólására (») Nov 17, 2015 /
 
Simán rákötheted. Kvarccal pontos lesz az órajel, nem függ a táptól. Akartam mondani, hogy az A/D referenciára figyelj oda, de látom, hogy ebben a uC-ben nincs is A/D...
(#) csatti2 válasza fecus hozzászólására (») Nov 17, 2015 /
 
Igen rákötheted. Természetesen PTC-t vagy vmi biztosítékot azért tegyél be közéjük.
Max. 10MHz-es kristályt használhatsz, de szerintem kissebb is elég lesz (minnél alacsonyabb az órajel annál kevesebbet is fogyaszt, akkunál ez nem mindegy). Illetve alvó mód is hasznos lehet. A pontos időt nem biztos, hogy ebben az eszközben oldanám meg (ha muszáj, akkor tennék rá egy dedikált RTC IC-t 32,768kHz-es órakristállyal és backup elemmel így nem kell időt állítgatni ha lemerült az akku), ha már ott a rádiós kommunikáció, akkor egy ESP8266-al vagy kábeles ethernetes központi egységgel olvasnám a friss ídőt NTP protokollal az internetről majd időnként átfrissíteném erre az eszközre (plussz előny, internetről is kapcsolható fűtésszabályzás).
(#) csabeszq válasza Droot hozzászólására (») Nov 17, 2015 /
 
Idézet:
„Pl.: volatile unsigned int cnt = 0;”


Ugye tudod, hogy ez nem működik?

Az unsigned int 2 byte-os. A 0x00FF-0x100 váltásnál simán előjöhet, hogy 0x1FF-et kapsz.

Kiolvasásnál vagy tiltod az interruptot, vagy leellenőrzöd, hogy kétszer kiolvasva is ugyanazt az értéket kapod-e.
(#) Droot válasza csabeszq hozzászólására (») Nov 17, 2015 /
 
Nem pont errol van szo azt ugye tudod?
Ha ilyen sok idod van inkabb ird le neki a megoldast.
(#) csabeszq válasza Droot hozzászólására (») Nov 17, 2015 /
 
Tudom, csak kötekszem.

  1. volatile uint16_t time = 0;
  2.  
  3. ISR(amilyen_isr_kell)
  4. {
  5.   time++;
  6. ...
  7. }
  8.  
  9. uint16_t get_time()
  10. {
  11.   uint16_t t1, t2;
  12.   // it kiszűrjük amikor az uint16_t félig változik
  13.   do
  14.   {
  15.     t1 = time;
  16.     t2 = time;
  17.   }while( t1 != t2 );
  18.   return t1;
  19. }
A hozzászólás módosítva: Nov 17, 2015
(#) Robika hozzászólása Nov 17, 2015 /
 
Sziasztok!
Melyik a jobb döntés?
Ha beforrasztom az AVR-t a nyákba és kivezetem valahova az ISP 6 lábat vagy ilyen preciziós foglalatban mindig kiveszem?
A nyákot gyártattnám, lötstoppal. Ezért jönne szóba a SOIC vagy TQFP.
Mi hátrányom származik belőle, ha beforrasztom és utána programozom fel?

Négyszögjelet mér és UART-on kommunikál, semmi komoly.
Köszönöm, ebben elég új vagyok (még )
(#) Zsolt2 válasza Robika hozzászólására (») Nov 17, 2015 /
 
Azert hivjak ISP (in-circuit serial programming), hogy a programozas az aramkorben tortenjen. Semmilyen hatrany nem szarmazik belole, viszont oda kell fogyelni tervezeskor, hogy a programozo labakat ha mas funkciora is hasznalod akkor le kell valasztani ellenallassal, hogy ne zavarja a programozast.
A hozzászólás módosítva: Nov 17, 2015
(#) zombee válasza Robika hozzászólására (») Nov 17, 2015 /
 
Az előbbi választól függetlenül ha furatszerelt az IC, akkor ne spórolj a foglalattal, és természetesen az ISP csatlakozó is kerüljön a panelra. Az IC el is romolhat, ezért nem utolsó dolog ha lehet cserélni. Egy SMD kiforrasztásához csak egy meleglevegős páka kell, de egy furatszerelt soklábú IC kiszedése még gyakorlott kezekben is problémás lehet. (na jó, hullámforrasztóval könnyű!)
(#) Robika válasza zombee hozzászólására (») Nov 17, 2015 /
 
Köszönöm a válaszotokat!

Akkor jól gondoltam,csak megkérdezem, ne már az elején legyen rossz tapasztalatom mindennel.

Ha 2 eszközzel szeretnék UART-on kommunikálni (GPS, Bluetooth), akkor 2 AVR szükséges?
Arra gondoltam,hogy akkor legyen kettő. Szétosztanám a feladatokat és SDA/SCL-en kommunikálna a két eszköz. Ez barbár módszer?
Következő: »»   704 / 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