Şimdi referans aldığım girşten sonra lojik 1 verebilen tek opto doğru olan 2.ci fazdan gelen sinyaldir. Fazlar arası 120° açı olduğundan 6.66 MS arayla ilgili pinler lojik 1 oluyor. Sıralama için e0 referans olduğunda E1 i takip edeceğiz. E0 dan sonra 6.66 MS sonra E1 lojik 1 olursa sıra doğru. Yok e0dan sonra E2 lojik bir olursa sıra yanlış yazacak Lcd de . Yani sıramız input pin_e0==1 delay_ms 6.66 input pin_e1==1 faz sırası doğru.. else yanlışpeki süre 6.66ms den fazla veya az olursa bir önemi var mı? Yada her iki sinyalde gelmezse ne olacak? Eğer bunların bir önemi yoksa üç tane harici kesmeyle bu sinyallerin sırasını izleyebilirsin. Örneğin referans geldiğinde değişkeni 1 yaparsın e1 geldiğinde bir artırırsın e2 geldiğinde bir azaltırsın. sonsuz döngüyle bu değişkenin değerini sürekli kontrol edersin 1 veya 2 ise faz sırası doğru 0 ise yanlış yazdırırsın.
Her iki sinyalde gelmezse faz kopuk yazacakpeki süre 6.66ms den fazla veya az olursa bir önemi var mı? Yada her iki sinyalde gelmezse ne olacak? Eğer bunların bir önemi yoksa üç tane harici kesmeyle bu sinyallerin sırasını izleyebilirsin. Örneğin referans geldiğinde değişkeni 1 yaparsın e1 geldiğinde bir artırırsın e2 geldiğinde bir azaltırsın. sonsuz döngüyle bu değişkenin değerini sürekli kontrol edersin 1 veya 2 ise faz sırası doğru 0 ise yanlış yazdırırsın.
Sadece bir pin harici kesme bacağında
olsun.
Kesme oluşunca diğer iki faz okuma
pinine bakın. 0b101 ise bir yön, 0b011
ise diğer yön olacaktır.
INTCON=0b11001000;
IOCB=0b00000100; //PORTB2- PIN CHANGE INTERRUP
//MOTOR SENS INTERRUPLI //em sens iptal edildi
T1CON=0b00110001;
TMR1H=0;
TMR1IE=1;
bu yukarda yazanlar portb change interrup ile ilgili,yani port b de hangi pinlerin change olayında interrupa girecegini ayarlamada kullanılıyor.sen üç pin olacak şekilde degişiklik yapacan.
//******************
#include <stdint.h>
#include <xc.h>
#include "usart_pic16.h"
#include "PORTLAR.c"
#include "DEGISKENLER.c"
#define _XTAL_FREQ 18432000
void interrupt ISR(void)
{
if (RCIE && RCIF) {
USARTHandleRxInt();
return;
}
if (TMR1IF)
{
TMR1IF=0;
TMR1_COUNT++;
TMR2_COUNT++;
TMR3_COUNT++;
TMR4_COUNT++;
if(TMR1_COUNT>=6) {TMR1_COUNT=1;}
if(MOTOR==1 && TMR2_COUNT>=5)
{
MOTOR=0;FREN=0;HATAKODU=1;CALISTI=44;EL_EMNIYET_PISTON=0;
}
FLAG.bits.HMI=1;
return;
}
if (RBIF) { //PORTB CHANGE INTERRUP
char temp=PORTB;
MOTOR=0; //SENSORU GORDUMU MOTOR DURDURULUYOR
FREN=0; //FREN SIKILIYOR
RBIF=0;
EL_EMNIYET_PISTON=0;
return;
}
}
bu yukarda yazanlarda ise timer ve portb change interrupına girdigi zaman ne yapacagı yazıyor.
senin yapman gereken portb change interrupını üfazın sinyal girişleri ile tetiklemek ve fazbirde zaman sayaclarının üçünüde sıfırlayacan,ikinci ve üçüncü zaman sayaclarının süreleri, eger üçüncü zaman ikinciden büyükse faz sırası dogru, yok ikinci sayac üçüncüden büyükse faz sırası yanlış demektir.
Kusura bakma yukardaki programları hale hazırda bir makinada kullandıgım yazılımdan kesip yapıştırdım.üzerinde degişiklikler yapman gerek.Kolay gelsin.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?