Fórum témák
» Több friss téma |
Nos kipróbáltam ...
A Timer1 indítása (setup_timer_) után kell átállítani az RD16 bitet a T1CON regiszterben és azután már működik a TIMER1L és TIMER1H regiszter irkafirkálása a régi módon. Sajna ezt minden TIMER1 indítás után el kell játszani... A buffer regiszter nem elérhető közvetlenül a felhasználó számára, ezért ilyenkor csak a set_timer(xx) utasítás marad a "H" regiszterbe íráshoz - ez egyszerre írja az "L" és a "H" regisztert is. Sajna ez nekem nem jó, mert már valamennyi érték beleketyeg az "L" regiszterbe amikor nekem írni kell/vagy nem a "H" regisztert. Tehát marad az indításonkénti átállítási procedúra ... Köszönöm az infókat .. a segítségetek megoldotta a problémát.
Írj egy saját setup_timer_() -t, ami 8 bites kiolvasást/írást állít be.
A hozzászólás módosítva: Ápr 4, 2022
Sziasztok.
PIC16F877A-t programozok C-ben (MPLAB + HiTech C). Van egy lebegőpontos változóm amit használnom kell, de mintha a fordítás nem működne jól. Próbaképpen leegyszerűsítettem csak egy értékadásra a programot, a szám értéke legyen "1", és szimulátorban nézve nem a kért értéket írja bele a változóba. Ha "0"-t írok bele, az OK, vagy ha a változó típusát pl "char"-ra állítom, akkor 0-255 közötti értékkel szintén jó. Csatolom a forráskódot, illetve a "WATCH" ablakot. Valakinek ötlet? Köszi.
Állítsd be nyomkövetőnek a Mp Sim -et. A forrásba tegyél még egy olyan sort, ami fel is használja a proba értékét. Fordítsd újra. Tegyél töréspontot a proba = 1; sorra. Indítsd a programot. Automatikusa megáll a fenti soron. Lépj még egy sort. Ezután már jónak kellene lennie az értéknek a Watch ablakban.
Az optimalizálás a változót ki is veheti a programból, ha értéke sehol sincs felhasználva.
Nem dolgoztam még nem egész számokkal.
Nekem kell még konvertálnom is?
Beszúrtam még egy float változót, amihez hozzáadnám a "proba" értékét, de nincs változás.
A hozzászólás módosítva: Júl 7, 2022
A szimulátorban milyen típusként figyeled a változót? Float ként?
pl 1 esetén milyen értéket látsz?
Rávezettél a megoldásra.
A méret 32bit alapesetben, átállítva 24bitre, jól jelenik meg az érték.
Sziasztok!
Egy tarfó tekercselő elektronikát készítek Bakman kollégáéhoz hasonlót, néhány kiegészítéssel. Az Ő segítségével eljutottam odáig, hogy az encoder által küldött jelet már tudom fogadni a mikrovezérlővel, és ezt ki is tudom jelezni. Ez mindd szép és szuper, csak kevés. Eljutottam oda is, hogy a teljes fordulatokat is ki tudom már jelezni: egész egyszerűen a bejövő jelet elosztva 2048-cal. (2048 inkremenst küldd az encoder egy teljes fordulatra). Viszont nekem nem lenne rossz, ha a tízed és század pontossággal is kiírná ezt az értéket. Ha jól értelmeztem a leírást, akkor a változók csak egész számokat tárolnak... Tehát ha mondjuk az encoderem megtett fél fordulatot az 1024 inkremens. Ha ezt osztom 2048-cal, akkor az 0,5. Ha jól értem ebből a 0,5-ből kéne egész számot varázsolnom még az elején. Vajón járható út-e ez: Maradjunk a fél fordulatnál. (1024*10)/2048. És ezt tárolnám le tömbváltozóban a megfelelő helyen, és ezt jeleníteném meg a kijelzőn?
Ha a programkódod megosztanád velünk, akkor egyszerűbb lenne... Minden esetre a változókat eléggé rosszul értelmezed. Ha C nyelvről van szó, ott azért válogathatsz a változófajtákból. Van lebegőpontos változófajta is, használhatod azt is (float, double).MPLAB® XC8 C Compiler User’s Guide - 143. oldaltól olvasgasd.
Az egész és a törtrész tárolása és azokkal való számolás sokkal kisebb kódot eredményez, mint a float avagy a doubble használata.
Gondolm ezt bbb-nek szántad? Idő közben ugyanerről Bakman kolléga is megerősített, hogy bonyolult a használata, és 8 bites vezérlőknél nem kevés erőforrást használ fel a mikrokontroller a lebegőpontos számításokhoz.
Ezt hívják map-olásnak (a százalékszámítás is ez), amikor egy számtartományt egy másik számtartománnyá alakítasz. Te az enkóder 0-2047 jeltartományát igényled 0-100 fordulatszám tartománnyá alakítani (azért 100, mert századokat is akarsz látni).
Jól írod (majdnem :laugh: fél fordulatnál: 1024*100/2048 = 50, maradékot eldobod. Tehát az enkóder minden kb 20 (pontosan 20.48) értékváltozásának felel meg 0,01 fordulatszám. A kijelzőre kiírod a fordulatszámlálódat (pl ha már 122 fordulatot letekercseltél), majd mellé az 50-et = 122,50 fordulat. Ha az eredményed >=100 (figyelj az esetleges túlcsordulásra), akkor hozzáadsz 1-et a fordulatszámlálódhoz és kiírod: 123,00 enkóder 0-20 21-40 41-61 62-81 82-102... 1003-1023 1024-1044... fordulat 0,01 0,02 0,03 0,04 0,05....... 0,5 0,51............ Bár kérdéses a huzaltekerési gyakorlatban kell-e ilyen felbontás - lehet, hogy elég 0,1, inkább 0,25 (=negyed) vagy 0,5 (=fél) fordulat is... A hozzászólás módosítva: Aug 31, 2022
Tekercselőgépnél nem sok értelmét látom a tized/század menetek számlálásának.
De vitathatatlanul lehetséges...
Szia!
Nagyon szépen köszönöm a tömör választ, így már remélhetőleg boldogulni is fogok. Igazából nem feltétlen kell ekkora felbontás. Őszintén szólva én még a tízedes jegyet sem szoktam figyelembe venni, mert nálam általában a cséve adottságai határozzák meg a végleges menetszámot azaz, hogy hol tudom kivezetni a huzalt majd. Ha valahol a vasmagon belül áll meg, hiába, ott nem tudom kivezetni majd, akarva akaratlanul is tovább kell egy negyed vagy fél fordulattal tekernem. Viszont ez egy elég preciz encoder, aztán ha már így van, a programon belül elfér még ez a kódrészlet.
Már megint egyetértünk Gafly-val
Osztás-szorzás nélküli példa negyed fordulat felbontásra: Enkóder <= 512 -> fordulat = 0; 512 < Enkóder <= 1024 -> fordulat = 0,25; 1024 < Enkóder <= 1536 -> fordulat = 0,5; 1536 <Enkóder <= 2000 -> fordulat = 0,75; 2000 < Enkóder -> fordulat = 1. Az 1 fordulat elérésének detektálásához szükséges kis biztonsági tartomány, hiszen az enkóder érték 2047 után 0 jön, ha abszolút enkóderről van szó. Minden 1/2048 = 0,175 foknyi szögváltozást, enkóder érték változást nem könnyű detektálni a mikrovezérlővel. Például 50 mm átmérőre tekercselt 1 menetnyi huzal = 50mm*Pi = 157 mm-es, ami 2048/157 = 13 enkóder értéknek felel meg. A hozzászólás módosítva: Aug 31, 2022
Már nem tudtam szerkeszteni, helyesen:
Például 50 mm átmérőre tekercselt 1 menetnyi huzal = 50mm*Pi = 157 mm hosszúságú. Ekkor 1 mm huzal 2048/157 = 13 enkóder értéknek felel meg.
Sziasztok!
Újabb problémába ütköztem. A szálvezető léptetőmotor vezérlése. Mindenképpen valami megszakításos dolgot kéne létrehozonom. Eddig úgy vezéreltem léptető motorokat (Step/Dir vezérlővel), hogy egy feltételnek megfelelően a mikrovezérlő egyik bitjét 1-re billentettem, majd kis idő elteltével (Delay_ms vagy us) 0-ra. Így létre hozva egy "step" impulzust. Viszont mivel most nagyon számít az idő és nem nagyon akadhat meg a program, így ezt érdemesebb lenne CCPx modullal megoldanom azthiszem. Olvasgattam erről, de nem vagyok benne biztos. Van lehetőség ezzel a modullal csak egy impulzust kiadni mondjuk egy feltételnek megfelelően? Sajnos egyik oldalon sem láttam leírva, hogy hogyan zajlik végbe a folyamat.
Hali,
Sajna ez a modul nem egy impulzusra van kitalálva, hanem hogy folyamatosan generálja a PWM modulált négyszögjelet - levéve a terhet a CPU-ról. Csak akkor lehet talán csinálni valamit, ha a kitöltési tényeződ nagyon kicsi és van időd kikapcsolni a PWM-et - ez azonban csak nagy bitszélességű (16bit vagy nagyobb) PWM-el lehet, az viszont csak nagyon kevés PIC-ben lakozik. De ez szerintem macera és ha valami miatt "lekésel" akkor több impulzus is kimehet. Szerintem jobban jársz ha csinálsz valami külső logikai hálózatot amit a PIC triggerel és az állítja elő a megfelelő impulzust - mondjuk egy számláló néhány logikai kapuval amit a PIC órajele léptet. Annak a kimenetére tehetsz egy meghajtót ami már tudja a léptetőmotor áramát kapcsolni. Milyen szélességű impulzus kell a motorhoz?
Attól függ, milyen PIC-ről beszélünk. PWM-et le leht állítani úgy is, hogy adott lábat bemenetre kapcsolod. Az új kontrollerekben ott a bővített tudású Timer2, kapuzható Timer1, CLC, NCO modulok stb. Csak fantázia kérdése.
Közben átnéztem a CCP modul leírását és megpróbálhatod még "Compare" üzemmódba használni, de itt be kell kapcsolni a megszakítást hozzá. Ezzel mehet a dolog külső alkatrészek nélkül is...
Találtam egy oldalt ahol meg tudod nézni ennek az üzemmódnak a működését :
CCPx "Compare" mód
Én csináltam több infra távirányítót is. A PWM modul 36kHz 50%-os négyszögjelre volt beállítva, és az adott billentyű kódjának bitjei ezt kapcsolgatták be-ki. Hibátlanul működnek a mai napig.
Sziasztok. Ismét belefutottam egy furcsa dologba: egy 5digites decimális számot (pl. 97475) akarok számjegyekre felbontani(tízezres, ezres, százas...), és a számolások közben zagyvaságok jönnek ki (csatolt kép).
Leegyszerűsítettem a programot csak egy műveletre, és ott is jelen van a "hiba"
Akkor van a hiba, ha a változó értéke átlépi a 32767-et. A szam2 típusa unsigned long int, a jelenlegi érték bőven a max alatt van. A környezet: MPLAB IDE + HiTech C. Van valakinek ötlete hogy mire nem figyelek? Köszi.
Köszönöm, így már működik
Ezt egy változóval hogyan kell jelölnöm, ha az is van a képletben?
?
Rájöttem. A változónál nem kell külön jelölnöm, csak a konstansoknál.
Változónál használhatsz kényszer konverziót
szam2=(unsigned long int) szam+1UL; https://en.cppreference.com/w/c/language/integer_constant
a = b + c
b és c összeadódik, majd az eredmény bekerül az 'a' változóba. b és c összeadása integer "dimenzióban" (-32768 ... +32767) történik, itt lehet túlcsordulás ami hibás eredménynek tűnhet. A hozzászólás módosítva: Dec 12, 2022
|
Bejelentkezés
Hirdetés |