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   823 / 1210
(#) don_peter válasza Pali79 hozzászólására (») Júl 11, 2016 /
 
Bizony..
Gondolom ha ASM-ben programozik, akkor az if feltételt át tudja forgatni.
Nem kész kódot kért, hanem segítséget, van még kérdésed?
A hozzászólás módosítva: Júl 11, 2016
(#) nedudgi válasza aroxol hozzászólására (») Júl 11, 2016 /
 
Nem egészen mindegy, melyik kontrollerre írnád programot.
A hozzászólás módosítva: Júl 11, 2016
(#) aroxol hozzászólása Júl 11, 2016 /
 
Köszönöm mindenkinek a segítőkészséget, végül levonásokkal megoldottam, bár így egy kicsit hosszabb lett a program.
(#) Pali79 válasza don_peter hozzászólására (») Júl 11, 2016 /
 
Hát azért az nem annyira egyszerű, de ha megtennéd, hogy ezt a részletet lefordítod, kíváncsi lennék, hogy mire fordul.
(#) don_peter válasza Pali79 hozzászólására (») Júl 11, 2016 /
 
Parancsolj: (ez a kód lefordítva)
  1. if(valtozo>1 && valtozo<10) { //2-9-ig 1. port aktív,
  2.                 }else if(valtozo>9 && valtozo<20) { //10-19ig 2. port is aktív,
  3.                 }else if(valtozo>19 && valtozo<25) { //20-24ig 3. port is aktív,
  4.                 }else if(valtozo>24 && valtozo<31) { //25-30ig 4. port is aktív,
  5.                 }
  1. 14:                             if(valtozo>1 && valtozo<10) { //2-9-ig 1. port aktív,
  2.    7EA    3002     MOVLW 0x2
  3.    7EB    0270     SUBWF 0x70, W
  4.    7EC    300A     MOVLW 0xa
  5.    7ED    1C03     BTFSS 0x3, 0
  6.    7EE    2FF3     GOTO 0x7f3
  7.    7EF    0270     SUBWF 0x70, W
  8.    7F0    1C03     BTFSS 0x3, 0
  9.    7F1    2FEA     GOTO 0x7ea
  10. 15:                             }else if(valtozo>9 && valtozo<20) { //10-19ig 2. port is aktív,
  11.    7F2    300A     MOVLW 0xa
  12.    7F3    0270     SUBWF 0x70, W
  13.    7F4    3014     MOVLW 0x14
  14.    7F5    1C03     BTFSS 0x3, 0
  15.    7F6    2FFB     GOTO 0x7fb
  16.    7F7    0270     SUBWF 0x70, W
  17.    7F8    1C03     BTFSS 0x3, 0
  18.    7F9    2FEA     GOTO 0x7ea
  19. 16:                             }else if(valtozo>19 && valtozo<25) { //20-24ig 3. port is aktív,
  20.    7FA    3014     MOVLW 0x14
(#) Pali79 válasza don_peter hozzászólására (») Júl 11, 2016 /
 
Hát jó kis maszlag lett belőle...köszi!
(#) Hp41C válasza aroxol hozzászólására (») Júl 11, 2016 /
 
Ehhez mit szóltok?
  1. clrf outbits  ; Minden kimenet törlése. Az alsó 4 biten keletkezik az eredmény
  2. movlw .230    ; bit3: Excellent, bit2: Good, bit1: OK, bit0: Marginal
  3. addwf valtozo,f; A 25 értéket 0 -ra konvertáljuk. C csak akkor 1, ha a változó a 25..30 tarományban van
  4. movlw 0x0F
  5. btfsc STATUS,C  ; A C jelzőbit szerint beállítjuk mind a 4 kimenetet
  6. iorwf outbits,f
  7. movlw 5; A 20 (akarom mondeni -5) értéket 0 -ra konvertáljuk. C csak akkor 1, ha a változó a 20..24 tarományban van, hiszen a 0 .. 5 esetén nincs átvitel
  8. addvf valtozo,f
  9. movlw 0x07
  10. btfsc STATUS,C
  11. iorwf outbits,f  ; A C jelzőbit szerint beállítjuk az alsó 3 kimenetet
  12. movlw .10
  13. addwf valtozo,f  ; stb...
  14. movlw 0x03
  15. btfsc STATUS,C
  16. iorwf outbits,f
  17. movlw 8
  18. addwf valtozo,f
  19. movlw 0x01
  20. btfsc STATUS,C
  21. iorwf outbits,f
(#) ktamas66 válasza don_peter hozzászólására (») Júl 11, 2016 /
 
Ebből is látszik, hogy felesleges tartományt vizsgálni . De tényleg nem mindegy, hogy 4 vagy 30 ledet szeretnék használni.

CLRF Aktív
MOVLW .10
SUBWF Változó, W
BTFSS STATUS,C
BSF Aktív,0

MOVLW .20
SUBWF Változó, W
BTFSS STATUS,C
BSF Aktív,1
......
(#) Zsora válasza aroxol hozzászólására (») Júl 11, 2016 /
 
Használj dekódoló táblázatot! (Adott értéknél milyen állapotúak a portok.)
Egyszerű és gyors. 4*29 Byte kell hozzá.
(#) sonajkniz válasza aroxol hozzászólására (») Júl 12, 2016 /
 
Szia!

PIC18-ra én igy oldanám meg:
  1. MAIN
  2.     MOVLW   0x1
  3.     CPFSGT  ERTEK
  4.     GOTO    KI1
  5.     BSF     LATB,4
  6.     MOVLW   0x9
  7.     CPFSGT  ERTEK
  8.     GOTO    KI2
  9.     BSF     LATB,5
  10.     MOVLW   0x13
  11.     CPFSGT  ERTEK
  12.     GOTO    KI3
  13.     BSF     LATB,6
  14.     MOVLW   0x18
  15.     CPFSGT  ERTEK
  16.     GOTO    KI4
  17.     BSF     LATB,7
  18.     GOTO    MAIN
  19. KI1 BCF     LATB,4
  20. KI2 BCF     LATB,5
  21. KI3 BCF     LATB,6
  22. KI4 BCF     LATB,7
  23.     GOTO    MAIN
(#) Pali79 válasza sonajkniz hozzászólására (») Júl 12, 2016 /
 
Csak ugye arra nem kaptunk választ, hogy a 4 port az most hány bitet is jelent.. Ha csak 4-et akkor rendben van, de ha a 4 port 4×8 bitet akkor kicist más a leányzó fekvése. Az, hogy azt írta 2-30 közti értéket akar megjeleníteni, nekem az utóbbi tűnik sanszosnak.
(#) sonajkniz válasza Pali79 hozzászólására (») Júl 12, 2016 /
 
Akkor mi értelme 4 mezőre osztani?
Ebben az esetben minden egyes értéknövekedésre újabb bitet kellene bekapcsolni.
(#) Hp41C válasza Pali79 hozzászólására (») Júl 12, 2016 /
 
A 4 változót előbb kinullázzuk és a bsf valtozó,x utasítások helyett a decf valtozo+i,f (ahol i: 0 ..3) utasítással lehet a kívánt változó minden bitjét 1 -re állítani.
(#) Pali79 válasza sonajkniz hozzászólására (») Júl 12, 2016 /
 
Azért kell 4 mezőre osztani, mert a 8 bites PIC-ek portjai csak 8 bitesek. Egybként ha végiggondoljuk egy 2-től 30-ig terjedő értéket 4 biten kijelezni elég nehézkes.... Nekem ezért kézenfekvő ha 4×8 bitet használunk akkor pontosan meg lehet jeleníteni az adatokat.
(#) sonajkniz válasza Pali79 hozzászólására (») Júl 12, 2016 /
 
Én itt csak 4 különböző állapotot látok.
Idézet:
„2 -109 Marginal
3 -107 Marginal
4 -105 Marginal
5 -103 Marginal
6 -101 Marginal
7 -99 Marginal
8 -97 Marginal
9 -95 Marginal
10 -93 OK
11 -91 OK
12 -89 OK
13 -87 OK
14 -85 OK
15 -83 Good
16 -81 Good
17 -79 Good
18 -77 Good
19 -75 Good
20 -73 Excellent
21 -71 Excellent
22 -69 Excellent
23 -67 Excellent
24 -65 Excellent
25 -63 Excellent
26 -61 Excellent
27 -59 Excellent
28 -57 Excellent
29 -55 Excellent
30 -53 Excellent”

Amúgy meg nem lenne egy hátrány, ha a kérdező válaszolna a hozzá intézett kérdésekre, és nem mi próbálnánk meg kitalálni, hogy ő mit akar. Részemről off a téma.
A hozzászólás módosítva: Júl 12, 2016
(#) Pali79 válasza sonajkniz hozzászólására (») Júl 12, 2016 /
 
Ez igaz, de akkor én úgy írtam volna, hogy ha 2-9 1. állapot, ha 10-14 2. állapot stb. De ha lényeges az érték is akkor....
(#) elektroszala hozzászólása Júl 12, 2016 /
 
Üdvözletek!
Én szúrok el valamit, vagy a fordító, vagy ez normális jelenség?:
18f26k22, B Porton: B0 OUT, B1 ÜRES, B2 DIGIT INPUT,B3 DIGIT INPUT,B4 DIGIT INPUT,B5 ANALOG IN(ez a problémás),B6 OUT,B7 OUT.
a gondom, hogy ha engedélyezem a B5-ön a mérést, akkor a B0 0-ra vált (lehet, hogy a többi kimenet is, nem néztem. Mérés előtt teszem 1-be a B0 -t....
A hozzászólás módosítva: Júl 12, 2016
(#) nedudgi válasza elektroszala hozzászólására (») Júl 12, 2016 /
 
Ez milyen programnyelv?
Kódot mutass, anélkül tippelhetünk napestig.
(#) Bakman válasza elektroszala hozzászólására (») Júl 12, 2016 /
 
Nem lehetséges, hogy valamelyik B porton történő analóg olvasás automatikusan analóg bemenetté kapcsolja át az analóg képes B portokat egyszerre?

Shot_522.jpg
    
(#) Zsora válasza aroxol hozzászólására (») Júl 12, 2016 /
 
De mégis, milyen mikrovezérlőről van szó?
Idézet:
„2-9-ig 1. port aktív,
10-19ig 2. port is aktív,”
Ez 18 bit, így ehhez 16-bites portok kellenek.

Idézet:
„ASM-ben programozni”
Olyan nyelv nincs, csak olyan hogy Assembly.

Továbbra is azt mondom hogy a dekodolótáblázat a legegyszerűbb és legrugalmasabb megoldás. Az egyes bitek ill. kimenetek (29 db) bármilyen sorrendben és elrendezésben lehetnek, ami megkönnyíti a vezetékezést. A 4 porthoz 4*29 byte (szó) kell, plusz 4 byte (szó) a maszkoláshoz, ha a portokat másra is használod.
A hozzászólás módosítva: Júl 12, 2016
(#) Pali79 válasza Zsora hozzászólására (») Júl 12, 2016 /
 
Mutass már nekem egy példát erre a dekódoló táblázatra, érdekelne a dolog, hátha másra is fel tudnám használni.
(#) Zsora válasza Pali79 hozzászólására (») Júl 12, 2016 /
 
Ez egy sima tömb, aminek az X. eleme (bemeneti minta) megadja a hozzá tartozó kimeneti mintát. Pofon egyszerű, pl.:

1: 10000000
2: 11000000
3: 11100000
4: 11110000
5: 11111000
6: 11111100
7: 11111110
8: 11111111
(#) giskard válasza Zsora hozzászólására (») Júl 12, 2016 /
 
„ASM-ben programozni”
"Olyan nyelv nincs, csak olyan hogy Assembly."
Nem kéne ennyire szőrözni.
Gyakorlatilag olyan nyelv sincs, hogy: assembly.
A hozzászólás módosítva: Júl 12, 2016
(#) Zsora válasza giskard hozzászólására (») Júl 12, 2016 /
 
Én szeretek szőrszálat hasogatni - fejszével.

Assembly.png
    
(#) giskard válasza Zsora hozzászólására (») Júl 12, 2016 /
 
Egy nyelv alapvető tulajdonsága, hogy a szintaxisa kötött.
Az assembly egy gyűjtő fogalom a gépi kódok helyett a mnemonikok használatára.
És azt nem kell ecsetelnem , hogy procitól függően hányfajta szintaxis lehet.
(#) Bakman válasza Zsora hozzászólására (») Júl 12, 2016 /
 
Az ASM pedig az Assembly rövidítése, nem?
(#) Zsora válasza Pali79 hozzászólására (») Júl 12, 2016 /
 
A példa átültetve PIC24 Assembly nyelvre:

  1. ;---------------------------------------
  2. dekod:      mov     RSSI,wreg
  3.             mov     #psvoffset(tabla),w1
  4.             mov     #psvoffset(maszk),w2
  5.             sl      w0,#2,w3                ;*4
  6.             add     w1,w3,w1
  7. ;-----------
  8.             mov     [w1++],w3
  9.             and     w3,[w2],w3
  10.             com     [w2++],w0
  11.             and     LATA,wreg
  12.             ior     w0,w3,w0
  13.             mov     w0,LATA
  14. ;-----------
  15.             mov     [w1++],w3
  16.             and     w3,[w2],w3
  17.             com     [w2++],w0
  18.             and     LATB,wreg
  19.             ior     w0,w3,w0
  20.             mov     w0,LATB
  21. ;-----------
  22.             mov     [w1++],w3
  23.             and     w3,[w2],w3
  24.             com     [w2++],w0
  25.             and     LATC,wreg
  26.             ior     w0,w3,w0
  27.             mov     w0,LATC
  28. ;-----------
  29.             mov     [w1++],w3
  30.             and     w3,[w2],w3
  31.             com     [w2++],w0
  32.             and     LATD,wreg
  33.             ior     w0,w3,w0
  34.             mov     w0,LATD
  35. ;-----------
  36.             return
  37. ;---------------------------------------
  38.             .section .const,psv
  39. tabla:      .word 0x0000,0x0000,0x0000,0x0030
  40.             .word 0x0000,0x0000,0x0000,0x00f0
  41.             .word 0x0000,0x0000,0x0000,0x03f0
  42.             .word 0x0000,0x0000,0x0000,0x0ff0
  43.             .word 0x0000,0x0000,0x0030,0x0030
  44.             .word 0x0000,0x0000,0x00f0,0x00f0
  45.             .word 0x0000,0x0000,0x03f0,0x03f0
  46.             .word 0x0000,0x0000,0x0ff0,0x0ff0
  47.             .word 0x0000,0x0030,0x0030,0x0030
  48.             .word 0x0000,0x00f0,0x00f0,0x00f0
  49.             .word 0x0000,0x03f0,0x03f0,0x03f0
  50.             .word 0x0000,0x0ff0,0x0ff0,0x0ff0
  51.             .word 0x0030,0x0030,0x0030,0x0030
  52.             .word 0x00f0,0x00f0,0x00f0,0x00f0
  53.             .word 0x03f0,0x03f0,0x03f0,0x03f0
  54.             .word 0x0ff0,0x0ff0,0x0ff0,0x0ff0
  55. ;---------------------------------------
  56. maszk:      .word 0x0ff0,0x0ff0,0x0ff0,0x0ff0
  57. ;---------------------------------------
A hozzászólás módosítva: Júl 12, 2016
(#) Zsora válasza Zsora hozzászólására (») Júl 13, 2016 /
 
A fenti kódot szándékosan írtam terjengősre, hogy jobban látszódjon a logika. Ha a táblázat értékei eleve maszkoltak (márpedig itt azok), és a maszkot az előző inverzére választjuk, akkor portonként 2 utasítás megspórolható:

  1. ;---------------------------------------
  2. dekod:      mov     RSSI,w0
  3.             mov     #psvoffset(tabla),w1
  4.             mov     #psvoffset(maszk),w2
  5.             sl      w0,#2,w0                ;*4
  6.             add     w1,w0,w1
  7. ;-----------           
  8.             mov     LATA,w0
  9.             and     w0,[w2++],w0
  10.             ior     w0,[w1++],w0
  11.             mov     w0,LATA
  12. ;-----------
  13.             mov     LATB,w0
  14.             and     w0,[w2++],w0
  15.             ior     w0,[w1++],w0
  16.             mov     w0,LATB
  17. ;-----------
  18.             mov     LATC,w0
  19.             and     w0,[w2++],w0
  20.             ior     w0,[w1++],w0
  21.             mov     w0,LATC
  22. ;-----------
  23.             mov     LATD,w0
  24.             and     w0,[w2++],w0
  25.             ior     w0,[w1++],w0
  26.             mov     w0,LATD
  27.            
  28.             return
  29. ;---------------------------------------
  30.             .section .const,psv
  31. tabla:      .word 0x0000,0x0000,0x0000,0x0030
  32.             .word 0x0000,0x0000,0x0000,0x00f0
  33.             .word 0x0000,0x0000,0x0000,0x03f0
  34.             .word 0x0000,0x0000,0x0000,0x0ff0
  35.             .word 0x0000,0x0000,0x0030,0x0030
  36.             .word 0x0000,0x0000,0x00f0,0x00f0
  37.             .word 0x0000,0x0000,0x03f0,0x03f0
  38.             .word 0x0000,0x0000,0x0ff0,0x0ff0
  39.             .word 0x0000,0x0030,0x0030,0x0030
  40.             .word 0x0000,0x00f0,0x00f0,0x00f0
  41.             .word 0x0000,0x03f0,0x03f0,0x03f0
  42.             .word 0x0000,0x0ff0,0x0ff0,0x0ff0
  43.             .word 0x0030,0x0030,0x0030,0x0030
  44.             .word 0x00f0,0x00f0,0x00f0,0x00f0
  45.             .word 0x03f0,0x03f0,0x03f0,0x03f0
  46.             .word 0x0ff0,0x0ff0,0x0ff0,0x0ff0
  47. ;---------------------------------------
  48. maszk:      .word 0xf00f,0xf00f,0xf00f,0xf00f
  49. ;---------------------------------------
A hozzászólás módosítva: Júl 13, 2016
(#) Hp41C válasza giskard hozzászólására (») Júl 13, 2016 /
 
Idézet:
„Egy nyelv alapvető tulajdonsága, hogy a szintaxisa kötött.”

Minden programnyelvre és beszélt nyelvre is igaz.
Idézet:
„Az assembly egy gyűjtő fogalom a gépi kódok helyett a mnemonikok használatára.”

A mnemonikok használata csak egy dolog abból amit az assembly nyelv tud:
Direktívák használata a kód és a változók elhelyezésére, helyfoglalásra. Szimbólumok definiálási lehetősége, a szimlólumokkal műveletet végezhetők fordítási időben. Makro -k használata.
Ha elkészítenél egy ilyen fordító programot, a mnemonik - kód átalakítás lecserélésével át tudnád alakítani más kontrollerre, mikroprocesszorra.

Elég a makrok kihasználása, hogy a MpLab Assembler -ével más kontrollerre fordíts.
A hozzászólás módosítva: Júl 13, 2016
(#) ktamas66 válasza Pali79 hozzászólására (») Júl 13, 2016 / 1
 
Kicsit talán látványosabb példa a klasszikus BCD -> 7 szegmens dekódolás:
  1. ; BCD 7 szegmens dekódolás
  2. LedTable
  3.         andlw   0x0f
  4.         addwf   PCL, F          ;add to PC low
  5. ;Szegmensek       kbafgedc
  6.         retlw   B'01110111'     ;led drive for 0
  7.         retlw   B'01000001'     ;led drive for 1
  8.         retlw   B'01101110'     ;led drive for 2
  9.         retlw   B'01101011'     ;led drive for 3
  10.         retlw   B'01011001'     ;led drive for 4
  11.         retlw   B'00111011'     ;led drive for 5
  12.         retlw   B'00111111'     ;led drive for 6
  13.         retlw   B'01100001'     ;led drive for 7
  14.         retlw   B'01111111'     ;led drive for 8
  15.         retlw   B'01111011'     ;led drive for 9
  16.         retlw   B'00000000'     ;led drive for space
  17.         retlw   B'00011111'     ;led drive for b
  18.         retlw   B'00110110'     ;led drive for c
  19.         retlw   B'01001111'     ;led drive for d
  20.         retlw   B'00111110'     ;led drive for E
  21.         retlw   B'00111100'     ;led drive for F

Esetleg:
  1. ; BCD 7 szegmens dekódolás
  2. ;
  3. LedTable
  4.                 BRW
  5.                 DT      0x11,0xB7,0xC1,0x83,0x27,0x0B,0x09,0x97,0x01,0x03,0x05,0x29,0x59,0xA1,0x49,0x4D
Következő: »»   823 / 1210
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