/*
__ ___________ __ ___ __________ ____ _ ________ __ ____ ____ ______
/ |/ / ____/ //_// |/_ __/ __ \/ __ \/ | / / _/ //_/ / __ \/ __ \/ ____/
/ /|_/ / __/ / ,< / /| | / / / /_/ / / / / |/ // // ,< / / / / /_/ / / __
/ / / / /___/ /| |/ ___ |/ / / _, _/ /_/ / /| // // /| | / /_/ / _, _/ /_/ /
/_/ /_/_____/_/ |_/_/ |_/_/ /_/ |_|\____/_/ |_/___/_/ |_| \____/_/ |_|\____/
*/
#include <SPI.h>
#define CS PIN_YAZIN
void setup()
{
//Serial.begin(9600); GEREK YOK
SPI.setRX( );//SPI MISO PIN
SPI.setTX( );//SPI MOSI PIN
SPI.setSCK( );//SPI CLOCK PIN
SPI.begin();
}
void loop() {
MCP(1023,512);
}
void MCP(int a , int b) {
int ch1 = a | 0b0111000000000000;
int ch2 = b | 0b1111000000000000;
digitalWrite(CS, LOW);
SPI.transfer(highByte(ch1));
SPI.transfer(lowByte(ch1));
digitalWrite(CS, HIGH);
delay(2);
digitalWrite(CS, LOW);
SPI.transfer(highByte(ch2));
SPI.transfer(lowByte(ch2));
digitalWrite(CS, HIGH);
delay(2);
}
Datasheet'i anlamıyorumki. Hem ingilizceden çakılıyorum hem SPI bana karmaşık geliyor. Okumayla içinden çıkamayacağım.Boşver kütüphaneyi falan. Datasheet'e bakıp SPI ile ne yazacaksan yaz.
Abi ben bu sorunu adım adım çözüyorum önce her ne olursa olsun datasheetin orjinalini ingilizcesini 2-3 kez oku anlamasanda.Datasheet'i anlamıyorumki. Hem ingilizceden çakılıyorum hem SPI bana karmaşık geliyor. Okumayla içinden çıkamayacağım.
I2C Adres tabanlı olması fazla ı/o kullanmadan bissürü slave'e veri gönderip okumak daha tasarruflu oluyor ı/o bakımından.Aslında SPI ile I2C birbirine çok benziyor. Eğer sadece veri yazıyorsan ve tek alıcı varsa, arada neredeyse hiç fark yok. İkisinde de bir data pini var (SPI için MOSI, I2C için SDA) ve bir de clock pini var (SPI için CLK, I2C SCL).
SPI ve I2C arasında iki temel fark var:
1) SPI'da veri okumak ve yazmak için ayrı pin var, I2C de tek pin üzerinden hem okuma yem yazma yapılıyor.
2) SPI'da bus üzerindeki uç noktalardan birisini seçmek için chip select kullanılıyor, I2C de bütün uç noktalar aktif, sen adres bilgisi göndererek o adrese sahip olmayan uç noktalara "sen sus konuşma" diyorsun.
Neticede SPI'da bus üzerinde fiziksel olarak sadece bir cihaz aktif olduğu için kapasitif yükleme minimaldir. Ayrıca aynı anda veri gönderme ve veri alma mümkün olduğu için SPI ile veri bant genişliği çok daha yüksektir.
O testi yapma imkanım yok çünkü DAC' elimde 1 tane vardı ve onu karta direk smd olarak lehimledim. Pico yerine nano takamam, taksam bile yine kartın geneline hükmetmiş olacağım. Aslında breadboard üzerinde denemeler yapmak istiyordum ama hem 5v referans entegresi hemde 74 serisi entegreler dahil olduğu için hepsini ayrı ayrı alıp dip dönüştürücüye takamadım. Bu yüzden hepsni devre üzerine lehimleyip başıma gelecekleri kart üzerinde görmeye karar verdim.O zaman önce Arduino ile minimal bir program yaz. Bu program SPI porttan veri yazsın. Chip select olarak da herhangi bir pini seçebilirsin.
SPI'da bir chip select (CS), bir gönderme pini (MOSI) bir alma pini (MISO), bir de clock (CLK) var. Senin için MISO lazım değil, DAC'tan birşey geri okumuyorsun.
O testi yapma imkanım yok çünkü DAC' elimde 1 tane vardı ve onu karta direk smd olarak lehimledim. Pico yerine nano takamam, taksam bile yine kartın geneline hükmetmiş olacağım. Aslında breadboard üzerinde denemeler yapmak istiyordum ama hem 5v referans entegresi hemde 74 serisi entegreler dahil olduğu için hepsini ayrı ayrı alıp dip dönüştürücüye takamadım. Bu yüzden hepsni devre üzerine lehimleyip başıma gelecekleri kart üzerinde görmeye karar verdim.
Yani nanoyu bread boarda bağlayıp DAC olmadan SPI yazayım ve Çıkış pinlerini osiloskop ile takip edeyim. Doğru anladım sanırım.SPI ile veri yazmak için bir uç noktaya ihtiyacın yok. Havaya yaz
Sinyalleri de osiloskop ile gör. Önce CS aktif olacak, sonra CLK ve MOSI de yazma süresince aktivite olacak.
Yani nanoyu bread boarda bağlayıp DAC olmadan SPI yazayım ve Çıkış pinlerini osiloskop ile takip edeyim. Doğru anladım sanırım.
setDac(200,0);
diyorsun güzelce set ediyor.// include the library code:
#include <SPI.h>
// Set Constants
const int dacChipSelectPin = 9; // pin 9'u DAC için çip seçimi olarak ayarlayın:
// Start setup function:
void setup() {
pinMode (dacChipSelectPin, OUTPUT);
// set the ChipSelectPins high initially:
digitalWrite(dacChipSelectPin, HIGH);
// initialise SPI:
SPI.begin();
SPI.setBitOrder(MSBFIRST); // Kesinlikle gerekli değil, sadece emin olmak için.
SPI.setDataMode(SPI_MODE0); // Kesinlikle gerekli değil, sadece emin olmak için.
} // End setup function.
// Start loop function:
void loop() {
setDac(200,0);
setDac(4000,1);
}// End of loop function.
// DAC'yi ayarlama işlevi, Gönderilecek Değeri ve kullanılacak DAC kanalını kabul eder.
void setDac(int value, int channel) {
byte dacRegister = 0b00110000; // Varsayılan DAC kayıtlarını ayarlar B00110000, 1. bit DAC'yi seçer, A=0 B=1, 2. Bit giriş Tamponunu atlar, 3. bit çıkış kazancını 1x'e ayarlar, 4. bit aktif düşük kapatmayı kontrol eder. LSB burada önemsizdir.
int dacSecondaryByteMask = 0b0000000011111111; // 12 bitlik değer olan B00000000111111111'in son 8 bitini izole eder.
byte dacPrimaryByte = (value >> 8) | dacRegister; //Değer maksimum 12 Bit değerdir, Birincil Bayta giriş için değerden ilk 4 MSB'yi almak için 8 bayt sağa kaydırılır, ardından da Register ile BORed
byte dacSecondaryByte = value & dacSecondaryByteMask; // 8 LSB'yi izole etmek ve onu tek bir bayta indirmek için 12 bit değerini karşılaştırır.
// Ayarlanacak DAC'yi belirlemek için birincil Baytta MSB'yi ayarlar, DAC A=0, DAC B=1
switch (channel) {
case 0:
dacPrimaryByte &= ~(1 << 7);
break;
case 1:
dacPrimaryByte |= (1 << 7);
}
noInterrupts(); // DAC'ye veri göndermeye hazırlanmak için kesintileri devre dışı bırakın
digitalWrite(dacChipSelectPin,LOW); // DAC'yi seçmek için Chip Select pinini alçaltın:
SPI.transfer(dacPrimaryByte); // Birincil Baytı gönder:
SPI.transfer(dacSecondaryByte);// İkincil Baytı gönder
digitalWrite(dacChipSelectPin,HIGH);// DAC'nin seçimini kaldırmak için Chip Select pinini yükseğe alın:
interrupts(); // Kesintileri etkinleştir
}
Abi böyle durumlarda test point noktaları bence çok kritik önem taşıyor.Bu gün biraz burnumun dikine gidip yukarıdaki kodlar ile cebelleştim. Artık bitirmek istediğim için tüm çabamı devre üzerine harcamak istiyorum. Kodlar hata vermiyor ama çalışmıyorda. Daha doğrusu ben beceremiyorum herhalde. Devreler eskisi gibi bread board üzerinde olmadığından gerektiği gibi mıncıklayamıyorum. Serial ekrana çıktı alamıyorum. Ne gönderdim, ne gitti takip edemiyorum. Sıkıntılı iş.
Yarın bari Timur abinin sözünü dinleyip nano ile spi çalışmaları yapayım.
Hee bide sen bizim pico'daki set pinlerini yazmayı unuymuşssun abi benim attığım kopya örneğin setup kısmına bak.1023 gönderince dac çıkışından ne okumam gerek? Yani multimetre ile okuyabilir miyim?
Eee o zaman 1023 ün kaç volta tekabul ettiğini nasıl anlayacağım?Evet ölçü aleti ile okuyabilirisin DC voltaj kademesinde