PIC16F628 ile İki Kanal Bağımsız Toggle (Tetik & Röle) Devresi ve mikroC Kodu

guclusat

Tanınmış Üye
Süper Moderatör
Herkese iyi çalışmalar dilerim uydudoktoru ailesi!

Atölyede elimizdeki bir proje için ihtiyaç duyduğumuz, tamamen birbirinden bağımsız çalışan 2 kanallı toggle (durum değiştiren) tetik ve röle kontrol devresinin mikroC kodunu tamamladık.

Sistem kısaca şu mantıkla çalışıyor:

  • 2 ayrı giriş pinine +V tetik sinyali geldiği anda (yükselen kenar mantığıyla) ilgili röle konum değiştirir (Açık kalır veya kapanır).
  • İkinci bir tetik gelene kadar röle son konumunda kilitli kalır.
  • Kanal 1 ve Kanal 2 tamamen birbirinden bağımsızdır.
  • 16F628'in dahili modüllerinden kaynaklı sorun yaşanmaması için CMCON = 0x07 ile pinler tamamen dijital I/O konfigürasyonuna alınmıştır.

Donanım Bağlantı Şeması (PIC16F628):​

  • Pin 8 (RB2): 1. Tetik Girişi (+V Tetik)
  • Pin 9 (RB3): 2. Tetik Girişi (+V Tetik)
  • Pin 6 (RB0): 1. Röle Çıkışı
  • Pin 7 (RB1): 2. Röle Çıkışı(Not: Giriş pinlerinin boşta parazit kapmaması için harici olarak 10k dirençle GND'ye çekilmesi tavsiye edilir.)

mikroC Kaynak Kodu:​

Kod:
/*
 * ============================================================================
 * Proje Adı : 2 Kanal Bağımsız Tetik & Röle Kontrol (Toggle)
 * MikroC    : PIC16F628 İçin Uyarlanmıştır
 * Geliştirici: Mehmet YILMAZ (uydudoktoru)
 * Web Sitesi: https://www.uydudoktoru.com
 * Tarih     : Ekim 2026
 *
 * Donanım Bağlantı Şeması (PIC16F628):
 *   - Pin 8 (RB2) : 1. Tetik Girişi (+V)
 *   - Pin 9 (RB3) : 2. Tetik Girişi (+V)
 *   - Pin 6 (RB0) : 1. Röle Çıkışı
 *   - Pin 7 (RB1) : 2. Röle Çıkışı
 * ============================================================================
 */

// uydudoktoru.com - Atölye Yazılım Künyesi
const char hazirlayan[] = "uydudoktoru.com - Mehmet YILMAZ";

void main() {
    // ------------------------------------------------------------------------
    // PORT VE ÇEVREBİRİM AYARLARI
    // ------------------------------------------------------------------------
    
    // 16F628 üzerindeki analog karşılaştırıcıları (CMCON) kapatıyoruz.
    // Bu sayede PORTA ve PORTB pinleri tamamen dijital I/O olarak çalışır!
    CMCON = 0x07;

    // Pin Yönlendirmeleri (1 = Giriş, 0 = Çıkış)
    // RB2 (Pin 8) ve RB3 (Pin 9) Giriş
    // RB0 (Pin 6) ve RB1 (Pin 7) Çıkış
    TRISB.F2 = 1; // 1. Tetik Girişi
    TRISB.F3 = 2; // 2. Tetik Girişi
    TRISB.F0 = 0; // 1. Röle Çıkışı
    TRISB.F1 = 0; // 2. Röle Çıkışı

    // İlk açılışta röle çıkışlarını güvenli olması için LOW (0V) yapıyoruz
    PORTB.F0 = 0;
    PORTB.F1 = 0;

    // Hafıza ve Durum Değişkenleri
    unsigned char eski_tetik1 = 0;
    unsigned char eski_tetik2 = 0;
    unsigned char durum1 = 0;
    unsigned char durum2 = 0;

    // ------------------------------------------------------------------------
    // ANA DÖNGÜ (uydudoktoru.com Toggle Kontrol Mekanizması)
    // ------------------------------------------------------------------------
    while(1) {
        
        // --- 1. KANAL (Pin 8 / RB2 Giriş -> Pin 6 / RB0 Çıkış) ---
        unsigned char yeni_tetik1 = PORTB.F2;
        
        // Yükselen kenar algılama (0V -> +V geçiş anı)
        if (yeni_tetik1 && !eski_tetik1) {
            durum1 = !durum1;          // Durumu tersle (Toggle)
            PORTB.F0 = durum1;         // Röleye yansıt
            Delay_ms(50);              // Kontak sıçrama (debounce) gecikmesi
        }
        eski_tetik1 = yeni_tetik1;

        // --- 2. KANAL (Pin 9 / RB3 Giriş -> Pin 7 / RB1 Çıkış) ---
        unsigned char yeni_tetik2 = PORTB.F3;
        
        // Yükselen kenar algılama (0V -> +V geçiş anı)
        if (yeni_tetik2 && !eski_tetik2) {
            durum2 = !durum2;          // Durumu tersle (Toggle)
            PORTB.F1 = durum2;         // Röleye yansıt
            Delay_ms(50);              // Kontak sıçrama (debounce) gecikmesi
        }
        eski_tetik2 = yeni_tetik2;
        
    } // while sonu
}
Projeyi yapacak arkadaşlara kolay gelsin, sorularınız olursa yorumlarda buluşalım!
 
Geri
Yukarı