USB'li proje için 48Mhz(48000000) kristal bulamıyorum

Başlatan Recep METE, 31 Mayıs 2015, 13:03:16

Recep METE

#include <18F4550.h>
#device ADC=10
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1,VREGEN,NOBROWNOUT // 8MHZ
#use delay(clock=48000000)


Arkadaşlar yukarıda bir bölümü görülen projeyi breaboarda kuracağım.Ancak elimde 48000000(48Mhz) frekansta osilatör yok. Hatta satın alacağım , "Direnç.Net" te de yok. Acaba osilatör değerini 4mhz düşürsem proje çalışır mı.Ya da bunun yerine ne önerirsiniz.Sağlıcakla kalın.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

DaRt

Ben 20 mhz kristal ve aşağıdaki kod ile 18f4550yi sorunsuz çalıştırıyorum.

#use delay(clock=48000000,crystal=20000000)

t2

20MHZ kristal takılır.
PLL ayarlanarak, PIC 48Mhzde çalışır.

Recep METE

Alıntı yapılan: t2 - 31 Mayıs 2015, 13:20:16
20MHZ kristal takılır.
PLL ayarlanarak, PIC 48Mhzde çalışır.
Hocam bu işi nasıl yapabilirim.  Anlatır mısınız?
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

t2

   
Ezbere bilmiyorum. Hazır  CCS C ,  USB'li proje  bulursanız zaten öyle yapılmıştır. 20 Mhz veya 8Mhz kristal takılır, PIC  48 Mhz olarak çalışır.

selimkoc

48 Mhz kristali doğrudan kullanamazsın. 4Mhz veya katları kristali bağlayacaksın PLL ile 48Mhz çıkartacaksın.

RaMu

CcsC de iş kolay.
Kısaca
#use delay(clock=48MHz, crystal=4MHz, USB_FULL)

Datasheet ten hangi kristal frekanslarının kullanılabileceğini kontrol etmekte fayda var, gerisi:
Alıntı yapılan: RaMu
http://www.ccsinfo.com/newsdesk_info.php?newsdesk_id=164
kaynağı baştan belirteyim.

Daha önce usb için osilatör ayarlarıyla epey uğraşmış ve
zaman zamanda nasıl neden nereden olduğunu anlatmıştım.

Yeni farkettiğim Mart 2014 de yayınlanan linkdeki yazıda
çok kolay bir operatör ile bu işi halletmiş CcsC,
daha sonra detayları yazacağım,
şimdilik not olarak şunu yazayım:
(başka seçeneklerde var linkde mevcut)

#use delay(clock=48MHz, crystal=4MHz, USB_FULL)

diye konfigurasyon ayarı girersek,
clock mcu nun çalışacağı frekansı seçtiğimiz kısım,
crystal mcu ya taktığımız kristalin frekansı,
usb_full usb nin çalışacağı frekans,
yani pice 4MHz kristal bağladık,
pic 48MHz de çalışıyor,
usb full speed (48MHz) de çalışıyor
demek oluyor.

Datsheet te devamındaki sayfada var:
Detaylar şu konuda https://www.picproje.org/index.php?topic=54462.0

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

esensoy

aşağıdaki kodlar 20MHz kristal için;
Datasheet in 24 üncü sayfasına bakarsan; PLLDIV register ı yanında (4MHz inut only) diye bir ibare var,
Bu pic için o noktaya yalnızca 4 MHz getirmelisin, girişte kullandığın kristal PLLDIV deki seçeneklerden birine bölündüğünde 4MHz olmalı,
Aşağıdaki sigorta ayarlarında PLL5 var,
PLL5 girişteki kristalin frekansını 5 e böl demek, usb peripheral için bu işlem yeterli,
8MHz bağlamış olsaydık PLL2 seçmeliydik,
Yalnız iş bitmedi, USB birimini 96 MHz yolundan beslediğin için USBDIV = 1 seçmelisin, oda CCS C de USBDIV ile yapılıyor,
#include <18F4550.h>
#device ADC=8

#fuses HSPLL,USBDIV,PLL5,PUT,CPUDIV1,VREGEN,NOWDT,PROTECT,NOLVP,NODEBUG,MCLR,NOPBADEN
#fuses CPB,CPD,WRT,WRTC,WRTB,WRTD,EBTR,EBTRB
#use delay(clock=48m)
En tehlikeli an "zafer" anıdır.

Recep METE

Hepinize çok teşekkür ederim.Çok faydalı yazılar oldu.Allah Razı olsun.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

OnderGrmz

Merhabalar;
Konu ile bağlantılı olduğu için buraya yazıyorum. Elimde 2 tane pic var bunlar 18f4550 ve 18f2550. 18f2550 ile Usb CDC haberleşmesini yapmaya çalışıyorum fakat bilgisayar bana USB Aygıtı tanınmadı diye hata veriyor. Aynı işlemi 18f4550 de yapınca sıkıntı çıkmıyor ve sistem çalışıyor.


Kullandığım kodlar PIC C Compiler için yazılmış örnek kodlardır, ex_usb_serial.c adındaki dosyadır.
//set to 1 to use a PIC's internal USB Peripheral
//set to 0 to use a National USBN960x peripheral
#define __USB_PIC_PERIF__ 1

#if !defined(__PCH__)
 #error USB CDC Library requires PIC18
#endif


#if __USB_PIC_PERIF__
 #DEFINE LED1  PIN_A5
 #include <18F2550.h>  //#include <18F4550.h>
 #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
 #use delay(clock=48000000)
#else //use the National USBN960x peripheral
 #DEFINE LED1  PIN_B3
 #include <18F452.h>
 #fuses HS,NOWDT,NOPROTECT,NOLVP
 #use delay(clock=20000000)
#endif   //endif check to see which peripheral to use

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

/////////////////////////////////////////////////////////////////////////////
//
// If you are using a USB connection sense pin, define it here.  If you are
// not using connection sense, comment out this line.  Without connection
// sense you will not know if the device gets disconnected.
//       (connection sense should look like this:
//                             100k
//            VBUS-----+----/\/\/\/\/\----- (I/O PIN ON PIC)
//                     |
//                     +----/\/\/\/\/\-----GND
//                             100k
//        (where VBUS is pin1 of the USB connector)
//
/////////////////////////////////////////////////////////////////////////////
///only the 18F4550 development kit has this pin
//#if __USB_PIC_PERIF__ && defined(__PCH__)
// #define USB_CON_SENSE_PIN PIN_B2
//#endif


#include <usb_cdc.h>

/////////////////////////////////////////////////////////////////////////////
//
// Configure the demonstration I/O
//
/////////////////////////////////////////////////////////////////////////////
#define LED2 PIN_B4
#define LED3 PIN_B5
#DEFINE BUTTON PIN_A4
#define LED_ON output_low
#define LED_OFF output_high


/////////////////////////////////////////////////////////////////////////////
//
// usb_debug_task()
//
// When called periodically, displays debugging information over serial
// to display enumeration and connection states.  Also lights LED1 based upon
// enumeration and status.
//
/////////////////////////////////////////////////////////////////////////////
void usb_debug_task(void) {
   static int8 last_connected;
   static int8 last_enumerated;
   int8 new_connected;
   int8 new_enumerated;
   static int8 last_cdc;
   int8 new_cdc;

   new_connected=usb_attached();
   new_enumerated=usb_enumerated();
   new_cdc=usb_cdc_connected();

   if (new_enumerated)
      LED_ON(LED1);
   else
      LED_OFF(LED1);

   if (new_cdc)
      LED_ON(LED2);
   else
      LED_OFF(LED2);

   if (usb_cdc_carrier.dte_present)
      LED_ON(LED3);
   else
      LED_OFF(LED3);

   if (new_connected && !last_connected)
      printf("USB connected, waiting for enumaration...\r\n\n");
   if (!new_connected && last_connected)
      printf("USB disconnected, waiting for connection...\r\n\n");
   if (new_enumerated && !last_enumerated)
      printf("USB enumerated by PC/HOST\r\n\n");
   if (!new_enumerated && last_enumerated)
      printf("USB unenumerated by PC/HOST, waiting for enumeration...\r\n\n");
   if (new_cdc && !last_cdc) {
      printf("Serial program initiated on USB<->UART COM Port\r\n\n");
      printf(usb_cdc_putc, "\r\n\nCCS CDC (Virtual RS232) Example\r\n\n");
      
      printf(usb_cdc_putc, "\r\n\nPULSEEEEEEEEEEEEEEEEEEEE\r\n\n");
   }

   last_connected=new_connected;
   last_enumerated=new_enumerated;
   last_cdc=new_cdc;
}

void main(void) {
   char c;

   LED_OFF(LED1);
   LED_OFF(LED2);
   LED_OFF(LED3);

   printf("\r\n\nCCS CDC (Virtual RS232) Example\r\n");

  #ifdef __PCH__
   printf("PCH: v");
   printf(__PCH__);
  #else
   printf("PCM: v");
   printf(__PCM__);
  #endif
   printf("\r\n");

   usb_init_cs();

  #if !(__USB_PIC_PERIF__)
   printf("USBN: 0x%X", usbn_get_version());
   printf("\r\n\n");
  #endif


   while (TRUE) {
      usb_task();
      usb_debug_task();

      if (kbhit()) {
         c=getc();
         if (c=='\n') {usb_cdc_putc('\r'); usb_cdc_putc('\n');}
         if (c=='\r') {usb_cdc_putc('\r'); usb_cdc_putc('\n');}
         else {usb_cdc_putc(c);}
      }
      if (usb_cdc_kbhit()) {
         c=usb_cdc_getc();
         if (c=='\n') {putc('\r'); putc('\n');}
         if (c=='\r') {putc('\r'); putc('\n');}
         else {putc(c);}
      }
   }
}


Kodlarda kısaca RS 232 üzerinden pic in aldığı veriyi USB CDC üzerinden bilgisayara geri gönderiyor.


RS 232 kısmı:

[IMG]http://i58.tinypic.com/34ngtop.jpg[/img]



USB CDC Kısmı:

[IMG]http://i58.tinypic.com/11hcw7c.jpg[/img]

18f4550 ve 18f2550 ile olan devreleri bread boarda kurdum. Daha önce 18f2550 delikli plakete kurulu idi. Çalışmadığı için bread boarda kurdum.

Yardımlarınız için teşekkür ederim şimdiden ...