#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <htc.h>
// CONFIG
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = ON // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define _XTAL_FREQ 4000000 // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#define buton_ileri RA0 //a0 bit'i buton_ileri olarak tanımlandı.
#define buton_geri RA1 //a1 bit'i buton_geri olarak tanımlandı.
#define buton_hiz_azalt RA2 //a2 bit'i buton_hiz_azalt olarak tanımlandı.
#define buton_hiz_arttir RA3 //a3 bit'i buton_hiz_arttir olarak tanımlandı.
#define buton_yarim_adim RA4 //a4 bit'i buton_yarim_adim olarak tanımlandı.
#define buton_tam_adim RA5 //a5 bit'i buton_tam_adim olarak tanımlandı.
const int yarim_adim[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09}; // Step motor yarım adım dönüş adımları tanımlandı.
const int tam_adim[]={0x01,0x02,0x04,0x08}; // Step motor tam adım dönüş adımları tanımlandı.
int i,j,m,n,adim,yon;
void __interrupt () kesme (void)
{
if(T0IF){ // Kesme oldu ise
TMR0=-200; // TMR0'a başlangıç değerini yeniden ata.
if(!buton_ileri)
{
yon=1;
}
if(!buton_geri)
{
yon=0;
}
if(!buton_yarim_adim)
{
adim=1;
}
if(!buton_tam_adim)
{
adim=0;
}
T0IF=0; // Kesme bayrağını sıfırla.
}
}
void main(void) {
TRISA=0xFF; //A Portu giriş olarak ayarlandı.
TRISB=0x00; //B Portu çıkış olarak ayarlandı.
TRISD=0x00; //D Portu giriş olarak ayarlandı.
PORTB=0x00; //B Portu çıkışı sıfırlandı.
if(adim==0&&yon==0)
for(i=3;i>-1;i--)
{
PORTB=tam_adim;
__delay_ms(100);
}
if(adim==1&&yon==0)
for(j=7;j>-1;j--)
{
PORTB=yarim_adim[j];
__delay_ms(100);
}
if(adim==0&&yon==1)
for(m=0;m<4;m++)
{
PORTB=tam_adim[m];
__delay_ms(100);
}
if(adim==1&&yon==1)
for(n=0;n<8;n++)
{
PORTB=yarim_adim[n];
__delay_ms(100);
}
T0CS=0; // TMR0, Timer olarak çalışsın
T0SE=1; // Yükselen kenar tetikleme
PSA=0; // WDT pasif T/C aktif
PS0=1; // Ön yükleyici 111 => 256'e bölünecek
PS1=1; // OSC=4 MHz, Timer => 1Mhz / 256
PS2=1; // Timer bir sayması 256 usn
TMR0=-200; // TMR0=-200 => 256 usn x 200 =51.200 usn
T0IF=0; // TMR0 kesme bayrağını resetle
T0IE=1; // TMR0 kesmesi aktif
GIE=1; // Global kesme aktif
while(1);
}