arkadaşlar dedektördeki potları micro işlemci ile kontrol etmek istiyorum...bunun içinde digital pot arayışlarına giriştim ve en sonunda int-el elektronik'te mcp-41010 kodlu entegreden buldum...yanlız bana uygulama için örnek kod lazım.birde daha önce bu entegreyi kullananların görüşlerini bekliyorum...bu tarz entegreleri başka nereden bulabilirim...çünki benim bulduğum sadece 10k dual pot olarak geçiyor. birde ist. başka bir firmaya ait direnci 200k-100k-20k-50k gibi entegre bulabileceğim bir yer varmı acaba_?
birde elinde basic veya protonda yazılmış bir örnek varsa yardımcı olabilirmi_?
datasheet'i incelemek isteyenler:
http://ww1.microchip.com/downloads/en/devicedoc/11195c.pdf
iyi çalışmalar...
şöyle kodlar var ,picbasic ,
çalışırmı bilmiyorum .
'16F628A
cmcon=7
define osc 8
res var byte
command var byte
SI var porta.0 'SI
CLK var porta.3 'CLK
CS var porta.2 'CS
LED var porta.1 'LED
high porta.2
command=19
high LED
pause 1000
low LED
pause 1000
high LED
repeatit:
res=256
low CS
shiftout SI,CLK,1,[%00010011\8,res\8]
HIGH CS
pause 5000
res=128
low CS
shiftout SI,CLK,1,[command,res]
HIGH CS
pause 5000
goto repeatit
end
birde bu
'
' Hardware configuration
' ======================
TRISC=0
'
' Hardware connection
' ===================
CS VAR PORTC.0
CLK VAR PORTC.1
SI VAR PORTC.2
'
' Variables definition
' ===================
Wiper var byte
'
' Constants definition
' ====================
MSBFIRST CON 1
WriteOnPot0 con %00010001
'
' Software/Hardware initialisation
' ================================
cs = 1 ' disable MCP
PAUSE 100 ' safe settle time
Start:
for wiper = 0 to 255
cs=0 ' enable
shiftout si,clk, MSBFIRST,[WriteOnPot0, WIPER] ' Write to MCP
cs = 1 ' Disable
pause 10
next
goto startNow connect PA0 too vcc, PB0 to GND and read
sonuncusu
WriteSPI:
GOSUB GetPotVal
CS = 0 ' Enable
Shiftout SI, SCK, MSBFIRST, [$11, UpdPotVal]
CS = 1 ' Disable
merhaba hocam;
Basit bir SPI protokolu. Hic basicte 74HC595 entegre kontrolu yaptın mı ? Bu da aynı mantıkla calısıyor. Basıcte Shiftout komutu ile yapılır diye dusunuyorum.
Soyle olsa gerek.
ShiftOut SI,SCK,1,[veri]
high Cst
Yukardaki kod sadece yol gostermek amaclıdır. Yanlış yazmıs olabilirim. Epey zamandır basic kullanmıyorum
Datasheetin 22 sayfasını bir incele derim.
Kolay gelsın.
M_B
En son mcp serilerini burda bulmuştum.msn den bağlantı kurup sorabilirsin.
http://www.direnc.net/main/
Alıntı yapılan: "cenkishan"En son mcp serilerini burda bulmuştum.msn den bağlantı kurup sorabilirsin.
http://www.direnc.net/main/
hocam vermiş olduğun site zaten int-el elektroniğin sitesi...hüseyin abi ile iletişim kurdum fakat elinde sadece
mcp41010 varmış...
@ maxiboost hocam :
'16F628A
cmcon=7
define osc 8
res var byte
command var byte
SI var porta.0 'SI
CLK var porta.3 'CLK
CS var porta.2 'CS
LED var porta.1 'LED
high porta.2
command=19
high LED
pause 1000
low LED
pause 1000
high LED
repeatit:
res=256
low CS
shiftout SI,CLK,1,[%00010011\8,res\8]
HIGH CS
pause 5000
res=128
low CS
shiftout SI,CLK,1,[command,res]
HIGH CS
pause 5000
goto repeatit
end
kod çalışıyor ama programda kafama takılan yerler var tam olarak kodların mantığını ve çalışmasını anlayamadım...kodda 2 kez shiftout komutuyla mcp'ye komut gönderiyor ama ikisinde de farklı şey yolluyor mesela res değişkeni neyi değiştiriyor command değişkenin görevi nedir_?
shiftout SI,CLK,1,[%00010011\8,res\8]
bu komutta \8 neyi ifade ediyor_? bunlar kafamı kurcalayan sorular...
bunların dışında programdan 2 buton kullanarak +/- direncin değerini nasıl değiştirebiliriz_?
valla hiç bakmadım ama bana şöyle gibi geliyor ,
2 tane komut var ,
önce ne yapıcanı söylüyorsun ,sonra direnç değerini gönderiyorsun veya ona benzer birşey ,yani sesi aç diyorsun ,sonrada şu kadar aç diyorsun olabilir ..bende bilmiyorum
bu entegreyi kullanması sorun yaratacak gibime geliyor...pek kullanılan bir entegre olmadığından olsa gerek...sağolun hocam...yapabilirsek siparişi yaparım ama hiçte içimden geçmiyor...200k lık bir pot lazım onun için 20 tane seri bağlarsam hiç bir anlamı kalmıyor...iyi çalışmalar...
sen al bu entegreyi ,bir şekilde çalıştırırsın nasılsa ,
data sheete baktımda ,
önce command biti gönderiliyor ,
data yazılacakmı ? entegre kapatılacakmı (shutdown) gibi birşey
sonra kanal seçme biti gönderiliyor ,
hangi kanala müdahale edilecek ? sol? sağ? ikiside?
en sonda asıl data gönderiliyormuş yani tam olarak potans değeri ..
birde bunun 2 türlü kullanım şekli varmış ,
reosta şeklindemi ?
yani orta uç bir tarafla kısa devre gibi ,
birde normal potans gibi ,yani 3 uçlu
eğer delta palsta 4538 ler için kullanacaksan bununla uğraşma.bu monostable lerin yerine 18 serisi pic kullan.pll ile 48 MHz de çalıştırısan çözünülürlük yüksek olur.zamanlama işini bununla halledebilirsin.
delta için değil hocam tarsos diye bir dedektör var bir abimizin kendi tasarımı ayrımlı bir dedektör onun ayar potlarını kullanacağım...iyi çalışmalar...
dallas serisinde de de bu tip entegreler var kullanımı daha kolay
hocam biliyoruz ama nerede bulacağımızı bilmiyoruz...
şimdi fark ettim ,
proteusta mcp41010 var ,
denedinmi ?
hocam verdiğiniz kodu isiste denedim zaten...ama çok karmaşık bir protkolü ve kontrol mantığı var bana daha basit protokolü bir digit pot lazım...olmazsa sample isteyeceğim...iyi çalışmalar...
MCP41010 ve PIC16f877A ile yaptığım devrenin proton kodlarıdır. Umarım işini görür... İyi günler dilerim
'****************************************************************
'* Name : mcp41010.BAS *
'* Author : [ergunbt] *
'* Notice : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 22.08.2015 *
'* Version : 1.0 *
'* Notes : mcp41010 dijital pot uygalaması *
'* : *
'****************************************************************
Device=16F877A
XTAL = 4
TRISA=%111111
ALL_DIGITAL = True
Symbol YUKARI= PORTA.0
Symbol ASAGI= PORTA.1
Symbol MODE= PORTA.2
Symbol CS10 = PORTB.3 ' CHIP SEÇ
Symbol CS20 = PORTB.4 ' CHIP SEÇ
Symbol CS30 = PORTB.5 ' CHIP SEÇ
Symbol CS40 = PORTB.6 ' CHIP SEÇ
Output CS10 ' CS10 ÇIKISINI AYARLA
Output CS20 ' CS20 ÇIKISINI AYARLA
Output CS30 ' CS30 ÇIKISINI AYARLA
Output CS40 ' CS40 ÇIKISINI AYARLA
Symbol SCK = PORTC.3 ' CLOCK PINI
Symbol SI = PORTC.4 ' DATA IN PINI
Symbol SO = PORTC.5 ' DATA OUT PINI
Dim POT1 As Byte
Dim POT2 As Byte
Dim POT3 As Byte
Dim POT4 As Byte
Dim MOD As Byte
MOD=0
LOOP:
If MODE=0 Then
While MODE=0 :Wend
MOD=MOD+1
If MOD=4 Then MOD=0
EndIf
If MOD=0 Then
If YUKARI=0 Then
While YUKARI=0 :Wend
POT1=POT1+10
If POT1>255 Then POT1=0
EndIf
If ASAGI=0 Then
While ASAGI=0 :Wend
POT1=POT1-10
If POT1<5 Then POT1=0
EndIf
EndIf
If MOD=1 Then
If YUKARI=0 Then
While YUKARI=0 :Wend
POT2=POT2+10
If POT2>255 Then POT2=0
EndIf
If ASAGI=0 Then
While ASAGI=0 :Wend
POT2=POT2-10
If POT2<5 Then POT2=0
EndIf
EndIf
If MOD=2 Then
If YUKARI=0 Then
While YUKARI=0 :Wend
POT3=POT3+10
If POT3>255 Then POT3=0
EndIf
If ASAGI=0 Then
While ASAGI=0 :Wend
POT3=POT3-10
If POT3<5 Then POT3=0
EndIf
EndIf
If MOD=3 Then
If YUKARI=0 Then
While YUKARI=0 :Wend
POT4=POT4+10
If POT4>255 Then POT4=0
EndIf
If ASAGI=0 Then
While ASAGI=0 :Wend
POT4=POT4-10
If POT4<5 Then POT4=0
EndIf
EndIf
GoSub POT_YAZ ' DİJİTAL PORTA YAZ
GoTo LOOP
'================================================= ========
POT_YAZ:
CS10=0 ' AKTIF
CS20=0 ' AKTIF
CS30=0 ' AKTIF
CS40=0 ' AKTIF
SHOut SI, SCK, msbfirst, [$11,POT1]
CS10=1
CS10=0
CS10=1
SHOut SI, SCK, msbfirst, [$11,POT2]
CS20=1
CS20=0
CS20=1
SHOut SI, SCK, msbfirst, [$11,POT3]
CS30=1
CS30=0
CS30=1
SHOut SI, SCK, msbfirst, [$11,POT4]
CS40=1
CS40=0
CS40=1
Return
End
@ ergunbt
yararlı bir çalışma olmuş klavyene sağlık,
fakat her voltaj verdiğinde set değeri standart olur bu şekilde,oysa son bıraktığın pozisyonu pic eepromuna kaydetseydi daha pratik olurdu düşüncesi kaldı aklımda.
şu an bir devremde kullandığım kod aşağıdadır. set_pot() fonksiyonu içindeki pin tanımlamalarını değiştirerek kullanabilirsiniz.
gerçi sonradan farkettim kod proton için istenmiş ama olsun birinin işine yarar.
unsigned int digital_pot_bilgi=0;// işaretsiz sekiz bitlik sayı
void set_pot()
{
char digipot_fonk_sayaci=0;
GPIO_Digital_Output(&GPIOC_ODR,_GPIO_PINMASK_0 | _GPIO_CFG_OTYPE_PP ); // DİJİTAL POT CS pini
GPIO_Digital_Output(&GPIOC_ODR,_GPIO_PINMASK_2 | _GPIO_CFG_OTYPE_PP ); // DİJİTAL POT SCK pini
GPIO_Digital_Output(&GPIOC_ODR,_GPIO_PINMASK_3 | _GPIO_CFG_OTYPE_PP); // DİJİTAL POT SI pini
digipot_cs=0; // dijital pot veri algılama aktif
delay_ms(20);
digipot_sclk=0;
digipot_si=0;
for(digipot_fonk_sayaci=16;digipot_fonk_sayaci>=1;digipot_fonk_sayaci--) // bu for döndüsünde mcp41010 dijital
{
digipot_si=0; // potansiyometresine gönderilen iki bayttan 1. olan bundan sonra göndereceğimiz
switch(digipot_fonk_sayaci) // baytın veri olduğunu bildiren komutu yolluyoruz.
{
case 16: digipot_si=0; break;
case 15: digipot_si=0; break;
case 14: digipot_si=0; break;
case 13: digipot_si=1; break;
case 12: digipot_si=0; break;
case 11: digipot_si=0; break;
case 10: digipot_si=0; break;
case 9 : digipot_si=1; break;
case 8 : if(digital_pot_bilgi.B7==1){digipot_si=1;}; break;
case 7 : if(digital_pot_bilgi.B6==1){digipot_si=1;}; break;
case 6 : if(digital_pot_bilgi.B5==1){digipot_si=1;}; break;
case 5 : if(digital_pot_bilgi.B4==1){digipot_si=1;}; break;
case 4 : if(digital_pot_bilgi.B3==1){digipot_si=1;}; break;
case 3 : if(digital_pot_bilgi.B2==1){digipot_si=1;}; break;
case 2 : if(digital_pot_bilgi.B1==1){digipot_si=1;}; break;
case 1 : if(digital_pot_bilgi.B0==1){digipot_si=1;}; break;
}
delay_ms(1);
digipot_sclk=1;
delay_ms(1);
digipot_sclk=0;
}
delay_ms(1);
digipot_si=0;
digipot_sclk=0;
digipot_cs=1; // dijital pot veri algılama pasif
}
main()
{
genel program ayarları
"
"
"
digital_pot_bilgi=255;//pot bilgisi 0-255 arasında ters orantılı değişiyor
set_pot();
}
http://www.muhittinkaplan.com/2015/07/21/sayisal-potansiyometre-stm32vl/ (http://www.muhittinkaplan.com/2015/07/21/sayisal-potansiyometre-stm32vl/)
Sayın ipek ben bu kodları yazarken mcp41010 u nasıl kodlayacağımızı yazmak istedim... doğru söylüyorsunuz... Bu kodları kullanan arkadaşlarıma balığı pişirip vermek istemedim oltayı verdim gerisi onların bileceği iş diye düşünüyorum ...umarım anlayışla karşılarlar....