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   594 / 1210
(#) ktamas66 válasza sprofan hozzászólására (») Nov 21, 2014 /
 
Mindegyik csak annyira lesz pontos, mint a kvarcod. Ha tudod mennyivel jár arrébb, szoftverből korrigálhatod , vagy egy trimmerkondival.
(#) nedudgi válasza Pali79 hozzászólására (») Nov 21, 2014 /
 
Miért jó az, hogy egy digitális jelből (a jeladó impulzusai) analóg jelet állítasz elő? Mikrokontrollerhez méltó megoldás az lenne, ha az impulzusok közti időt mérnéd, és a késés/sietés módosítaná a kitöltési tényezőt.
A hozzászólás módosítva: Nov 21, 2014
(#) Pali79 válasza nedudgi hozzászólására (») Nov 21, 2014 /
 
Hmmm. Azon még nem gondolkodtam, hogy a jeladó impulzusokat ad. Ezt még szkóppal leellenőrzöm. Eddig csak feszültséget mértem a jeladón ami növekszik ahogy nő a fordulat. Viszont az időméréssel nem vagyunk jóban. Eddig nem nagyon tudtam tökéletesre megcsinálni sose, az AD-vel jobban boldogulok.
(#) Zsolt2 hozzászólása Nov 22, 2014 /
 
Sziasztok!
A napokban elkeztem egy projektet PIC18F242-re MPLAB 8.7 es XC8 forditoval. Mivel inkabb linuxot hasznalok, ezert gondoltam ott folytatom tovabb a programozast. Sikeresen fel is sikerult telepiteni a MPLABX-et es ugyanazt a forditot (XC8). Importaltam az elozoleg elkezdett projektet es sikeresen le is forditotta es be is egette (pickit2 programozoval), azonban semmi sem mukodik abbol ami elozoleg ment (eddigi program egy 7szegmenses kijelzos ora, 4 gombbal). Valakinek van valamilyen otlete, tapasztalata, hogy mit kene meg beallitani, modositan, hogy mukodjon MPLABX-es is ugyanaz a program?
(#) don_peter válasza Zsolt2 hozzászólására (») Nov 22, 2014 /
 
Én elsőnek rápillantanék, hogy fordításnál "Debug" vagy "Release" módban fordult a program.
Aztán a fájl elérések, könyvtárak...stb

Az én kérdésemre valaki? :Bővebben: Link
A hozzászólás módosítva: Nov 22, 2014
(#) cross51 válasza don_peter hozzászólására (») Nov 22, 2014 /
 
Szerintem a kiolvasásnál azt felejted el, hogy az IODIRA kimenetnek van állítva így azt fogod olvasni amit rá írtál az OLATA-val a kimenetre vagy amilyen kimeneti állapotban van a PORT, nem azt amit rá akartál küldeni(mondjuk azt, hogy nyomva van-e egy gomb vagy nem).
(#) don_peter válasza cross51 hozzászólására (») Nov 22, 2014 /
 
Idézet:
„Szerintem a kiolvasásnál azt felejted el, hogy az IODIRA kimenetnek van állítva így azt fogod olvasni amit rá írtál az OLATA-val a kimenetre vagy amilyen kimeneti állapotban van a PORT”

Igen, pontosan ezt akarom, de miden esetben 0x00-jön vissza.
Nem értem miért...
(#) cross51 válasza don_peter hozzászólására (») Nov 22, 2014 /
 
De az IODIRA bemenetnek van állítva mert az általad csatolt init részen kimenetnek állítod.
A hozzászólás módosítva: Nov 22, 2014
(#) ktamas66 válasza don_peter hozzászólására (») Nov 22, 2014 /
 
Én azt sem látom hol olvasna, sehol egy read vagy receive . Amikor a regiszter címét adod meg, az írás lenne. Az AN1043-at nézted már?
(#) don_peter válasza cross51 hozzászólására (») Nov 22, 2014 /
 
Nincs gomb...
Kimeneten van az A és a B prot is.. (IODIRA)
OLATA regiszterrel állítom a lábakat magas vagy alacsony szintre programból..
Írás működik gond nélkül, az olvasás csak annyival különbözik, hogy az OP nem 0x40 hanem 0x41.
(#) don_peter válasza ktamas66 hozzászólására (») Nov 22, 2014 /
 
Feljebb van az olvasás forráskódja..
0x41 a regiszter kód az olvasáshoz.
Ezt nem akartam linkelni mert az adatlapban benne van és jeleztem is:
  1. //MCP23S17 regiszterek
  2. #define IODIRA          0x00
  3. #define IODIRB          0x01
  4. #define IPOLA           0x02
  5. #define IPOLB           0x03
  6. #define GPINTENA        0x04
  7. #define GPINTENB        0x05
  8. #define DEFVALA         0x06
  9. #define DEFVALB         0x07
  10. #define INTCONA         0x08
  11. #define INTCONB         0x09
  12. #define IOCONA          0x0A
  13. #define IOCONB          0x0B
  14. #define GPPUA           0x0C
  15. #define GPPUB           0x0D
  16. #define INTFA           0x0E
  17. #define INTFB           0x0F
  18. #define INTCAPA         0x010
  19. #define INTCAPB         0x011
  20. #define GPIOA           0x012
  21. #define GPIOB           0x013
  22. #define OLATA           0x014
  23. #define OLATB           0x015
A hozzászólás módosítva: Nov 22, 2014
(#) ktamas66 válasza don_peter hozzászólására (») Nov 22, 2014 /
 
Ok, tehát a read fv. 6 sorában olvas?

"Gyári" javaslat:
  1. //*****************************************************************
  2. //     Function Name:    SPIReadByte                                
  3. //     Return Value:     Data at register                                        
  4. //     Parameters:       Register
  5. //     Description:      This routine performs a sequential write.        
  6. //*******************************************************************
  7. unsigned char SPIReadByte(unsigned char reg)
  8. {
  9.   unsigned char n;
  10.  
  11.   CSL;                        // Enable SPI Communication to MCP2515
  12.   while( WriteSPI(gControlByte | RdCmd | gAddrPins) );
  13.   while( WriteSPI(reg) );
  14.   n = ReadSPI();
  15.   CSH;                       // Disable SPI Communication to MCP2515
  16.  
  17.   return n;
  18. }
(#) foxi63 válasza Pali79 hozzászólására (») Nov 22, 2014 /
 
Szia!
Szerintem 1sec alatt 10szer elég ránézni, ha nem akkor lehet többször is. Tehát ciklusonként beolvasod az AD tartalmát, ha egyezik a referenciával (kívánt érték) akkor nem csinál semmit.
Ha kevesebb növeli a pwm-et 1- 2-3 stb. kisérleti úton meghatározott értékkel.
Ha több, akkor csökkenti.
De a túlzott beavatkozás oszcillációhoz vezet!
Egyéb opció lehet a felfutási és leállási rámpa beállítása start/stop nyomógombok stb.
Aztán figyelni kéne a motor felvett áramát is és egy max. limitet is be kéne állítani. (esetleges megszorulás)
Nem meghatározható a korrigálás mértéke, a tömeg és a motor tulajdonsága miatt.
Leírhatnád a motor adatait, a jeladó fajtáját.
Ha elakadnál a programozásban keress meg.
Üdv. Foxi
(#) Pali79 válasza foxi63 hozzászólására (») Nov 22, 2014 /
 
Szia!
A motor egy 600W-os felsőmaró motorja. A maximális fordulatszáma adattábla szerint 36000 f/min. A jeladóval kapcsolatban nedudgi hozzászólási szöget ütött a fejembe. Először arra gondoltam, hogy tacho generátorral oldanám meg a fordulatszám figyelést, de ekkora fordulatnál már 39V körüli feszültséget ad le. Nem tudom mi volna a célravezetőbb, ezt a feszültséget leosztani vagy inkább nedudgi gondolatmenetét folytatva mondjuk egy hall szenzorral figyelni az időt?
(#) foxi63 válasza Pali79 hozzászólására (») Nov 22, 2014 /
 
Ekkora fordulaton jobb a mágneses érzékelő, vagy optokapu.
36000 forulatnál felesleges kikoptatni egy másik motor csapágyát.
(#) Zsolt2 válasza don_peter hozzászólására (») Nov 22, 2014 /
 
Mplab-ban debug modban fordit, linux alatt midkettot probaltam, de semmi valtozas. Eleresek jok, semmifele hibat nem ad forditaskor, azonban egetes utan semmit sem csinal a hardwer.
(#) lastewer hozzászólása Nov 22, 2014 /
 
Üdv !

Van egy Pic16f877a és egy enc28j60 -am és szereték összehozni egy kis webszervert erre a picre.

Neten találtam példa programot , bele is töltöttem a hex fájlt a pic-be , de pingeléskor a megadott ip címre azt írja , hogy a célállomás nem elérhető. (192.168.0.170 Ip-n , és beállítottam egy 0.100 as ip címet a hálókártyára ugye.)

Mellékeltem egy képet amin látszik hogy kötöttem össze a 2 modult valamint a hex fájlom forrását.

Csak azok a lábak vannak bekötve amik jelölve vannak , a többi üresen "lóg".
Valakinek lenne ötlete mit rontottam el?
A hozzászólás módosítva: Nov 22, 2014
(#) don_peter válasza ktamas66 hozzászólására (») Nov 22, 2014 /
 
Nos, bocs csak közben el kellett mennem.
Szóval: pont ahogyan te is írtad a 6. sorban van a kiolvasás.
Részleteiben:
  1. buff = byte_send(adat); // Itt olvassuk az adatot ami az SSPBUF regiszterbe kerül
  2. // olvasunk, de akkor is kell adatot kiküldeni ez esetben a 0x00-t küldjük adatnak

A gyári ajánlás szerint írtam meg a programot..
(#) don_peter válasza Zsolt2 hozzászólására (») Nov 22, 2014 /
 
MPLAB-ban is, ha nem akarsz mindenképp Debugolni akkor Release-ra állítsd át és az menni fog.
Linux alatt nem tudom, de ott is érdemes megnézni, hogy nem e Debug módban van a program.
Nincs hirtelen más ötletem..
Mennie kéne, ha csak nem a fordító nem ugyan az és abban van valami hiba.
Esetleg még include-olnám a PIC linker állományát.. Persze ez utóbbi csak tipp..


ktamas66: ez még neked, csak már nem tudtam szerkeszteni az előzőt..
A gyári ajánlás szerint írtam meg a programot..
Már mindent kipróbáltam amire gondoltam, de sehogy nem jön vissza a már beállított érték.
Azért kellene mert mint feljebb is írtam maszkolnom kellene.
Kijelzőt szeretnék meghajtani és így egy porton belül úgy kellene kapcsolgatnom a lábakat, hogy a már előzőleg beállított lábak ne változzanak meg, kivéve, ha azt szeretném.

Vezetékek jók, jó helyre is vannak kötve (írás működik), MCP23S17 chip jó, 3db-ot kipróbáltam mindnél ugyan azt produkálja, beállítások elvileg jók (gyári ajánlás szerint)... furcsállom, hogy nem lehet kiolvasni a port állapotát.
A hozzászólás módosítva: Nov 22, 2014
(#) don_peter válasza cross51 hozzászólására (») Nov 22, 2014 /
 
Ezt a bejegyzésed nem értem:
Idézet:
„De az IODIRA bemenetnek van állítva mert az általad csatolt init részen kimenetnek állítod.”

Kifejtenéd?
IODIRA bemenetnek van állítva?
Gyárilag igen!
Általam csatolt init részben kimenetnek.
És ez miért baj?
Nem bemenetnek akarom használni a protokat, hanem kimenetnek és OLAT regiszter segítségével állítom a bitek szintjét...
Vagy mire gondolsz?

ktamas66: Mire gondolsz mikor ezt írod? :"AN1043"
A hozzászólás módosítva: Nov 22, 2014
(#) ktamas66 válasza don_peter hozzászólására (») Nov 22, 2014 /
 
Én még nem használtam ilyet (csak I2C-t), de az ajánlásban nem küld semmit, csak control byte (read-del), cím és utána 1 byte olvasás. Próbáld ki, ha a függvényt nem adat=0-val hívod, hanem mással, mit kapsz vissza, mert az a sanda gyanúm, hogy adatot (nem is tudom az pontosan milyen paraméter lenne az olvasáskor).

Microchip AN1043
A hozzászólás módosítva: Nov 22, 2014
(#) don_peter válasza ktamas66 hozzászólására (») Nov 22, 2014 /
 
Hát már, hogy a viharba ne küldene:
  1. unsigned char ReadSPI( void )
  2. {
  3.   SSPBUF = 0x00;          // initiate bus cycle
  4.   while ( !BF );          // wait until cycle complete
  5.   return ( SSPBUF );      // return with byte read
  6. }

Ez a gyári olvasó függvénye MCP23S17-hez.
Ettől független kipróbálom..

Ha nem küldök adatot akkor kiakad.
Ha a regiszter kóddal egyből olvasok akkor szintén 0x00-val tér vissza.
  1. temp = byte_send(reg);          // Adat
A hozzászólás módosítva: Nov 22, 2014
(#) ktamas66 válasza don_peter hozzászólására (») Nov 22, 2014 /
 
(#) don_peter válasza ktamas66 hozzászólására (») Nov 22, 2014 /
 
Igen, ezt linkeltem én is..
Ebből indultam ki, persze nem pont úgy ahogyan ő használja, de az alapján írtam a sajátomat.
De indulhatsz ki a teljes gyári felépítéssel is, de akkor sem olvas nekem és nagyon nem értem miért..

Minden tudok csinálni vele, de olvasni a biteket nem tudom..
GPIOx (PORT) regiszter nem akarja az igazságot..
Semmi más ötlet? Valaki?
A hozzászólás módosítva: Nov 22, 2014
(#) ktamas66 válasza don_peter hozzászólására (») Nov 22, 2014 /
 
Ez a byte_send függvényt kellene szerintem látni, mert a küldés és fogadás nem ugyanaz:
  1. /********************************************************************
  2. *     Function Name:    WriteSPI                                    *
  3. *     Return Value:     Status byte for WCOL detection.             *
  4. *     Parameters:       Single data byte for SPI bus.               *
  5. *     Description:      This routine writes a single byte to the    *
  6. *                       SPI bus.                                    *
  7. ********************************************************************/
  8. unsigned char WriteSPI( unsigned char data_out )
  9. {
  10.   SSPBUF = data_out;      // write byte to SSPBUF register
  11.   if ( SSPCON & 0x80 )    // test if write collision occurred
  12.    return ( -1 );         // if WCOL bit is set return negative #
  13.   else
  14.   {
  15.     while( !BF );         // wait until bus cycle complete
  16.   }
  17.   SSPIF = 0;
  18.   return ( 0 );           // if WCOL bit is not set return non-negative#
  19. }
  20.  
  21. /********************************************************************
  22. *     Function Name:    ReadSPI                                     *
  23. *     Return Value:     contents of SSPBUF register                 *
  24. *     Parameters:       void                                        *
  25. *     Description:      Read single byte from SPI bus.              *
  26. ********************************************************************/
  27. unsigned char ReadSPI( void )
  28. {
  29.   SSPBUF = 0x00;          // initiate bus cycle
  30.   while ( !BF );          // wait until cycle complete
  31.   return ( SSPBUF );      // return with byte read
  32. }


Az olvasó rész csak azért tol ki 0-át, hogy az órajel beléptesse a fogadott adatot, és avval tér vissza ( az író hibakóddal).
(#) don_peter válasza ktamas66 hozzászólására (») Nov 22, 2014 /
 
Itt a teljes kódom amit használok..:
  1. void mcp23s17_init(void){
  2.         //mcp23s17_write(IOCONA, 0); // BANK:0
  3.         //mcp23s17_write(IOCONB, 0);
  4.         TRIS_GPA(0);            // MCP23S17 A prot kimenet
  5.         TRIS_GPB(0);            // MCP23S17 B prot kimenet
  6. }
  7.  
  8. unsigned char mcp23s17_read(unsigned char reg, unsigned char adat){
  9.         unsigned char temp;
  10.         SPI2_CS = 0;                    // Chip engedélyezése
  11.         byte_send(0x41);                // Olvasás engedélyezése
  12.         byte_send(reg);                 // Regiszter cím
  13.         temp = byte_send(adat);         // Adatot küldünk, de csak olvasunk
  14.         SPI2_CS = 1;                    // Chip tiltása
  15.         return(temp);                   // Visszatérünk az vett adattal
  16. }
  17.  
  18. void mcp23s17_write(unsigned char reg, unsigned char adat){
  19.         SPI2_CS = 0;            // Chip engedélyezése
  20.         byte_send(0x40);        // írás engedélyezése
  21.         byte_send(reg);         // Regiszter cím
  22.         byte_send(adat);        // Adat
  23.         SPI2_CS = 1;            // Chip tiltása
  24. }
  25.  
  26. unsigned char byte_send(unsigned char adat){
  27.         unsigned char tmp;  
  28.         SSP2STATbits.BF = 0;            // törli foglaltság jelző állapotát a státusz regiszterben
  29.         SSP2CON1bits.WCOL = 0;          // törli az esetleges írás ütközés hibajelzőt
  30.         tmp = SSP2BUF;                          // törli a BF jelzőbitet
  31.         SSP2BUF = adat;                         // kirakja a kimenő adatot az SSPBUF regiszterbe
  32.         while(!SSP2STATbits.BF);        // megvárjuk a busz ciklus végét
  33.         return (SSP2BUF);                       // a vett byte-tal térünk vissza
  34. }

Teljesen a gyári alapjain kicsit kiegészítve..
Mint mondottam tökéletesen működik élesben írásra, de olvasásra nem.
Szimulátorban tökéletes..
A hozzászólás módosítva: Nov 22, 2014
(#) ktamas66 válasza don_peter hozzászólására (») Nov 22, 2014 /
 
Esetleg próbáld ki, hogy a

temp = byte_send(adat);

helyett berakod a gyárit:

SSP2BUF = 0x00; // initiate bus cycle
while(!SSP2STATbits.BF); // wait until cycle complete
temp = SSP2BUF;

És nézd meg az SO láb jól van-e bekötve .
(#) don_peter válasza ktamas66 hozzászólására (») Nov 22, 2014 /
 
Megnéztem
Éppen most..
Semmi változás.
Töltöm fel a videót, hogy szemléltessem mi a probléma..
Bekötés tuti jó...
Videó
Az elején mutatom, hogy szimulátorban jól működik, utána mutatom élesben ledekkel szemléltetve a bitek állapotát.
Mindnek ami egyszer felvillan annak világítania kellene folyamatosan..
A hozzászólás módosítva: Nov 22, 2014
(#) ktamas66 válasza don_peter hozzászólására (») Nov 22, 2014 /
 
Semmi jó ötletem sincs, csak az, hogy a gyáriból kellene kiindulni. (Én rátenném a Serial Analyzer-t , ha Pickit2-d van megnézheted a jelalakokat.)
(#) don_peter válasza ktamas66 hozzászólására (») Nov 22, 2014 /
 
LED-eket tettem az SPI IN és OUT lábakra az MCP23S17-nél.
Látszatra küld adatot, de a PIC-be már csak nulla érkezik.
Ami azért érdekes.
Sajnos Debug-olni nem tudom a 18F46K22-őt..
Kicsit érdekes ez a jelenség.
Most mivel nem tudok mást csinálni elölről elkezdem megnézni a PIC majd az MCP beállításokat.
MCP-nél a gyári ajánlásnál nincs reset, de sok helyen láttam, hogy tesznek bele.
Gondolom ez nem befolyásolja az olvasást, ha írni simán tudom, nem?
A bosszantó, hogy tudom tökéletesen írni, de amikor ki akarom olvasni ..., az is érdekes még, hogy ha lehúzom a PIC lábáról az MCP OUT vezetéket akkor is ugyan az van.
Tehát olyan mint ha nem kapna adatot.
A hozzászólás módosítva: Nov 22, 2014
Következő: »»   594 / 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