18f4550 USB_CDC yardım

realistic

Üye
Katılım
20 May 2008
Mesajlar
13
Puanları
1
Yaş
39
Merhaba arkadaşlar

Bilgisayardan ccs c'nin usb cdc kütüphanesini kullanarak veri alıp seri iletişimle başka bir pic'e göndermek istiyorum.
İsiste simülasyon gayet düzgün çalıştı fakat devreyi bredbord üzerine kurduğum zaman bilgisayarda "usb aygıt tanınamadı" hata uyarısını alıyorum

Yardımınıza ihtiyacım var!!!

KODLARIM:

#define __USB_PIC_PERIF__ 1
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#include <stdlib.h>
#include <math.h>
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=N, stop=1)
#include <usb_cdc.h>
#use fast_io(d)

const int8 uzuv1 = 24;
const int8 uzuv2 = 15;
const int8 uzaklik = 3;
const int8 x_scale = 30;
const int8 y_scale = 30;

static int8 last_cdc;
int8 new_cdc;
float servo1,servo2,servo3,aci_step;
unsigned int8 pozisyon_x,pozisyon_y;
char gelen;
int8 kontrol=1;
int8 sepet;
char ok = 13;




//*** SERVOLARA ACI DEGERLERINI GONDEREN FONKSIYON ***\\
void cisme_git()
{
output_high(pin_d0);
printf("%f",servo1);
putc(ok);
delay_ms(50);
printf("%f",servo2);
putc(ok);
delay_ms(50);
output_low(pin_d0);

output_high(pin_d1);
printf("%f",servo3);
putc(ok);
delay_ms(50);
output_low(pin_d1);

delay_ms(1000);
}



//*** 3 farkli sepetin gonderilmesi icin servolara aci degerleri gonderir ***\\
void sepete_git(int z)
{
output_high(pin_a3);
delay_ms(200);
switch (z)
{
case 1:
output_high(pin_d0);
printf("30");
putc(ok);
printf("95");
putc(ok);
delay_ms(50);
output_low(pin_d0);
output_high(pin_d1);
printf("120");
putc(ok);
delay_ms(50);
case 2:
output_high(pin_d0);
printf("50");
putc(ok);
printf("95");
putc(ok);
delay_ms(50);
output_low(pin_d0);
output_high(pin_d1);
printf("120");
putc(ok);
delay_ms(50);
case 3:
output_high(pin_d0);
printf("120");
putc(ok);
printf("95");
putc(ok);
delay_ms(50);
output_low(pin_d0);
output_high(pin_d1);
printf("120");
putc(ok);
delay_ms(50);
}

delay_ms(1000);
output_low(pin_a3);

// matlab'e cismin tasinip birakildigi bilgisi gonderiliyor
printf(usb_cdc_putc, "\n\rok");
}


//*** 255 x 255 birimlik alandaki pozisyon bilgirenie göre servo acisi hesaplnamasi ***\\

void aci_hesapla(float x, float y)
{
float a,b;
//ustteki degiskenler float olarak degistirilmeye calisilmali
float temp,p;
printf(usb_cdc_putc,"\n\rx......=%f",x);
printf(usb_cdc_putc,"\n\ry......=%f",y);
if (x<=127)
{
a = (x_scale/2)-((x*x_scale)/254);
// printf(usb_cdc_putc,"\n\ra......= %f",a);

b = y_scale - (y/254)*y_scale;
// printf(usb_cdc_putc,"\n\rb......= %f",b);

temp =(b+uzaklik)*(b+uzaklik) + a*a;
// printf(usb_cdc_putc,"\n\rtemp......= %f",temp);

p = sqrt(temp);
// printf(usb_cdc_putc,"\n\rp......= %f",p);

aci_step=asin((b+uzaklik)/p);
// printf(usb_cdc_putc,"\n\raci_step......= %f",aci_step);
}

else
{
a = ((x-127)/254)*x_scale;
// printf(usb_cdc_putc,"\n\ra......= %f",a);

b = y_scale - (y/254)*y_scale;
// printf(usb_cdc_putc,"\n\rb......= %f",b);

temp =(b+uzaklik)*(b+uzaklik) + a*a;
// printf(usb_cdc_putc,"\n\rtemp......= %f",temp);

p = sqrt(temp);
// printf(usb_cdc_putc,"\n\rp......= %f",p);

aci_step = asin(a/p);
aci_step = aci_step+pi/2;
// printf(usb_cdc_putc,"\n\raci_step......= %f",aci_step);
}

temp = ((uzuv1*uzuv1) + (uzuv2*uzuv2) - (p*p))/(2*uzuv1*uzuv2);
// printf(usb_cdc_putc,"\n\rtemp......= %f",temp);
servo2 = acos(temp);

temp = (uzuv2*sin(servo2))/p;
servo1 = acos(temp);
servo3 = pi+servo1-servo2;

servo1=floor(180/pi*servo1);
servo2=floor(180/pi*servo2);
servo3=floor(180/pi*servo3);
printf(usb_cdc_putc,"\n\rservo1......= %f",servo1);
printf(usb_cdc_putc,"\n\rservo2......= %f",servo2);
printf(usb_cdc_putc,"\n\rservo3......= %f",servo3);

}


void main()
{
set_tris_a(0x00);
set_tris_d(0x00);
setup_adc(ADC_OFF);
setup_adc_ports(NO_ANALOGS);
setup_ccp1(CCP_OFF);
setup_ccp2(CCP_OFF);

output_low(pin_d0);

while (1)
{
usb_task();
new_cdc=usb_cdc_connected();
if (usb_enumerated()) {output_high(pin_B4);}
if (usb_cdc_connected()) {output_high(pin_B5);}

while (new_cdc && !last_cdc)
{


if (usb_cdc_kbhit())
{


switch (kontrol)
{
case 1:
gelen = usb_cdc_getc();
pozisyon_x=(int8)gelen;
//printf(usb_cdc_putc,"\n\rpozisyon_x......= %u",pozisyon_x);
kontrol = 2;
case 2:
gelen = usb_cdc_getc();
pozisyon_y=(int8)gelen;
//printf(usb_cdc_putc,"\n\rpozisyon_y......= %u",pozisyon_y);
kontrol = 3;
case 3:
gelen = usb_cdc_getc();
sepet = (int8)gelen;
//printf(usb_cdc_putc,"\n\rsepet......= %d",sepet);
kontrol = 4;
}

}

delay_ms(200);

if (kontrol == 4)
{
kontrol = 1;
aci_hesapla(pozisyon_x,pozisyon_y);

cisme_git();

sepete_git(sepet);
output_high(pin_d0);
delay_ms(1000);
output_low(pin_d0);
}

}


last_cdc=new_cdc;
}
}
 
USB bağlantıda işlemci çalışma frekansı çok önemli. USB haberleşme için 48mhz bir çalışma frekansı gerekli. Bu frakansı elde etmek için kullandığınız kristal değerine göre fuse ayarlarından PLL seçimi yapmanız gerekir.
Siz zaten 48 mhz bir kristal kulanmışsınız ama fuse ayarlarında PLL5 seçili.PLL5 in kristal değeri 20mhz. Siz PLL5 Yerine PLL12 yazmalısınız. Yada 20mhz kristal kullanmalısınız.
 
USB bağlantıda işlemci çalışma frekansı çok önemli. USB haberleşme için 48mhz bir çalışma frekansı gerekli. Bu frakansı elde etmek için kullandığınız kristal değerine göre fuse ayarlarından PLL seçimi yapmanız gerekir.
Siz zaten 48 mhz bir kristal kulanmışsınız ama fuse ayarlarında PLL5 seçili.PLL5 in kristal değeri 20mhz. Siz PLL5 Yerine PLL12 yazmalısınız. Yada 20mhz kristal kullanmalısınız.

Hocam Çok sağolun. Söylediğinizi yaptım
fuses da PLL5 yerine PLL12yi yazdım

fakat hala USB Aygıtı Tanınmadı Hatasını alıyorum

Doğru çalışma için başka tavsiyelerde bulunabilir misiniz?
 
Tamam Çözebildim Cenkun Hocam teşekkürler Meğerse 18f4550 maksimum kristal frenkansı olarak 20 MHZ kabul ediyormuş. 4MHZ kristal ve fuses ayarlarında PLL1 yapınca devre board üzerinde çalıştı.
 
Ben de ilk usb çalışmalarımı ccs c kodları ile denemiştim. İnternetten bulduğum hazır kolar üzerinde çalışma yaparken devreler parazitlerden çabuk etkilenip usb aygıt tanınamadı gibisinden bende sorunlar yaşamıştım.
Sizdede böyle bir sıkıntı olabilir. USB konnektöründen gelen kabloları biraz daha kısaltıp besleme devresini daha iyi hale getirip bir deneme yapın.
Diğer bir seçenek devrenizin usb bağlantıyı sağlayıp sağlamadığını görmek için sade bir kod yazın.

Ben şu anda USB uygulamalarımda Proton kullanıyorum. Proton kodları daha kararlı çalışıyor gibi geldi bana.

Elimde 18f4550 yok ama 2550 var. Fırsatım olursa programınızı ona göre değiştirip bir debeneme yapmaya çalışırım.



Ben cevap yazarken siz olayı çözmüşsünüz. Çok sevindim.
 
Hatta belki aynı problemi yaşayan arkadaşlar olur diye fuses ayarlarındaki 16f serisine göre ekstra olan birkaç terimi açıklamakta fayda görüyorum
HSPLL (XTPLL veya ECPLL de olabilir kullacanağınız kristal çeşitiyle ilgili)
PLLX
CPUDIVX

HSPLL: bu ön işlemci fonksiyonunu bağladığınız kristalin frekansından daha da yüksek bir çalışma frekansı istiyorsanız kullanıyorsunuz (örneğin yukarıdaki projede 4MHZ kristal ile 48MHZ çalışma frekansı elde edebildim)

PLLX : mikroişlemci 48 MHZ çalışma frekansına ulaşabilmek için 4 MHZlik bir referans frekans istiyor. Bunu da si PLL ile mikro işlemciye bildiriyorsunuz. örneğin 20 mhz kristal kullandıysanız PLL5 kullanmanız gerekiyor ( 20mhz/5 = 4mhz) ya da 4mhz için PLL1 yazmanız gerekiyor (4mhz/1 = 4mhz)

CPUDIVX: Buradada yukarıdaki adımlarla ulaştığınız frekansı düşürebilirsiniz. Çalışma frekansı X yerine yazacağınız sayısal değere bölünür ve çalışma frekansınız belirlenmiş olur.

Örneğin 8mhz kristaliniz var
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV4,VREGEN
ön işlemci komutlarını verdiniz arkasından çalışma frekansı için
#use delay(clock=12000000)

yazmalısınız

Benim anladıklarım bunlar ve benim durumumda olan arkadaşlara yardımcı olur umarım.

Yanlışımız varsa ustalarımızın düzeltmesi dileğiyle affoluna...
 
realistic verdiğin bilgiler için teşekkür ederim kendi adıma. Ancak sanırım gecenin yorgunluğundan olacak ki tam olarak önişlemci komutları ile #use delay (clock=xxxx) değerini nasıl belirledin anlayamadım. Daha ayrıntılı açıklaman mümkün müdür acaba?
 
realistic verdiğin bilgiler için teşekkür ederim kendi adıma. Ancak sanırım gecenin yorgunluğundan olacak ki tam olarak önişlemci komutları ile #use delay (clock=xxxx) değerini nasıl belirledin anlayamadım. Daha ayrıntılı açıklaman mümkün müdür acaba?
merhaba, microc ile uğraşıyorum, bilgisayar ve devreyi usb aracılığı ile bağladığımda aynı hatayı alıyorum. devre isis de çalışmasına rağmen bilgisayarda çalışmıyor. yardımcı olabilir misiniz?
 

Forum istatistikleri

Konular
128,197
Mesajlar
915,762
Kullanıcılar
449,977
Son üye
keskiyan

Yeni konular

Geri
Üst