salihonur
Üye
- Katılım
- 7 Ağu 2008
- Mesajlar
- 78
- Puanları
- 1
- Yaş
- 37
Arkadaşlar, projenin bir bölmünde 24 bitlik ADC'den SPI protokolünü kullanarak veri okumam gerekiyor.
Bunun için 2 adet PIC18F2520'yi SPI ile bağladım. 1. picte buton1'e tıkladığımda SPI'ya 0xFFFFFC, 2. butona basıldığında ise 0xFFFFFF verisi basılıyor. SPI 8 bit veri taşıdığından doğal olarak 3'e bölüp diğer tarafta birleştiriyorum. 2. pice bağlı olan led ise 0xFFFFFC verisi geldiğinde logic 1 aksi halde logic 0 oluyor. Kodlar aşağıdaki gibidir.
CCS KODLAR
Ancak burada ters giden birşeyler var. Buton1'e sürekli basılmasına rağmen her daim doğru veri okunmuyor. Led bazen yanıyor bazen sönüyor.
Yanlış yaptığım yer neresidir? CS5460A 24 bit ADC konusunda fikir verebilecek var mı?
Bunun için 2 adet PIC18F2520'yi SPI ile bağladım. 1. picte buton1'e tıkladığımda SPI'ya 0xFFFFFC, 2. butona basıldığında ise 0xFFFFFF verisi basılıyor. SPI 8 bit veri taşıdığından doğal olarak 3'e bölüp diğer tarafta birleştiriyorum. 2. pice bağlı olan led ise 0xFFFFFC verisi geldiğinde logic 1 aksi halde logic 0 oluyor. Kodlar aşağıdaki gibidir.
CCS KODLAR
Kod:
#include <18F2520.h>
#use delay(clock=32000000, restart_wdt)
#fuses NOMCLR,WDT,WDT8,NOBROWNOUT,PUT,NOLVP,CPB,CPD,PROTECT,NOWRT
#use rs232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7,ENABLE=PIN_C5,PARITY=N,ERRORS)
//#use SPI(
// DO = PIN_C5,
// DI = PIN_C4,
// CLK = PIN_A5,
// baud = 9600,
// BITS = 24,
// LSB_FIRST,
// SAMPLE_RISE,
// stream = SPI_PORT0
//)
// Port ve Pin Tanımlamaları ===================================================
#byte PORTA = 0xF80
#byte PORTB = 0xF81
#byte PORTC = 0xF82
#bit CS = PORTA.5
#bit SECIM_1 = PORTA.0
#bit SECIM_2 = PORTA.1
#bit BUZZER = PORTC.0
#define DEVICE 2
void main(void)
{
int16 k;
int i,x;
int32 data,rc_data;
//---------------------------------------------------------------------------
setup_oscillator(OSC_32MHZ);
restart_wdt();
set_tris_a(0x0F);
set_tris_b(0xFF);
set_tris_c(0x00);
enable_interrupts(global);
enable_interrupts(int_rda);
restart_wdt();
PORTA = 0;
PORTB = 0;
PORTC = 0;
#if DEVICE==1
SETUP_SPI(SPI_MASTER | SPI_CLK_DIV_4);
#else
SETUP_SPI(SPI_SLAVE | SPI_CLK_DIV_4);
#endif
// disable_interrupts(GLOBAL);
restart_wdt();
while(1)
{
#if DEVICE==1
if(SECIM_1)
data=0xFFFFFC;
else if(SECIM_2)
data=0xFFFFFF;
else
data=0x000000;
x=data;
spi_write(x);
data=data>>8;
x=data;
spi_write(x);
data=data>>8;
x=data;
spi_write(x);
// spi_write(data);
#else
// rc_data = spi_read();
k++;
if(k>65534)
{
rc_data=0;
x=spi_read(0);
rc_data=x;
x=spi_read(0);
rc_data=rc_data<<8;
rc_data|=x;
x=spi_read(0);
rc_data=rc_data<<8;
rc_data|=x;
}
if(rc_data==0xFFFFFC)
BUZZER=1;
else
BUZZER=0;
#endif
restart_wdt();
}
}
Ancak burada ters giden birşeyler var. Buton1'e sürekli basılmasına rağmen her daim doğru veri okunmuyor. Led bazen yanıyor bazen sönüyor.
Yanlış yaptığım yer neresidir? CS5460A 24 bit ADC konusunda fikir verebilecek var mı?