Fórum témák
» Több friss téma |
Az addwf WREG,F feltételezi, hogy a léptetni szándékolt érték a WREG -ben van.
Egyébként: movf reg, w / addwf reg, f Idézet: „A 0. biten 1 van, az kihullik de a carry bit 1. Eddig még nincs gond, de a következő shiftnél az érték 16 lenne, de nem mert visszajön balról az 1.” Mind a két utasítást ismételni kell léptetésenként, ha csak 8 bitet kell léptetni. Ha több byte is van, akkor csak ez első helyi értéknél kell a C bitet törölni. A hozzászólás módosítva: Márc 6, 2021
Igen, igazad van de sajnos nem találtam erre megoldást. Eddig jutottam:
Az elején a 65 végülis a PWM kitöltési tényezője lenne 8 biten. Ezt kellene beletenni CCPR4L-be úgy, hogy az alsó két bit a CCP4CON, DC4B0 és DC4B1 bitjeire kerüljön, és persze ezt kellene odébb lökdösni két bittel. De ezt gondolom tudjátok de nekem még új ![]() Erre gondoltam, hogy valami ilyesmi progit összetákolok kezdésnek. De ha van erre egyéb ötletetek akkor azt nagyon szívesen fogadom.
Igen, igazad van, elnézést nem közöltem a konkrét tényeket.
Ha átlátható programot akarsz írni, ennél a kontrollernél érdemes makrót használni, mert nem tartalmaz shift utasítást.
Ezután a programba ennyit kell írni:
Ehhez át kel futni, és értelmezni az RRCF és BCF utasításokat, hogy a megfelelő paramétereket tudd megadni. Direkt az adatlapban használt jelöléseket használtam. Ezzel az "új utasítással" létrejött egy egysoros valami, ami egy shift utasítást szimulál.
Köszi szépen, ez nagyon jól néz ki. Első ránézésre érthető is, de holnap tesztelem.
Sok sikert! (Mert én nem teszteltem.)
![]() A hozzászólás módosítva: Márc 6, 2021
Minden okés, köszi a segítséget mindenkinek. Megoldódott a probléma.
Viszont lenne itt még egy furcsaság ami nem teljesen tiszta. PWM frekvenciát és kitöltési tényezőt szeretnék kiszámolni százalékosan, ami nagyjából már meg is van de nem vagyok benne biztos hogy jól számolok. A valós frekvencia szerintem sokkal több mint amit számolok. Így számoltam: A PWM felbontása legyen 8 bit. A kristály frekvenciája 8MHz, vagyis a rendszer órajelem (fosc) 2MHz. 8 bit esetén a lépés szám 256. (Z = 256) Így a PWM frekvencia fosc / Z = 2000000 / 256 = 7812Hz = 7.8kHz PR2 = (256 / 4) - 1 = 63 A kitöltési tényező százalékos értékének meghatározása: (TH %) a kívánt kitöltési tényező %-ban TH % * (PR2 + 1) / 25 Például legyen a kitöltési tényező 50%. (50 * 64) / 25 = 128 vagy (256 / 100) * 50 = 128 Ez binárisan (8 biten természetesen) 10000000 Ezt az értéket kell betölteni CCPR4L-be úgy, hogy az alsó két bit a CCP4CON regiszter DC4B1 és DC4B0 bitjeire kerüljön. A Timer2 elő és utóosztója egyeránt 1:1 így a max. frekit el tudom érni. Lehet hogy sok, nem tudom mik a gyakorlatban beváltak. Nem tudom hogy jól számolok-e, de szerintem a valós freki a képen látható diagram szerint 31.250kHz. Középen látható hogy 1 periódus 64 utasításciklus alatt fut le, aminek a periódusideje 64 * 500ns = 32us. Ennek a reciproka, vagyis a frekvenciája 31.25kHz. Most vagy én számolok el nagyon valamit, vagy nem jó a progi. Szerintetek? A hozzászólás módosítva: Márc 7, 2021
A Debugger / Settings lapon beállítottad az órajel frekvenciáját?
Szia!
A hiba ott van, amkor betolod a 2 bitet a CCP4CON regiszter DC4B1 és DC4B0 bitjeibe, ezek nem az oszcillátor/4 frekin mennek, hanem *4 maga a kristály frekije. A valós freki a PR2 értéke 255 esetén 2MHZ /256 = 7812.5 Hz A két legkisebb bitet soha nem használom, ha kell mégis a finomabb felbontás akkor 256*4-1= 0x 3ff -et kell beírni a PR2-be és a CCP4CON regiszter DC4B1 és DC4B0 bitjeibe Tehát a 7812.5Hz 3ff beírásával érhető el. üdv.:Foxi A hozzászólás módosítva: Márc 7, 2021
Igen, 8MHz -re állítottam. Stopwatch -ban is mértem. 1 periódus 32us.
Szia!
Köszi, átnézem mégegyszer. Azt sem értem még hogy hogy lehet kibővíteni a TMR2 8 bites számlálóját 10 bitesre. Hol van az a plusz két bit? Most akkor a a CCP4CON regiszter DC4B1 és DC4B0 bitjeit nem kell használni?
Ha jobban belegondolok akkor ha növelem PR2 értékét akkor csökken a frekvencia.
Jelenleg pont meg kell 4 szerezni ahhoz amit írtál hogy megkapjam a 7812.5Hz-et. Vagyis akkor csak jól számoltam mert ha PR2 64 mint most akkor a freki pont a 4 szerese azaz 31520Hz.
Valójában igaziból úgy van 10 bit, hogy a frekit meghatározza a PR2 ez ugye 8 bit.
A pwm is 8 bit. Ha viszont kell a 10 bit, ekkor felszorzod 4-el a PR2 értékét ekkor a felbontásod 10 bit lesz és mostmár lehet tologatni 2 bitet a DC4B§ -DCB4B1 be és lehet 8 bitet írni a CCPR4L be. Viszont a 10 bit felbontásnál is marad a frekvencia mintha csak pr2 lenne. Ennek akkor van értelme, ha PR2 64 től kisebb értékű és kevés lépésszáma van a pwm-nek. Előfordulhat olyan alacsony érték, hogy kell a finomabb felbontás. Úgy kell belőni a fekit,hogy PR2 200 és 250 legyen ekkor nem kell bittologatással foglalkozni. 10 bites felbontásban is ugyanaz a freki, csak a kitöltése 10 bit. üdv.: Foxi A hozzászólás módosítva: Márc 7, 2021
Húúú, erre még innom kell egy kávét, de nagyjából értem.
Nem kell egyenlőre a 10 bit elég a 8. Átírom PR2-t 200-ra aztán mérek egyet. Így gondolom kisebb lesz a freki, de a DC4B1 és DC4B0 bitekbe azért mehet a kitöltési tényező alsó két bitje? Vagy ha nem rakom bele akkor nem is kell tologatni a CCPR4L-t? A hozzászólás módosítva: Márc 7, 2021
A PWM frekvenciáját a Timer2 előosztója (Prescaler), a periódus regisztere (PR2) és az órajel adja.
A PWM felbontását csak a PR2 regiszter értéke határozza meg. Alapesetben, ha a PR2 értéke 255, a PWM felbontása 10 bit. A felső nyolc bitet a CCPR1L regiszter, az alsó két bitet a CCP1CON 5. és 4. bitje adja. Ha az alsó két bitet nem használod, veszítesz az elérhető felbontásból. Minél kisebb a PR2 értéke, annál inkább szükség van az alsó két bitre is. Pl.: prescaler=16, PR2=2, Fosc=8 Mhz. PWM frekvencia: 41 667 Hz, PWM felbontás: 3.584 bit. A PWM kitöltési tényező (CCPR1L : CCP1CON<54>):
Ha PR2 értéke 200, a PWM felbontása 9.651 bit lesz, 804 lépés adódik a kitöltési tényező meghatározására. Ha az alsó két bitet nem használod, csak a CCPR1L regisztert, akkor 201 lépésed marad. Az alsó két bit mindenképpen fontos, ha 0 %-os kitöltési tényezőt is akarsz, ekkor a CCP1CON 5. és 4. bitjét mindenképpen nullára kell állítani, különben hiába írsz nullát a CCPR1L-be, a kitöltési tényező biztosan nem lesz nulla.
Köszi, azt hiszem már kezdem érteni, de nem teljesen tiszta még hogy hogy jöttek ki neked ezek az értékek.
Ha 10bites lesz a TMR2 akkor gyakorlatilag csak minden 4. lépésnél léptet 1-et. Ha az előosztó 16 és 8MHz a freki, akkor az utasításciklus periódusideje 500ns. Ez szorozva 16-al 8us. Vagyis 8us -onként léptetne 8 bit esetén. 10 bit esetén pedig minden 4.-re léptet akkor 8us * 4 = 32us/lépés. Mármint a számlálót 32us -ként lépteti. Ez szorozva 255-el (PR2) = 2ms. Ennyi lesz egy túlcsordulás vagyis a pwm periódusideje. Ennek ha vesszük a reciprokát az 490Hz-re jön ki. Nem tudom mit számolok el, de már zavar. Lehet félre kéne már rakni egy kicsit az agyam lazulni ![]() Idézet: Ezzel ne keverd össze magad.„Ha 10bites lesz a TMR2” Nézd meg a képleteket az adatlapban, ne próbálj mindent (is) kiszámolni. A CCP (ECCP) modult beállítod, a többi az ő dolga.
Sziasztok,
Nekem igazából egy C nyelvi kérdésem lenne. Szeretnék létrehozni egy olyan struktúrát amiben csak mutatók vannak és nem egy másik struktúrára szeretnék mutatni, hanem néhány logikailag összetartozó mutatót szeretnék egy csokorba szedni. Ez lehetséges? Ha igen, hogy? Az MPLAB X nem ette meg az eddigi próbálkozásaimat. ![]()
Köszi, megtaláltam, olvasgatok. Lassan összeáll a kép.
Ilyesmire gondoltál?
typedef struct { uint32_t* p1; uint16_t* p2; uint8_t* p3; }ptr_t; ptr_t PointerStruct;
Szia,
Igen ilyenre, kb így használnám: uint8_t a = 5; uint8_t b = 6; uint8_t c = 7; typedef struct { uint8_t *kismacska; uint8_t *kiskutya; uint8_t *kismalac; } ptr_t; ptr_t P_STRUCT = { .kismacska = &a, .kiskutya = &b, .kismalac = &c } switch(P_STRUCT.kismacska) { case: stb... stb... ...... } na erre kapok egy olyan error kódot, hogy: "error: switch quantity not an integer"
A P_STRUCT.kismacska nem egy integer, hanem egy integerre mutató pointer. (A struct rendben van)
A hozzászólás módosítva: Márc 8, 2021
Értem, teljesen igaza van.
Viszont ha így írom a switch-be, akkor lefordul a kód, kérdés, hogy ez így oké e? switch((uintptr_t)P_STRUCT.kismacska) ....
Viszont, ha a P_STRUCT.kismacska értékét szeretném kiolvasni, akkor szerintem így csak a címét kapom meg. :/
szerk: switch(*P_STRUCT.kismacska) -val működik szépen.. A hozzászólás módosítva: Márc 8, 2021
Igen,
Üdv. Egy IC, aminek a kimenete 5V vagy 0V, szeretném összekötni egy PIC bemenetével. Ha jól emlékszem, nem kell a PICre lehúzó ellenállás, sem pedig a PIC bemenete, és az IC kimenete közé ellenállás, igaz?
Ha biztosra akarsz menni, akkor teszel oda egy felhúzó ellenállást. Milyen IC kimenetéről van szó? Van olyan kimenet, ami nyitott kollektoros/három állapotú...
- Amennyiben az "IC" és a PIC tápfeszültsége közös és 5V: Igen, de inicializálásnál ügyelni, hogy nem legyen a láb kimenet egy kis időre sem.
- Ha az "IC" tápfeszültsége ugyan 5V, de ki lehet kapcsolva, amikor a PIC -é be van kapcsolva: Igen, de inicializálásnál ügyelni, hogy nem legyen a láb kimenet egy kis időre sem. - Ha az "IC" tápfeszültsége ugyan 5V, de be lehet kapcsolva, ha a PIC -é nincs: soros ellenállással korlátozni kell a PIC lábába folyó áramot, vagy szintillesztőt kell használni. - Amennyiben a PIC tápfaszültsége nem 5V: szintillesztőt kell használni (lehet egy ellenállás osztó is). - Amennyiben a PIC tápfeszültsége nem 5V, és ki lehet kapcsolva, amikor az "IC" -é be van kapcsolva: Meg kell akadályozni, hogy a 5V feszültség a PIC tápfeszültségére jusson a belső védődiódákat is figyelembe véve. |
Bejelentkezés
Hirdetés |