Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   152 / 153
(#) spenyo hozzászólása Ápr 4, 2022 /
 
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.
(#) Hp41C válasza spenyo hozzászólására (») Ápr 4, 2022 /
 
Í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
(#) kzozo hozzászólása Júl 7, 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.
(#) Gafly válasza kzozo hozzászólására (») Júl 7, 2022 /
 
BitConverter.ToSingle()
Idézet:
„0 00-80-3F-00 5.831554E-39”
(#) Hp41C válasza kzozo hozzászólására (») Júl 7, 2022 / 1
 
Á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.
(#) kzozo válasza Gafly hozzászólására (») Júl 7, 2022 /
 
Nem dolgoztam még nem egész számokkal.
Nekem kell még konvertálnom is?
(#) kzozo válasza Hp41C hozzászólására (») Júl 7, 2022 /
 
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
(#) Lamprologus válasza kzozo hozzászólására (») Júl 7, 2022 / 1
 
A szimulátorban milyen típusként figyeled a változót? Float ként?
pl 1 esetén milyen értéket látsz?
(#) kzozo válasza Lamprologus hozzászólására (») Júl 7, 2022 /
 
Rávezettél a megoldásra.
A méret 32bit alapesetben, átállítva 24bitre, jól jelenik meg az érték.
(#) scooby_ hozzászólása Aug 29, 2022 /
 
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?
(#) bbb válasza scooby_ hozzászólására (») Aug 29, 2022 /
 
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.
(#) Hp41C válasza scooby_ hozzászólására (») Aug 29, 2022 / 3
 
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.
(#) scooby_ válasza Hp41C hozzászólására (») Aug 30, 2022 /
 
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.
(#) HeZ válasza scooby_ hozzászólására (») Aug 31, 2022 / 1
 
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
(#) Gafly válasza HeZ hozzászólására (») Aug 31, 2022 / 1
 
Tekercselőgépnél nem sok értelmét látom a tized/század menetek számlálásának.
De vitathatatlanul lehetséges...
(#) scooby_ válasza HeZ hozzászólására (») Aug 31, 2022 /
 
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.
(#) HeZ válasza Gafly hozzászólására (») Aug 31, 2022 /
 
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
(#) HeZ válasza HeZ hozzászólására (») 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.
(#) scooby_ hozzászólása Okt 5, 2022 /
 
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.
(#) spenyo hozzászólása Nov 3, 2022 /
 
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?
(#) Bakman válasza spenyo hozzászólására (») Nov 3, 2022 /
 
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.
(#) spenyo hozzászólása Nov 3, 2022 /
 
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...
(#) spenyo hozzászólása Nov 3, 2022 /
 
Találtam egy oldalt ahol meg tudod nézni ennek az üzemmódnak a működését :
CCPx "Compare" mód
(#) kzozo válasza spenyo hozzászólására (») Nov 4, 2022 /
 
É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.
(#) kzozo hozzászólása Dec 12, 2022 /
 
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"
  1. #include <pic.h>
  2. #include <math.h>
  3. #include <htc.h>
  4. #define _XTAL_FREQ 20000000
  5.  
  6. unsigned char  egyes, tizes, szazas, ezres, tizezres;
  7. unsigned long int  szam2;
  8.  
  9. main ()
  10. {
  11.         szam2=32767+1;
  12.  
  13. while(1)                                                        //végtelen ciklus
  14.                 {}


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.
(#) Hp41C válasza kzozo hozzászólására (») Dec 12, 2022 / 1
 
  1. szam2=32767+1;

helyett
  1. szam2=32767L+1;
(#) kzozo válasza Hp41C hozzászólására (») Dec 12, 2022 /
 
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?
  1. szam2=szam+1;

?
(#) kzozo válasza kzozo hozzászólására (») Dec 12, 2022 /
 
Rájöttem. A változónál nem kell külön jelölnöm, csak a konstansoknál.
(#) pipi válasza kzozo hozzászólására (») Dec 12, 2022 / 1
 
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
(#) Bakman válasza kzozo hozzászólására (») Dec 12, 2022 / 1
 
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
Következő: »»   152 / 153
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