analog - dijital - uart

Başlatan wrangler, 03 Haziran 2018, 10:10:59

wrangler

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);

wrangler

Arkadaşlar yardımcı olabilecek kimse yok mu özellikle dijital değerleri okuduğumda dijitalle birlikte analog değerlerde sapıtıyor

mehmet

Sekiz okuma yaptığınız kodlar nerede?
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

makine_terbiyecisi

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.
# ÖĞRENELİM, ÖĞRETELİM #

fide

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.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

wrangler

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);
          
        }
}

wrangler

#6
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.

fide

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.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

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.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

wrangler

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