1. sayfa
| 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(); } |
| 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. |
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 |
1. sayfa
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye Ol Şimdi DeğilÜye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.