Rotary Encoder Usb Gönderme

Başlatan bymerag, 17 Nisan 2015, 14:58:00

bymerag

#define RotaryEncoder portb    // Rotary Encoder ile PIC18F4550 bağlantısı
#include "USBdsc.c"
char Encoder, oldEncoder;      // global
long  sayac, tmp;           // değişkenler
char txt[5];
unsigned char readbuff[64] absolute 0x500;
unsigned char writebuff[64] absolute 0x540;
void interrupt()
{
USB_Interrupt_Proc();
}
void main(void){
   ADCON1 |= 0x0F;             // AN pinleri dijital I/O yapılandırıldı
   CMCON  |= 7;                // Comparators (karşılaştırıcılar) pasif edildi
   RotaryEncoder = 0;          // Portun ilk durumu sıfırlanıyor.
   trisb = 0x03;               // Rotary Encoder portu giriş yapıldı
   Encoder = 0x03;             // Rotary encoder'in değerini tutan değişkene ilk değer veriliyor.
   sayac = 0;                  // sayac değeri sıfırlanıyor.
  HID_Enable(&readbuff,&writebuff);                       // PWM1 başlatıldı
  while(1){
              while(!HID_Read())
              {
          oldEncoder = Encoder;     // yeni değer eski değere yükleniyor
          tmp = sayac;              // 2 byte'lık sayac desimale dönüştürülüyor

          if (Encoder == oldEncoder) Encoder = RotaryEncoder & 0x03;
          if (oldEncoder.F1 != Encoder.F0)
          {
              if (oldEncoder.F0 == Encoder.F1) if (sayac < 32000) sayac++;
          }
          if (oldEncoder.F0 != Encoder.F1)
          {
              if (oldEncoder.F1 == Encoder.F0 ) if (sayac > 0) sayac--;
          }
         writebuff[2]= //buraya ne yazmam lazım onu çözemedim. writebuff[2]=sayac dediğimde 255 e kadar sayıyor.
               while(!HID_Write(&writebuff,64));
         }

}
}


Arkadaşlar bu kodlarla encoderi okuyorum.
okuduğum değeri usb üzerinden bilgisayara göndermeye çalışıyorum.
Ancak sadece 255 e kadar görebiliyorum.ekranda 255 olduğunda 0 oluyor.
bunu nasıl düzeltebilirm. ben 32000 e kadar saymasını istiyorum.
yardım ederseniz sevinirim.

Kolay gelsin.

Gökhan BEKEN

32000 = 0x7D00 yani 2byte'lık bir veridir.
veriyi 2 byte halinde parçalı göndermeniz gerekiyor, bunun için paketlemeniz lazım, yoksa karışır.
Paketlemek için minimum 2byte gerekiyor, yoksa paketteki veriler, asıl sayının içinde 2 kere gelirse paketi karıştırır. Paketler için örnek olarak # ve $ işaretini kullanacak olursak:
unsigned int asilSayi=32000;
unsigned char sayiH=0,sayiL=0;
unsigned char veri[4]={'#','$',0,0}
sayiH=(asilSayi>>8);
sayiL=(unsigned char)(asilSayi&0x00FF);
veri[2]=sayiH;
veri[3]=SayiL;
usbGonder(veri);


Bilgisayarda okurken paket başlarını bulup veriyi tekrar birleştirmeniz gerekiyor.
(Not: sizin programı incelemeden yazdım, farklar olacaktır)
Özel mesaj okumuyorum, lütfen göndermeyin.

diot

#2
dikkatiden kaçmış - cevabı siliyorum


bymerag

Alıntı yapılan: Gökhan BEKEN - 17 Nisan 2015, 15:25:48
32000 = 0x7D00 yani 2byte'lık bir veridir.
veriyi 2 byte halinde parçalı göndermeniz gerekiyor, bunun için paketlemeniz lazım, yoksa karışır.
Paketlemek için minimum 2byte gerekiyor, yoksa paketteki veriler, asıl sayının içinde 2 kere gelirse paketi karıştırır. Paketler için örnek olarak # ve $ işaretini kullanacak olursak:
unsigned int asilSayi=32000;
unsigned char sayiH=0,sayiL=0;
unsigned char veri[4]={'#','$',0,0}
sayiH=(asilSayi>>8);
sayiL=(unsigned char)(asilSayi&0x00FF);
veri[2]=sayiH;
veri[3]=SayiL;
usbGonder(veri);


Bilgisayarda okurken paket başlarını bulup veriyi tekrar birleştirmeniz gerekiyor.
(Not: sizin programı incelemeden yazdım, farklar olacaktır)

Hocam paket dediğiniz nedir.?
paket ten kasıt şu ise 64 bayt lık usb paketimiz var
writebuff[2]=sayiH;
writebuff[3]=sayiL; diyecez gönderirken

c# ise usbgelen[3] ve usbgelen[4] te değerlerimizin olması gerekir. bu değerleri birleştitmemiz lazım onun dönüşümle yapabiliriz

necati

[email]entegreterbiyecisi@yahoo.com[/email]