iyi günler arkadaşlar 16f877a ile 8 analog 8 digital değer okuyup bu değerleri uart üzerinden rf verici ile ikinci 16f877a ya göndemek istiyorum tüm değerleri tek tek okuyup uart üzeirinden gönderiyorum ama değerleri birlikte okuduğumda sıkıntı oluşuyor.
deger=ADC_read(0);
longtostr(deger,pot1);
uart1_write_text(pot1);
if(PortD.F0){deger=1023;}else{deger=0;}
longtostr(deger,sw1);
uart1_write_text(sw1);
Arkadaşlar yardımcı olabilecek kimse yok mu özellikle dijital değerleri okuduğumda dijitalle birlikte analog değerlerde sapıtıyor
Sekiz okuma yaptığınız kodlar nerede?
Alıntı yapılan: wrangler - 05 Haziran 2018, 12:23:10Arkadaşlar yardımcı olabilecek kimse yok mu özellikle dijital değerleri okuduğumda dijitalle birlikte analog değerlerde sapıtıyor
Öyle bir anlatmışsın ki her türlü sonuca açık bir problem. Biraz daha detay gerekiyor.
Alıcı tarafında bu verileri nasıl alıyorsun kodları vermen gerekiyor.
Adc okumada kanal değiştirme işlemi ile okuma arasına 10milisaniye bekleme koy.
Verilerin karışmaması için bir dizi oluştur. Okuduğun değeri okuduğun sırayla diziye atarsan karışmaz. Ama analog kanal değişiminde beklemeye koymayı unutma.
Verilen her cevap için teşekkür ederim.
Alıcı tarafını henüz yapmadım çünkü terminalden henüz işleyebilecek bir veri elde edebilmiş değilim verici kodlarım bu şekilde 5. analogtan sonra bağlantı kesiliyor.
Tek tek tüm değerler alıyor ama birlikte kullanınca bir yerde patliyor.
Olumlu olumsuz cevap veren herkese tekrardan teşekkür ederim.
void kurulum() {
Adcon1=0b10100000;
ADC_Init();
UART1_Init(9600);
delay_ms(200);
}
unsigned ADC(unsigned short x) {
long int ADC;
switch (x) {
case 0: Adcon0=0b10000001;
case 1: Adcon0=0b10010001;
case 2: Adcon0=0b10100001;
case 3: Adcon0=0b10110001;
case 4: Adcon0=0b11000001;
case 5: Adcon0=0b11010001;
case 6: Adcon0=0b11100001;
case 7: Adcon0=0b11110001;
}
delay_ms(10);
ADC = ADC_Read(x);
ADC = ADC*1.9550342131;
ADC = ADC + 1000;
return ADC;
}
unsigned SW(unsigned short x){
long int SW;
delay_ms(10);
if(x){SW=3000;}else{SW=1000;}
return SW;
}
int i=0,j=0;
unsigned char pot1[5],pot2[5],pot3[5],pot4[5],pot5[5],pot6[5],pot7[5],pot8[5],sw1[5],sw2[5],sw3[5],sw4[5];
long int deger;
void main() {
kurulum();
TrisA=0b11111111;
TrisB=0;
TrisC=0b10111111;
TrisD=0b11111111;
PortA=0;
PortB=0;
PortC=0;
PortD=0;
while(1) {
deger=ADC(0);
longtostr(deger,pot1);
uart1_write_text(pot1);
deger=ADC(1);
longtostr(deger,pot2);
uart1_write_text(pot2);
deger=ADC(2);
longtostr(deger,pot3);
uart1_write_text(pot3);
deger=ADC(3);
longtostr(deger,pot4);
uart1_write_text(pot4);
deger=ADC(4);
longtostr(deger,pot5);
uart1_write_text(pot5);
deger=ADC(5);
longtostr(deger,pot6);
uart1_write_text(pot6);
deger=ADC(6);
longtostr(deger,pot7);
uart1_write_text(pot7);
deger=ADC(7);
longtostr(deger,pot8);
uart1_write_text(pot8);
deger=SW(PortD.f0);
longtostr(deger,sw1);
uart1_write_text(sw1);
deger=SW(PortD.f1);
longtostr(deger,sw2);
uart1_write_text(sw2);
deger=SW(PortD.f2);
longtostr(deger,sw3);
uart1_write_text(sw3);
deger=SW(PortD.f3);
longtostr(deger,sw4);
uart1_write_text(sw4);
delay_ms(500);
}
}
Alıntı yapılan: fide - 05 Haziran 2018, 18:21:12Adc okumada kanal değiştirme işlemi ile okuma arasına 10milisaniye bekleme koy.
Verilerin karışmaması için bir dizi oluştur. Okuduğun değeri okuduğun sırayla diziye atarsan karışmaz. Ama analog kanal değişiminde beklemeye koymayı unutma.
Tavsiyen için teşekkür ederim çok faydası oldu şuan verileri gönderiyorum ama karşıdan sağlıklı alamıyorum.
1-Dizi uzunluğu en fazla kaç olmalı
2-rf için uyandırma ve senkron kodunu nasıl göndermeliyim dizi içinde mi ayrı mi
3-dogrulama kodu + pot işareti + pottan veriyi yolluyorum karşıdan dizinin sadece bir kısmı görünüyor
void kurulum() {
Adcon1=0b10100000; // adc dijital analog seçimi
ADC_Init(); // ADC başlatma
UART1_Init(9600); // seri bağlantı başlatma
delay_ms(200);
}
unsigned ADC(unsigned short x) { // ADC fonksiyonu
long int ADC;
switch (x) { // ADC kanal seçimi
case 0: Adcon0=0b10000001;
case 1: Adcon0=0b10010001;
case 2: Adcon0=0b10100001;
case 3: Adcon0=0b10110001;
case 4: Adcon0=0b11000001;
case 5: Adcon0=0b11010001;
case 6: Adcon0=0b11100001;
case 7: Adcon0=0b11110001;
}
delay_ms(10);
ADC = ADC_Read(x); // ADC okuma
ADC = ADC*1.9550342131;
ADC = ADC + 1000; // ADC 1000-3000 arası ayarlama
return ADC;
}
unsigned SW(unsigned short x){
long int SW;
if(x){SW=3000;}else{SW=1000;}
return SW;
}
unsigned char ilk[3]={85,255,0}; // rf uyandirma ve senkron
unsigned char sifre[10]={'d','e','n','e','m','e','n','m','i'}; // rf şifreleme
int i,j,k=0;
unsigned char pot1[5],pot2[5],pot3[5],pot4[5],pot5[5],pot6[5],pot7[5],pot8[5]; // ADC ve digital toplanan veriler
long int deger;
unsigned char uart1[50]; // seri bağlantı gönderilecek veri
void main() {
kurulum();
TrisA=0b11111111;
TrisB=0;
TrisC=0b10111111;
TrisD=0b11111111;
PortA=0;
PortB=0;
PortC=0;
PortD=0;
for(i=0;i<3;i++){
for(j=0;j<5;j++){
uart1[k]=ilk[i];
k++;
}
}
uart1_write_text(uart1); // rf uyardırma ve senkron verisi gönderme
delay_ms(100);
while(1) {
deger=ADC(0);
wordtostr(deger,pot1);
deger=ADC(1);
wordtostr(deger,pot2);
deger=ADC(2);
wordtostr(deger,pot3);
deger=ADC(3);
wordtostr(deger,pot4);
deger=ADC(4);
wordtostr(deger,pot5);
deger=ADC(5);
wordtostr(deger,pot6);
deger=ADC(6);
wordtostr(deger,pot7);
deger=ADC(7);
wordtostr(deger,pot8); // Adc verileri toplama
for(i=0;i<5;i++){
for(j=0;j<9;j++){
uart1[j]=sifre[j];
}
uart1[9]='*';
uart1[10]='A';
uart1[15]='B';
uart1[20]='C';
uart1[25]='D';
uart1[30]='E';
uart1[35]='F';
uart1[40]='G';
uart1[45]='H';
uart1[50]='#';
uart1[i+10]=pot1[i];
uart1[i+15]=pot2[i];
uart1[i+20]=pot3[i];
uart1[i+25]=pot4[i];
uart1[i+30]=pot5[i];
uart1[i+35]=pot6[i];
uart1[i+40]=pot7[i];
uart1[i+45]=pot8[i];
}
uart1_write_text(uart1); // seri porttan ADC verilerini yollama
delay_ms(100);
deger=SW(PortD.f0);
wordtostr(deger,pot1);
deger=SW(PortD.f1);
wordtostr(deger,pot2);
deger=SW(PortD.f2);
wordtostr(deger,pot3);
deger=SW(PortD.f3);
wordtostr(deger,pot4);
deger=SW(PortD.f4);
wordtostr(deger,pot5);
deger=SW(PortD.f5);
wordtostr(deger,pot6);
deger=SW(PortD.f6);
wordtostr(deger,pot7);
deger=SW(PortD.f7);
wordtostr(deger,pot8); // dijital verileri toplama
for(i=0;i<5;i++){
for(j=0;j<9;j++){
uart1[j]=sifre[j];
}
uart1[9]='-';
uart1[10]='A';
uart1[15]='B';
uart1[20]='C';
uart1[25]='D';
uart1[30]='E';
uart1[35]='F';
uart1[40]='G';
uart1[45]='H';
uart1[50]='#';
uart1[i+10]=pot1[i];
uart1[i+15]=pot2[i];
uart1[i+20]=pot3[i];
uart1[i+25]=pot4[i];
uart1[i+30]=pot5[i];
uart1[i+35]=pot6[i];
uart1[i+40]=pot7[i];
uart1[i+45]=pot8[i];
}
uart1_write_text(uart1); // seri porttan dijital verileri yollama
delay_ms(100);
}
}
Hatam ne olabilir yardımcı olursanız sevinirim.
Ayrica 1000m mesafede veri kaybı olmadan hangi rf modülünü kullanabilirim.
Modül konusunda hmtrp-433 kullandım. 2250mt açık alanda haberleştim. Modül rx-tx otomatik algılamalı olduğu için rx pinine gönderdiğin veri diğer modülde tx pininden çıkar. Uyandırma yok. 9600 bpste haberleşme için dizi uzunluğu konusunda datasheete bakman gerekir. Xbee modullerinde hız daha yüksek. 2.4ghz ve 1ghz altı modelleri var ama eşleştirme ve ayarları biraz karışık. Xctu programı ve datasheet karıştırmayla yaparsın.
Dorji ve ebyte modülleri kullanmadım. Kullanıp beğenen arkadaşlarım var.
Udeanın 1watt çıkışlı modülleri var ama manchester kodlama ile çalışıyor.
Senin yerinde olsam kodlarda şöyle bir yol izlerim.
fprintf(comm1,"<%f4.5,%f4.5,%f4.5,%f4.5,%f4.5,>" deger1, deger2, deger3, deger4, deger5)
Değeri float kabul ettiğim için %f kullandım, int ise %u, longint ise %lu kullanabilirsin.
Burda büyük küçük parantezlerinin arasında virgülleri sayarak istediğin sayıda değişken gönderebilirsin. Sonra da virgüller arasını böler değişkenleri alırsın. Senin yöntemin buna göre hataya daha meyilli.
Derleyici belirtmemişsin. C kodları ufak tefek düzeltmelerle çalışır ama yazdığım kod ccs c de denenmiş bir kod.
Hocam çok teşekkür ederim şuan proteus ta uart üzerinden çalışan bir sistem hazırladım XBee biraz pahalı geldi ebyte nin bi kaç ürününe göz gezdiriyorum birde nrf24L10 pa lna modülü ulaşımı ve fiyatı uygun görünüyor bu modülü verici tarafta nrf24l01+pa+lna alıcı olarak nrf24l01 modülünü kullansam nasıl olur tavsiyelerinizi dikkatle bekliyorum