#include <18F4550.h>
#device ADC=10
#fuses HSPLL,USBDIV,PLL5,PUT,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOMCLR
#use delay(clock=20000000)
#define USB_HID_DEVICE FALSE
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //Uçnokta1'de Yığın transferi aktif
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK
#define USB_EP1_TX_SIZE 64 //Uçnokta1 için maksimum alınacak ve gonderilecek
#define USB_EP1_RX_SIZE 64 //veri boyutu (64 byte)
#include <pic18_usb.h>
#include <USB_Konfigurasyon.h> //USB konfigurasyon bilgileri bu dosyadadır.
#include <usb.c>
#define UcNokta1 1
#define Komut gelen_paket[0]
//Komutlar
#define bilgi_oku 0x03 //Mikrokontrolör içindeki yazılımın sürüm numarasını oku
#define bilgi_yaz 0x02
//#define olcum_al 0x02 // ADC girişilerindeki değerleri ve manuel çalışmadaki parametreli al
//#define pwm_1_ayarla 0x04 //dc motor için pwm1 çıkışını ayarla
//#define pwm_2_ayarla 0x05 //dc motor için pwm2 çıkışını ayarla
//Değişkenler
static unsigned int16 ADC_deger1 = 0; //DC motor için gerekli ADC girişi, pwm çıkışları ve yön değerini
static unsigned int8 pwm_deger1 = 0; //tutan değişkenler
static unsigned int8 pwm_deger2 = 0;
static unsigned int8 dc_yon_degisim = 0;
static unsigned int16 ADC_deger2 = 0; //Step Motor için gerekli ADC girişi, yön , hiz ve adim değerlerini
static unsigned int8 step_yon = 0; //tutan değişkenler
static byte step_hiz= 0;
static byte adim_durum = 0;
byte const adimlar[] = {10,12,5,3}; //Tam Adım unipolar stepmotor adımları yarım adım[]={2,10,8,12,4,5,1,3}
unsigned int8 step_yon_degisim = 0;
void step_motor_sur();
/*#int_TIMER1
void TIMER1_isr(){
step_motor_sur();
}*/
#int_EXT
void ext_isr()
{
while(!input(Pin_B0)); //Buton bırakılana kadar bekle
dc_yon_degisim++;
}
#int_EXT1
void ext1_isr() //Buton bırakılana kadar bekle
{
while(!input(Pin_B1));
step_yon_degisim++;
}
void user_init(void) //Pic açılırken ayarlanacak temel özellikler
{
set_tris_a(0x03); //RA0,RA1 giriş
set_tris_b(0x03); //RB0,RB1 giriş
set_tris_d(0x00);
setup_adc_ports(AN0_TO_AN1); //A0 ve A1 pinleri analog-dijital çevirici girişleri
setup_adc(ADC_CLOCK_INTERNAL); //ADC ölçümü için dahili osilatörü kullan
port_b_pullups(TRUE);
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
ext_int_edge(0,H_TO_L);
ext_int_edge(1,H_TO_L);
setup_timer_2(T2_DIV_BY_16, 255, 1); //pwm için timer2'yi ayarla
setup_ccp1(CCP_PWM); //CCP1 ve
setup_ccp2(CCP_PWM); //CCP2 pinlerini PWM üretimi için ayarla
}
unsigned int16 ADC_Oku(byte kanal) // ADC pinlerideki voltaj değerlerini okuyan fonksiyon
{
unsigned int16 olcum=0;
set_adc_channel(kanal);
delay_us(20);
olcum = read_adc();
return olcum;
}
void main(void)
{
byte sayac=0;
byte gelen_paket[64]; //gelen paket
byte gond_paket[64]; //gönderilecek paket
//Sistemi başlat
user_init();
usb_init();
usb_task();
set_pwm1_duty(pwm_deger1);
set_pwm2_duty(pwm_deger2);
usb_wait_for_enumeration(); //Cihaz, hazır olana kadar bekle
if(usb_enumerated())
output_high(Pin_A2); //USB bağlantısı kurulduysa LED'i yak.
for (;;)
{
while(usb_enumerated())
{
if (usb_kbhit(1)) //Eğer pc'den yeni bir paket geldiyse
{
usb_get_packet(UcNokta1, gelen_paket, 64); //paketi oku
switch(Komut) // Paketin ilk elemanındaki komutu oku ve ilgili göreve git
{
case bilgi_oku:
ADC_deger1=ADC_Oku(0);
ADC_deger2=ADC_Oku(1);
gond_paket[0] = Komut;
gond_paket[1] = ADC_deger1/4;
gond_paket[2] = dc_yon_degisim;
gond_paket[3] = ADC_deger2/4;
gond_paket[4] = step_yon_degisim;
sayac = 0x05;
break;
case bilgi_yaz:
pwm_deger1 = gelen_paket[1];
set_pwm1_duty(pwm_deger1);
pwm_deger2 = gelen_paket[2];
set_pwm2_duty(pwm_deger2);
step_yon = gelen_paket[3];
step_hiz = gelen_paket[4];
break;
default: ; break;
}
}
if(sayac!=0)
{
usb_put_packet(UcNokta1, gond_paket, sayac, USB_DTS_TOGGLE);
sayac = 0;
Komut = 0;
}
step_motor_sur();
}
}
}
void step_motor_sur()
{
if((step_hiz != 0) && (step_yon != 0)){
output_d(adimlar[adim_durum]*4); //çıkışı ötelemek için 4 ile çarpılır
Delay_Ms(257-step_hiz);
if(step_yon == 1)
adim_durum = (adim_durum+1)&(sizeof(adimlar)-1);
else
adim_durum = (adim_durum-1)&(sizeof(adimlar)-1);
}
if(step_yon==0)
output_d(0);
}