çok haklısın, baştan beri niyetim oydu ama yazılımdan çok anlamıyorum chatgpt yardımıyla da bi yere kadar ilerleyebildim. projede ufak bir değişiklik oldu. artık sensörden gelen pals hızına göre pwm duty oranını da değiştirmem gerekiyor.Eğer mikroişlemcinin güçü yetiyorsa ve diğer kısıtlamalar/şartlar yoksa bu tür işlerin yazılımla yapılması daha mantıklı olur.
Ek kod için 5 saat fazladan harcanır, donanımla yapılınca entegre ve etrafındakı devre elemanların maliyeti (fiyat, tedarik, pcb ölçüsü, dizgi ve s.) üretilen her ürünün fiyatına eklenecek.
@ __config _INTOSCIO & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF
DEFINE OSC 4
OSCCON = %01100001
CMCON0 = 7
ANSEL = 0
WPU = 0
GPIO = 0
TRISIO = %00001000 ' GP3 giriş, diğer çıkış
CCP1CON = %00001100 ' PWM modu
PR2 = 249 ' 1 kHz PWM
T2CON = %00000101 ' Timer2 on, prescaler 1:4
' Değişkenler
oldState VAR BIT
newState VAR BIT
kenarSayisi VAR BYTE
dutyDegeri VAR WORD
sayac VAR WORD
PAUSE 100
BASLA:
kenarSayisi = 0
oldState = GPIO.3
FOR sayac = 1 TO 500 ' 500 ms ölçüm
newState = GPIO.3
IF (newState = 1) AND (oldState = 0) THEN
kenarSayisi = kenarSayisi + 1
ENDIF
oldState = newState
PAUSE 1
NEXT
IF kenarSayisi > 50 THEN
kenarSayisi = 50
ENDIF
dutyDegeri = kenarSayisi * 1023 / 50
CCPR1L = dutyDegeri >> 2
CCP1CON.5 = dutyDegeri.1
CCP1CON.4 = dutyDegeri.0
GOTO BASLA
#define COUNTER_THRESHOLD = 1000 // bekleme timer'i
static unsigned int counter = 0;
// Pin toggle interrupt'ı
void interrupt pin_change(){
if(counter == COUNTER_THRESHOLD +1){
// sensor dönmeye başladı - gereken işlemleri yap
}
counter = 0;
}
// Timer interrupt'ı
void interrupt timer(){
if( counter == COUNTER_THRESHOLD){
// sensor durdu - gereken işlemleri yap
counter++;
}
else{
if (counter != COUNTER_THRESHOLD + 1){
counter++;
}
}
}
#define COUNTER_THRESHOLD = 1000 // bekleme timer'i
static unsigned int counter = 0;
static unsigned char input_pin = 0;
void interrupt timer(){
unsinged char tint = GPIO.3; // giriş pin'i oku
if (tint != input_pin){
if(counter == COUNTER_THRESHOLD + 1){
// sensör dönmeye başladı - gereken işlemleri yap
}
input_pin = tint;
counter = 0;
}
else{
if(counter == COUNTER_THRESHOLD){
// sensor durdu - gereken işlemleri yap
counter++;
}
else{
if(counter != COUNTER_THRESHOLD +1){
counter++;
}
}
}
}