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   1054 / 1203
(#) usane válasza kissi hozzászólására (») Nov 4, 2018 /
 
Akkor te minek neveznéd? 1 dróton jön.
(#) kissi válasza usane hozzászólására (») Nov 4, 2018 /
 
1 vezetékes kommunikációnak !

A 1-wire-t már másra használják :Bővebben: Link !
(#) usane válasza kissi hozzászólására (») Nov 4, 2018 /
 
Nem értem mire akarsz kilyukadni. Miért nem 1-wire az 1 vezetékes kommunikáció. Nem olvastam végig a linket, de az elején is ezt állítják. A Dallas is 1-wire.
Magyarázd el nekem légy oly szíves, hogy megértsem a különbséget.

Mindezeket átugorva viszont a kérdés még fennáll. Nálam csak a az alacsony jeleket (RESET) mutatja időpecséttel ellátva.
(#) Bakman válasza usane hozzászólására (») Nov 4, 2018 /
 
A "1-Wire" egy kötött protokoll, mint pl. az UART. Az, amit te akarsz elemezni, az egy egy vezetékes kommunikáció, de nem "1-Wire".

Minden 1-Wire egy vezetékes kommunikáció, de nem minden egy vezetékes kommunikáció 1-Wire.
Idézet:
„Nálam csak a az alacsony jeleket (RESET) mutatja időpecséttel ellátva.”
Ez azért lehet, mert az alacsony jelek hossza eléri a 1-Wire protokoll Reset idejét.
A hozzászólás módosítva: Nov 4, 2018
(#) usane válasza Bakman hozzászólására (») Nov 4, 2018 /
 
Így értem, és akkor félreértettem Kissi mit akart mondani vele. Protokollban nem is gondolkodtam, azokat utálom Egyébként is volt itt már használva ez a kifejezés mint kommunikációs vonal protokoll nélkül, de lépjünk tovább.
Tehát akkor ha félretesszük mint protokoll, van lehetőség ezen (1 wire kötőjel nélkül, one wire) vagy ha már magyarok vagyunk 1 vezetékes kommunikáció dekódolására a Saleae szoftverral?
Mint írtam a jelek egyforma periódusúak, nem úgy mint pl. a WS2812 NRZ-je. 1 periódus magas 3 periódus alacsony, illetve 3 periódus magas 1 periódus alacsony. Sajnos én nem találtam egy "protokollt" vagy analizátort sem a szoftverben ami ezt tudná, de hátha valaki tud valamit amit én nem.
A hozzászólás módosítva: Nov 4, 2018
(#) usane válasza usane hozzászólására (») Nov 4, 2018 /
 
Nos, alapos utánajárás után, nem tudja az NRZ-t analizálni. Viszont van valami C++-os SDK-ja belenézek abból mit lehet kihozni.
(#) sonajkniz válasza usane hozzászólására (») Nov 4, 2018 /
 
Idézet:
„1 periódus magas 3 periódus alacsony, illetve 3 periódus magas 1 periódus alacsony.”

Ezt hogy kell értelmezni? A byte értéke 10001110 ?
Ez jelalakilag hogy néz ki? Mert ez 1-Wire-n hosszú magas- rövid alacsony, majd 3x rövid magas- hosszú alacsony, 3x hosszú magas- rövid alacsony, végül rövid magas- hosszú alacsony jel.
De ha ilyen is a jel, startjel nélkül, illetve a Dallas szabványtól eltérő frekin a Saleae szoftvere nem értelmezi.
(#) usane válasza sonajkniz hozzászólására (») Nov 4, 2018 /
 
Igen, ahogy írtad. Ilyen formában követik egymást a bitek négyesével. Valamint már rájöttem, hogy nem tud NRZ-t. Most éppen az SDK-t olvasgatom, hátha tudok egy NRZ analizátort belerakni, holnapra talán okosabb leszek, ha lesz rá elég időm, de valószínűleg nem, csak később. Mindenesetre jó lenne megoldani ne kelljen a jelalakokból manuálisan dekódolnom több száz bitet.
Igaz tudnék csinálni PIC-el is egy dekódolót, csak ott még nem tartok, hogy azt txt-be vagy csv-be tudjam exportálni a PIC-ből. Bár így belegondolva rosszul közelítem, meg, mert elég lenne egy soros kommunikáció PC-vel és a PC-re írni valamit ami exportálja, de annyi időráfordítást nem ér meg. Hátha a Saleae SDK gyorsabb lesz.
(#) Bakman válasza usane hozzászólására (») Nov 4, 2018 /
 
Egy OpenLog modul?
(#) usane válasza Bakman hozzászólására (») Nov 5, 2018 /
 
Azt nem tudom tudja-e. Nem ismerem, de ha jól látom HEStoreban nincs is már. 1 hónap mire megjön Ebay-ről.
(#) silent15 hozzászólása Nov 5, 2018 /
 
Sziasztok!

Innen implementáltam egy I2C kommunikációt megvalósító metóduscsomagot (konkrétan ami az oldalon van, csak a regisztereket pontosítva(16F18323)) viszont olvasáskor a második read beakad a várakozásba és az első read értékében sem vagyok biztos, hogy jót olvas e ki. Egy DS1307-el szeretnék kommunikálni. A kód amivel próbálnám olvasni az alábbi:
  1. I2C_Master_Init(100000);
  2.         I2C_Master_Start();
  3.         I2C_Master_Write(DS_W_Address);
  4.        
  5.         I2C_Master_Write(DS_SecAddr);
  6.         I2C_Master_Write(0x80);
  7.         I2C_Master_Stop();
  8.        
  9.         I2C_Master_Start();
  10.         I2C_Master_Write(DS_W_Address);
  11.         I2C_Master_Write(DS_SecAddr);    
  12.         I2C_Master_RepeatedStart();
  13.         I2C_Master_Write(DS_R_Address);
  14.         i2cTime.seconds = I2C_Master_Read(Ack);
  15.         i2cTime.minutes = I2C_Master_Read(Ack);
  16.         i2cTime.hours = I2C_Master_Read(Ack);
  17.         i2cTime.weekdays = I2C_Master_Read(Ack);
  18.         i2cTime.days = I2C_Master_Read(Ack);
  19.         i2cTime.months = I2C_Master_Read(Ack);
  20.         i2cTime.years = I2C_Master_Read(Nack);
  21.  
  22.         I2C_Master_Stop();


Ennek elvileg végig kéne olvasni a DS regisztereit, viszont nem tudom miért akad be. Valószínűleg megint egy bitet kéne megpiszkálnom egy regiszterben, de ismét nem találom, pedig már napok óta ezzel szórakozok

Logikai analizátorom sajnos tönkrement, így azzal nem tudok ránézni, hogy hova mi megy.

  1. #define DS_W_Address    0xD0
  2. #define DS_R_Address    0xD1
  3. #define DS_SecAddr      0x00


Módosított kódom:
  1. void I2C_Master_Wait()
  2. {
  3.   while ((SSP1STAT & 0x04) || (SSP1CON2 & 0x1F)); //Transmit is in progress
  4. }
  5.  
  6. void I2C_Master_Start()
  7. {
  8.   I2C_Master_Wait();    
  9.   SSP1CON2bits.SEN = 0x01;
  10. }
  11.  
  12. void I2C_Master_RepeatedStart()
  13. {
  14.   I2C_Master_Wait();
  15.   SSP1CON2bits.RSEN = 0x01;
  16. }
  17.  
  18. void I2C_Master_Stop()
  19. {
  20.   I2C_Master_Wait();
  21.   SSP1CON2bits.PEN = 1;
  22. }
  23.  
  24. void I2C_Master_Init(const unsigned long c)
  25. {
  26.   SSP1CON1 = 0x28;
  27.   SSP1CON2 = 0x00;
  28.   SSP1ADD = (_XTAL_FREQ/(4*c))-1;
  29.   SSP1STAT = 0x00;
  30.   TRISCbits.TRISC3 = 1;
  31.   TRISCbits.TRISC4 = 1;
  32. }
  33.  
  34. void I2C_Master_Write(unsigned d)
  35. {
  36.   I2C_Master_Wait();
  37.   SSP1BUF = d;         //Write data to SSPBUF
  38. }
  39.  
  40. unsigned short I2C_Master_Read(unsigned short a)
  41. {
  42.   unsigned short temp;
  43.   I2C_Master_Wait();
  44.   SSP1CON2bits.RCEN = 1;
  45.   I2C_Master_Wait();
  46.   temp = SSP1BUF;
  47.   I2C_Master_Wait();
  48.   SSP1CON2bits.ACKDT = (a)?0:1;
  49.   SSP1CON2bits.ACKEN = 1;
  50.   return temp;
  51. }


Az i2cTime egy saját typedef struct, amiben mindegyik tag egy unsigned char.

Bárkinek bármi ötlete van, nagyon szépen megköszönöm!
(#) eSDi válasza silent15 hozzászólására (») Nov 5, 2018 /
 
Ha beragad, akkor valami a kommunikációnál nem fejeződik be úgy, ahogy kellene. Tegyél rá egy logikai analizátort, az egyből megmutatja. Én I2C Slave-nél szívtam vele.
Itt az én HW I2C kódom, amivel működtettem egy OLED kijelzőt. Igaz 18F4550 és BASIC, de talán hasznát veszed (Csak a kommunikációs rész, Repeated Start-ot nem használtam).

  1. SSPSTAT.SMP = 0
  2. SSPSTAT.CKE = 0
  3. SSPCON1.SSPM3 = 1
  4. SSPCON1.SSPM2 = 0
  5. SSPCON1.SSPM1 = 0
  6. SSPCON1.SSPM0 = 0
  7. SSPADD = 2
  8. SSPCON1.SSPEN = 1
  9.  
  10. Proc hwi2c_start()
  11.         SSPCON2.SEN = True
  12.         While SSPCON2.SEN = True
  13.         ASM:        nop
  14.         Wend
  15.         PIR1.SSPIF = False
  16. End Proc                                          
  17.  
  18. Proc hwi2c_stop()
  19.         SSPCON2.PEN = True
  20.         While SSPCON2.PEN = True
  21.         ASM:        nop
  22.         Wend
  23.         PIR1.SSPIF = False
  24. End Proc                                          
  25.  
  26. Proc hwi2c_data(data As Byte)
  27.         SSPBUF = data
  28.         While PIR1.SSPIF = False
  29.         ASM:        nop
  30.         Wend
  31.         PIR1.SSPIF = False
  32. End Proc
  33.  
  34. Function exteeprom_read(address As Byte, register As Word) As Byte
  35.         Call hwi2c_start()
  36.         Call hwi2c_data(address)
  37.         Call hwi2c_data(register.HB)
  38.         Call hwi2c_data(register.LB)
  39.         Call hwi2c_stop()
  40.         address.0 = True
  41.         Call hwi2c_start()
  42.         Call hwi2c_data(address)
  43.         SSPCON2.RCEN = True
  44.         While SSPCON2.RCEN = True
  45.         ASM:        nop
  46.         Wend
  47.         PIR1.SSPIF = False
  48.         exteeprom_read = SSPBUF
  49.         SSPCON2.ACKDT = True
  50.         SSPCON2.ACKEN = True
  51.         While SSPCON2.ACKEN = True
  52.         ASM:        nop
  53.         Wend
  54.         PIR1.SSPIF = False
  55.         Call hwi2c_stop()
  56. End Function
A hozzászólás módosítva: Nov 5, 2018
(#) Tasznka válasza silent15 hozzászólására (») Nov 5, 2018 /
 
Kommunikációnál ne tegyél be csak whilet,ami csak bitekre vár,mert ott megakadhatsz,dobj bele még 1 timert is,és figyeld a timer interrupt-ot is .Ha a timer bejelez,akkor dobd a próbálkozást 1 kis ideig,vagy számlálóval mérd,és bizonyos próbálkozás után dobd ki hibának .Használhatod a WD-t is,csak az nem bizti,hogy megoldás.Mert nem mindig a master a hunyó .
(#) eSDi válasza silent15 hozzászólására (») Nov 5, 2018 /
 
Nekem ez az "I2C_Master_Wait()" nem tetszik, ha megnézed az adatlapban az "I2C MASTER MODE WAVEFORM" ábrát, látszik, hogy a Interrupt Flag figyelése elegánsabb. Próbáld ki, nekem bevállt.
(#) diginewl hozzászólása Nov 8, 2018 /
 
Tiszteletem!
Van egy érdekes esemény, amit nem igazán értek, ebben kérném a segítséget. (inkább csak felhasználó vagyok, ezért kíméljetek meg a szakmai kifejezésektől)

Van egy PIC16F887 40 lábúm, amit beleteszek a PICkit2 íróba. Beleírom a HEX-et. Azután rögtön kiolvasom, és az EPROM data egyes soraiban más értékek lesznek a kiolvasás után, mint amit beírtam. Ez mitől lehet?
Sokkal több adat módosul az EPROM data-ban, ha bekapcsolom a VDD pickit2 jelölőnégyzetet, amit 5V-ra állítok. (az alatta levő /MCLR-t be sem mertem kattintani)

Köszönettel: Jenő
(#) Hp41C válasza diginewl hozzászólására (») Nov 8, 2018 /
 
Mit csinál a beprogramozott hex? Átírhatja az adat EEProm tartalmát. Ha belső oszcillátorra van konfigurálva, a kontroller programja elindulhat a programozás után.
Mit jelez az írás utáni ellenőrzés? Arra gondolok, amit a PICkit2 automatikusan végez közvetlenül a beírás folyamat legvégén.
(#) diginewl válasza Hp41C hozzászólására (») Nov 8, 2018 /
 
A beprogramozott hex átírhatja az eprom tartalmát, igen. (utólag így lehet(ne) pozíciókat rögzíteni a PIC-be, amit nem mindig jegyez meg)
A programozás után a veryifing mindig elszáll hibával, valami memory miatt.
(#) Hp41C válasza diginewl hozzászólására (») Nov 9, 2018 /
 
Egy kép többet mondana...
Milyen az összeköttetés a pIC és a PICkit2 között? Be van-e kötve minden Vss és minden Vdd programozáskor? Esetleg tegyél egy 100nF kerámia kondenzátort a Vss és a Vdd közé.
Állíts be lassabb programozást.
A hozzászólás módosítva: Nov 9, 2018
(#) diginewl válasza Hp41C hozzászólására (») Nov 9, 2018 /
 
Itt a kép.
A 40-es sor szeret változni. Ott elméletileg a beírandó hex-ben végig 02 van.
Aztán írás után ez lesz.
A pickit2 íróba van beletéve a PIC. Abba nagy 40 lábas leszorítós IC rögzítőbe, nincs benn az áramkörben.

pic.jpg
    
(#) f2f2 hozzászólása Nov 9, 2018 /
 
Üdv !
3 byte ot kellene módosítanom egy PIC16F1946 eepromjában
CP védve CPD nyitott,
Egy rossz tapasztalatom után inkább megkérdezem újra
Egyáltalán van olyan PIC mcu ami ilyen esetben való
csak EEPROM bepipált írással megsemmisíti a CODE(futtatott) állományt is ?
Nyugodtan írjam át vagy kockázatos ?
Illetve lehet e olyan, hogy PK2 vel igen/nem PK3 al Igen/nem
Kössz
(#) diginewl válasza diginewl hozzászólására (») Nov 9, 2018 /
 
Azt néztem, hogy mindig a 41-es memória sorszám (?) hibádzik ellenőrzéskor. Ha ezt átírom 01-re programozás előtt ,a többit a sorban hagyom 02-n akkor a verify is lefut hibátlanul...
A programozást átettem lassúra.

Hát ezért maradok én outsider.
(#) Hp41C válasza diginewl hozzászólására (») Nov 9, 2018 /
 
Írásról készített kép jobb lett volna. Ha nem titkos a hex, töltsd fel ide, délután megpróbálom.
A hozzászólás módosítva: Nov 9, 2018
(#) diginewl válasza Hp41C hozzászólására (») Nov 9, 2018 /
 
Nem titkos. Vasútmodellezős dolog. A Szerzője annyit kötött ki, hogy csak saját felhasználásra lehet használni.
Beteszem az asm-et, is mert én fordítottam a hex-re, és mint már előbb is írtam, felhasználó vagyok...
(#) Hp41C válasza diginewl hozzászólására (») Nov 9, 2018 /
 
Nem módosítja magát és az adatait sem. Belső oszcillátor, MCLR letiltva, a PGD (RB7) és PGC (RB6) és a PGM (RB3) kimenetnek beállítva néhány programlépésen belül.
Próbáld meg a "Vpp First Programming Entry" módszert.
(#) diginewl válasza Hp41C hozzászólására (») Nov 9, 2018 /
 
Ok. Köszönöm a segítséget, és az erre fordított időt!

Akkor valami hiba itt van nálam.
(#) silent15 válasza eSDi hozzászólására (») Nov 9, 2018 /
 
Bocsánat, hogy eddig nem válaszoltam, de nem jutott erre időm, most rá tudtam nézni:

  1. SSP1CON2bits.SEN = 1;
  2.         while(SSP1IF==0);
  3.         SSP1IF = 0;
  4.         SSP1BUF = 0xD0;
  5.         while(SSP1CON2bits.ACKSTAT==1);
  6.         while(SSP1IF==0);
  7.         SSP1IF = 1;
  8.         SSP1BUF = 0x00;
  9.         while(SSP1CON2bits.ACKSTAT==1);

Idézet:
„PIC16F18323 adatlap - 30.6.6.4 Typical Transmit Sequence”


Ezt programoztam most bele, de kapásból az első SSP1IF-re várásnál elhasal. Sikeres indítás (SEN) után ezt hardveresen 1-re kéne állítania. A baj, hogy csak jövőhéten tudok ránézni logikai analizátorral. Addig van esetleg tippetek hogy miért hasal el már itt a kommunikáció?

MSSP beállításai:
  1. SSP1CON1 = 0x28;
  2.   SSP1CON2 = 0x00;
  3.   SSP1ADD = 0x4F;
  4.   SSP1STAT = 0x00;


Már tisztára idegesít, hogy nem jövök rá mi a baja
Köszönöm!

UI: eSDi próbáltam a te kódod átírását is, az se járt sikerrel.

Utó-UI: ugye egy DS1307-ről beszélünk, a feszültségeket megmértem, az elem 3,2V a VCC 5V, szóval nem kéne "battery" módra váltania.
A hozzászólás módosítva: Nov 9, 2018
(#) eSDi válasza silent15 hozzászólására (») Nov 9, 2018 /
 
Pedig semmi különbség a két típus ezen része között.
30-28-as ábra - I2C MASTER MODE WAVEFORM (TRANSMISSION, 7 OR 10-BIT ADDRESS).

Start Bit küldés: A SEN bitet 1-be állítod, majd vársz, míg hardverből vissza nem áll 0-ba. Ekkor törlöd az SSPIF-et.
Adat küldés: Ezután az SSPBUF-ba beírod a kiküldendő byte-ot, majd vársz míg az SSPIF magas nem lesz. Ekkor törlöd az SSPIF-et.
Ha kell még adatot kiküldened, megismétled az előző SSPBUF-os műveletet.
Stop Bit küldés: Ugyan az mint a Start csak a PEN-t kell bebillenteni.

De a 30.6.6.4 Typical Transmit Sequence is ugyan ezt írja, az /ACK figyeléssel kiegészítve. Én azt mellőztem (láttam a kijelzőn, hogy működött), szerintem kezdésnek ne foglalkozz te sem vele. Illetve küldésnél nem fontos annyira (csak a slave nyugtázza vele a vételt), olvasásnál mindenképp kell.
(#) f2f2 válasza f2f2 hozzászólására (») Nov 10, 2018 /
 
A PicKit3 Programmer menüje alatt az "Erase Before Programming"
ha nincs bepipálva, akkor legalábbis egy 18F46K22 vel tesztelve az eeprom szabadon átírható
flash az összes CP védelemmel se száll el.
Viszont ilyen funkciót nem látok a PK2 ben. Erre ott nincs is mód ?
Mondjuk egy írás csak az eepromban illene figyelmeztetnie a programnak, hogy
keletkezik e így veszteség vagy kínáljon fel lehetőségeket.
Ha ezért szállt el tavasszal nekem egy 16F946 csupán kezdek felháborodni.
Írtatok erről korábban ?
(#) eSDi válasza silent15 hozzászólására (») Nov 10, 2018 / 1
 
Megírtam XC8-ban is. Ez így működik nekem 16F18324-en. 18323-asom nincs, de majdnem ugyan az a kettő.
  1. /*
  2.  * File:   main.c
  3.  * Author: Dániel
  4.  *
  5.  * Created on 2018. november 10., 9:47
  6.  */
  7.  
  8. // CONFIG1
  9. #pragma config FEXTOSC = OFF    // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled)
  10. #pragma config RSTOSC = HFINT32 // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz))
  11. #pragma config CLKOUTEN = ON    // Clock Out Enable bit (CLKOUT function is enabled; FOSC/4 clock appears at OSC2)
  12. #pragma config CSWEN = OFF      // Clock Switch Enable bit (The NOSC and NDIV bits cannot be changed by user software)
  13. #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
  14.  
  15. // CONFIG2
  16. #pragma config MCLRE = ON       // Master Clear Enable bit (MCLR/VPP pin function is MCLR; Weak pull-up enabled)
  17. #pragma config PWRTE = OFF       // Power-up Timer Enable bit (PWRT enabled)
  18. #pragma config WDTE = OFF       // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored)
  19. #pragma config LPBOREN = ON     // Low-power BOR enable bit (ULPBOR enabled)
  20. #pragma config BOREN = ON       // Brown-out Reset Enable bits (Brown-out Reset enabled, SBOREN bit ignored)
  21. #pragma config BORV = LOW       // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V)
  22. #pragma config PPS1WAY = OFF    // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be set and cleared repeatedly (subject to the unlock sequence))
  23. #pragma config STVREN = OFF     // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will not cause a Reset)
  24. #pragma config DEBUG = ON      // Debugger enable bit (Background debugger disabled)
  25.  
  26. // CONFIG3
  27. #pragma config WRT = OFF        // User NVM self-write protection bits (Write protection off)
  28. #pragma config LVP = OFF        // Low Voltage Programming Enable bit (High Voltage on MCLR/VPP must be used for programming.)
  29.  
  30. // CONFIG4
  31. #pragma config CP = OFF         // User NVM Program Memory Code Protection bit (User NVM code protection disabled)
  32. #pragma config CPD = OFF        // Data NVM Memory Code Protection bit (Data NVM code protection disabled)
  33.  
  34. // #pragma config statements should precede project file includes.
  35. // Use project enums instead of #define for ON and OFF.
  36.  
  37. #define _XTAL_FREQ 32000000 //32MHz
  38. #include <xc.h>
  39.  
  40. void I2C_Master_Start() {
  41.     SSP1CON2bits.SEN = 1;
  42.     while (SSP1CON2bits.SEN == 1) {
  43.         asm("nop");
  44.     }
  45.     PIR1bits.SSP1IF = 0;
  46. }
  47.  
  48. void I2C_Master_Stop() {
  49.     SSP1CON2bits.PEN = 1;
  50.     while (SSP1CON2bits.PEN == 1) {
  51.         asm("nop");
  52.     }
  53.     PIR1bits.SSP1IF = 0;
  54. }
  55.  
  56. void I2C_Master_TXData(unsigned char TXData) {
  57.     SSP1BUF = TXData;
  58.     while (PIR1bits.SSP1IF == 0) {
  59.         asm("nop");
  60.     }
  61.     PIR1bits.SSP1IF = 0;
  62. }
  63.  
  64. void main(void) {
  65.     TRISA = 0b11111011;             //PORTA - RA7_x|RA6_x|RA5_IN|RA4_IN|RA3_IN|RA2_IN|RA1_IN|RA0_IN
  66.     ANSELA = 0x00;                  //PORTA - Analog OFF
  67.     WPUA = 0x00;                    //PORTA - Pull-Up OFF
  68.     ODCONA = 0x00;                  //PORTA - Open Drain OFF
  69.     SLRCONA = 0x00;                 //PORTA - Slew Rate MAX
  70.     INLVLA = 0xff;                  //PORTA - ST Input Level
  71.     TRISC = 0b11111111;             //PORTC - RC7_x|RC6_x|RC5_IN|RC4_IN|RC3_IN|RC2_IN|RC1_IN|RC0_IN
  72.     ANSELC = 0x00;                  //PORTC - Analog OFF
  73.     WPUC = 0x00;                    //PORTC - Pull-Up OFF
  74.     ODCONC = 0x00;                  //PORTC - Open Drain OFF
  75.     SLRCONC = 0x00;                 //PORTC - Slew Rate MAX
  76.     INLVLC = 0xff;                  //PORTC - ST Input Level
  77.     PMD0 = 0b01111111;              //PMD - SYSCMD:ON|FVRMD:OFF|NVMMD:OFF|CLKRMD:OFF|IOCMD:OFF
  78.     PMD1 = 0b11111111;              //PMD - NCOMD:OFF|TMR6MD:OFF|TMR5MD:OFF|TMR4MD:OFF|TMR3MD:OFF|TMR2MD:OFF|TMR1MD:OFF|TMR0MD:OFF
  79.     PMD2 = 0b11111111;              //PMD - DACMD:OFF|ADCMD:OFF|CMP2MD:OFF|CMP1MD:OFF
  80.     PMD3 = 0b11111111;              //PMD - CWG2MD:OFF|CWG1MD:OFF|PWM6MD:OFF|PWM5MD:OFF|CCP4MD:OFF|CCP3MD:OFF|CCP2MD:OFF|CCP1MD:OFF
  81.     PMD4 = 0b11111101;              //PMD - UART1MD:OFF|MSSP1MD:ON
  82.     PMD5 = 0b11111111;              //PMD - CLC4MD:OFF|CLC3MD:OFF|CLC2MD:OFF|CLC1MD:OFF|DSMMD:OFF
  83.     SSP1DATPPS = 0b00010001;
  84.     SSP1CLKPPS = 0b00010000;
  85.     RC0PPS = 0b00011000;
  86.     RC1PPS = 0b00011001;        
  87.     SSP1STATbits.SMP = 0;
  88.     SSP1STATbits.CKE = 0;
  89.     SSP1CON1bits.SSPM3 = 1;
  90.     SSP1CON1bits.SSPM2 = 0;
  91.     SSP1CON1bits.SSPM1 = 0;
  92.     SSP1CON1bits.SSPM0 = 0;
  93.     SSP1ADD = 0x4f;
  94.     SSP1CON1bits.SSPEN = 1;
  95.    
  96.     while(1) {
  97.         I2C_Master_Start();
  98.         I2C_Master_TXData(0xa0);
  99.         I2C_Master_TXData(0x00);
  100.         I2C_Master_TXData(0x00);
  101.         I2C_Master_Stop();
  102.          LATAbits.LATA2 = 1;         //Diagnostic LED ON
  103.         __delay_ms(50);
  104.         LATAbits.LATA2 = 0;         // Diagnostic LED OFF
  105.         __delay_ms(50);
  106.     }
  107. }
A hozzászólás módosítva: Nov 10, 2018
(#) Hp41C válasza f2f2 hozzászólására (») Nov 10, 2018 /
 
PICkit2 -vel és PIC16F886 -tel elvégeztem az alábbi tesztet:
- Kód memória védelemmel konfigurált program beírása (CP altív), az írási ellenőrzés egyezést mutat.
- Újbóli kiolvasások során a program memória csupa 0, az adat EEProm -ból az eredeti tartalmat lehet kiolvasni.
- A pipát kivettem a program memória felirat elől.
- Átírtam néhány adatot az adat EEProm -ban. Beírattam (pipa kivéve a program memória felirat elől).
- Ellenőrzésnél csak az adat EEProm -ot ellenőrzi, jónak találja.
- Kipróbáltam a programot.
- Működik!

Figyelem, a program memória kezelésének letiltása (pipa kivéve a program memória felirat elől) sok funkcióra érvényes: File import, File Export, Read, Wite, Verify, stb.
Sajnos nincs PIC16F1946 -om.
Következő: »»   1054 / 1203
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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