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   718 / 1210
(#) edison14 válasza SKY hozzászólására (») Nov 1, 2015 /
 
Szia!

Az első kérdésedre a válasz nem. Egyszerre csak egy PGD és PGC lábat használhatsz amit a konfigurációs bitekben be kell állítani.

Programozásban nagyon sok különbség van a PIC18-as szériájához képest. Tölts le egy adatlapot és nézzed meg az utasításkészletet. Nem bonyolult az egész csak meg kell szokni. Én most már a PIC24-eseket tanulom assemblyben és azt kell hogy mondjam nem bonyolultabb mint a PIC18 vagy PIC16 sőt szerintem sokkal jobb. Igaz hogy nagy szívás volt vele az elején mire rájöttem mit hogyan kell csinálni, de utánaolvastam kérdeztem és elindult az első program. Ha át akarsz állni mindenképp elölről kell kezdeni, tehát programokban is a LED villogtatástól nem pedig egyből egy atomreaktor irányítóközponntal. Ha pedig kérdéseid lesznek nyugodtan felteheted ide mert már többen foglalkoznak a PIC24-es szériájával és tudnak segíteni.
(#) icserny válasza SKY hozzászólására (») Nov 1, 2015 /
 
"egy 24-es sorozatú PIC bármelyik PGED és PGEC lábain programozható, ha három is van ezekből?"
Igen, bármelyikről (természetesen mindig az egymással párban levő lábakon) programozható. Debug-olni viszont csak a konfigurációs biteknél előzetesen kiválasztott bemeneten lehet.

PIC24 vs. PIC18: Más a felépítése, más a programozói modellje, de nem egetverően bonyolult.
Assemblyben kell szokni hogy több regiszter van, több megszakítási szint, inicializálni kell a veremtárat és bizonyos perifériák használatba vétele előtt előbb kivezetés(eke)t kell rendelni hozzá (nincs eleve megszabva, hogy hol van kivezetve).

Tananyag a honlapomon: PIC-kwik projekt
(#) SKY válasza icserny hozzászólására (») Nov 1, 2015 /
 
Köszönöm a válaszaitokat!
Még annyi kérdésem lenne, hogy a bootloader a PIC18F4550-nél milyen hardveres kiépítést igényel?
Vagyis az USB csatlakozó "self power only" szerinti bekötésével használható úgy a bootloader, hogy közben állandó tápfeszültséget kap a PIC egy stabilizátorról, vagy ez a bekötés csakis a kommunikációhoz elegendő, a bootloaderes programozáshoz az USB-től igényli a tápfeszültséget, illetve azt meg kell tudnia szakítani?
(#) Hp41C válasza SKY hozzászólására (») Nov 1, 2015 /
 
Nem kell megszakítani a tápfeszültséget. Egy lehetőséget kell biztosítani a bootloader -be való visszatérésre a program frissítésének elvégzésére.
(#) icserny válasza SKY hozzászólására (») Nov 1, 2015 /
 
A bootloaderes programozáshoz csak USB kommunikáció kell, a tápfeszültséget onnan adod, ahonnan tetszik. Külső táplálás esetén annyival bonyolódik a helyzet, hogy az USB kapcsolódást figyelni kell (USB-only táplálás esetén erre nekem nem volt szükségem, hiszen ha nincs USB kapcsolódás, akkor a mikrovezérlő sem kap tápot). A gyári FSUSB demókártya dokumentációjából ki lehet nézni, hogy mi kell ehhez.
(#) don_peter hozzászólása Nov 1, 2015 /
 
icserny: A következő oldalon található leírásod alapján összeállítottam egy kapcsolást: Bővebben: Link
A 24LC515 helyett egy 24LC512-est használok, ez gondolom nem okozhatna problémát.
Mindent a leírás szerint van, a linkelt rutinokat kigyűjtöttem és azokkal próbálkozom, de sajnos annak ellenére, hogy hibát nem hoz fel a fordító nem működik az i2c kommunikáció.
C18 és PIC18F4550-es chipet használok, pont mint a leírásban.
Debugból kiderül, hogy MCP24LC515_write() rutinba ragad a program.
Csatoltam egy proteust, amiben lehet tesztelni, rápillantanál, hogy mi lehet a gond?
Illetve aki vágja az i2c-t és tudna segíteni az is nézze meg.
Eddig sajnos nem volt dolgom az i2c-vel, és ez csak egy tanuló program.
Osztom külön a fájlokat is, hogy könnyebb legyen.

Előre is köszönöm.
(#) SKY hozzászólása Nov 1, 2015 /
 
Nagy kérés lenne, de valaki rá tudna erre a kapcsolásra nézni, hogy a digitális részét tekintve működőképes, vagyis az SPI bekötés így megfelelő (késleltetések és SDI közösítés?, használható lassabb galvanikus izolátor?) és a PIC bekötött lábai is alkalmasok erre, azaz esetleg nem használható bizonyos láb, ha megy pl az SPI?
Ezer köszönet!

v3.jpg
    
(#) icserny válasza don_peter hozzászólására (») Nov 1, 2015 / 1
 
A két IC (515 vs. 512) címzésmódja különbözik, ezért pl. az alábbi függvényben a feltételes rész neked nem kell!
  1. void MCP24LC515_write(uint8 addr,  union16 memaddr, uint8* pbuf) {
  2.   pbuf[1] = memaddr.lo_byte;                            //a lapcímet is a bufferbe tesszük
  3.   pbuf[0] = memaddr.hi_byte;
  4. //--  if (memaddr.hi_byte & 0x80) {                             // ha MSB='1', beállítjuk a blokkválasztó bitet
  5. //--    addr = addr | 0x08;
  6. //--  }
  7.   MCP24LC515_wait(addr);                                        //Várunk, ha az EEPROM elfoglalt
  8.   i2c_writeN(addr,pbuf,BLKSIZE+2);                      //Az adatbuffer kiírása (cím+adatok)
  9. }


Ugyanígy vedd ki a többi függvényből is ezt a részt, ahol szerepel.
(#) Hp41C válasza don_peter hozzászólására (») Nov 1, 2015 /
 
Kétféle címet kell beállítani írás előtt. Nálad a word cím átvitele kimaradt.
Írás:
<I2C start> <slave cím és W> <WORD ADDR Low> <WORD ADDR High> <adat><adat><adat> ... <I2C Stop>
Olvasás:
<I2C start> <slave cím és W> <WORD ADDR Low> <WORD ADDR High> <I2C Restart><slave cím és R> <adat><ack>...<adat><nack> <I2C Stop>
(#) don_peter válasza Hp41C hozzászólására (») Nov 1, 2015 /
 
Az a címzési két adat benne van a tömb elején, ezért 2bájt-tal nagyobb, legalább is ezt látom és a leírás is erre utal, illetve az elején annak a feltöltésével kezdünk, nyilván itt ez a nulla lesz az első cím.

icserny: kivettem, de ez nem oldotta meg a gondot.
Továbbra sem lép ki a várakozó rutinból.
Nem jön válasz.
A hozzászólás módosítva: Nov 1, 2015
(#) don_peter válasza icserny hozzászólására (») Nov 2, 2015 /
 
Közben tovább kísérleteztem és debugoltam az adatvonalat is.
Továbbra sincs eredmény, nem működik.
Csatolok egy képet a debugról is.

Ebben a rutinba ragad be, és forog végtelen.
A hozzászólás módosítva: Nov 2, 2015

i2c_debug.JPG
    
(#) icserny válasza don_peter hozzászólására (») Nov 2, 2015 / 1
 
A kép alapján már a megszólításkor is NAK a válasz. Nincs felhúzva az I2C két vonala, nem kap tápfeszt az IC, vagy nincsenek lekötve földre az A0, A1, A2 címválasztó bemenetek?
A hozzászólás módosítva: Nov 2, 2015
(#) don_peter válasza don_peter hozzászólására (») Nov 2, 2015 /
 
Közben megjavult.
A Memória cím lábain kellett variálnom (föld-re kellett húzni mind) és rögtön működött.
Köszi a segítséget.

A lényege nem a memória volt, hanem az I2C kommunikáció működése.
Egy DS1338-as naptár IC-ét akarok használni és ehhez kell az I2C.
A hozzászólás módosítva: Nov 2, 2015
(#) don_peter hozzászólása Nov 2, 2015 /
 
Uraim, most megpróbáltam átültetni a megoldást egy 18F46k22-re.
Ugyan az minden, de itt nem működik.
A regisztereket átnéztem és átírtam, mivel ebben a PIC-ben 2 i2c van.
Van ennek a PIC-nek egy olyan speciális állítása ami befolyásolja a működést?
Átnéztem a regisztereket és a beállítások egyeznek a 18F4550-el, bár a 46K22-ben van olyan regiszter is ami az 4550-ben nincs.

Mire kell odafigyelnem ami eddig nekem nem tűnt fel?
Ahogyan elnézem a SSPxCON3 regiszter nem igen kell, mert csak a SSPxBUF felülírását és az interrupthoz, illetve a slave módhoz kell.

Közben megnéztem a gyári könyvtárat is, és aszerint is teljesen rendben van a beállítás, még is az alábbi képet produkálja.
PIC18F46K22 adatlap
Amennyiben valaki már foglalkozott ezen pic i2c-s vonalon történő adatküldéssel, az segítsen nekem kicsit.
Köszönöm.

Az érdekes kódok:
  1. #define I2C_SCL         TRISCbits.TRISC3
  2. #define I2C_SDA         TRISCbits.TRISC4
  3. #define I2C_ACK         0       //pozitív nyugtázás
  4. #define I2C_NAK         1       //negatív nyugtázás
  5.  
  6. /* Makrók az SSPCON1 regiszter beállításához  */
  7. #define   SSPENB                        0b00100000      /* Enable serial port and configures SCK, SDO, SDI*/
  8. #define   MASTER                        0b00001000      /* I2C Master mode */
  9. #define   SLEW_OFF                      0b10000000      /* Slew rate vezérlés letiltva  (100kHz mód) */
  10. #define   SMBUS_DISABLE                 0b00000000      /* SMBUS specifikus bemenet tiltása  */
  11.  
  12. #define i2c_idle()  while ((SSP1CON2 & 0x1F) | (SSP1STATbits.R_W))
  13. #define i2c_start() SSP1CON2bits.SEN=1; while(SSP1CON2bits.SEN)
  14. #define i2c_rstart() SSP1CON2bits.RSEN=1; while(SSP1CON2bits.RSEN)
  15. #define i2c_stop()  SSP1CON2bits.PEN=1; while(SSP1CON2bits.PEN)
  16. #define i2c_ack(ackbit)   SSP1CON2bits.ACKDT=ackbit; SSP1CON2bits.ACKEN=1; while(SSP1CON2bits.ACKEN)

És a rutinok:
  1. void i2c_init(unsigned int bitrate_kHz) {
  2.   #define clk_tmp Fosc/4000L
  3.   SSP1ADD = clk_tmp/bitrate_kHz -1;
  4.   SSP1STAT = SLEW_OFF | SMBUS_DISABLE;
  5.   SSP1CON1 = MASTER;
  6.   SSP1CON2 = 0x00;
  7.   I2C_SCL = 1;
  8.   I2C_SDA = 1;
  9.   SSP1CON1 |= SSPENB;                   // az MSSP egység engedélyezése
  10. }
  11.  
  12. uint8 i2c_getc(uint8 ack2send) {
  13.   i2c_idle();
  14.   SSP1CON2bits.RCEN = 1;                 // a master engedélyezése egy bájt vételére
  15.   while ( !SSP1STATbits.BF );            // megvárjuk, amíg a bájt beérkezik
  16.   i2c_ack(ack2send);                                    // kiküldjük a nyugtázó bitet
  17.   return ( SSP1BUF );                    // visszatérünk a bájttal
  18. }
  19.  
  20. uint8 i2c_putc(uint8 data) {
  21.   SSP1BUF = data;                        // kirakunk egy bájtot SSPBUF-ba
  22.   while( SSP1STATbits.BF );              // megvárjuk,amíg az íráslezajlik  
  23.   i2c_idle();                           // megvárjuk a busz aktivitás végét
  24.   return ( SSP1CON2bits.ACKSTAT );       // a nyugtázó bittel térünk vissza
  25. }
A hozzászólás módosítva: Nov 2, 2015
(#) Hp41C válasza don_peter hozzászólására (») Nov 2, 2015 /
 
A 18F46K22 -ben két MSSI van. Sajnos egyik sem azokat a lábakat használja, amit a 18F4550 -nél az MSSI.
Felhúzóellenállsa, címlábak, stb.
(#) don_peter válasza Hp41C hozzászólására (») Nov 2, 2015 /
 
Mármint a regiszterekre gondoltam.
18F46K22 C3 és C4-en vannak a SCL és SDA lábak.
Ezek megvannak.
(#) bbalazs_ válasza don_peter hozzászólására (») Nov 2, 2015 / 1
 
Ha bemeno lab nem megy, akkor erdemes megnezni az ANSEL regiszterek erteket, mert alapbol mindegyik analog bemenetre van allitva, ezeket a progi elejen torolni kell, azon kivul arra is figyelni kell, ha assemblyben programozol, hogy az ANSEL-eknel a regiszterbankot a 0f-re allitsd, mert ezek mar kivul vannak a normal regiszterek tartomanyan.
(#) don_peter válasza bbalazs_ hozzászólására (») Nov 2, 2015 /
 
A regiszterek szerintem rendben vannak, más lesz a gond, bár lehet valamit elnézek.
  1. void init(void){
  2.  
  3.     /*********************************************
  4.         +               Ki / Bemenetek
  5.         **********************************************/
  6.         TRISA = 0x03;
  7.         PORTA = 0;
  8.         TRISD = 0;
  9.         PORTD = 0;     
  10.         TRISB = 0;
  11.         PORTB = 0;
  12.         TRISE = 0;
  13.         PORTE = 0;
  14.         TRISC = 0;              // PWM portok és egyebek, teljes port kimenetre állítva
  15.         PORTC = 0;
  16.        
  17.         ADCON0 = 0x03;          // ADC le van tiltva, kivéve A0 és A1
  18.         ADCON1 = 0;
  19.         ADCON2 = 0b10111110;    // Jobbra zárt 10bit, ACQ time=20TAD, ADC time=Fosc/64 (van idı mindenre)
  20.  
  21.        
  22.         CM2CON1 = 0;
  23.         CM1CON0 = 0;
  24.         CM2CON0 = 0;
  25.        
  26.         ANSELA = 0;             // Digital input buffer enabled
  27.         ANSELB = 0;
  28.         ANSELC = 0;
  29.         ANSELD = 0;
  30.         ANSELE = 0;
  31.        
  32.         OSCCON = 0;     // Primary Clock-ot haszn·ljuk CONFIG1H be·llÌt·sai szerint
  33.     OSCCON2 = 0x04; // Oscillator drive circuit on
  34.     OSCTUNE = 0x20; // PLL enabled
  35.        
  36.         CCP1CON = 0;    // Coperátorok és PWM kikapcsolva
  37.         CCP2CON = 0;
  38.         CCP3CON = 0;
  39.         CCP4CON = 0;
  40.         CCP5CON = 0;
  41.         INTCONbits.GIE = 0;
  42. }

18F4550-en szépen fut már az I2C, de ugyan az a kód 18F46K22-őn már nem akar.
Pedig a regiszterek át vannak írva és minden más az adatlap szerint egyezik.
Legalább is én ezt látom ki belőlük.
Mostanában darabosan megy csak a programozás, mint ha butulnék és nem fejlődnék.
A hozzászólás módosítva: Nov 2, 2015
(#) Hp41C válasza don_peter hozzászólására (») Nov 3, 2015 / 1
 
Biztos, hogy jó?
Idézet:
  1. TRISC = 0;
(#) don_peter válasza Hp41C hozzászólására (») Nov 3, 2015 /
 
Igen.
Az első dolga az i2c_init()-nek, hogy ezt rendbe vágja:
  1. I2C_SCL = 1;
  2.   I2C_SDA = 1;
(#) don_peter hozzászólása Nov 3, 2015 /
 
Nos megvan a hiba.
Már mindent 100szor átnéztem és kiderült, hogy a felhúzó ellenállás értéke volt kicsi.
4.7K-os ellenállással már egyből jó lett.
Köszi a segítséget.
(#) usane válasza don_peter hozzászólására (») Nov 3, 2015 /
 
Mit értesz a kicsi alatt? 1.5k-tól 10k-ig működni szokott az IIC, de láttam már 1k-s rajzot is. Én általában 2k2-t szoktam használni, azzal eddig mindig ment minden PIC beleétve a 24 és DSpic-et is.
(#) don_peter válasza usane hozzászólására (») Nov 3, 2015 /
 
1K már nem tetszett neki.
18F4550-nél elég volt, de 18K46K22-nek kevés volt.
(#) Kapagerenda hozzászólása Nov 4, 2015 /
 
Üdv.
Van valahol a neten egy oldal ahol a 16F887 el megoldott pices kapcsolások vannak C, assembly nyelven. Az elektronikához kapcsolási rajzok is voltak, a programok levannak vezetve magyarázattal együtt. Nem találom sehol sem.
Esetleg valaki tud rá linket? Eleve annak idején itt ajánlotta nekem valaki azt az oldalt 2x is
Előre is kösz!
(#) kissi válasza Kapagerenda hozzászólására (») Nov 4, 2015 /
 
Esetleg ez volt Bővebben: Link ?!
(#) Kapagerenda válasza kissi hozzászólására (») Nov 4, 2015 /
 
Köszönöm! igen ez volt
(#) jany1966 hozzászólása Nov 5, 2015 /
 
Sziasztok
Kezdő vagyok a PIC-ezésben ezért szeretném a segítségeteket kérni.
Van nekem egy panelom kapcsolási rajz mellékelve, ezt szeretném programozni.
Olyat szeretnék vele csinálni, hogy kapcsolókat figyelne és különböző logikai műveletek és késleltetések után a kimeneteken lévő reléket kapcsolná. Plusz a kijelzőn különböző feliratok jelennének meg a kapcsoló vagy nyomógomb megnyomásakor. Ha lehet még azt is szeretném, hogy üzemórát számolna amit ha nincs táp alatt a PIC akkor is eltárol és aztán onnan folytatja a számolást.
Ha valakinek van ötlete és kedve kérem segítsetek.
Köszi előre is.
(#) Pali79 válasza jany1966 hozzászólására (») Nov 5, 2015 /
 
Szia!
Mennyire vagy kezdő? Milyen nyelven szeretnéd programozni?
(#) jany1966 válasza Pali79 hozzászólására (») Nov 5, 2015 /
 
Nagyon egy kis basic ismeretem van de nem sok úgyhogy szerintem mindegy a nyelv.
(#) Pali79 válasza jany1966 hozzászólására (») Nov 5, 2015 /
 
Én assemblyben tudok segíteni, de egy totál kezdő PIC-esnek ez nagyon nagy falat.
Következő: »»   718 / 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