MicroC PWM Komutları İle Yaşadığım Problem

Başlatan korkmazlar23, 21 Nisan 2016, 22:26:15

korkmazlar23

Eyvallah hocam motor kontrolünü hallettim programı falan yazdım bir kaç eksik var şimdiki amacım basmada gecikmeli buton yapmak acaba onu nasıl yapabilirim? Program;

//LCDLERİN MODÜL BAĞLANTISI
sbit LCD_RS at RB5_bit;
sbit LCD_EN at RB4_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_direction at TRISB5_bit;
sbit LCD_EN_direction at TRISB4_bit;
sbit LCD_D4_direction at TRISB0_bit;
sbit LCD_D5_direction at TRISB1_bit;
sbit LCD_D6_direction at TRISB2_bit;
sbit LCD_D7_direction at TRISB3_bit;
// MODUL BAĞLANTISI BİTTİ

    char txt[10];
    int toplam=0;
void main() { // ana program
ADCON1 |=0x06;
CMCON |=7;

trisc=0;  // c' nin çıkışlar 0
portc=0; // c' nin verdiği voltaj 0
trisd=0;
portd=0;

//PWM MOTOR KONTROL



pwm1_init(1000); // pwm1 init 5KHz
pwm1_start(); // pwm1 başlangıç
pwm1_set_duty(127);// +90* dönme kare sinyal

pwm2_init(1490); // pwm2 init 1,490KHz
pwm2_start(); // pwm2 başlangıç
pwm2_set_duty(72); // 0* dönme kare sinyal








// LCD KONTROL
Lcd_Init(); // LCD başlangıç
LCD_CMD(_LCD_CURSOR_OFF);  // cursor'u off yaptık
LCD_CMD(_LCD_CLEAR); // lcd yi temizledik

ByteToStr(toplam,txt); // toplam int değer'i txt  char değerine at
Lcd_Out(2,6,txt);    // lcd'nin 1. satır 6.sütuna txt değerini yaz (255 yani);
Lcd_Out(2,1,"Arac=");  // lcd'nin 1. satır 4. sütüna "sayi=" yaz
Lcd_Out(1,1,"Oak Otopark Bos");




while(1){
if(rd0_bit==1){

toplam=toplam+1;
delay_ms(10);
ByteToStr(toplam,txt); // toplam int değer'i txt  char değerine at
Lcd_Out(2,6,txt);    // lcd'nin 1. satır 6.sütuna txt değerini yaz (255 yani);
Lcd_Out(2,1,"Arac=");  // lcd'nin 1. satır 4. sütüna "sayi=" yaz
Lcd_Out(1,1,"Oak Otopark  ");
                  }
if(rd1_bit==1)
{

toplam=toplam-1;
delay_ms(10);
ByteToStr(toplam,txt); // toplam int değer'i txt  char değerine at
Lcd_Out(2,6,txt);    // lcd'nin 1. satır 6.sütuna txt değerini yaz (255 yani);
Lcd_Out(2,1,"Arac=");  // lcd'nin 1. satır 4. sütüna "sayi=" yaz
Lcd_Out(1,1,"Oak Otopark");
}

if(toplam>=10) {
LCD_CMD(_LCD_CLEAR);
Lcd_Out(1,1,"Otopark Dolu");
Lcd_Out(2,1,"DOLU");
}

if(toplam<0) {
LCD_CMD(_LCD_CLEAR);
Lcd_Out(1,1,"Otopark Bos");
}
          }
}

korkmazlar23

programın amacı akıllı otopark sistemi şemayıda sana atayım motor üstteki butonla 0 derece alttaki butonla 90 derece açı yapıyor en alttaki 2 butonda sayıcı için ancak basılı tuttuğumda lcdide art arda sayıyor bu yüzden basmada gecikmeli istiyorum yani bastıgımda degılde cektıgımde sayacak

karacan451


//LCDLERİN MODÜL BAĞLANTISI
sbit LCD_RS at RB5_bit;
sbit LCD_EN at RB4_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_direction at TRISB5_bit;
sbit LCD_EN_direction at TRISB4_bit;
sbit LCD_D4_direction at TRISB0_bit;
sbit LCD_D5_direction at TRISB1_bit;
sbit LCD_D6_direction at TRISB2_bit;
sbit LCD_D7_direction at TRISB3_bit;
// MODUL BAĞLANTISI BİTTİ

    char txt[10];
    int toplam=0;
void main() { // ana program
ADCON1 |=0x06;
CMCON |=7;

trisc=0;  // c' nin çıkışlar 0
portc=0; // c' nin verdiği voltaj 0
trisd=0;
portd=0;

//PWM MOTOR KONTROL



pwm1_init(1000); // pwm1 init 5KHz
pwm1_start(); // pwm1 başlangıç
pwm1_set_duty(127);// +90* dönme kare sinyal

pwm2_init(1490); // pwm2 init 1,490KHz
pwm2_start(); // pwm2 başlangıç
pwm2_set_duty(72); // 0* dönme kare sinyal








// LCD KONTROL
Lcd_Init(); // LCD başlangıç
LCD_CMD(_LCD_CURSOR_OFF);  // cursor'u off yaptık
LCD_CMD(_LCD_CLEAR); // lcd yi temizledik

ByteToStr(toplam,txt); // toplam int değer'i txt  char değerine at
Lcd_Out(2,6,txt);    // lcd'nin 1. satır 6.sütuna txt değerini yaz (255 yani);
Lcd_Out(2,1,"Arac=");  // lcd'nin 1. satır 4. sütüna "sayi=" yaz
Lcd_Out(1,1,"Oak Otopark Bos");




while(1){
if(rd0_bit==1){

toplam=toplam+1;
delay_ms(10);
ByteToStr(toplam,txt); // toplam int değer'i txt  char değerine at
Lcd_Out(2,6,txt);    // lcd'nin 1. satır 6.sütuna txt değerini yaz (255 yani);
Lcd_Out(2,1,"Arac=");  // lcd'nin 1. satır 4. sütüna "sayi=" yaz
Lcd_Out(1,1,"Oak Otopark  ");
while (rd0_bit==1) { }

                  }
if(rd1_bit==1)
{

toplam=toplam-1;
delay_ms(10);
ByteToStr(toplam,txt); // toplam int değer'i txt  char değerine at
Lcd_Out(2,6,txt);    // lcd'nin 1. satır 6.sütuna txt değerini yaz (255 yani);
Lcd_Out(2,1,"Arac=");  // lcd'nin 1. satır 4. sütüna "sayi=" yaz
Lcd_Out(1,1,"Oak Otopark");
while (rd1_bit==1) { }

}

if(toplam>=10) {
LCD_CMD(_LCD_CLEAR);
Lcd_Out(1,1,"Otopark Dolu");
Lcd_Out(2,1,"DOLU");
}

if(toplam<0) {
LCD_CMD(_LCD_CLEAR);
Lcd_Out(1,1,"Otopark Bos");
}
          }
}


karacan451

 İşin zor kısmını halletmişsin.


while (rd0_bit==1) { }



while (rd1_bit==1) { }


Her butona basıldığında sayı artırma veya eksiltme olayı olacaksa veya bir kereye mahsus işlem yapılacaksa işlemin sonunda while döngüsünü kullanabilirsin. Parantezin içi boş kalabilir her hangi sıkıntı olmaz.

korkmazlar23

Hocam Allah razı olsun derdime derman oldun arkadaşla sevinçten evi inlettik proje olduğu için süpersin :D

karacan451

Sizden den Allah razı olsun :) Zaten işin büyük kısmını siz halletiniz.

Powered by EzPortal