Şimdi Ara

ACİL I2C

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
12
Cevap
0
Favori
724
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 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



  • Beyler yokmu kimsede yardım etcek kaç kişi okumuş birisi cevap yazmamış ya
  • Dostum asm değil de c'de istersen gönderebilirim. Niçin asm ödev falanmı?
  • 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.


    .................... #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 >




  • 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.
  • quote:

    Orijinalinden alıntı: PuPPeT

    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.
  • Eyvallah dostum sağolasın
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.