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   633 / 1210
(#) Zsora válasza Balagemann2031 hozzászólására (») Feb 12, 2015 /
 
Gondolom hogy mi lehet:
A SPIxBUF tulajdonképpen 2 regisztert takar (TX és RX buffer). Írni csak a TX buffert lehet, olvasni pedig csak az RX buffert. Tehát a beírt adatot nem lehet visszaolvasni mert az a TX bufferbe (onnan pedig a Shift regiszterbe) kerül, olvasáskor pedig te az RX buffert látod. Az RX bufferben pedig akkor lesz valós adat ha a tranzakció már befejeződött.

Példa:
  1. 1:      bclr    SPI1STAT,#SPIEN
  2.         mov     #0x0423,w0              ;master mód, 16 bit, 5MHz
  3.         mov     w0,SPI1CON1
  4.         mov     #0x0000,w0              ;standard mód
  5.         mov     w0,SPI1CON2
  6.         mov     #0x8000,w0              ;SPI1 eng.
  7.         mov     w0,SPI1STAT
  8. ;-------
  9.         mov.b   #0x66,w0
  10.         mov.b   wreg,SPI1BUF            ;SPI küldés
  11. 2:      btst    SPI1STAT,#SPIRBF        ;RX buffer tele van?
  12.         bra     z,2b
  13.         mov.b   SPI1BUF,wreg            ;SPI olvasás
(#) Balagemann2031 hozzászólása Feb 12, 2015 /
 
Bemásoltam a bufferbe írós sort, szimulátorban szépen bekerül az adat a bufferbe, betöltöm picbe, nyomkövetéskor léptetem a zöld nyilacskát, és mikor nop-ra ér, még adat nincs benne a bufferben...

dfhgf.jpg
    
(#) Zsora válasza Balagemann2031 hozzászólására (») Feb 12, 2015 / 1
 
Mégegyszer:
A SPI1BUF regiszter fizikailag 2 külön regisztert takar; a SPI1TXBUF és SPI1RXBUF regisztereket. Amikor a SPI1BUF regiszterbe írsz, akkor tulajdonképpen a SPI1TXBUF regiszterbe írsz, amikor pedig olvasod, akkor a SPI1RXBUF regisztert olvasod. Tehát a beírt adatot nem tudod visszaolvasni. (A szimulátor sem.)
(#) Balagemann2031 válasza Zsora hozzászólására (») Feb 12, 2015 /
 
Ja értem, akkor gyakorlatilag, mikor élesben nyomkövetem, azért ír nullákat, mert a rx ből olvas, ahol viszont nincs semmi eddig. Oké, köszönöm!
(#) Zsora válasza Balagemann2031 hozzászólására (») Feb 12, 2015 /
 
Igen. Csak akkor lesz ott valós adat ha a 8 (vagy 16) ciklus után a Shift regiszterből áttöltődik a vett adat a SPI1BUF (SPI1RXBUF) regiszterbe.
(#) Balagemann2031 hozzászólása Feb 14, 2015 /
 
Sziasztok! Egy ideje szenvedek már a SPI-vel 24H-s picen. Logikai analizátorral nézném a kommunikációt, ha lenne, de nincs. Esetleg a periféria elhelyezésen, konfigurálásán, kívül kell még valamit csinálni? Config bitekkel esetleg, vagy valami?
(#) Zsora válasza Balagemann2031 hozzászólására (») Feb 14, 2015 /
 
Üdv!
Fel tudnád vázolni konkrétan a problémát?
Mivel szeretnél kommunikálni SPI-n keresztül? Milyen hardveres elrendezéssel? Milyen beállításokkal? Mi nem működik?
(#) Balagemann2031 válasza Zsora hozzászólására (») Feb 14, 2015 /
 
Szia! Majd egy nokia 3310-es kijelzőre küldenék adatokat, de egyenlőre szeretném látni, hogy megy ki adat, elvileg analizátoron kellene látnom a SPI master órajelét, meg a kimenő adatot. Microstick 2 a környezet. 26,25,24,23-mas lábakra van beállítva a SPI modul.
  1. STACK_INIT:
  2.         MOV             #0x900,w15  
  3.         MOV             #0x1000,w0
  4.         MOV             w0,SPLIM  
  5.  
  6. START:
  7.         CLR             LATA
  8.     CLR         TRISA
  9.         NOP    
  10.         CLR             LATB                     
  11.         MOV             #0B0100000000000000,W0
  12.         MOV             W0,TRISB
  13.         NOP
  14.         BSET    AD1PCFGL,#12
  15.  
  16.  
  17. SPI1_PERIPHERIA_SELECT:
  18.         MOV             #0B0000100100001000,W0          ;SS PIN24, SCK PIN23
  19.         MOV             W0,RPOR6               
  20.         MOV             #0B0000000000000111,W0          ;SDO PIN25
  21.         MOV             W0,RPOR7
  22.         MOV.B   #0B00001111,W0                          ;SDI PIN26
  23.         MOV.B   WREG,RPINR20                                           
  24.  
  25.  
  26. SPI_INIT:
  27.         BCLR    SPI1STAT,#SPIEN
  28.         MOV             #0B0000000000111111,W0
  29.         MOV             W0,SPI1CON1
  30.         CLR             SPI1CON2
  31.        
  32. UJRA:
  33.         MOV.B   #0x55,W0
  34.         MOV.B   WREG,SPI1BUF            
  35. O_1:    
  36.         BTST    SPI1STAT,#SPIRBF        
  37.         BRA             Z,O_1
  38.         NOP
  39.         GOTO    UJRA


Ez csak egy teszt akar lenni, hogy lássam a működését. Egyébként 16 és 18F en már sokmindennel kommunikáltam, SPI-n is. De ott nem volt túlbonyolítva a modul.
(#) Balagemann2031 válasza Balagemann2031 hozzászólására (») Feb 14, 2015 /
 
Közben látom hogy a csatolt kódban pont ki van kapcsolva a modul, de ha bekapcsolom, akkor is fura az órajel jelalakja, és nincs adat. Kérdés hogy holvan az adat?
A hozzászólás módosítva: Feb 14, 2015
(#) Zsora válasza Balagemann2031 hozzászólására (») Feb 14, 2015 /
 
Milyen mikrovezérlőt nyúzol? PIC24HJ128GP502-t?
Az ilyen kis lábszámú mikrovezérlők perifériakiosztása elég furfangos a tetszőleges lábhozzárendelés miatt (RPx lábak). A programrészletedben nem látom a Control Register Unlock folyamatot, ami a lábhozzárendelések engedélyezéséhez kell. Anélkül nem módosíthatod a beállításokat. Doksi 138. oldal (11.6.3.1).
(#) Balagemann2031 válasza Zsora hozzászólására (») Feb 14, 2015 /
 
Igen, ezt a vezérlőt kínzom. Control regiszterrel valóban nem találkoztam. Utánanézek és jelentkezem! Azért az órajel jelalak akkor is ilyesztő általában 50%-os a a normál jelalak kitöltése, ennek meg vagy 90... (Basszus, hogy átsiklottam a control reges rész felett, pedig erre járkáltam, mikor a lábakhoz rendeltem a ki-be meneteket)
A hozzászólás módosítva: Feb 14, 2015
(#) Zsora válasza Balagemann2031 hozzászólására (») Feb 14, 2015 / 1
 
Egy példa (PIC24FJ64GB002-re):
  1. ;-----------
  2.         setm    AD1PCFG                 ;AN lábak digitálisak
  3. ;-----------
  4.         mov     #OSCCON,w1
  5.         mov     #0x46,w2
  6.         mov     #0x57,w3
  7.         mov.b   w2,[w1]
  8.         mov.b   w3,[w1]
  9.         bclr    OSCCON,#IOLOCK
  10.         mov     #0x0700,w0              ;SDO1->RP1
  11.         mov     w0,RPOR0
  12.         mov     #0x0200,w0              ;SCK1->RP2, SDI1->RP0
  13.         mov     w0,RPINR20
  14.         mov     #0x0003,w0              ;SS1->RP3
  15.         mov     w0,RPINR21
  16.         mov     #OSCCON,w1
  17.         mov     #0x46,w2
  18.         mov     #0x57,w3
  19.         mov.b   w2,[w1]
  20.         mov.b   w3,[w1]
  21.         bset    OSCCON,#IOLOCK
  22. ;-----------
  23.         bclr    SPI1STAT,#SPIEN
  24.         mov     #0x0480,w0              ;16 bit, SSEN=1, slave mód
  25.         mov     w0,SPI1CON1
  26.         mov     #0x4001,w0              ;enhanced buffer mód
  27.         mov     w0,SPI1CON2
  28.         mov     #0x8000,w0              ;SPI1 eng.
  29.         mov     w0,SPI1STAT
  30. ;-----------
A hozzászólás módosítva: Feb 14, 2015
(#) Zsora válasza Balagemann2031 hozzászólására (») Feb 14, 2015 /
 
Még valami:
Az SS vezeték nem kimenet, hanem bemenet, és csak szolga módban van jelentősége. Amikor a mikrovezérlő mester módban működik, akkor a szolga egység kiválasztásához bármelyik nekünk tetsző kimenetet használhatjuk, nincs erre semmi megkötés. A lényeg hogy nekünk kell a kommunikáció megkezdése előtt a megfelelő Chip Select (Slave Select) vezetéket aktiválni, majd a kommunikáció végeztével inaktiválni (ha szükséges). Ha a szolga egység nem igényel /CS jelet, akkor ez elhagyható. (Ilyenkor a szolga folyamatosan aktív állapotban van.)
(#) Balagemann2031 válasza Zsora hozzászólására (») Feb 15, 2015 /
 
Szia! Köszönöm a segítséget! Ez a periféria felóldó és lezáró szekvencia dolog meglepett. 16 és 18F nél én is tetszőleges lábat használtam SS nek. Lesznek még meglepetések a 16bitesekkel úgylátom sokkal nagyobb a különbség, mint 16F és 18F között...
(#) kissi válasza Balagemann2031 hozzászólására (») Feb 15, 2015 /
 
Az benne a jó, hogy mikor én majd foglalkozom vele, akkor addig Ti már kitárgyaljátok az "alap" buktatókat !
További jó munkát !
(#) Zsora válasza Balagemann2031 hozzászólására (») Feb 15, 2015 /
 
Ez a feloldó szekvencia nem csak a lábkiosztások módosításánál van, hanem a futásidőben történő órajel/PLL módosításoknál is. (Ott viszont csak feloldás van, lezárás nincs, mert az automatikusan megtörténik. Ez a művelet ezért időkritikus.)

  1. ;-----------------------------------
  2. PLL_80: mov     #6,w0
  3.         mov     w0,CLKDIV               ;N1=8, N2=2 (def: 2, 4)
  4.         mov     #30,w0
  5.         mov     w0,PLLFBD               ;M=32 (def: 50)
  6.         mov     #0x78,w0
  7.         mov     #0x9a,w1
  8.         mov     #0x03,w2                ;új oszcillátor
  9.         mov     #OSCCONH,w3             ;OSCCON felső byte címe
  10.         mov.b   w0,[w3]
  11.         mov.b   w1,[w3]
  12.         mov.b   w2,[w3]
  13.         mov     #0x46,w0
  14.         mov     #0x57,w1
  15.         mov     #0x01,w2                ;órajelváltás
  16.         mov     #OSCCONL,w3             ;OSCCON alsó byte címe
  17.         mov.b   w0,[w3]
  18.         mov.b   w1,[w3]
  19.         mov.b   w2,[w3]                 ;órajelváltás kérelem
  20. 1:      btst    OSCCON,#OSWEN
  21.         bra     nz,1b
  22.         return
  23. ;-----------------------------------
A hozzászólás módosítva: Feb 15, 2015
(#) cmdnetwizard hozzászólása Feb 15, 2015 /
 
Sziasztok!

Egy érdekes problémával találtam szembe magamat, mégpedig adott egy MCP2200-ás USB-UART átalakító, meg egy PIC32MX440-es proci.
A problémám meg az volna, hogy a PC-ről küldök egy bájtot a procinak, amit az mindenféle módosítás nélkül visszaad a PC-nek. Azonban ha a bájt értéke nagyobb, mint 127, a proci minden esetben 63-at dob vissza. Melyet nem értek, hogy miért, és hogy hogyan lehetne kiküszöbölni.

PC-n ez a program fut:
  1. class Program
  2.     {
  3.         private static SerialPort serialPort;
  4.         private static Thread t;
  5.         static void Main(string[] args)
  6.         {
  7.             serialPort = new SerialPort();
  8.             serialPort.BaudRate = 9600;
  9.             serialPort.DataBits = 8;
  10.             serialPort.Parity = Parity.None;
  11.             serialPort.PortName = "COM3";
  12.             serialPort.StopBits = StopBits.One;
  13.             if (serialPort.IsOpen)
  14.                 return;
  15.             else
  16.                 serialPort.Open();
  17.             int i = 0;
  18.             t = new Thread(new ThreadStart(run));
  19.             t.Start();
  20.             while (true)
  21.             {
  22.                 Console.Write(i + " ");
  23.                 //serialPort.Write(new byte[] { i }, 0, 1);
  24.                 serialPort.Write(new char[] { (char)i }, 0, 1);
  25.                 Thread.Sleep(100);
  26.                 //Console.ReadLine();
  27.                 i++;
  28.             }
  29.         }
  30.         static void run()
  31.         {
  32.             while (true)
  33.                 Console.Write(serialPort.ReadChar() + "\n");
  34.         }
  35.     }


A procin meg egy ilyen:
  1. void main()
  2. {
  3.     [...]
  4.     UARTConfigure(UART1, UART_ENABLE_PINS_TX_RX_ONLY);
  5.     UARTSetFifoMode(UART1, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);
  6.     UARTSetLineControl(UART1, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
  7.     UARTSetDataRate(UART1, 80000000L, 9600);
  8.     UARTEnable(UART1, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));
  9.     INTEnable(INT_SOURCE_UART_RX(UART1), INT_ENABLED);
  10.     INTSetVectorPriority(INT_VECTOR_UART(UART1), INT_PRIORITY_LEVEL_3);
  11.     INTSetVectorSubPriority(INT_VECTOR_UART(UART1), INT_SUB_PRIORITY_LEVEL_0);
  12.     [...]
  13. }
  14.  
  15. void __ISR(_UART1_VECTOR, ipl3) UART1Handler(void)
  16. {
  17.     if(INTGetFlag(INT_SOURCE_UART_RX(UART1)))
  18.     {
  19.         // Clear the RX interrupt Flag
  20.         INTClearFlag(INT_SOURCE_UART_RX(UART1));
  21.         unsigned int c = UARTGetDataByte(UART1);
  22.         putcUART1(c);
  23.         return;
  24.         [...]
  25.     }
  26. }


Előre is köszönök mindenféle segítséget!
A hozzászólás módosítva: Feb 15, 2015
(#) don_peter válasza cmdnetwizard hozzászólására (») Feb 15, 2015 /
 
Idézet:
„Azonban ha a bájt értéke nagyobb, mint 127, a proci minden esetben 63-at dob vissza.”

Lehet, hogy a típusokkal lesz a gond.
Ha előjelesen küldesz 1bájtot, akkor az -128 és +127 lesz a maximális érték.
Ha előjel nélkül küldöd akkor mehet a 255 érték a nullával együtt 1 byte-ban.
Bővebben: Link
Bár elvileg, ha jól látom akkor az "unsigned int c" változód lesz amit kiküldesz ez esetben egy 32bites változód lesz.
Azt hiszem neked egy "unsigned char v" változó kellene..
A hozzászólás módosítva: Feb 15, 2015
(#) Balagemann2031 válasza Zsora hozzászólására (») Feb 15, 2015 /
 
Egyébként a kapcsos zárójel mit jelent, mit módosít, mikor kell használni? Kissi! Végülis ez a fórum lényege, többek közt
(#) Zsora válasza Balagemann2031 hozzászólására (») Feb 15, 2015 /
 
A szögletes zárójelre gondolsz? Az az indirekt címzésre utal.
Ajánlom elolvasásra a 16-bit MCU and DSC Programmer's Reference Manualt.
mov w0,w1 - w0 tartalmának betöltése w1-be.
mov w0,[w1] - w0 tartalmának betöltése a w1 által mutatot memóriacímre.
(Nem tudom hogy a kerek zárójel miért nem volt jó a Microchipnek.)
A hozzászólás módosítva: Feb 15, 2015
(#) Balagemann2031 válasza Zsora hozzászólására (») Feb 15, 2015 /
 
Igen, a szögletesre voltam kiváncsi, köszönöm! Le is töltöttem a reference manualt, tanulmányozom!
(#) icserny válasza cmdnetwizard hozzászólására (») Feb 16, 2015 /
 
A PC oldali programozásnál volt olyan tapasztalatom, hogy a (virtuális) soros portról érkező karaktereket az alkalmazás (vagy a rendszer?) alapértelmezetten átkódolta ASCII-ra. Külön be kellett állítani a soros port tulajdonságai között, hogy ne ASCII legyen, hanem hagyja meg az ANSI kódolást (nekem az ékezetes betűk átviteléhez kellett).
(#) hatcsupasz válasza Hp41C hozzászólására (») Feb 17, 2015 /
 
A mai hírük szerint pedig 50 %-os kedvezménnyel lehet Pickit 3 vagy ICD 3-at venni, ha beviszed a régi Pickit 2 vagy ICD 2 programozódat. Bővebben: Link
(#) Hp41C válasza hatcsupasz hozzászólására (») Feb 17, 2015 / 2
 
A világért sem adnám ki a kezemből a PICkit2 -t...
(#) eSDi válasza hatcsupasz hozzászólására (») Feb 17, 2015 /
 
Nemrég én is írtam, montjuk nem ide, hanem a közérdekűbe. Szépen törölve is lett. Csak óvatosan a reklámokkal!
(#) don_peter válasza Hp41C hozzászólására (») Feb 17, 2015 /
 
Ejj de egyet értek , ez hirdetés sem más csak vakítás és a jobb hardverek beszedése...
(#) csiberaptor hozzászólása Feb 17, 2015 /
 
Sziasztok!
Pic18f97j60-at forrasztok be épp, és folyamatosan ellenőrizgetek menet közben multiméterrel, nehogy összeérjenek a lábak. Két lábsort forrasztottam be eddig. Elértem az AVSS lábig, ahol a multiméter majdnem minden lábnál kontaktot jelez. Ezen kívül az összes többi láb rendben van.
Valaki tudja, hogy ez mi?
(#) nedudgi válasza csiberaptor hozzászólására (») Feb 18, 2015 /
 
A multiméter vezetékeit felcserélve megmarad a kontakt jelzése?
(#) csiberaptor válasza nedudgi hozzászólására (») Feb 18, 2015 /
 
Megfordítottam, és így csak a többi VSS-sel jelez. Akkor gondolom ez nem baj.
(#) hapci hozzászólása Feb 19, 2015 /
 
Kezdő amatőr PIC-kelőként 16F628-al komparátor hiszterézist szeretnék állítani (az adatlapon nem találtam rá utalást...). Kettős komparátor megoldással próbálkozom, de gyanítom, hogy nem így a legelegánsabb. Tudna valaki segíteni?
Következő: »»   633 / 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