#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.
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)
dikkatiden kaçmış - cevabı siliyorum
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
https://sites.google.com/site/proyectosroboticos/encoder/encoder-por-software/pic-encoder-usb
Alıntı yapılan: necati - 17 Nisan 2015, 18:06:20
https://sites.google.com/site/proyectosroboticos/encoder/encoder-por-software/pic-encoder-usb
Hocam teşekkürler ama mikroc örneği lazım.