Lojik Seviye Dönüştürücü neden çalışmadı?

Başlatan Cemre., 03 Aralık 2015, 16:31:34

Cemre.

// Durum LED'leri
#define LED1 LATE.B0
#define LED2 LATE.B1
#define LED3 LATE.B2

// LCD bağlantıları tanımlanıyor
sbit LCD_RS at  LATD.B4;
sbit LCD_EN at  LATD.B5;
sbit LCD_D4 at  LATD.B0;
sbit LCD_D5 at  LATD.B1;
sbit LCD_D6 at  LATD.B2;
sbit LCD_D7 at  LATD.B3;

sbit LCD_RS_Direction at TRISD4_bit;
sbit LCD_EN_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD0_bit;
sbit LCD_D5_Direction at TRISD1_bit;
sbit LCD_D6_Direction at TRISD2_bit;
sbit LCD_D7_Direction at TRISD3_bit;
// LCD bağlantıları tanımlandı

void init_mcu(){
     ADCON1     = 0x0F;                          // Analog özellikli tüm pinler Dijital G/Ç yapıldı.
     CMCON      = 0x07;                          // Karşılaştırıcılar kapatıldı.
     TRISB      = 0xFF;
     TRISE      = 0x00;                          // PORTE çıkış yapıldı.
}

void check_device(unsigned short dev_address){
 I2C1_Start();
 while(I2C1_Wr(dev_address)){
  Lcd_Out(2,1,"Device not found");
  delay_ms(100);
  LED3 =~ LED3;
 };
 Lcd_Out(2,1,"Device is OK");
 I2C1_Stop();
}

void main() {
     init_mcu();
     LED1 = 1;
     Lcd_Init();                         // LCD Kurulumu
     Lcd_Cmd(_LCD_CLEAR);                // Ekranı Temizle
     Lcd_Cmd(_LCD_CURSOR_OFF);           // İmleç Kapalı
     LED2 = 1;
     I2C1_Init(100000);
     Delay_ms(100);
     Lcd_Out(1,1,"START");
     check_device(0x68);
     Delay_ms(200);
     Lcd_Out(1,1,"FINISH");
}


Bu deneme amacıyla basite indirgemeye çalıştığım ancak sonuç alamadığım kodum hocam. Gördüğünüz bir hata ya da eksiklik var mı acaba?

apocalips

#16
Arkadaşlar bende aynı sorunu yaşıyorum.
Pic ile mpu6050 haberleşmiyor. I2cin komutunu kullarak aldığım verilerin tamamı 2x16 lcd'ye desimal olarak 4112 sayısını döndürüyor.
Bu işi nasıl çözeceğiz? acil yardım lütfen.

Kullandığım basit kod örneği http://www.sonsivri.to/forum/index.php?topic=59978.0 sitesindekidir.
Herşeyi denedim sonuç yok!
Kullandığım pic 16f876a.

Hatta SCL ile SDA bağlantılarını bile çaprazladım. her halükarda sonuç aynı :(

Gökhan BEKEN

Alıntı yapılan: Kabil ATICI - 03 Aralık 2015, 22:57:09
MPU-6050 çip olarak değilde modül olarak kullanıyorsan, modülünü veya şemasını bulabilirsen şemasını bir incele üzerinde 3.3V regülatör olabilir.
Aynı sorun başıma gelmişti hocam. Dediğiniz gibi regülatörden dolayı 5v ile beslemek gerekiyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

apocalips

Gökhan bey nasıl çözdünüz sorunu daha detaylı anlatabilir misiniz?
Devre şeması falan var mı?

Yukarıda verdiğim sitede satın almış olduğum mpu6050'nin resmi ve kartının devre şeması gözüküyor.
3.3Vluk regülatör kullanılmış durumda. bu regülatörü sökersem gyro yanar!
bunun dışında da aynı 5V ile hem regülatörü hemde gyronun regüllatörünü besliyorum.

Önerdiğiniz nasıl bir çözüm? Araya basit bir lojik seviye dönüştürücü de koydum. yine olmadı?

Gökhan BEKEN

Hocam çip 3.3v ile çalışıyor ama modülde vcc pininin regülatöre bağlı olduğuna dikkat etmemiştim. 3.3v verdiğimde çalışıyordu ama 10 saniye sürmeden kapanıyordu, mcu ya reset atmam gerekiyordu düzelmesi için. Sonradan regülatör olduğunu farkettim ve vcc pinine 5v verince kilitlenmeler olmamaya başlamıştı.
Yani aslında ortadaki sorun benden kaynaklanıyordu.
Eğer siz de benim gibi yaptığınız halde başka bir sorunla karşılaşıyorsanız regülatörün çıkışını bir ölçün bence. Ya da yazılımınızı kontrol edin derim.
Özel mesaj okumuyorum, lütfen göndermeyin.

apocalips

#20
mpu6050'ye gerekli 3.3 V ulaşıyor. MPU6050 kartı ve pic aynı besleme kartından 5V ile besleniyor.
İ2Cin komutunu kullanarak açıları okuduğum zaman 4112 gibi bir rakam görüyorum. Who am i okumaya çalıştığım zaman da 16 gibi bir değer dönüyor.
Ancak I2cout kullanıp mpu6050'yi uyandırmaya çalışıyorum. buna rağmen hala aynı rakamları okuyorum. değişen hiçbirşey yok!
pic olarak da 18f2620 kullanıyorum.

Cemre.

Alıntı yapılan: apocalips - 11 Eylül 2016, 11:47:03
mpu6050'ye gerekli 3.3 V ulaşıyor. MPU6050 kartı ve pic aynı besleme kartından 5V ile besleniyor.
İ2Cin komutunu kullanarak açıları okuduğum zaman 4112 gibi bir rakam görüyorum. Who am i okumaya çalıştığım zaman da 16 gibi bir değer dönüyor.
Ancak I2cout kullanıp mpu6050'yi uyandırmaya çalışıyorum. buna rağmen hala aynı rakamları okuyorum. değişen hiçbirşey yok!
pic olarak da 18f2620 kullanıyorum.

Açıları ne ile okuyorsunuz? LCD mi UART mı?

Şu dosyadaki projeyi bir düzenleyip dener misiniz? 18F4550 için çalışıyordu.
http://s9.dosya.tc/server/zm2vp4/usart.rar.html

apocalips

#22
Sn Cemre ben malesef C bilmiyorum.

Proton basic ile yazdığım kodlar aşağıdadır.

kod:
Device = 18F2620
Declare Xtal = 20            ' Kristal frekansı: 20 MHz
CMCON = 7                    ' Tüm comparatorlar devre dışı
Declare All_Digital = True   '
TRISA=%00111111                 
TRISB=0                         
TRISC=%01000000

Declare LCD_DTPin = PORTB.4
Declare LCD_RSPin = PORTB.1
Declare LCD_ENPin = PORTB.0
Declare LCD_Interface = 4
Declare LCD_Lines = 2
Declare LCD_Type = 0
Declare LCD_CommandUs = 2000
Declare LCD_DataUs = 50


Dim READAX  As Word
Dim READAY  As Word
Dim READAZ  As Word
Dim READX   As Word
Dim READY   As Word
Dim READZ   As Word
Dim READT   As Word
Dim READT1  As Word
       
Symbol SDA = PORTC.4  ' I2C data pin. Pullup connection is required. You can change, according your board ports
Symbol SCL = PORTC.3  ' I2C clock pin. Pullup connection is required. You can change, according your board ports
Symbol W_DATA = $D2   'Used to perform a Write operation
Symbol R_DATA = $D3   'Used to perform a Read operation
Symbol PWR_M1 = $6B   'Power Management Register 1.This register allows the user to configure the power mode and clock source. It also provides a bit for resetting the entire device, and a bit for disabling the temperature sensor.
Symbol PWR_M2 = $6C   'Power Management Register 2.This register allows the user to configure the frequency of wake-ups in Accelerometer Only Low Power Mode. This register also allows the user to put individual axes of the accelerometer and gyroscope into standby mode.
Symbol CONF_R = $1A   'Congiguration Register.This register configures the external Frame Synchronization (FSYNC) pin sampling and the Digital Low Pass Filter (DLPF) setting for both the gyroscopes and accelerometers.
Symbol G_CONF = $1B   'Gyro Configuration Register.This register is used to trigger gyroscope self-test and configure the gyroscope full scale range.
Symbol A_CONF = $1C   'Accelerometer Congiguration Register. This register is used to trigger accelerometer self test and configure the accelerometer full scale range. This register also configures the Digital High Pass Filter (DHPF).
Symbol XA_MSB = $3B   'Read Register, Output of accelerometer X MSB 8-bit value.
Symbol XA_LSB = $3C   'Read Register, Output of accelerometer X LSB 8-bit value.
Symbol YA_MSB = $3D   'Read Register, Output of accelerometer Y MSB 8-bit value.
Symbol YA_LSB = $3E   'Read Register, Output of accelerometer Y LSB 8-bit value.
Symbol ZA_MSB = $3F   'Read Register, Output of accelerometer Z MSB 8-bit value.
Symbol ZA_LSB = $40   'Read Register, Output of accelerometer Z LSB 8-bit value.
Symbol TEMP_M = $41   'Read Register, Output of temperature MSB 8-bit value.
Symbol TEMP_L = $42   'Read Register, Output of temperature LSB 8-bit value.
Symbol XG_MSB = $43   'Read Register, Output of gyro X MSB 8-bit value.
Symbol XG_LSB = $44   'Read Register, Output of gyro X LSB 8-bit value.
Symbol YG_MSB = $45   'Read Register, Output of gyro Y MSB 8-bit value.
Symbol YG_LSB = $46   'Read Register, Output of gyro Y LSB 8-bit value.
Symbol ZG_MSB = $47   'Read Register, Output of gyro Z MSB 8-bit value.
Symbol ZG_LSB = $48   'Read Register, Output of gyro Z LSB 8-bit value.

I2COut SDA,SCL,W_DATA,PWR_M1,[%10000000] 'RESITER 6B CONFIG (PWR MANAGEMENT)  MPU6050 reset
DelayMS 100
I2COut SDA,SCL,W_DATA,PWR_M1,[%00000000]  'RESITER 6B CONFIG (PWR MANAGEMENT)  MPU6050 START
DelayMS 100
I2COut SDA,SCL,W_DATA,CONF_R,[%00000001]  'RESITER 1A CONFIG (FILTER CONFIG)
DelayMS 10
I2COut SDA,SCL,W_DATA,G_CONF,[%00000000]  'RESITER 1B CONFIG (GYRO CONFIG)
DelayMS 10
I2COut SDA,SCL,W_DATA,A_CONF,[%00010000]  'RESITER 1C CONFIG (ACCELERATOR CONFIG)
DelayMS 10


READI2C:

I2CIn SDA,SCL,R_DATA,XA_MSB,[READAX.HighByte]  'The first 8 bits of 16-bit X Axis
I2CIn SDA,SCL,R_DATA,XA_LSB,[READAX.LowByte ]  'The second 8 bits of 16-bit X Axis
I2CIn SDA,SCL,R_DATA,YA_MSB,[READAY.HighByte]
I2CIn SDA,SCL,R_DATA,YA_LSB,[READAY.LowByte ]
I2CIn SDA,SCL,R_DATA,ZA_MSB,[READAZ.HighByte]
I2CIn SDA,SCL,R_DATA,ZA_LSB,[READAZ.LowByte ]
I2CIn SDA,SCL,R_DATA,TEMP_M,[READT.HighByte ]
I2CIn SDA,SCL,R_DATA,TEMP_L,[READT.LowByte  ]
I2CIn SDA,SCL,R_DATA,XG_MSB,[READX.HighByte] 
I2CIn SDA,SCL,R_DATA,XG_LSB,[READX.LowByte ]
I2CIn SDA,SCL,R_DATA,YG_MSB,[READY.HighByte]
I2CIn SDA,SCL,R_DATA,YG_LSB,[READY.LowByte ]
I2CIn SDA,SCL,R_DATA,ZG_MSB,[READZ.HighByte]
I2CIn SDA,SCL,R_DATA,ZG_LSB,[READZ.LowByte ]
READT1 = (READT / 340 + 37)-192

Print $FE,1, "X=",SDec READAX,"Xg=",SDec READX
Print $FE,$C0, "Z=",SDec READAZ,"T=",SDec READT1
DelayMS 100
       
GoTo READI2C:
End



Bu kodları kullanıyorum.

lojik gerilim seviyesi dönüştürücü devre örneğini de kurdum. ama nafile. LCD'de sadece 4112 görülüyor :(

apocalips

Arkadaşlar şimdi farklı birşey daha denedim. pic'in girişine 10k direnç üzerinden 5V uyguladım. ekranda yine 4112 rakamını gördüm.
Anladığım kadarıyla ben bu alet ile hiç haberleşemiyorum.
Bununla ilgili olarak lojik seviye kaydırma uygulamasından da sonuç alamadım.
Elimde 1 adet daha mpu6050 vardı onuda denedim onda da aynı sonuç :(

Şimdi farklı lojik seviye kaydırma uygulamalarını araştırıyorum.
Öneri ve görüşlerinizi rica ederim.

Saygılarımla;

apocalips

Arkadaşlar haberleşemiyorum. Kafayı yemek üzereyim. Ne sitelerde adam gibi bir devre şeması var, ne de kod satırı.
Arduino haricinde pic ile  yapabilen 1 kişi gördüm sadece.
Yok mu bana yardım edebilecek bir vatan evladı!!!

35Murat35

#25
Merhaba iyi bayramlar  :)
Öncelikle şu voltaj olayını halletmek lazım. Elinde pickit3 varsa 3.3v'u kitten alabilirsin. 18F4550 ve LCD 3.3v'da çalışabiliyo. Modülde 3v3 olduğuna göre hepsini aynı voltajla çalıştırabilirsin. Hiç voltaj farklarıyla uğraşma. I2C pinlerinide (SCL ve SDL) 1-10K arası iki dirençle pullup yapabilirsin.
Şurdaki örneğide modifiye edip kullanabilirsin. http://libstock.mikroe.com/projects/view/1002/mpu-imu-click-example
Birde pic'i kaç mhz kristalle çalıştırıyosun. Konfigürasyon penceresinin görüntüsünü yollar mısın?

Ek olarak : Eğer pickit'den besliceksen LCD'nin ışıklandırmasını bağlama, lcdnin ışığını yakınca ne kadar akım çekiyo bilmiyorum. LCD'nin modelini yazarsan onunda dökümanına bakarız. Belki sendeki 3v3 da çalışmıyordur.

Cemre.

#26
https://www.picproje.org/index.php/topic,62384.msg483235.html#msg483235

Şu konuyu ve alt konularını inceleyin. Ben verdiğiniz koda biraz baktım ancak pek aşina değilim o yüzden anlayamıyorum. Siz yeni bir konu açın isterseniz Proton kategorisine, bir de şema vs verirseniz daha hızlı çözülür sorun. Ben bu kodda cihaz adresi nerede tanımlanmış göremedim. Adres olarak 0x68 kullanıyorsanız bir de 0xD0 olarak deneyin. Size gönderdiğim dosyada header dosyası içinde gerekli tanımlamalar yapılmış. Bu şekilde bir kullanım daha doğru sanıyorum. Siz yinede yeni bir konu açın oradan elbet Proton bilen birileri yol gösterecektir.

Kolay gelsin. İyi çalışmalar.

Şimdi gördüm

Symbol W_DATA = $D2   'Used to perform a Write operation
Symbol R_DATA = $D3   'Used to perform a Read operation

Eğer Adres piniyle oynamadıysanız hata burada.

apocalips

Herkese iyi bayramlar :)

Sn.35Murat35
Cevabın için teşekkür ederim. Ben programlayıcı olarak brenner8 kullanıyorum. Bu programlayıcı 5V ile çalışıyor.
Söylediğin gibi tüm devreyi 3.3V ile besledim. Ancak LCD çalışmadı. bildiğimiz standart 2x16 lcd.
Satın aldığım MPU6050 devresinde SDA ve SCL portları 3.3V üzerinden 4.7K dirençler ile pull up yapılmış durumda. Arada lojik kaydırıcı kullanmadan 5V tarafı ile bağlantı kurmayı denedim. Hatta 5V tarafı için 10K'lık dirençler de yerleştirmeyi denedim :) Sonuç alamadım.

Pic18f2620'yi de 20MHz kristal ile çalıştırıyorum. Protonda kullanılan port yavaşlatma-hızlandırma komutunu kullanarak da denedim.

Ancak hiçbirinden sonuç alamadım. Neyse malum bayramda açık elektronikçi olmadığı için kendi elimdeki malzemeler ile lojik shifter yapmayı denedim.
NPN transistörler ile yapılan, mosfet ile yapılan shifterlardan yaptım. Hatta optokuplör ile kendim birkaç çeşit devre tasarladım ancak sonuç yine hüsran.

Artık emin olmamakla birlikte bss138 alıp piayada bulunan shifterlardan yapacağım. Artık bakacağız.

Sn. CEMRE
Sizin de cevabınız için teşekkür ederim. Gönderdiğiniz kısımların tamamını okumuştum ancak uyarınız üzerine tekrar gözden geçirdim. Ben sorunun donanımsal olduğunu düşünüyorum. Çünkü kullandığım hiçbir komut satırında 4112 haricinde geri dönüş sağlayamadım. Hatta bu da bir geri dönüş değil! Eğer PİC'in SDA portuna direk sabit 5V uygularsanız ekranda yine 4112 yazısını görüyorsunuz.

Neyse söylediğiniz gibi

Symbol W_DATA = $D2   'Used to perform a Write operation
Symbol R_DATA = $D3   'Used to perform a Read operation

kısımlarında hata olabilir. D0 ve D1'den haberleşemeyince yaptığım araştırmalarda 68 69 D0 D1 D2 D3 kullanıldığını gördüm. bu nedenle yaptığım denemerden biridir sadece bu. çok dikkate almayın bu kodu lütfen.

Özellikle "Who Am I" ($75) almaya çalıştığımda 104 görmem gerekirken hala 4112 görüyorum. MPU ile haberleşmeyi sağladığımı bu şekilde anlayabileceğim.

Logic Shifter yapıp denedikten sonra cevabı sizler ile paylaşırım.

Sizler shifter kullandınız mı? Ne tavsiye edersiniz?

apocalips

Arkadaşlar selamlar.

Lojik seviye dönüştürücüyü yaptım. haberleşmeyi "Declare I2C_Slow_Bus On" olarak ayarladım. haberleşme olmadı.
Ancak haberleşmenin kontrolünü yapmak için SDA ve SCL'ye osiloskop bağladığım zaman WHO_AM_I kodunda ilk cevabımı 104 olarak aldım :)

Bingo !!! doğru cevap :)

Şimdi sorum şu. Benim tahminim bu habeleşme hattında bir şekilde ortaya çıkan yüksek miktarda gürültü var ve osiloskop bunu filtreledi. Nasıl düzeltebilirim?
Soru 2. sizin başka bir öneriniz var mı?

Teşekkürler.

mehmet

Hem LV hem de HV yollarına 1K
ile pull-up yapıp deneyiniz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr