DonanımHaber Mini sürüm 2 Ocak 2026 tarihi itibariyle kullanımdan kalkacaktır. Bunun yerine daha hızlı bir deneyim için DH Android veya DH iOS uygulamalarını kullanabilirsiniz.
Arkadaşlar ben harici bir seri eeproma yazma ve okuma işlemi yapmak istiyorum PIC BASIC PRO ile kolay ama bunu ASM ile yapmam gerek ve PIC16F877 kullanıcam microchip sitesinden örnek döküman buldum ama sadece yazma kısmı çalışıyor okuma yapmıyor kısacası kodlar hatalı elinde kesin çalıştığına emin olduğu kodlar olan varsa ve gönderirse sevinicem hem yazma hem okuma çok acil arkadaşlar ne olur sadece kod
Evet hoca ya ASM olması lazım yoksa ben hem asm hem PBP kullanıyorum PBP da kolay işler ama ASM de PIC16F877'nin I2C modülünü bir türlü kullanamadım yazma yapıyorum ama sadece bir kez oluyor okuma ise hiç yapamıyorum lütfen örnek kod beyler
I2C olarak kullanacağın entegreyi buraya yazsana! Her I2C entegresi aynı şekilde çalışmaz. C deki kod derleyici tarafından asm olarakda çıktı verir , sadece derleyiciyi ayarlayın.
Belki bir fikir verebilir c de yazılmış programın asm hali aşağıda. c codlarının altında asm kaşılıkları bulunmaktadır. asm de özel register status gibi onlara karşılık gelen hafıza adresleri ile gösterilmektedir.
Port6 = 0x06 gibi yada portb nin 3. biti = 0x06.3 gibi
programın başından ilk RETURN yazılan yere kadar olan yer i2c ile haberleşme alt programıdır.
address=10; i2c_start(); i2c_write(0xa0); // Device address i2c_write(address); // Data to device i2c_start(); // Restart i2c_write(0xa1); // to change data direction data=i2c_read(0); // Now read from slave i2c_stop();
Rafet32 sağol dostum ama bu benim işime yaramaz @macera sende demişsin kullanacağın I2C yi yazsana pek kibar bir itam olmamış ama neyse PIC16F877 I2C modülü ile tüm seri EEPROM lara bilgi gönderilebileceğini biliyorum bu işten pek anlmıyorsun galiba sadece hafıza kapasitesi büyüdükçe kontrol byte'ının 0.biti hariç(bu bayrak bitidir) 1.2 ve 3 bitlerini kurarak kontrol byte'ı update edilir ve her eeproma da yazılır yukarda verdiğiniz kodlar her PIC te çalışsın diye I2C olayı komutlarla yapılmış donanım modülü kullanılmamış bana PIC16F877 'nin I2C modülü kullanılarak yazılmış kod lazım beyler yok mu bilen
Sayın PuPPeT arkadaşım I2C ile çalışan iki devre yaptım Birincisi 24C32 ikincisi 24C512.Edindiğim tecrübeye göre I2C programı aynı da olsa data yazmalarında problem yaşadım. Sadece 100kHz ile çalışan IC var 1Mhz dede.Tabi 1Mhz de çalışan 100 kHz dede çalışıyor ama 100kHz de çalışan 1Mhzde çalışmıyor.Entegreyi sormamın nedeni bu. I2C haberleşme rutinlerini Microchipin sayfaları olduğu kadar I2C entegrelerin dökümanlarını iyice inceleyerek yazabilirsin.
Kod ekliyecektim ama Rafet32 arkadaşımız gayet güzel bir kod yazmış. Kodu inceleyerek epey yol alırsın.Benim kodda buna yakın olur.
Rafet32 sağol dostum ama bu benim işime yaramaz @macera sende demişsin kullanacağın I2C yi yazsana pek kibar bir itam olmamış ama neyse PIC16F877 I2C modülü ile tüm seri EEPROM lara bilgi gönderilebileceğini biliyorum bu işten pek anlmıyorsun galiba sadece hafıza kapasitesi büyüdükçe kontrol byte'ının 0.biti hariç(bu bayrak bitidir) 1.2 ve 3 bitlerini kurarak kontrol byte'ı update edilir ve her eeproma da yazılır yukarda verdiğiniz kodlar her PIC te çalışsın diye I2C olayı komutlarla yapılmış donanım modülü kullanılmamış bana PIC16F877 'nin I2C modülü kullanılarak yazılmış kod lazım beyler yok mu bilen
Evet C yada PBP gibi programlar genelde esnek yapıda kod üretirler. Yukarıdaki kod örneğinde I2C pinleri olarak C4 ve C3 pinleri master ve hızlı modda kullanıldı. Bunlar 877 nin donanımsal I2C haberleşeme pinleridir.
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
Evet dediğin gibi kontrol bytenin 0. biti data okuma yönünü değiştirir. L ise I2C entegresi data yazma modunda, H ise data okuma modunda kurulur.
Göndereceğin ve okuyacağın byte sayısı kullandığın entegrenin protokolüna bağlıdır. Örneğin sen bir kontol byte gönderirsin cihaz sana 3 byte data gönderir. Bu gibi durmlarda programda peş peşe 3 adet okuma yapman gerekiyor.
Ama bende asm de I2C yi hiç kullanamadım. Ve kullanmayıda düşünmüyorum Tabi senin durum biraz farklı ödev durumları
Evet hoca ya haklısın ödev olmasa yaz I2CWRITE bitti işte ama onlarda herşeyi kodla yaptığında (donanım kullanmadan) hafızada çok yer kaplıyor dostum tek ilgilenen sen çıktın sağol sanırım cevabımı burda bulamıycam o zaman sana son bir sormak istiyorum ben ASM kullandığım kadar PBP de kullanıyorum hatta karışık kullanıyorum bir çok uygulamamda PIC16F877 hafızası bile yetmiyor ve mecburen programın büyük bir kısmını ASM ile yazıyorum işte bu yüzden 18FXX ailesine geçmek istiyorum PBP'yazdığım komutları 18F452 gibi bir denetçide kullanabilir miyim zaten çoğu işlem hep kodla donanım modüllerini yeri geldikçe kullanıyoruz önemli olan hafıza yani ben 18FXX ailesine geçerken PBP de yazdıklarım bu chipte çalışır mı
Kullanacağın kodlarda bir değişiklik olmayacak. Ama kullandığın PBP derleyisicinin yeni veya 18F serisini desteklemesi gerekiyor. Yani 18F serisinde kullanacağın chip için konfigrasyon bitleri hafıza boyutları gibi tanımların derleyici için önceden tanımlanmış olması veya header dosyalarının yüklenmesi gerekir. PBP de bir yerlerde destelediği PIc ailesini yazması gerekir. PBP kullanmadığım için daha fazla bişey demem zor.
Bu arada şu kadarını söyleyeyim 16F877 ile 18F452 aynı pin yapısına sahip. 877 ile yapılmış bir devreye 452 takarsan çalışır. Tabi 877 için yazdığın programın başında device=18F452 yapıp tekrar derlemen gerekiyor.
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesaja 1 cevap geldi. Cevapları Gizle
Her I2C entegresi aynı şekilde çalışmaz.
C deki kod derleyici tarafından asm olarakda çıktı verir , sadece derleyiciyi ayarlayın.
Bu mesaja 1 cevap geldi. Cevapları Gizle
Port6 = 0x06 gibi yada portb nin 3. biti = 0x06.3 gibi
programın başından ilk RETURN yazılan yere kadar olan yer i2c ile haberleşme alt programıdır.
.................... #use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
0004: MOVLW 08
0005: MOVWF 78
0006: NOP
0007: BCF 07.3
0008: BCF 20.3
0009: MOVF 20,W
000A: BSF 03.5
000B: MOVWF 07
000C: BCF 03.5
000D: RLF 23,F
000E: BCF 07.4
000F: BTFSS 03.0
0010: GOTO 017
0011: BSF 20.4
0012: MOVF 20,W
0013: BSF 03.5
0014: MOVWF 07
0015: GOTO 01B
0016: BCF 03.5
0017: BCF 20.4
0018: MOVF 20,W
0019: BSF 03.5
001A: MOVWF 07
001B: NOP
001C: BCF 03.5
001D: BSF 20.3
001E: MOVF 20,W
001F: BSF 03.5
0020: MOVWF 07
0021: BCF 03.5
0022: BTFSC 07.3
0023: GOTO 026
0024: BSF 03.5
0025: GOTO 021
0026: DECFSZ 78,F
0027: GOTO 006
0028: BCF 07.3
0029: BCF 20.3
002A: MOVF 20,W
002B: BSF 03.5
002C: MOVWF 07
002D: NOP
002E: BCF 03.5
002F: BSF 20.4
0030: MOVF 20,W
0031: BSF 03.5
0032: MOVWF 07
0033: BCF 03.5
0034: BSF 20.3
0035: MOVF 20,W
0036: BSF 03.5
0037: MOVWF 07
0038: BCF 03.5
0039: BTFSC 07.3
003A: GOTO 03D
003B: BSF 03.5
003C: GOTO 038
003D: CLRF 78
003E: BTFSC 07.4
003F: BSF 78.0
0040: BCF 07.3
0041: BCF 20.3
0042: MOVF 20,W
0043: BSF 03.5
0044: MOVWF 07
0045: BCF 03.5
0046: BCF 07.4
0047: BCF 20.4
0048: MOVF 20,W
0049: BSF 03.5
004A: MOVWF 07
004B: BCF 03.5
004C: RETLW 00
004D: MOVLW 08
004E: MOVWF 24
004F: MOVF 77,W
0050: MOVWF 25
0051: BSF 20.4
0052: MOVF 20,W
0053: BSF 03.5
0054: MOVWF 07
0055: BCF 03.5
0056: BSF 20.3
0057: MOVF 20,W
0058: BSF 03.5
0059: MOVWF 07
005A: BCF 03.5
005B: BTFSC 07.3
005C: GOTO 05F
005D: BSF 03.5
005E: GOTO 05A
005F: BTFSC 07.4
0060: BSF 03.0
0061: BTFSS 07.4
0062: BCF 03.0
0063: RLF 78,F
0064: BCF 20.3
0065: MOVF 20,W
0066: BSF 03.5
0067: MOVWF 07
0068: BCF 03.5
0069: BCF 07.3
006A: DECFSZ 24,F
006B: GOTO 051
006C: BSF 20.4
006D: MOVF 20,W
006E: BSF 03.5
006F: MOVWF 07
0070: BCF 03.5
0071: BCF 07.4
0072: MOVF 25,W
0073: BTFSC 03.2
0074: GOTO 07A
0075: BCF 20.4
0076: MOVF 20,W
0077: BSF 03.5
0078: MOVWF 07
0079: BCF 03.5
007A: NOP
007B: BSF 20.3
007C: MOVF 20,W
007D: BSF 03.5
007E: MOVWF 07
007F: BCF 03.5
0080: BTFSC 07.3
0081: GOTO 084
0082: BSF 03.5
0083: GOTO 07F
0084: BCF 07.3
0085: BCF 20.3
0086: MOVF 20,W
0087: BSF 03.5
0088: MOVWF 07
0089: BCF 03.5
008A: BCF 07.4
008B: BCF 20.4
008C: MOVF 20,W
008D: BSF 03.5
008E: MOVWF 07
008F: BCF 03.5
0090: BCF 0A.3
0091: BCF 0A.4
0092: GOTO 0F5 (RETURN)
*
009B: MOVLW FF
009C: BCF 03.5
009D: MOVWF 20
....................
....................
....................
....................
.................... void main()
.................... {
*
0093: CLRF 04
0094: MOVLW 1F
0095: ANDWF 03,F
0096: BSF 03.5
0097: BSF 1F.0
0098: BSF 1F.1
0099: BSF 1F.2
009A: BCF 1F.3
.................... int data;
.................... int address;
....................
....................
.................... setup_adc_ports(NO_ANALOGS);
*
009E: BSF 03.5
009F: BSF 1F.0
00A0: BSF 1F.1
00A1: BSF 1F.2
00A2: BCF 1F.3
.................... setup_adc(ADC_OFF);
00A3: BCF 03.5
00A4: BCF 1F.0
.................... setup_psp(PSP_DISABLED);
00A5: BSF 03.5
00A6: BCF 09.4
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
00A7: MOVF 01,W
00A8: ANDLW C7
00A9: IORLW 08
00AA: MOVWF 01
.................... setup_timer_1(T1_DISABLED);
00AB: BCF 03.5
00AC: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1);
00AD: MOVLW 00
00AE: MOVWF 78
00AF: MOVWF 12
00B0: MOVLW 00
00B1: BSF 03.5
00B2: MOVWF 12
....................
....................
.................... address=10;
00B3: MOVLW 0A
00B4: BCF 03.5
00B5: MOVWF 22
....................
.................... i2c_start();
00B6: BSF 20.4
00B7: MOVF 20,W
00B8: BSF 03.5
00B9: MOVWF 07
00BA: BCF 03.5
00BB: BSF 20.3
00BC: MOVF 20,W
00BD: BSF 03.5
00BE: MOVWF 07
00BF: BCF 03.5
00C0: BCF 07.4
00C1: BCF 20.4
00C2: MOVF 20,W
00C3: BSF 03.5
00C4: MOVWF 07
00C5: BCF 03.5
00C6: BCF 07.3
00C7: BCF 20.3
00C8: MOVF 20,W
00C9: BSF 03.5
00CA: MOVWF 07
00CB: MOVLW 00
00CC: MOVWF 00
....................
.................... i2c_write(0xa0); // Device address
00CD: MOVLW A0
00CE: BCF 03.5
00CF: MOVWF 23
00D0: CALL 004
....................
.................... i2c_write(address); // Data to device
00D1: MOVF 22,W
00D2: MOVWF 23
00D3: CALL 004
....................
.................... i2c_start(); // Restart
00D4: BSF 20.4
00D5: MOVF 20,W
00D6: BSF 03.5
00D7: MOVWF 07
00D8: BCF 03.5
00D9: BSF 20.3
00DA: MOVF 20,W
00DB: BSF 03.5
00DC: MOVWF 07
00DD: BCF 03.5
00DE: BTFSC 07.3
00DF: GOTO 0E2
00E0: BSF 03.5
00E1: GOTO 0DD
00E2: BCF 07.4
00E3: BCF 20.4
00E4: MOVF 20,W
00E5: BSF 03.5
00E6: MOVWF 07
00E7: BCF 03.5
00E8: BCF 07.3
00E9: BCF 20.3
00EA: MOVF 20,W
00EB: BSF 03.5
00EC: MOVWF 07
00ED: MOVLW 00
00EE: MOVWF 00
....................
.................... i2c_write(0xa1); // to change data direction
00EF: MOVLW A1
00F0: BCF 03.5
00F1: MOVWF 23
00F2: CALL 004
....................
.................... data=i2c_read(0); // Now read from slave
00F3: CLRF 77
00F4: GOTO 04D
00F5: MOVF 78,W
00F6: MOVWF 21
....................
.................... i2c_stop();
00F7: BCF 20.4
00F8: MOVF 20,W
00F9: BSF 03.5
00FA: MOVWF 07
00FB: NOP
00FC: BCF 03.5
00FD: BSF 20.3
00FE: MOVF 20,W
00FF: BSF 03.5
0100: MOVWF 07
0101: BCF 03.5
0102: BTFSC 07.3
0103: GOTO 106
0104: BSF 03.5
0105: GOTO 101
0106: NOP
0107: NOP
0108: NOP
0109: BSF 20.4
010A: MOVF 20,W
010B: BSF 03.5
010C: MOVWF 07
edit: Buda sade c kodları
void main()
{
int data;
int address;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
address=10;
i2c_start();
i2c_write(0xa0); // Device address
i2c_write(address); // Data to device
i2c_start(); // Restart
i2c_write(0xa1); // to change data direction
data=i2c_read(0); // Now read from slave
i2c_stop();
}
< Bu mesaj bu kişi tarafından değiştirildi rafet32 -- 7 Ağustos 2005, 0:55:38 >
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesaja 2 cevap geldi. Cevapları Gizle
Birincisi 24C32 ikincisi 24C512.Edindiğim tecrübeye göre I2C programı aynı da olsa data yazmalarında problem yaşadım.
Sadece 100kHz ile çalışan IC var 1Mhz dede.Tabi 1Mhz de çalışan 100 kHz dede çalışıyor ama 100kHz de çalışan 1Mhzde çalışmıyor.Entegreyi sormamın nedeni bu.
I2C haberleşme rutinlerini Microchipin sayfaları olduğu kadar I2C entegrelerin dökümanlarını iyice inceleyerek yazabilirsin.
Kod ekliyecektim ama Rafet32 arkadaşımız gayet güzel bir kod yazmış.
Kodu inceleyerek epey yol alırsın.Benim kodda buna yakın olur.
Evet C yada PBP gibi programlar genelde esnek yapıda kod üretirler.
Yukarıdaki kod örneğinde I2C pinleri olarak C4 ve C3 pinleri master ve hızlı modda kullanıldı. Bunlar 877 nin donanımsal I2C haberleşeme pinleridir.
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
Evet dediğin gibi kontrol bytenin 0. biti data okuma yönünü değiştirir. L ise I2C entegresi data yazma modunda, H ise data okuma modunda kurulur.
Göndereceğin ve okuyacağın byte sayısı kullandığın entegrenin protokolüna bağlıdır. Örneğin sen bir kontol byte gönderirsin cihaz sana 3 byte data gönderir. Bu gibi durmlarda programda peş peşe 3 adet okuma yapman gerekiyor.
Ama bende asm de I2C yi hiç kullanamadım. Ve kullanmayıda düşünmüyorum
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu arada şu kadarını söyleyeyim 16F877 ile 18F452 aynı pin yapısına sahip. 877 ile yapılmış bir devreye 452 takarsan çalışır. Tabi 877 için yazdığın programın başında device=18F452 yapıp tekrar derlemen gerekiyor.
Bu mesaja 1 cevap geldi. Cevapları Gizle