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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions