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   722 / 837
(#) AxaGame válasza AxaGame hozzászólására (») Feb 5, 2016 /
 
Érdekes, hogy a MS Visual Studio elkeféli az AVR Studio programot.
Pedig hát abban írták...
Szóval levettem az MS-t, újra telepítettem az AVR-t, és lőn csoda, megnyílnak a projektek.
Ez van.
(#) zombee válasza killbill hozzászólására (») Feb 5, 2016 /
 
El tudsz képzelni olyan programot ahol a főprogram részben nincs is portbillegetés? Csak az állapotgép ami néhol változókat ír/olvas, amiken keresztül az időzítő közreműködésével eléri a hardvert?

És olyan alkalmazást ahol egy gombnyomás 50ms-os késleltetése már számít?
És ha egy 100ms nyomvatartás után felengedem, azzal nem érzékel(het) lenyomást is?
(#) killbill válasza zombee hozzászólására (») Feb 5, 2016 / 3
 
Idézet:
„El tudsz képzelni olyan programot ahol a főprogram részben nincs is portbillegetés? Csak az állapotgép ami néhol változókat ír/olvas, amiken keresztül az időzítő közreműködésével eléri a hardvert?”
El tudsz kepzelni olyan programot, ahol nincs olyan, hogy foprogram, mert multitask-os az egesz? Mert en ilyeneket irok husz eve. Marpedig ott baromira kell figyelni az eroforrasokra. Barmikor megszakithatja egyik process a masikat. Ezert a kozosen hasznalt dolgokat (resource - eroforras) vedeni kell. Erre sok modszer van.
Szoval igen, el tudok kepzelni olyat, hogy a PORTB-t egy driver-en keresztul lehet elerni. Ennek a driver-nek a legegyszerubb fajtaja az, amikor te csak egy vagy tobb valtozot allitasz be, es mondjuk a billentyuzet kezelo megszakitas a valtozo(k) alapjan allitja be ugyanazon a porton a tobbi bitet is.

Amiert en felhoztam ezt a PORTB peldat az az, hogy ha valaki megszakitasbol allitgatja, akkor meg fog lepodni, ha a foprogramjabol is allitgatni probalja. Csak felhivtam ra a figyelmet, azaz segiteni probaltam.
Idézet:
„És olyan alkalmazást ahol egy gombnyomás 50ms-os késleltetése már számít?”
Az öt szazad masodperces nyomogomb reakcio szerintem akkor lehet problema, ha kifejezetten reakcióidő-mérő keszuleket epitesz. Mert egyebkent nem hiszem, hogy lenne jelentosege. Ettol fuggetlenul, a sajat munkaimban 20-25 millisecenkent szoktam mintavetelezni, de altalanossagban elfogadott a 10-50ms. A tiz feleslegesen gyors, az otven talan a hatar. De ettol meg a prellmentesitesnek ez a vilagon a legegyszerubb modja.
(#) trigger444 hozzászólása Feb 6, 2016 /
 
Hello!
Egy lcd kijelző (HD44780) meghajtásához mekkora órajel szükséges?
(#) Axel válasza trigger444 hozzászólására (») Feb 6, 2016 /
 
Hello!

A minimális frekvenciára tudtommal semmilyen megkötés nincsen. Akár 1 Hz-ről is hajthatod, ekkor persze értelemszerűen olyan sebességű is lesz a megjelenítés. Hogy mennyi a max. órajel azt nem tudom adatlapból szerintem kiderül. De nem sok esély van arra, hogy azt elérd vagy meghaladd.
(#) zombee válasza killbill hozzászólására (») Feb 6, 2016 /
 
Szerintem a többség nem driverekben, multitaszkban gondolkodik, inkább portlábakban meg célokban.

Az előzőhöz elfelejtettem hozzátenni: a PORTB |= 1; (AVR-nél) nagyon is atomi művelet, nincs benne olvasás! Ahogy a PORTB &= ~(1<<3) is az! Ezeket egy valamire való fordító sbi és cbi utasításra fordítja(most ellenőriztem: az enyém is). Más esetben lehet hogy hibás működés az eredménye egy (pl. PORTB|=3) műveletnek, ha közben a megszakítás szintén írogatja ugyanazt a portot.

A fotó a legutóbbi munkámról készült. Ebben minden hardverspecifikus részt(kijelző, billentyűzet, játékost jelző LED-ek) az időzítő megszakítás kezel. A LED-es rész csak azért került oda, mert villogtatni is akartam, ehhez az állapotgépben nem elég egy portbillegetés. A cucc portkiosztása elég vegyesre sikerült(a hardverterv nem az én művem, ahogy a szkin sem), minden periféria legalább két AVR-es portot érint. Mondhatni, hogy a LED-es rész átrakása egy csomó szívástól mentett meg?
A hozzászólás módosítva: Feb 6, 2016
(#) Droot hozzászólása Feb 6, 2016 /
 
Hogyan lehet ATmega328-al véletlen számokat generálni?
Egymás után kellene 6-ot. Viszont van DS1307-em.
Esetleg csinálni egy unix timestamp-et (ezt elosztani valamennyivel...) és ezt beadni az srand-ba? Az a lényeg, hogy a 6 számot minél gyorsabban legeneráljam, abszolút maximum néhány másodpercem van rá.
(#) zombee válasza Droot hozzászólására (») Feb 6, 2016 /
 
Felhasználói beavatkozás(pl. gombnyomás) után kell generálni?
(#) vyky hozzászólása Feb 6, 2016 /
 
Tudom unalmas vagyok már,de akkor is megkérdezem
Gombnyomásra jól működik. forog jobbra ,balra 2-2 mp.
De nem áll le a motor,ha a portlábak ismét ki vannak kapcsolva
Valami megoldás erre?
Tudom nem a legjobb az optós megoldás,de csak ez van

névtelen.JPG
    
(#) RoliNyh válasza vyky hozzászólására (») Feb 6, 2016 /
 
Ha ez a próbapanelon is így van bekötve, akkor be kellene tenni a processzor kimenetére (az optocsatoló LED elé) egy-egy áramkorlátozó ellenállást első sorban...

Némelyík opto, akár 1V feszültséggel is képes működni, így akár félig meddig nyitva van a tranzisztor, ha alacsony a jelszint akkor is.

A relé meg általában úgy működik, hogy van egy behúzási feszültsége (ami magasabb) és egy tartási feszültsége.
Tehát PL egy 5V-os relé meghúz 5V -nál, de ha csökkented a feszültséget, lehet még 3V -nál is be van kapcsolva.

Az optocsatoló meg lehet átvezet annyit, hogy ez a feszültség a tartási feszültség fölött marad alacsony szintnél is.
A hozzászólás módosítva: Feb 6, 2016
(#) Bakman válasza vyky hozzászólására (») Feb 6, 2016 /
 
Azért nem áll le, mert egyenáramú áramkörben triakot használsz. Az csak akkor kapcsol ki, ha nem folyik rajta áram. A triak váltóáramhoz való, egyenáramnál úgy viselkedik, mintha beragadna, mint kapcsoló.
A hozzászólás módosítva: Feb 6, 2016
(#) zombee válasza vyky hozzászólására (») Feb 6, 2016 /
 
Mi lenne ha nem optoTRIAK-ot használnál egyenáramú cucc meghajtására?
A hozzászólás módosítva: Feb 6, 2016
(#) killbill válasza zombee hozzászólására (») Feb 6, 2016 /
 
Idézet:
„Szerintem a többség nem driverekben, multitaszkban gondolkodik, inkább portlábakban meg célokban.”
Sokan megszakitasbol akarnak teljes i2c muveleteket elvegezni (pl. az orat beolvasni), mikozben a foprogramjuk meg az i2c buszon eppen az EEPROM-ot probalja olvasni. Na, ezert szoltam en, hogy az ilyen eroforrasok kezelesenel korultekintoen kell eljarni.
Lehet, hogy a PORTB |= 1; az atomi muvelet lesz, de a PORTB |= rows[nextrow]; mar biztosan nem. Es ha te minden megszakitasban a kovetkezo sort valasztod ki, akkor kezenfekvo, hogy egy tablazatban vannak leteve a portbitek.
(#) Bakman válasza vyky hozzászólására (») Feb 6, 2016 /
 
Így próbáld.

Shot_313.jpg
    
(#) Droot válasza zombee hozzászólására (») Feb 6, 2016 /
 
Igen! És generálás után ellenőrizni, hogy van-e már ilyen elmentve az eepromban a többi 400db kód mellett. Ha van akkor újat kell generálni.
(#) csabeszq válasza Droot hozzászólására (») Feb 7, 2016 /
 
Véletlenszám generálás pszeudo-randommal megy. Néhány szorzás és összeadás, kiszedheted a java Random osztályából. Induláskor véletlen magot generálsz, amiből a véletlen szekvencia menni fog (kezdő véletlen értékre hasonlít).

Lehet igényes és igénytelen random mag (seed) generálás.

- igénytelen: ADC-n lebegő lábat olvasol többször
- igényes: a watchdog belső rc oszcillátort használ, ami frankó jó szórású véletlen mag készítéséhez

Én igénytelenkedek: 256 ADC, összes csatorna olvasásával
A hozzászólás módosítva: Feb 7, 2016
(#) zombee válasza Droot hozzászólására (») Feb 7, 2016 /
 
Ez nagyon jó. Akkor így szól a "véletlenszám-generátor": elindítasz egy számlálót valamilyen sebességgel. Ha megtörténik - valamikor - a felhasználói beavatkozás, akkor megnézed a számláló értékét és AZ lesz a generált érték. A számláló legyen elég gyors hogy bekapcsolás után "rendelkezésre álljon" az összes érték, de túl gyors se legyen: ha gyors akkor egyes értékek valószínűsége megnő, míg más értékek kiesnek a pörgetésből. Persze ezzel csak egy értéket lehet generálni, de a generált értéket bitenként szét is lehet szedni. Ha már benne van az EEPROM-ban az érték, akkor nincs más dolgod, mint az ellenőrzés után újra ránézni a számlálóra. Bár az EEPROM olvasás majdnem konstans idejű, mivel már előtte is "véletlen" volt az érték, a konstans+véletlen is véletlen érték lesz...
(#) zombee válasza killbill hozzászólására (») Feb 7, 2016 /
 
Egy PORTB |= rows[nextrow]; típusú művelet magában a megszakításban szokott lenni, azt pedig általános esetben nem szakíthatja meg más. Inkább a főprogram rész aminél figyelni kell, ott egy PORTB |= 1; nem okoz gondot a művelet atomi volta miatt.

I2C megszakításból? Soha nem mertem megcsinálni. Vegyesen (megszakítás+főprogram) főleg nem.
A hozzászólás módosítva: Feb 7, 2016
(#) vyky hozzászólása Feb 7, 2016 /
 
Köszönöm a segítséget a moc3021 helyett a 2n1711 kellett és máris tökéletes amit csinál
Egy olyan kérdés ,hogy lehet azt megcsinálni,ha lehet, hogy a motor irányváltáskor azonnal megálljon. Gondolom nem használ a motornak,de azért megkérdem
(#) zombee válasza vyky hozzászólására (») Feb 7, 2016 /
 
A főkapcsoló relénél kösd be a másik érintkezőpárt is úgy, hogy kikapcsoláskor "rövidre zárja" a motor kimeneteit. Generátorüzemben üzemi fordulaton ez elég sokat fékez, de amikor már lassan forog nem sokat használ. A két relét meg kellene cserélni, hogy a fékezésbe az irányváltó kikapcsolása ne zavarjon bele.
(#) Droot válasza zombee hozzászólására (») Feb 7, 2016 /
 
Köszönöm a válaszokat! Még át kell gondolnom.
A számláló alatt timert értesz?
Az csak egy számot generál hacsaknem többet különböző időben indítok.

Csabeszq:
A pszeudo random generátorra egy példát tudnál adni?
Ezt a javasat nem értem honnan kell bekopizni. Esetleg ha van időd be tudnád másolni?
(#) gtk hozzászólása Feb 7, 2016 /
 
Sziasztok.

Mit tudtok az AVR jovojevel kapcsolatosan, erdemes-e uj aramkorbe alkalmazni, vagy inkabb valasszak mas uC-t ?
(#) rolandgw válasza gtk hozzászólására (») Feb 7, 2016 /
 
Második negyedévben zárul le a tranzakció,szóval nem tudni.Én is nézegetem már az Stm8-at,használta már valaki ?
(#) killbill válasza zombee hozzászólására (») Feb 7, 2016 /
 
Idézet:
„Egy PORTB |= rows[nextrow]; típusú művelet magában a megszakításban szokott lenni,”
Ezt ugye te magad sem gondoltad komolyan!
Es ha valaki annyira zsilett programozo, hogy nem csak megszakitasban hasznal PORTB |= valtozo; muveletet, azzal mi van? Ne bosszants mar! En csak felhivtam a figyelmet egy olyan dologra, amivel sokat lehet szivni. Az, hogy ez a te post-oddal kapcsolatban jott elo, az egy dolog. Es mi van akkor, ha PORTB |= 3; mert mindket LED-et akarja bekapcsolni egyszerre. Az SBI csak 1 bitet tud egyszerre beallitani.
(#) zombee válasza killbill hozzászólására (») Feb 7, 2016 2 /
 
beállítja kétszer
(#) zombee válasza gtk hozzászólására (») Feb 7, 2016 /
 
A 8 bites szegmensen évekig nem fog változni semmi. Az AVR-es termékpaletta max. annyiban szűkül hogy nem lesz m168+m168a+m168p+m168pa, hanem csak egy fajta m168 és így tovább.
Jó eséllyel kivezetnek pár népszerű típust amelyek helyébe visszafelé kompatíbilis, nagyobb tudású
IC-k lépnek. Pl. lehet hogy a t2313 eltűnik, helyette csak t4313 vagy t8313 lesz. Az ATTiny2313-ból
az ADC sokaknak hiányzik (csak ez miatt nem váltanak a halálra ítélt ATTiny26-ra), lehet hogy
a kompatíbilis utód kap ADC kiegészítést is. Meg persze órajel emelés is bejöhet.

Azt se illik elfelejteni hogy az Atmel nem csak mikrokontrollereket gyárt, ott van pl. az AT24Cxx
sorozatú EEPROM, ezt sem állíthatják le egyik pillanatról a másikra, átcímkézik de ugyanaz lesz.
A hozzászólás módosítva: Feb 7, 2016
(#) rolandgw válasza zombee hozzászólására (») Feb 7, 2016 /
 
Aztán rászállnak a Studio-ra és fizess érte,ha jó C fordítót akarsz.
(#) zombee válasza rolandgw hozzászólására (») Feb 7, 2016 /
 
Vagy azt is egységesítik és ingyenes lesz.
A WinAVR, és az Eclipse-IDE is eredetileg opensource kezdeményezés volt, ezért kerülhettek
bele a szintén ingyenes AVR Studio-ba. A Studio4 ma is ugyanúgy használható mint 10 évvel ezelőtt,
és amíg forgalomban vannak a "régi" IC-k addig nem változik semmi. Az AVRDUDE a mai napig opensource...
A hozzászólás módosítva: Feb 7, 2016
(#) killbill válasza zombee hozzászólására (») Feb 7, 2016 1 /
 
Igen, beallitja ketszer, ha tudja, hogy kulonben baj lesz. Ezert szoltam. Hiaba is vitatkozol.
(#) csabeszq válasza Droot hozzászólására (») Feb 7, 2016 /
 
Megnéztem, hogy én hogyan csináltam pszedudo-randomot. Sehogy, az avr-libc-t használtam.

  1. #include <stdlib.h>
  2.  
  3. int get_random(uint8_t max)
  4. {
  5.   return rand() % max;
  6. }


Egyetlen hátulütője, hogy mindig ugyanazokat az eredményeket adja (ahányszor elindítod, mindig 1,15,16,4,... lesz), ezért be kell állítani a random magot (kezdő véletlen).

  1. void init_random()
  2. {
  3.   uint16_t mag = 0;
  4.  
  5.   for( uint8_t i=0; i < 255; i++ )
  6.   {
  7.     uint8_t csatorna = i % 7;
  8.     uint16_t ertek = adc_olvasas(csatorna);
  9.     mag = 31 * mag + (ertek & 3); // also 2 bit hasznalata randommagnak
  10.   }
  11.   srand( mag ); // random mag beallitasa
  12.   rand(); // az elso ertek kiolvasasa (nalam csak a masodiktol hatott a srand)
  13. }
A hozzászólás módosítva: Feb 7, 2016
Következő: »»   722 / 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