Skip to content

Çift Modlu ve Alarmlı Voltmetre #29

@richsahin

Description

@richsahin

#include <xc.h>

#define _XTAL_FREQ 8000000
#pragma config FOSC = HSHP
#pragma config WDTEN = OFF

unsigned char seg_char[11] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x1C};

unsigned long value;
unsigned int raw_adc = 0;
unsigned char digits[4] = {0, 0, 0, 0};
unsigned char digit_counter = 0;
unsigned char conversion_done = 0;

// Yeni eklediğimiz şalterler
unsigned char mod_flag = 0; // 0: Volt Modu, 1: Ham ADC Modu
unsigned char blink_on = 1; // Ekranın ve LED'in o anki açık/kapalı durumu
unsigned int blink_counter = 0; // 250 ms'yi sayacak sayaç

void main(void) {
// PORT AYARLARI
TRISA = 0xE0;
ANSELA = 0x00;
PORTA = 0x00; // Komple PORT yapıldı

TRISB = 0xFF;
ANSELB = 0x00;
PORTB = 0x00;

TRISD = 0x00;
ANSELD = 0x00;
PORTD = 0x00; // Komple PORT yapıldı

TRISE = 0x0F;
ANSELE = 0x02;
PORTE = 0x00;

// ADC AYARLARI (RE1 - AN6)
ADCON0 = 0x19;
ADCON1 = 0x00;
ADCON2 = 0xA1;

// TIMER0 AYARLARI (10 ms)
T0CON = 0xC6;
TMR0L = 100;

// KESME AYARLARI
INTCON2bits.INTEDG0 = 0;
TMR0IE = 1;
INT0IE = 1;
PEIE = 1;
GIE = 1;

GODONE = 1; // Sistemi başlat

while (1) {
    if (conversion_done == 1) {
        conversion_done = 0;
        
        // Ham veriyi hesapla (0-1023)
        raw_adc = (unsigned int)((ADRESH << 8) + ADRESL);
        
        // MATEMATİK BÖLÜMÜ
        if (mod_flag == 0) {
            value = (unsigned long)((5000UL * raw_adc) / 1023);
            
            digits[3] = (unsigned char)(value / 1000);
            digits[2] = (unsigned char)((value / 100) % 10);
            digits[1] = (unsigned char)((value / 10) % 10);
            digits[0] = 0; // Bu modda 0. hane 'u' harfi olacağı için önemi yok
        } 
        else {
            value = raw_adc;
            
            digits[3] = (unsigned char)(value / 1000);
            digits[2] = (unsigned char)((value / 100) % 10);
            digits[1] = (unsigned char)((value / 10) % 10);
            digits[0] = (unsigned char)(value % 10);
        }
        
        GODONE = 1; // Sıradaki ölçümü ateşle
    }
}

}

void __interrupt(high_priority) isr() {

// --- GÖREV 1: ZAMANLAMA VE EKRAN (TIMER0) ---
if (TMR0IF) {
    TMR0IF = 0;
    TMR0L = 100;

    // 1. BLINK (ALARM) SAYACI
    if (raw_adc > 800) {
        blink_counter++;
        if (blink_counter >= 25) { // 250 ms dolunca
            blink_on = !blink_on;  // Ana şalteri tersle
            blink_counter = 0;     // Sayacı sıfırla
        }
    } else {
        blink_on = 1;      // Alarm yoksa şalter hep açık kalsın
        blink_counter = 0; 
    }

    // 2. GÖRÜNTÜ VE LED YÖNETİMİ
    PORTA &= 0xF0; // RA0-RA3 (haneleri) kapat ama RA4 LED'ini bozma

    if (blink_on == 1) { // Şalter "AÇIK" ise
        
        // LED Kontrolü
        if (raw_adc > 800) PORTAbits.RA4 = 1; // Alarm varsa LED'i yak
        else PORTAbits.RA4 = 0;

        // Hane İçeriği (Modlara Göre)
        if (digit_counter == 0) {
            if (mod_flag == 0) PORTD = seg_char[10]; // Volt moduysa 'u' bas
            else PORTD = seg_char[digits[0]];        // Ham modsa rakam bas
        } else {
            if (mod_flag == 0 && digit_counter == 3) {
                PORTD = seg_char[digits[digit_counter]] + 0x80; // Volt modunda noktayı ekle
            } else {
                PORTD = seg_char[digits[digit_counter]];        // Sadece rakam
            }
        }

        // İlgili haneyi aktif et
        PORTA =(0x01 << digit_counter); 
        
    } else {
        // Şalter "KAPALI" ise (Blink'in karanlık fazı)
        PORTAbits.RA4 = 0; // LED'i kapat.
    }

    // Multiplexing sayacı
    digit_counter++;
    if (digit_counter == 4) {
        digit_counter = 0;
    }
}

// --- GÖREV 2: ADC BİTİŞ KONTROLÜ ---
if (PIR1bits.ADIF) {
    PIR1bits.ADIF = 0;
    conversion_done = 1;
}

// --- GÖREV 3: MOD DEĞİŞTİRME BUTONU ---
if (INT0IF) {
    INT0IF = 0;
    mod_flag = !mod_flag;
}

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions