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   806 / 1216
(#) Pali79 válasza kissi hozzászólására (») Jún 6, 2016 /
 
A szekr-et nem láttam!
(#) benjami válasza Pali79 hozzászólására (») Jún 6, 2016 /
 
Előkotortam egy sokéves programomat és ezt makrót találtam, igaz ez 18f-re van, de némi módosítással átvihető 16f-re:
  1. ;==============================================================================
  2. ; W-ben található 8 bites bináris számot karakteressé alakítja
  3. ; képes előjel nélküli és előjeles számok átalakítására is
  4. ; ha a szám nem fér el 'he' karakterhelyen, az elejét csonkolja
  5. ; a makro hivatkozás helyén szükséges változók:
  6. ; - Num : átmeneti tár a szám tárolásához
  7. ; - WTemp : átmeneti tár W regiszter tárolásához
  8. ; - ZeroSw : egy bit tárolóhely a kezdő nullák eltüntetéséhez (csak ha ZeroChar != '0')
  9. ; - NegSw : egy bit tárolóhely az előjel tárolásához (csak ha NegChar == '-')
  10. ; paraméterek :
  11. ; - he = {1, 2, 3} : ennyi számjeggyel írja ki
  12. ; - ZeroChar : szám elején előforduló nullákat mivel helyettesítse
  13. ; - NegChar : ha '-' akkor előjeles számként írja ki
  14. ; - WriteProc : karakterkiíró eljárás címe
  15.  
  16. WriteByte  macro  he, ZeroChar, NegChar, WriteProc
  17. LOCAL  l100loop, l100end, l10loop, l10end
  18. LOCAL  n100, n10, n1
  19.  
  20.                 movwf   Num
  21. ; előjeles szám esetén
  22. if NegChar == '-'
  23. LOCAL Plus
  24.                 bcf     NegSw                     ; pozitív szám
  25.                 btfss   Num, 7                    ; pozitív ?
  26.                 bra     Plus                      ; igen
  27.                 negf    Num
  28.                 bsf     NegSw                     ; negatív szám
  29. Plus
  30. endif
  31.  
  32. if ZeroChar != '0'
  33.                 bcf     ZeroSw
  34. endif
  35.  
  36. if NegChar == '-' & ZeroChar == '0'
  37.                 movlw   NegChar
  38.                 btfss   NegSw
  39.                 movlw   ' '
  40.                 rcall   WriteProc
  41. endif
  42.  
  43. ; százasok
  44. if he >= 3
  45.                 movlw   '0'
  46.                 movwf   WTemp
  47. endif
  48. l100loop        movlw   .100
  49.                 subwf   Num, f
  50.                 bnc     l100end
  51. if he >= 3
  52.                 incf    WTemp, f
  53.   if ZeroChar != '0'
  54.     if NegChar == '-'
  55.                 btfsc   ZeroSw
  56.                 bra     n100
  57.                 movlw   ' '
  58.                 btfsc   NegSw
  59.                 movlw   NegChar
  60.                 rcall   WriteProc
  61.     n100
  62.     endif
  63.                 bsf     ZeroSw
  64.   endif
  65. endif
  66.                 bra     l100loop
  67.                
  68. l100end         movlw   .100
  69.                 addwf   Num, f
  70.  
  71. if he >= 3
  72.   if ZeroChar != '0'
  73.                 movf    WTemp, W
  74.                 btfss   ZeroSw
  75.                 movlw   ZeroChar
  76.                 rcall   WriteProc
  77.   else
  78.                 movf    WTemp, W
  79.                 rcall   WriteProc
  80.   endif
  81. endif
  82.  
  83. ; tizesek
  84. if he >= 2
  85.                 movlw   '0'
  86.                 movwf   WTemp
  87. endif
  88. l10loop         movlw   .10
  89.                 subwf   Num, f
  90.                 bnc     l10end
  91. if he >= 2
  92.                 incf    WTemp, f
  93.   if ZeroChar != '0'
  94.     if NegChar == '-'
  95.                 btfsc   ZeroSw
  96.                 bra     n10
  97.                 movlw   ' '
  98.                 btfsc   NegSw
  99.                 movlw   NegChar
  100.                 rcall   WriteProc
  101.     n10
  102.     endif
  103.                 bsf     ZeroSw
  104.   endif
  105. endif
  106.                 bra     l10loop
  107.                
  108. l10end          movlw   .10
  109.                 addwf   Num, f
  110. if he >= 1
  111.   if ZeroChar != '0'
  112.                 movf    WTemp, W
  113.                 btfss   ZeroSw
  114.                 movlw   ZeroChar
  115.                 rcall   WriteProc
  116.   else
  117.                 movf    WTemp, W
  118.                 rcall   WriteProc
  119.   endif
  120. endif
  121.  
  122. if NegChar == '-'
  123.                 btfsc   ZeroSw
  124.                 bra     n1
  125.                 movlw   ' '
  126.                 btfsc   NegSw
  127.                 movlw   NegChar
  128.                 rcall   WriteProc
  129. n1
  130. endif
  131. ; egyesek
  132.                 movlw   '0'
  133.                 addwf   Num, W
  134.                 rcall   WriteProc
  135. endm

A felhasználása pedig:
  1. ;==========================================================
  2. WriteuByte1;    WriteByte  1, '0', ' ', WriteChar
  3.                 return
  4. ;==========================================================
  5. WriteuByte2     WriteByte  2, '0', ' ', WriteChar
  6.                 return
  7. ;==========================================================
  8. WriteuByte3     WriteByte  3, ' ', ' ', WriteChar
  9.                 return
  10. ;==========================================================
  11. WriteByte1;     WriteByte  1, ' ', '-', WriteChar
  12.                 return
  13. ;==========================================================
  14. WriteByte2      WriteByte  2, ' ', '-', WriteChar
  15.                 return
  16. ;==========================================================
  17. WriteByte3      WriteByte  3, ' ', '-', WriteChar
  18.                 return
(#) Pali79 válasza benjami hozzászólására (») Jún 7, 2016 /
 
Köszi, ezt elteszem későbbre. Most csak kétjegyű számot kellett szétbontani, jelenleg felesleges egy ilyen hosszú kód.
(#) zsoltee0001 hozzászólása Jún 7, 2016 /
 
Sziasztok
Egy pic-ről, ha nincs semmiféle visszajelzés, hogy tudom megállapítani, hogy megy-e?
Ha egy multival rámérek az oszcillátorra frekvenciamérőjével akkor akkor blokkolja, tehát az nem mérvadó, dse mégis, hogy tudom megállapítani scrödinger macskájáról, hogy él/halott egy egyszerű multiméterrel?
A Vss - Vdd között nem mérek terhelést.
Gyári áramkörökről van szó.
Üdv
(#) Pali79 válasza zsoltee0001 hozzászólására (») Jún 7, 2016 /
 
Szia!
Hát kicsit többet kellene tudni az áramkörről és annak működéséről. Ha van kimenet valamelyik lábon akkor az mérhető, de lehet, hogy ahhoz a multi kevés lesz, esetleg ha tud frekit mérni akkor mutathat valamit, de egy oszcilloszkóppal többre mennél.
A hozzászólás módosítva: Jún 7, 2016
(#) benjami válasza Pali79 hozzászólására (») Jún 7, 2016 /
 
Használtál már feltételes fordítást? Érdemes használni, mert lehetőséged van arra, hogy a kódodat többféle felhasználási módnak is eleget téve készítsd el, aztán a paraméterezéstől függ, hogy a végleges kódba mely részek kerülnek bele és mely részek nem. Így ha pl. a fenti példában csak a WriteuByte2-t rakod bele, akkor csak a kétszámjegy átalakításához szükséges kód kerül bele, a többi pedig nem.
(#) sonajkniz válasza Pali79 hozzászólására (») Jún 7, 2016 /
 
  1. LEBONTAS
  2.         MOVF    SZAM,W       ;Lebontandó számot áttöltöm EGYESEK-be
  3.         MOVWF   EGYESEK
  4.         MOVLW   0xFF         ;TIZESEK-be 255-öt töltök, hogy az első
  5.         MOVWF   TIZESEK      ;incrementálás nullázza.
  6.         MOVLW   0xA          ;WREG-be 10-et töltök
  7. INDUL   INCF    TIZESEK      ;1-el növelem TIZESEK értékét
  8.         SUBWF   EGYESEK,F    ;EGYESEK-ből kivonom W-t
  9.         BTFSC   STATUS,C     ;Ha nem negatív, visszaugrok INDUL-ra
  10.         GOTO    INDUL
  11.         ADDWF   EGYESEK      ;Ha negatív, hozzáadom W-t
  12.         RETURN
(#) zsoltee0001 válasza Pali79 hozzászólására (») Jún 7, 2016 /
 
Szia
pic16c57c-ről van szó, máskor is futottam bele más uC-be ami kérdéses volt, mert oké kiszedem rákötöm pk2-re, esetleg fölismeri, kódot nem tudom kiolvasni, mert biztos, hogy read protectes, nem biztos, hogy előrébb vagyok.
Egyébként kapunyitó, a pic kivétele után a kimeneteket tudom kapcsolgatni 5 voltal, tehát itt már hiba nincs, viszont az, hogy biztosítékokra tettek ledeket, hogy lássa az ember, hogy kiment-e, de hogy az pic-re sajnáltak ráakasztani, hogy villog vagy valami az elég vicces, arra már nem futotta

Milyen árkategóriájú egy olyan szkóp amit ha rákötök a oscillátorra, (4-20 mhz-ról van szó) és tutira megmondja, hogy az a pic fut/nem él?
Üdv
(#) Bell válasza don_peter hozzászólására (») Jún 7, 2016 / 1
 
Talán ilyesmit keresel. Bővebben: Link
(#) don_peter válasza Elektro.on hozzászólására (») Jún 7, 2016 /
 
Hogy lehet ellene védekezni.
Időnként leakassza a PIC-et, sajnos.
Tuti a motor zavar be ilyenkor.
(#) Elektro.on válasza don_peter hozzászólására (») Jún 7, 2016 /
 
Jó volna tudni mi kerül rá a mért részre.
Gyanítom, hogy időnként nagyobb feszültségű zaj jut a PIC -re mint amit fel tudna dolgozni.
Én talán valami műveleti erősítős megoldással próbálkoznék aminek a kimenete semmiképp nem lehet magasabb 5V-nál. Esetleg a bemenetén még szűrni a tüskéket.
(#) icserny válasza zsoltee0001 hozzászólására (») Jún 7, 2016 /
 
Az oszcillátor egyik kivezetése kimenet, a másik pedig bemenet. Értelemszerűen a kimenetre kell csatlakoznod a frekvenciamérővel.
(#) don_peter válasza Elektro.on hozzászólására (») Jún 7, 2016 /
 
Akkor lehet egy 5v-os zéner és egy 100nF-es kondi meg is oldaná a dolgot nem?
(#) Elektro.on válasza don_peter hozzászólására (») Jún 7, 2016 /
 
Még az is lehet.
(#) kaito83 hozzászólása Jún 7, 2016 /
 
Srácok!

Köszönöm mindenkinek a segítséget, sikerült a távcső mechanika PIC-ét Flashelnem csere után tökéletesen működik!
(#) sonajkniz válasza don_peter hozzászólására (») Jún 7, 2016 /
 
Idézet:
„Beépített a hőmérő a motorba, nem tudom cserélni.”

Idézet:
„Időnként leakassza a PIC-et, sajnos.”


Le is fogja. A gyári beépített hőfokmérő analóg műszerhez készül többnyire, így a testet a motor adja. De még ha kétvezetékes is, akkor sincs rendesen elszigetelve. Galvanikus leválasztás híján minden zavart összegyűjt.
Próbálj meg megfelelő mérőhelyet keresni a motoron, és fogadd meg Elektro.on tanácsát.
A DS 1820-asnak van ilyen változata is.
(#) don_peter válasza sonajkniz hozzászólására (») Jún 7, 2016 /
 
Nem kell megfogadnom a tanácsát, mert eddig is DS18B20-al volt mérve a hőfok, de gondoltam kipróbálom a beépített szenzorát.
De be-be üt véletlenszerűen és gyakorlatilag megbolondul a program.
(#) cross51 hozzászólása Jún 7, 2016 /
 
Sziasztok!

Egy dsPIC33EV256GM102 PLL-jével számolgatok és a 9.1 CPU Clocking System alatt van a PLL blokk diagramja és ott a FOSC < 140MHz van írva de a 70MIPS-hez nem 140MHz kell?
Vagy csak hibázott az M és <= nem fért oda?
Valamint nem igazán értem, hogy lehet a 140MHz-t kihozni a PLL-ből 4MHz vagy 8MHz-el számolva se tudtam kihozni mert ha az N1 N2 M hez hozzáadok, szorzok ahogy a doksi írja sehogy se jön ki.

És egy kép is ne kelljen keresni .

Szerk.:
Most nézem az oszcillátor reference manuál-ját és ott nincs benne semmi hozzáadás meg szorzás. De akkor a FOSC CALCULATION-ba mért van benne ez:
Where:
N1 = PLLPRE<4:0> + 2
N2 = 2 x (PLLPOST<1:0> + 1)
M = PLLDIV<8:0> + 2
?
A hozzászólás módosítva: Jún 7, 2016

pll.png
    
(#) cross51 válasza cross51 hozzászólására (») Jún 7, 2016 /
 
Közben rájöttem az N1 N2 M hozzáadás, szorzás problémára. A bináris értékhez hozzá kell adni vagy szorozni, hogy a leírásban megfelelő értéket kapjuk (pl.: PLLPRE = 0 az 2-nek számít).
De az első kérdés még fent áll, de szerintem 140MHz tud menni a PIC, csak nem akarok szívni vele.
(#) ha1drp válasza cross51 hozzászólására (») Jún 7, 2016 /
 
A 140MHz-hez a 4 MHz-es órajelet oszt le 4-el (PLLPRE=2) így 1 MHz-et kapsz, majd a PLL feedback osztó legyen M=140 (PLLDIV=138). A PLLPOST maradhat 2. Jitter szempontjából lehet az PLLPRE=0 (N1=2), PLLDIV=68 (M=70) jobb.

A "+" jelek csak azt jelölik, hogy a regiszterbe beírt értékekhez hozzá kell adni egyet vagy kettőt hogy megkapd az N1,N2, M értékeket. Ennek az az oka, hogy pl. a 0-ás és 1-es értéknek nincs értelme a PLL szorzás, osztásnál.
(#) ha1drp válasza cross51 hozzászólására (») Jún 7, 2016 /
 
Tapasztalatom szerint simán megy 170MHz-en (85MIPS) is.
(#) cross51 válasza ha1drp hozzászólására (») Jún 7, 2016 /
 
Hallottam már ilyesmit, hogy a PIC tud nagyobb frekin menni mint ami rá van írva csak a Microchip eddig garantálja mert 85MIPS-re lehet az egyik felmegy a másik nem. De így így legalább iztos, hogy a 70MIPS megvan.
(#) Zsora válasza cross51 hozzászólására (») Jún 7, 2016 /
 
Egyértelműen elírás.
Egy tipp: olvasgasd a dsPIC33E/PIC24E Family Reference Manualt is, ne csak az adatlapot. Abban bővebben leírnak mindent.
(#) cross51 hozzászólása Jún 8, 2016 /
 
Felmerült egy újabb kérdés, de lehet már a haladóba kéne írjak ezzel kapcsolatban.
Az előbb említett dsPIC-el szeretnék C-ben egy 8 bites változóban bit cím fordítást 7->1 6->2 ... és tudom, hogy tudja hw-san is. Valamennyire már megértem a 16 bites assembly-t de még nem vettem rá magam, hogy megtanuljam. Nem is értem teljesen ezt a reversed addressing dolgot, de assembly-ben van egy csomó példa csak nem igazán tudom, hogy pakoljam át C-be, próbálkoztam C-s kóddal és inline assembly-vel is egyik se lett jó.
Nem FFT-hez kellene amit mindenhol elmondanak, hogy arra van, de e mondjuk, ha egy váltó 0xC0 akkor abból 0x03-mat kellene kapjak és szerintem ezzel a hw-s modullal megoldható gyorsabban mint bit vizsgálattal.

Valakinek nincs erre kódja, esetleg Zsora neked (láttam, hogy elég sokat foglalkozol 16 bittel)?
(#) Hp41C válasza cross51 hozzászólására (») Jún 8, 2016 /
 
Idézet:
„On dsPIC33EPXXX(GP/MC/MU)806/810/814 devices, overhead-free circular buffers (Modulo Addressing) are supported in both X and Y address spaces. The Modulo Addressing removes the software boundary checking overhead for DSP algorithms. The X AGU circular addressing can be used with any of the MCU class of instructions. The X AGU also supports Bit-Reversed Addressing to greatly simplify input or output data reordering for radix-2 FFT algorithms. PIC24EPXXX(GP/GU)810/814 devices do not support Modulo and Bit-Reversed Addressing.”
(#) Zsora válasza cross51 hozzászólására (») Jún 8, 2016 /
 
Ez a funkció adatterületek átrendezéséhez való, és csak [Wx]++ és ++[Wx] címzésmódokkal, ill. szavas (16-bites) mérettel (az X adat RAM területen) használható. Konkrét adat bitjeinek átrendezéséhez nem használható!

Milyen célra kellene neked? Leírnád pontosan a feladatot?
(#) Zsora válasza Zsora hozzászólására (») Jún 8, 2016 /
 
Bocsi! A címzésmódokat mindig keverem az MC68000 címzésmódjaival, mivel korábban sokat programoztam Amigán.
Tehát: [Wn++] és [++Wn]
(#) cross51 válasza Zsora hozzászólására (») Jún 8, 2016 /
 
Kényelmesebb a kikötés egy HD44780-ra, ha az LCD d0->RB15 d1->RB14 ... megy (mondjuk) és fel akartam cserélni a biteket. Ezt tudom, hogy C-ben megoldható sok féle módon, de free-ben egy bit fordítása 6 vagy 7 sor, 3 vagy s optimalizációval 4 sorra hozza ki, de ezt assembly-ben meglehetne oldani gyorsabban nekem egy ilyen az elképzelésem:
  1. uint8_t inv(uint8_t val)
  2. {
  3.     uint8_t retval = 0;
  4.    
  5.     asm("BTSC %0, #7": : "r"(val));
  6.     asm("BSET %0, #0": "=r"(retval));
  7.     asm("BTSC %0, #6": : "r"(val));
  8.     asm("BSET %0, #1": "=r"(retval));
  9.     asm("BTSC %0, #5": : "r"(val));
  10.     asm("BSET %0, #2": "=r"(retval));
  11.     asm("BTSC %0, #4": : "r"(val));
  12.     asm("BSET %0, #3": "=r"(retval));
  13.     asm("BTSC %0, #3": : "r"(val));
  14.     asm("BSET %0, #4": "=r"(retval));
  15.     asm("BTSC %0, #2": : "r"(val));
  16.     asm("BSET %0, #5": "=r"(retval));
  17.     asm("BTSC %0, #1": : "r"(val));
  18.     asm("BSET %0, #6": "=r"(retval));
  19.     asm("BTSC %0, #0": : "r"(val));
  20.     asm("BSET %0, #7": "=r"(retval));
  21.     return retval;
  22. }

De ez a kód csak 0-ás optimalizációnál működik és ott mivel ezt se direkten assembly-ben rakja be a C az is 4 sor. Mint a 3/s optimalizációnál C-ben.
Az 1,2,3,s optimalizációnál ezt adja a disassembly:
  1. !{
  2. !    uint8_t retval = 0;
  3. !    
  4. !    asm("BTSC %0, #7": : "r"(val));
  5. 0x2E4: BTSC W0, #7
  6. !    asm("BSET %0, #0": "=r"(retval));
  7. !    asm("BTSC %0, #6": : "r"(val));
  8. 0x2E6: BTSC W0, #6
  9. !    asm("BSET %0, #1": "=r"(retval));
  10. !    asm("BTSC %0, #5": : "r"(val));
  11. 0x2E8: BTSC W0, #5
  12. !    asm("BSET %0, #2": "=r"(retval));
  13. !    asm("BTSC %0, #4": : "r"(val));
  14. 0x2EA: BTSC W0, #4
  15. !    asm("BSET %0, #3": "=r"(retval));
  16. !    asm("BTSC %0, #3": : "r"(val));
  17. 0x2EC: BTSC W0, #3
  18. !    asm("BSET %0, #4": "=r"(retval));
  19. !    asm("BTSC %0, #2": : "r"(val));
  20. 0x2EE: BTSC W0, #2
  21. !    asm("BSET %0, #5": "=r"(retval));
  22. !    asm("BTSC %0, #1": : "r"(val));
  23. 0x2F0: BTSC W0, #1
  24. !    asm("BSET %0, #6": "=r"(retval));
  25. !    asm("BTSC %0, #0": : "r"(val));
  26. 0x2F2: BTSC W0, #0
  27. !    asm("BSET %0, #7": "=r"(retval));
  28. 0x2F4: BSET W0, #7
  29. !    return retval;
  30. !}
  31. 0x2F6: RETURN


De ez 0-ás optim.-nál nem így néz ki(nem akarom bemásolni az működik ).
Tudom, hogy az a 7 vagy 4 vagy 2 sor majdnem mindegy egy LCD-nél, de a későbbiekben jól jöhet hogy itt megértek valamit.

Ja és még mielőtt rám szólna valaki, hogy mért nem írom assembly-ben, mert sose írtam assemblyben 16 bitre kódot csak a sok disassemblyből kicsit megértettem.
(#) Zsora válasza cross51 hozzászólására (») Jún 8, 2016 /
 
Ezt lehet rövidebben, gyorsabban is:
(Assembly kód)

PIC24, ciklussal:
  1. 0:              mov     #7,w2
  2. 2:              lsr.b   w0,w0
  3.                 rlc.b   w1,w1
  4.                 dec     w2,w2
  5.                 bra     c,2b

PIC24, sebességre opt.:
  1. 0:              .rept 8
  2.                 lsr.b   w0,w0
  3.                 rlc.b   w1,w1
  4.                 .endr

dsPIC, DO ciklussal:
  1. 0:              do      #7,1f
  2.                 lsr.b   w0,w0
  3. 1:              rlc.b   w1,w1
A hozzászólás módosítva: Jún 8, 2016
(#) cross51 válasza Zsora hozzászólására (») Jún 8, 2016 /
 
Mindig tanul valamit az ember
Következő: »»   806 / 1216
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