Microbasic ile Harici ADC kullanımı ile ilgili yardım !!!

Başlatan 35badboy35, 17 Ocak 2012, 19:59:05

35badboy35

Arkadaşlar selamlar. Ben pic18F4620'i 16 Bit'lik harici adc ile iletişime geçirmek istiyorum. Microbasic kullanıyorum. Bunun için Microbasite SPI iletişimi nasıl kullanabilirim yardımcı olabilirseniz sevinirim. Sizlere konu ile ilgili detay vermeye çalışayım.

ADC : AD977 (16Bit, Anolog Devices Firmasının bir ürünü)
Pic : 18F4620

Yüksek lisans yapıyorum ve bir çalışmam için bu adc ile analog bilgiyi dijitale dönüştürdükten sonra pic ile bu dijital veriyi okumam lazım. Neden 16Bit diye soracak olursanız çalışmanın hassasiyetinden dolayı.

Benim Microbasic te kendi yazdığım kod aşağıda:


program EXTERNAL_ADC_READ

' ADC module connections
dim Chip_Select as sbit at RC0_bit
Soft_I2C_Scl as sbit at RC3_bit
Soft_I2C_Sda as sbit at RC4_bit

dim Chip_Select_Direction as sbit at TRISC0_bit
Soft_I2C_Scl_Direction as sbit at TRISC3_bit
Soft_I2C_Sda_Direction as sbit at TRISC4_bit
' End ADC module connections



' Lcd module connections
dim LCD_RS as sbit at RB4_bit
LCD_EN as sbit at RB5_bit
LCD_D4 as sbit at RB0_bit
LCD_D5 as sbit at RB1_bit
LCD_D6 as sbit at RB2_bit
LCD_D7 as sbit at RB3_bit

LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit
' End Lcd module connections

dim convertion1 as byte
convertion2 as byte
convertion3 as word

dim LCD as string[16]

'--------------------- Read ADC -----------------------------------------
sub procedure Read_ADC()
Chip_Select = 0 ' Select ADC chip
Delay_us( 8 )
Chip_Select = 1 ' Deselect ADC chip
Soft_I2C_Start() ' Issue start signal
convertion1 = Soft_I2C_Read(1)
convertion2 = Soft_I2C_Read(0)
Soft_I2C_Stop() ' Issue stop signal}
end sub
'------------------------------------------------------------------------

main:

CMCON=0x07
ADCON0.0=0
ADCON1=%00001111

TRISA=0
TRISB=0
TRISC=%00000010
TRISD=%01111111
TRISE=0

PORTA=0
PORTB=0
PORTC=%00000001
PORTD=0
PORTE=0

convertion1 = 0
convertion2 = 0
convertion3 = 0

Soft_I2C_Init() ' Initialize Soft I2C communication

Lcd_Init()
Lcd_Cmd(_LCD_CURSOR_OFF)

Delay_ms(1000)

WordToStr(convertion3,LCD)
Lcd_Out(1, 1, LCD)

BUTON_BAK:

IF PORTD.0=1 THEN
BUTON_KONTROL:
IF PORTD.0=0 THEN
Read_ADC()
convertion3 = convertion1 * convertion2
WordToStr(convertion3,LCD)
Lcd_Out(1, 1, " ")
Lcd_Out(1, 1, LCD)
GOTO BUTON_BAK
ELSE
GOTO BUTON_KONTROL
END IF
ELSE
GOTO BUTON_BAK
END IF

end.


Bu kodda gördüğünüz gibi ben burada I2C protokolünü kullanmaya çalıştım. Fakat dijital bilgi 16bit yani 65000 küsur. Fakat microbasic te I2C de bilgi byte olarak alınabildiğinden üst üste iki kere read yaptırıyorum. Fakat uygun bir sonuç alamadım bu kodlarla. ADC'nin girişini toprağa bile versem (yani 0 volta) yinede saçma sapan değerler okuyorum (Örneğin 50000, 28000, vs... gibi).

Ben bu işi SPI iletişim ile nasıl yapabilirim ? Veya varsa microbasicte olmak koşulu ile başka nasıl halledebilirim?

Konu ile ilgili son detaylarımda şöyle olacak:

ADC'nin

R/C pini Pic'in PORTC.0 pini ile denetleniyor (Benim buradaki uygulamamda)
ADC'nin CS pini toprakta
ADC'nin DATA pini Pic'in PORTC.4 ile denetleniyor
ADC'nin DATACLK pini Pic'in PORTC.3 ile denetleniyor

Konu ile ilgili bana yardımcı olabilecek arkadaşlar varsa çok sevinirim. Şimdiden herkeze çok teşekkür ediyorum. Herkeze iyi çalışmalar, iyi günler

drmp

datshetteki diagram i2c ye benzemiyor o yüzden çalışmamış olabilir
microbasic arasırada olsa kullanıyorum
spi alış veriş de 8 bit olmakta ama 16 bit almanız sorun çıkarmaz
yazdığınız kodu(read adc ) kısmını spi olarak düzenleyip tekrar deneyin
i2c transferinde  rw ve ack bitleri olduğundan garip değerler görme ihtimaliniz var

ilhan_mkp

http://www.mikroe.com/eng/chapters/view/57/chapter-9-spi-module/#ch9.1

üstat bu sayfa konuyla alakalı bilgiler içeriyor.
microbasic kullanmadığım için ancak bu kadar :'(