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   392 / 840
(#) sgt válasza zombee hozzászólására (») Dec 20, 2011 /
 
Pedig nagyon hasznos tud lenni . Jó múltkorában ismerőssel csináltunk egy virtuális digi oszcit melynek programja 4000+ soros (PIC32 C-ben), és bizony nagyon jól jött az online debug. Pl. mikor a uC lábait néztük, hogy van-e jel, akkor csak simán lépkedni kellett és azonnal látszódott, a műszeren, hogy van-e vagy sincs a lábon fesz. Nem kellett külön erre programot írni.

Nem mellesleg AVR-e egyelőre én is szimulátor és debuggolás nélkül írok programokat, de mondjuk nem ekkorákat, mint pl te.

AVR Studio C szimulátora egy bughalmaz, az asm oké, de a C része elképesztő.
(#) sikolymester válasza zombee hozzászólására (») Dec 20, 2011 /
 
Le a kalappal akkor.
Én mindenesetre kényelmes maradok, és ahelyett, hogy Soros porton kiküldött infók alapján jöjjek rá, hogy mi történik bizonyos esetekben, inkább belenézek a lelkébe debugerrel.
(#) Gery hozzászólása Dec 21, 2011 /
 
Sziasztok!

Segítséget szeretnék kérni PID szabályozásban, illetve elég lenne a PI is. Az interneten sok mindent olvastam róla, de mindenhol matematikai levezetéseket találok, és a problémám az, hogy nem tudom leírni programban. Vannak programok amik már működnek, de nagyon kezdetlegesek, és a lengést egyikben se sikerült kiküszöbölnöm. Ezt a pdf-et kaptam hozzá, ami alapján meg kéne tudnom csinálni, de sajnos nem nagyon tudom értelmezni. Tudna ebben segíteni valaki?
Adott egy 32UC3B1256 mikrokontroller. Továbbá egy DC motor amelynek mindig tudom a pontos helyzetét 12biten. Egyik irányba nő a másikba csökken, értelemszerűen. Egy végtelenített potmeter ami 2bites GRAY kódot ad, gyakorlatilag egy körbefordulás alatt 48szor "ad jelet". Továbbá interruptban minden pwm jel lefutásakor mérem a kapocsfeszültséget egy analog érzékelővel. Ez, ha áll a motor ez decimális számként 423-at jelent, az egyik irányban ha felpörög le megy 0-rá a másik irányba pedig fel 846-ra.
Ezek alapján tudtok segíteni hogyan is kéne hozzálátnom a program megírásához?

Üdv.:Gergő
(#) dB_Thunder válasza Gery hozzászólására (») Dec 21, 2011 /
 
A programozás részében nem tudok segíteni, de itt a fórumon a CNC-és topicban foglalkoznak PID szabályzással.
Amit viszont fontosnak tartok, hogy minden PID rendszert az adott "hardwerhez" hozzá kell hangolni, ami nem is egyszerű ! Anélkül nem ér semmit.
Olvastam már öntanuló (hangoló) PID rendszerről, szerintem afelé kellene neked is elindulnod!

Régebben gyűjtöttem a PID rendszerről szóló leírásokat, ha érdekel megosztom veled!
(#) sikolymester válasza Gery hozzászólására (») Dec 21, 2011 /
 
PI szabályzást javaslom, mivel a PD-ben, illetve PID-ben a D deriváló tag könnyen destabilizálhatja a rendszert.
A PI szabályzáshoz a következőket kell tudnod:

Milyen paraméterrel szabályzol, milyen paramétert szabályzol, illetve a rendszered milyen gyors.

Nos, tételezzük fel, hogy a DC motor sebességét szabályzod. A bemenő paramétered amit tudsz állítani pedig a feszültség, mégpedig egy PWM jel által. A rendszered gyorsasága a motorod és a forgatott tehetetlenségi nyomatékától függ elsősorban. Fontos, hogy a szabályzás sokkal gyorsabb legyen mint a rendszered, vagyis jelen esetben a motoros felpörgési ideje 0-ról max ford. számra. 2 nagyságrend eltérés biztos hogy kell lennie.

Röviden ennyit kell tenned:
dt időnként mintavételezni a sebességet(ez az ami min 2 nagyságrenddel rövidebb idő mint a motorállandód).
Mivel neked pozicióvisszajelzésed van a motorrol, így értelemszerűen ezt először deriválnod kell (itt máris bejöhet egy jó kis hiba, amivel a deriválás mindig járhat). Az utolsó pár mérésre vonatkozóan tedd ezt meg.

Most már tudod az aktuális sebességet. Mivel neked van egy előírt sebességed, ami eltér az aktuális sebességtől, ezért feszt kell kapcsolnod a motorra. Ekkor szorzod meg az előírt és az aktuális különbségét az erősítéssel (P-vel). Értelemszerűen, ha az erősítés 0, akkor sosem indul el a motor, ha az erősítés túl nagy, akkor elindul a motor mint a mérgezett egér.

Az I része a szabályzónak abból áll, hogy minden dt időben, integrálod, vagyis összegzed a különbségét az előírtnak az aktuálistól. Ezt az összegzett értéket is hozzáadod a P szabályzóval kiszámolt értékhez. EZ kb arra jó, hogyha a P erősítési értéke nagyon kicsi, mondjuk 0, akkor is szép lassan egyre csak összeadod a hibát, és végül eléred az előírt értéket. Az I résznek is van egy erősítési tényezője.

Az egészet pedig a Ziegler-Nichols módszerrel tudod behangolni. Ez amolyan ökölszabály dolog. Ziegler-Nichols

Hadd linkeljek egy képet, ami ezt a konyhanyelv leírásom jól személteti:PID
(#) Axel hozzászólása Dec 21, 2011 /
 
Sziasztok!

Valaki próbált már AVR-ről adatot küldeni MATLAB környezetbe UART-on keresztül? Egy USB-UART konvertert szeretnék használni mindehhez. Nézegettem neten az Instrument Control Toolbox-ot ami olybá tűnik alkalmas ilyesmire de egy kicsit el vagyok még veszve a leírás részleteiben. Nekem ugyanis semmi másra nincsen szükségem csak arra, hogy 8 bites adatcsomagokat (gyakorlatilag "unsigned char" méretű számokat) küldjek a programnak és azt feldolgozás után grafikusan ábrázoljam.

Köszi szépen!
(#) sikolymester válasza Axel hozzászólására (») Dec 22, 2011 /
 
Jobb híján köss össze két PC-t. Aztán hiperterminálban írogass dolgokat matlabnak. Még azt is megteheted, hogy csinálsz szoftveresen 2 RS232-t a PC-n és azokat loopbackkel összekötöd. Van erre valamilyen szoftver.

Ha működik, akkor AVR-rel is fog.
(#) Gery válasza sikolymester hozzászólására (») Dec 22, 2011 /
 
Igen, nagyjából értem, hogy ez a lényege, de sajnos még mindig nem áll össze a kép, hogy hogy is kéne erre programot írni. Szóval a sima arányos tényezőt úgy írtam le hogy:

sebesség = konstans*(beállított pozíció érték - aktuális pozíció érték)

Akárhogy is csináltam, mindig az történt, hogy olyan gyorsan forgott a motor, hogy egyből túllendült a 0 értéken ami után 4095 jön és forgott tovább mint az őrült. Ezek után raktam bele mindenféle "if" parancsokat ami valamit javított, de nagyon össze-visszaság lett belőle.

"dt időnként mintavételezni a sebességet"- ez például világos, meg a többi is, de az nem, hogy hogyan is csinálom meg. A Zeigler-Nichols dolgot pedig egyáltalán nem értem .
(#) sikolymester válasza Gery hozzászólására (») Dec 22, 2011 /
 
Aham, tehát pozícióra szabályzol. Nos tegyük fel, hogy 360 fok a körbefordulás (értelemszerűen). Te előírsz 350 fokot és éppen 0 fokon van. Természetes, hogy felgyorsul mint az állat, eléri a 350 fokot és úgy elhúz mellette, hogy máris 0 foknál van. Ott aztán megint nagy a hiba és rákapcsol megint kakaót, a nagy hiba miatt.

Egyáltalán mindkét irányba tudod forgatni a motort? Neadj isten fékezni?

Egy P szabályzó önmagában bitang nagy lengéseket okoz, amennyiben nincsen I tag mellette. Amúgy meg vedd le kicsire a "sebesség = konstans*(beállított pozíció érték - aktuális pozíció érték)" -ben a konstanst.

Aggódni nem kell, hogyha a sima P szabályzó nem éri el az előírt értéket, hiszen a nagykönyv is megírta, hogy mindig lesz maradandó hiba.
(#) Ricsi89 hozzászólása Dec 22, 2011 /
 
Sziasztok!
Kérnék egy kis segítséget. Adott egy kapcsolás, Attiny13-al menne, de valamiért az egyetlen darabom megdöglött, nem látja a programozó. Viszont szükségem lenne az eszközre, amibe a proci menne. Mivel esélytelen a héten újat beszereznem, így át kellene alakítani a programot Attiny24-re, mert az van itthon. A gond csak az, hogy asm-ben van a program. A procit átírtam a kódban, 5 hibát adott, de életemben sosem foglalkoztam asm-el, így nem is nagyon tudom javítani. Ha valaki rá tudna nézni a programra és esetleg nem bonyolult átírni a másik procira az megcsinálná nekem? Itt a link a cucchoz. Bővebben: Link
(#) Ricsi89 válasza Ricsi89 hozzászólására (») Dec 22, 2011 /
 
Nos próbálom javítani a hibákat, eddig 5-ből 4 elvileg meg is van. Egyel viszont nem boldogulok.
  1. ldi m_temp,low(RAMEND); Load low byte address of end of RAM into register R16

Nos ebben a sorban van hiba, ami a következő:
Idézet:
„C:\Users\Ricsi\Documents\avr\v-tail\v-tail.asm(176): error: Overlap in .cseg: addr=0xe conflicts with 0xe:0xf”

Erre valakinek valami ötlet?
(#) Axel válasza Gery hozzászólására (») Dec 22, 2011 /
 
Hello!

A Ziegler-Nichols módszer egy kísérleti módja a szabályozás behangolásának. Lényege, hogy megkeresed azt az erősítést amelynél a kimeneti jel állandósult lengésbe jön, oszcillál. (Pl. egy motor periodikusan felpörög-lelassul, felpörög-lelassul és így tovább állandó időközönként) Ezt az ismert ún. kritikus körerősítést felhasználod a paraméterek számítására PI szabályozás esetén a következőképpen: P=0.45*kkritikus (ez gyakorlatilag a szabályozó erősítése lesz) illetve Ti=0.85*Tkritikus. Ahol Ti az integráló tag időállandója melyet a lengések periódusidejének ismeretében (Tkritikus) határozol meg. Látható, hogy ehhez már bizony műszeres méréseket is kell végezni. Remélem nagyjából érthető volt a dolog.
(#) luxmanpower hozzászólása Dec 22, 2011 /
 
Egy gyors kérdésem lenne ahhoz aki használt már TCN75 IC-t. A három címbit közül amit 1-nek szeretnék, azt mindenképpen fel kell húzni magas szintre? Vagyis nincs az IC-n belül felhúzva? Sajna adatlapban erről nem találtam semmit. (Univerzális panelt szeretnék csinálni, ahol utólag ki lehet jelölni az IC címét)
(#) Axel válasza sikolymester hozzászólására (») Dec 22, 2011 /
 
Szia!
Köszi a tippet! Találtam egy leírásfélt ehhez. Itt végülis a COM portot kell neki megadni ahogy látom és működik a dolog (elvileg). Még annyi, hogy ha kérhetem tudnál nekem egy kis fejtágítást adni ,hogy ha én összekötöm USB-UART konverterrel a gépemet akkor pontosan milyen szabvány szerint kommunikálok illetve mit is csinál ez az USB UART átalakító? Használtam már AVR-rrel HyperTerminal-ban, működött is de szeretném tudni pontosan mi történt akkor a háttérben. Ha nagyon OFF a téma itt és inkább máshová írod a választ kérlek jelezd majd!
(#) sgt válasza Ricsi89 hozzászólására (») Dec 22, 2011 /
 
  1. ldi m_temp, HIGH(RAMEND)
  2. out SPH, m_temp
  3. ldi m_temp, LOW(RAMEND)
  4. out SPL, m_temp


Így próbáld meg. Az a baja hogy az Attiny13-ban kicsit az SRAM így csak simán SP regiszter van. Az Attiny24-ben pedig már elég nagy ahhoz, hogy SPL és egy SPH regiszter kelljen.
(#) sikolymester válasza Axel hozzászólására (») Dec 22, 2011 /
 
A háttérben teljesen mindegy mi történik. Végeredményben a windows lát egy com portot, mintha az alaplapon lenne rajta egy pentium2-esen pl.

Összekötöd max232-vel az AVRt és az usb com portot. Aztán küldöd az adatot. Ennyi.
Protokol nincsen, hacsak nem csinálsz te valamit.
(#) Ricsi89 válasza sgt hozzászólására (») Dec 22, 2011 /
 
Beleírtam, de nem jó. Ha esetleg megnéznéd a pár hsz-el fentebb linkelt programot, az jó lenne.
(#) Axel válasza sikolymester hozzászólására (») Dec 22, 2011 /
 
Azt hittem a max 232 az csak a régi soros porthoz való.
Akkor mi a különbség közte és az FT232 között?
(#) sikolymester válasza Axel hozzászólására (») Dec 22, 2011 /
 
Azt hiszem ez már a fórumon kívüli témára vezet. Egy kis google + adatlapolvasással ráadásul gyorsan megtudható.
(#) Axel válasza sikolymester hozzászólására (») Dec 22, 2011 /
 
OFF:
Hello!
Olvastam ám adatlapot meg ezt is. A legfelső postból számomra egyértelműen az derül ki, hogy a max 232 önmagában alkalmatlan arra, hogy USB felületen kommunikáljunk a PC és egy UART modul közt. Ez csak az RS232 szabványú jelek szintillesztését végzi úgy, hogy a mikrovezérlő számára az megfeleljen semmi mást. Tehát evvel csak a soros portra csatlakozhatunk. Míg az FT 232 már USB protokoll szerinti kommunikációt tesz lehetővé. Ezért voltam némileg zavarban mikor azt írtad, hogy :"Összekötöd max232-vel az AVRt és az usb com portot." Nem mondom, hogy Te hülyeséget írtál csak számomra nem egyértelmű most a dolog. Ezért kérdeztem.
ON:
(#) matrix64 válasza Ricsi89 hozzászólására (») Dec 22, 2011 /
 
Csak egy tipp:
.org 0x0011
Ezt írd be a ldi m_temp sor elé.A reset vektoron indul egyébként a program,gondolom ez lehet a probléma.
(#) matrix64 válasza matrix64 hozzászólására (») Dec 22, 2011 /
 
és az alább javasolt módosításra is szükség van,természetesen.
(#) matrix64 válasza matrix64 hozzászólására (») Dec 22, 2011 /
 
interrupt vektor,nem reset,bocs
(#) Ricsi89 válasza matrix64 hozzászólására (») Dec 22, 2011 /
 
Köszi, így már jó lett. Még pár dolgot átírtam, általában a regiszterek címei nem stimmeltek, de most már hiba nélkül lefordul. Holnap kiderítem, hogy működik-e élesben. Pár alap dolgot azért átlátok a programban, de mélyebben nem vágom a témát.
(#) tecsa hozzászólása Dec 23, 2011 /
 
Helló!

Nyomógombot AVR-re úgy kötünk, hogy kontroller és föld közé?
Lehet fordítva is? Hogy a nyomógomb megnyomásakor jelenjen meg az uC lábon 5v? (nekem úgy tűnik a T-bird panelon így van megoldva.)
Előre is köszi:
Tecsa
(#) zombee válasza Axel hozzászólására (») Dec 23, 2011 /
 
Szerintem meg arra gondolt az "usb com port" alatt hogy van egy kábel aminek egyik vége USB, másik RS-232.
Egyébként ha van 2 COM port a gépen akkor elég 1 gépen matlabozni, illetve van még a com0com is...
(#) matrix64 hozzászólása Dec 23, 2011 /
 
Sziasztok! Tudom,hogy láma kérdés,de már rég programoztam C-ben és az asm után nehéz visszatérniEgy adott byte változóban hogy tudok bitenkénti vizsgálatot végezni ?
(#) tecsa válasza matrix64 hozzászólására (») Dec 23, 2011 /
 
Amelyik bitet vizsgálni akarod a változódban egy másik változóval ÉS kapcsolatba hozod, ahol ott vannak 1-esek, amelyik bitet v biteket vizsgálni akarod.
  1. char a = 0b00110101;
  2. char b = 0b00001111;
  3. char c;
  4.  
  5. c=a&b;

A c változó értéke 0b00000101-lesz. (ugye itt az alsó 4 bitet vizsgáltuk.)
(#) matrix64 válasza tecsa hozzászólására (») Dec 23, 2011 /
 
  1. if (valtozo&(1<<bit))

kösz,ezt kerestem..rövidzár
(#) Axel válasza tecsa hozzászólására (») Dec 23, 2011 /
 
Szeva!

Kötheted Vcc-re is ez esetben pozitív logikáról beszélünk ekkor ugyebár "pull-down" ellenállásokat kell használnod az adott bemeneten a stabil logikai szint biztosításához mikor nincs lenyomva a gomb. Én azonban inkább a fordítottját javaslom tehát, az "aktív nulla" (vagy aktív alacsony) kapcsolást amikor is -ahogyan Te is írtad- a gomb a földre van kötve és a "pull-up" ellenállás a Vcc-re húzza fel a kimenetet (ez lehet a mikrovezérlő belső felhúzó ellenállása is). A negatív logika előnye, hogy elvileg kevésbé zavarérzékeny.

Üdv!
Következő: »»   392 / 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