PIC16F628A ile Buton Kontrollü Toggle (ON-OFF) Röle Devresi ve Yazılımı

guclusat

Tanınmış Üye
Süper Moderatör
Herkese selamlar,

Bu konuda PIC16F628A mikrokontrolcüsü kullanarak, bir butona veya 5V lojik sinyale her basışta (tetiklendiğinde) çıkıştaki röleyi ON / OFF (Mandalama - Toggle) yapan örnek bir proje paylaşıyorum. İlk basışta röle çeker, ikinci basışta bırakır.

Devre Bağlantı Detayları:​

  • Tetik / Buton Girişi: RA0 (17. Pin) -> 5V tetik veya buton girişi için uygundur.
  • Röle Çıkış Pini: RB0 (6. Pin) -> Sürücü devre (transistör/optokuplör) üzerinden röleye bağlanır.
  • Kritik Not: 16F628A'da PORTA pinlerinin analog modda başlamaması için yazılım içinde CMCON = 0x07; tanımı yapılmıştır.

C Kaynak Kodu (Kenar Tetiklemeli Toggle)​


Kod:
void main() {
    unsigned char role_durumu = 0; // Değişkeni fonksiyonun en başına aldık

    // Tüm analog birimleri kapat, PORTA ve PORTB tamamen dijital olsun
    CMCON = 0x07;
    VRCON = 0x00;

    // Pin yönleri: RA0 giriş (tetik), PORTB çıkış (röle/LED)
    TRISA = 0b00000001;
    TRISB = 0b00000000;

    // Başlangıçta çıkışımız 0 (kapalı)
    PORTB.F0 = 0;

    while(1) {
        // RA0 pinine +5V sinyal geldi mi?
        if (PORTA.F0 == 1) {
            Delay_ms(50); // Kararlılık (debounce) gecikmesi

            // Kısa bir süre sonra hâlâ basılı mı diye kontrol et
            if (PORTA.F0 == 1) {
                // Rölenin durumunu tersle (Aç / Kapat)
                role_durumu = !role_durumu;
                PORTB.F0 = role_durumu;

                // Tetiğin (butonun) bırakılmasını bekle
                while (PORTA.F0 == 1) {
                    Delay_ms(10);
                }

                // Çift tetiklenmeyi önlemek için kısa bekleme
                Delay_ms(50);
            }
        }
    }
}

PIC16F628A HEX Dosyası:​

Aşağıdaki HEX kodunu kopyalayıp bir metin belgesine yapıştırın ve uzantısını .hex olarak kaydederek (Örn: toggle_role.hex) doğrudan programlayıcınızla entegre yükleyebilirsiniz:

Kod:
:
:100000000428FF3FFF3FFF3F03138312A001073087
:100010009F0083169F010130850086018312061020
:1000200001300505F1007108013A031D60284130D7
:10003000FB00FF30FA00FB0B1E282128FA0B1E28BC
:100040001B28C330FA00FA0B2328000001300505F5
:10005000F1007108013A031D602820080130031DDA
:100060000030F0007008A000003070180130060663
:100070000139860601300505F1007108013A031DBA
:1000800051280D30FB00FF30FA00FB0B48284B28AD
:10009000FA0B48284528F330FA00FA0B4D280000E7
:1000A0003A284130FB00FF30FA00FB0B58285B2850
:1000B000FA0B58285528C330FA00FA0B5D280000C7
:1000C00010286128FF3FFF3FFF3FFF3FFF3FFF3FFB
:02400E00303F41
:00000001FF
1792059151250.webp
 

Eklentiler

Son düzenleme:
1792048393291.webp

Kendisi otomatik olarak ayarlayacak yine bir sorun olur ise resimdeki gibi PICPgm Programmer ayarları bu şekilde ayarlayınız
 
Son düzenleme:

Güncellenmiş MikroC Kodu (Düşen Kenar / Active-Low)​

Kod:
void main() {
    unsigned char role_durumu = 0; // Değişkeni fonksiyonun en başına aldık

    // Tüm analog birimleri kapat, PORTA ve PORTB tamamen dijital olsun
    CMCON = 0x07;
    VRCON = 0x00;

    // Pin yönleri: RA0 giriş (tetik), PORTB çıkış (röle/LED)
    TRISA = 0b00000001;
    TRISB = 0b00000000;

    // Başlangıçta çıkışımız 0 (kapalı)
    PORTB.F0 = 0;

    while(1) {
        // RA0 pinine GND (0V) sinyal geldi mi? (Düşen kenar)
        if (PORTA.F0 == 0) {
            Delay_ms(50); // Kararlılık (debounce) gecikmesi

            // Kısa bir süre sonra hâlâ GND'de mi diye kontrol et
            if (PORTA.F0 == 0) {
                // Rölenin durumunu tersle (Aç / Kapat)
                role_durumu = !role_durumu;
                PORTB.F0 = role_durumu;

                // Tetiğin (butonun) bırakılmasını bekle (Tekrar +5V olana kadar bekle)
                while (PORTA.F0 == 0) {
                    Delay_ms(10);
                }

                // Çift tetiklenmeyi önlemek için kısa bekleme
                Delay_ms(50);
            }
        }
    }
}

Yapılan Değişiklikler:​

  1. PORTA.F0 == 1 kontrolleri, GND tetiklemesine uygun olarak PORTA.F0 == 0 şeklinde değiştirildi.
  2. Buton bırakılma döngüsü (while (PORTA.F0 == 0)) yapılarak, kullanıcı parmağını çekene kadar (pin tekrar 1 olana kadar) sistemin beklemesi sağlandı.
 
Geri
Yukarı