Değişik bir problemim var. ADC ölçüm yaparken Mux8 ile bir sonraki pine geçiyorum ancak ya AnalogColumnMux1'e bağlı olan portları yada AnalogColumnMux2'ye bağlı olanların verilerini okuyabiliyorum. Dolayısı ile çift sayılı portlar ile tek sayılı portları aynı anda okuyamıyorum.
Ancak datasheette gösterdiği örnek kodlara göre bütün pinleri gezebilmem gerekiyor. Nerede hata yapıyorum ?
void welcomeScreen(void); void rsout(void); int iData; BYTE bPortNumber;
void main() { M8C_EnableGInt; // Enable global interrupts PGA_Start(PGA_HIGHPOWER); ADCINC14_Start(ADCINC14_HIGHPOWER); // Turn on Analog section ADCINC14_GetSamples(0); // Start ADC to read continuously UART_CmdReset(); UART_IntCntl(UART_ENABLE_RX_INT); UART_Start(UART_PARITY_NONE);
welcomeScreen();
/* while(ADCINC14_fIsDataAvailable() == 0); // Wait for data to be ready iData = ADCINC14_iGetData(); // Get Data ADCINC14_ClearFlag(); // Clear data ready flag Data1 = iData; Data2 = iData; UART_PutSHexInt(iData); */
void rsout() { while(ADCINC14_fIsDataAvailable() == 0); // Wait for data to be ready iData = ADCINC14_iGetData(); // Get Data ADCINC14_ClearFlag(); // Clear data ready flag UART_PutSHexInt(iData); UART_PutChar(12); }
psoc ta 8li mux yapısı yok ( en azından verdiğin resime göre ) hepsi 4 lüdür. yanlız AMUX81.h adında bir dosya include etmiş. AMUX81.h dosyasının içerisinde ne halt ettiğini bilmiyorum ama InputSelect1 yapısınıda anahtarlıyor olabilir çünki bu şekilde ancak port0 ın tüm pinlerinden analog giriş alabilirsin...
PSoCtaki yardımların için sağol öncelikle. Sende olmasan bu konuda kimseye danışamayacağım. Yukarıda yazılı olan AMUX81.h değil AMUX8.h olacaktı, denemelerden dolayı kalan ufak bir yazım hatası.
8 kanalıda kullanabilmek için aşağıdaki kodlar ile ColumnInput Select Yapmak gerekiyormuş. Yani iki tane mux4'u başka bir blokta switch yapıyoruz.
ABF_CR0 &= ~0x80; //Set AnalogColumnInputSelect1 input to AnalogColumn1 mux ABF_CR0 |= 0x80; //Set AnalogColumnInputSelect1 input to AnalogColumn0 mux.
şuan problemsiz çalıştı. Böyle olması gerekiyordu galiba.
Başlık açmışken başka bir sorumda var. ADC ölçümde pine direkt olarak gnd veriyorum ancak almam gereken değer E000 iken E158 gibi bir değer alıyorum. Bu ölçümün doğru yönde olduğunu gösteriyor ancak çok fazla sapma var. Neden olabilir ?
ABF_CR0 ye technical reference manual den bakmak lazım ama dediğim gibi mutlaka 2 yönlü girişi olan InputSelect1 i anahtarlıyordur. registeri yazılımdan değiştirirsen sorun çözülecektir.
E000 yerine E158 okumanın nedeni ise; analog girişi PGA üzerinden ADC modülüne yönlendirmen. PGA nın datasında min giriş tipik olarak 240mV görünüyor yani aşşağsında PGA dan hayır bekleme. hesaplamadım ama hex 158 in gerilim karşılığı da yaklaşık 240mV a denk gelecektir...
FFFF sapacak diye düşünmeyin sadece PGA nın min giriş seviyesi altındaki değerleri ölçemeyeceksiniz. tabi aynı şekilde bir kısıtlamada PGA nın çıkış geriliminde olacak. bildiğim kadarıyla PGA rail to rail bir opamp olmadığından, 1FFF ide hiç göremeyeceksiniz. bu yüzden aradan PGA yı kaldırın ve ADC girişlerini port 2.1 den verin...
ADC ölçüm yaparken Mux8 ile bir sonraki pine geçiyorum ancak ya AnalogColumnMux1'e bağlı olan portları yada AnalogColumnMux2'ye bağlı olanların verilerini okuyabiliyorum.
Dolayısı ile çift sayılı portlar ile tek sayılı portları aynı anda okuyamıyorum.
Ancak datasheette gösterdiği örnek kodlara göre bütün pinleri gezebilmem gerekiyor. Nerede hata yapıyorum ?
--------------------------------------------------------------------------------------------------------------------------------
#include <m8c.h>
#include "PSoCAPI.h"
#include "AMUX81.h"
void welcomeScreen(void);
void rsout(void);
int iData;
BYTE bPortNumber;
void main()
{
M8C_EnableGInt; // Enable global interrupts
PGA_Start(PGA_HIGHPOWER);
ADCINC14_Start(ADCINC14_HIGHPOWER); // Turn on Analog section
ADCINC14_GetSamples(0); // Start ADC to read continuously
UART_CmdReset();
UART_IntCntl(UART_ENABLE_RX_INT);
UART_Start(UART_PARITY_NONE);
welcomeScreen();
/*
while(ADCINC14_fIsDataAvailable() == 0); // Wait for data to be ready
iData = ADCINC14_iGetData(); // Get Data
ADCINC14_ClearFlag(); // Clear data ready flag
Data1 = iData;
Data2 = iData;
UART_PutSHexInt(iData);
*/
for(;;)
{
//AInMux_n
bPortNumber = AMUX8_PORT0_7;
AMUX81_InputSelect(bPortNumber);
UART_CPutString("\n\r0_7 - ");
rsout();
bPortNumber = AMUX8_PORT0_5;
AMUX81_InputSelect(bPortNumber);
UART_CPutString("\n\r0_5 - ");
rsout();
bPortNumber = AMUX8_PORT0_3;
AMUX81_InputSelect(bPortNumber);
UART_CPutString("\n\r0_3 - ");
rsout();
bPortNumber = AMUX8_PORT0_1;
AMUX81_InputSelect(bPortNumber);
UART_CPutString("\n\r0_1 - ");
rsout();
bPortNumber = AMUX8_PORT0_6;
AMUX82_InputSelect(bPortNumber);
UART_CPutString("\n\r0_6 - ");
rsout();
bPortNumber = AMUX8_PORT0_4;
AMUX82_InputSelect(bPortNumber);
UART_CPutString("\n\r0_4 - ");
rsout();
bPortNumber = AMUX8_PORT0_2;
AMUX82_InputSelect(bPortNumber);
UART_CPutString("\n\r0_2 - ");
rsout();
bPortNumber = AMUX8_PORT0_0;
AMUX82_InputSelect(bPortNumber);
UART_CPutString("\n\r0_0 - ");
rsout();
}
}
void rsout()
{
while(ADCINC14_fIsDataAvailable() == 0); // Wait for data to be ready
iData = ADCINC14_iGetData(); // Get Data
ADCINC14_ClearFlag(); // Clear data ready flag
UART_PutSHexInt(iData);
UART_PutChar(12);
}
void welcomeScreen()
{
UART_CPutString("\n\r**********Welcome**********");
}
< Resime gitmek için tıklayın >
< Resime gitmek için tıklayın >
< Bu mesaj bu kişi tarafından değiştirildi koby -- 12 Kasım 2008; 0:00:09 >