Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   1153 / 1203
(#) Hp41C válasza Peet19 hozzászólására (») Márc 6, 2021 / 1
 
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
(#) Peet19 válasza proli007 hozzászólására (») Márc 6, 2021 /
 
Igen, igazad van de sajnos nem találtam erre megoldást. Eddig jutottam:
  1. MOVLW   65
  2.         MOVWF   CCPR4L
  3.        
  4.         BTFSC   CCPR4L, 0
  5.         GOTO    A1
  6.         GOTO    A0
  7.         A1
  8.         BSF             CCP4CON, DC4B0
  9.         GOTO    B0
  10.         A0
  11.         BCF             CCP4CON, DC4B0
  12.         B0
  13.         BTFSC   CCPR4L, 1
  14.         GOTO    A3
  15.         GOTO    A2
  16.         A3
  17.         BSF             CCP4CON, DC4B1
  18.         GOTO    B1
  19.         A2
  20.         BCF             CCP4CON, DC4B1
  21.         B1     
  22.         RRNCF   CCPR4L
  23.         RRNCF   CCPR4L
  24.         NOP


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.
(#) nedudgi válasza Peet19 hozzászólására (») Márc 6, 2021 /
 
Milyen kontroller az alany?
(#) Peet19 válasza nedudgi hozzászólására (») Márc 6, 2021 /
 
18F46K22
(#) Peet19 válasza Hp41C hozzászólására (») Márc 6, 2021 /
 
Igen, igazad van, elnézést nem közöltem a konkrét tényeket.
(#) nedudgi válasza Peet19 hozzászólására (») Márc 6, 2021 / 1
 
Ha átlátható programot akarsz írni, ennél a kontrollernél érdemes makrót használni, mert nem tartalmaz shift utasítást.
  1. ; Egybites leptetes jobbra, atvitel nelkul
  2. SHRL macro f,d,a
  3.         RRCF f,d,a
  4.         BCF   f,7,a
  5.         endm

Ezután a programba ennyit kell írni:
  1. ize:
  2.         SHRL   f,d,a

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.
(#) Peet19 válasza nedudgi hozzászólására (») Márc 6, 2021 /
 
Köszi szépen, ez nagyon jól néz ki. Első ránézésre érthető is, de holnap tesztelem.
(#) nedudgi válasza Peet19 hozzászólására (») Márc 6, 2021 /
 
Sok sikert! (Mert én nem teszteltem.)
A hozzászólás módosítva: Márc 6, 2021
(#) Peet19 hozzászólása Márc 7, 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
(#) Hp41C válasza Peet19 hozzászólására (») Márc 7, 2021 /
 
A Debugger / Settings lapon beállítottad az órajel frekvenciáját?
(#) foxi63 válasza Peet19 hozzászólására (») Márc 7, 2021 /
 
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
(#) Peet19 válasza Hp41C hozzászólására (») Márc 7, 2021 /
 
Igen, 8MHz -re állítottam. Stopwatch -ban is mértem. 1 periódus 32us.
(#) Peet19 válasza foxi63 hozzászólására (») Márc 7, 2021 /
 
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?
(#) Peet19 válasza foxi63 hozzászólására (») Márc 7, 2021 /
 
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.
(#) foxi63 válasza Peet19 hozzászólására (») Márc 7, 2021 / 1
 
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
(#) Peet19 válasza foxi63 hozzászólására (») 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
(#) Bakman válasza Peet19 hozzászólására (») Márc 7, 2021 / 1
 
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>):
  1. 0: 0 %
  2. 1: 8.33 %
  3. 2: 16.66 %
  4. 3: 25 %
  5. 4: 33.33 %
  6. 5: 41.66 %
  7. 6: 50 %
  8. 7: 58.33 %
  9. 8: 66.66 %
  10. 9: 75 %
  11. 10: 83.33 %
  12. 11: 91.66 %
  13. 12: 100 %
Az alsó két bit használatával van 12 lépésed, ezek kihagyásával csak négy. Természetesen, ahogy növeled PR2 értékét, úgy lesz egyre kevésbé érdekes az alsó két bit.

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.
(#) Peet19 válasza Bakman hozzászólására (») Márc 7, 2021 /
 
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
(#) Bakman válasza Peet19 hozzászólására (») Márc 7, 2021 / 1
 
Idézet:
„Ha 10bites lesz a TMR2”
Ezzel ne keverd össze magad.

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.
(#) slimcolt hozzászólása Márc 7, 2021 /
 
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.
(#) Peet19 válasza Bakman hozzászólására (») Márc 8, 2021 /
 
Köszi, megtaláltam, olvasgatok. Lassan összeáll a kép.
(#) lokátoros válasza slimcolt hozzászólására (») Márc 8, 2021 /
 
Ilyesmire gondoltál?

typedef struct {
uint32_t* p1;
uint16_t* p2;
uint8_t* p3;
}ptr_t;

ptr_t PointerStruct;
(#) slimcolt válasza lokátoros hozzászólására (») Márc 8, 2021 /
 
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"
(#) Pethical válasza slimcolt hozzászólására (») Márc 8, 2021 / 1
 
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
(#) slimcolt válasza Pethical hozzászólására (») 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)
....
(#) slimcolt válasza slimcolt hozzászólására (») Márc 8, 2021 /
 
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
(#) Pethical válasza slimcolt hozzászólására (») Márc 9, 2021 / 1
 
Igen,
  1. uint8_t valtozo = 1; // változó, integer
  2. uint8_t * pointer = &valtozo // változóra mutató pointer, azaz a pointerbe valtozo címe kerül
  3. valami = pointer // valami értéke a valatozo címe lesz
  4. valami = *pointer // valami értéke a valtozo értéke lesz (azaz a csillag jelentése: olvasd ki innen a címet és add vissza az azon a memória címen lévő értéket)
  5. valami = (uint8_t) pointer // valami értéke a valtozo címe lesz egészre kasztolva
(#) jdani hozzászólása Márc 13, 2021 /
 
Ü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?
(#) Bakman válasza jdani hozzászólására (») Márc 13, 2021 /
 
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ú...
(#) Hp41C válasza jdani hozzászólására (») Márc 13, 2021 / 1
 
- 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.
Következő: »»   1153 / 1203
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