Untitled

mail@pastecode.io avatar
unknown
plain_text
2 months ago
3.4 kB
3
Indexable
Never
// PIC24FJ128GA010 Configuration Bit Settings

// For more on Configuration Bits
// consult your device data sheet

// CONFIG2
#pragma config POSCMOD = XT // XT Oscillator mode selected
#pragma config OSCIOFNC = ON // OSC2/CLKO/RC15 as port I/O (RC15)
#pragma config FCKSM = CSDCMD // Clock Switching and Monitor disabled
#pragma config FNOSC = PRI // Primary Oscillator (XT, HS, EC)
#pragma config IESO = ON // Int Ext Switch Over Mode enabled

// CONFIG1
#pragma config WDTPS = PS32768 // Watchdog Timer Postscaler (1:32,768)
#pragma config FWPSA = PR128 // WDT Prescaler (1:128)
#pragma config WINDIS = ON // Watchdog Timer Window Mode disabled
#pragma config FWDTEN = OFF // Watchdog Timer disabled
#pragma config ICS = PGx2 // Emulator/debugger uses EMUC2/EMUD2
#pragma config GWRP = OFF // Writes to program memory allowed
#pragma config GCP = OFF // Code protection is disabled
#pragma config JTAGEN = OFF // JTAG port is disabled

#include <math.h>
#include <xc.h>
#include <stdlib.h>
#include "adc.h"

#define ALARM_THRESHOLD 128 // Połowa maksymalnej wartości potencjometru

#define LED_ON() LATA = 0xFF; // Włącz wszystkie diody
#define LED_OFF() LATA = 0x00; // Wyłącz wszystkie diody

int main(void) {
    // Domyślna konfiguracja ADC
    ADC_SetConfiguration(ADC_CONFIGURATION_DEFAULT);
    // ADC ma czytać potencjometr
    ADC_ChannelEnable(ADC_CHANNEL_POTENTIOMETER);
    // Output LEDów PORT A
    TRISA = 0x00; // Ustaw port A jako wyjście
    unsigned int value;
    bool alarm_active = false;
    unsigned int alarm_counter = 0;
    bool led_state = false; // Dodano zmienną do śledzenia stanu diod

    while (1) {
        // Czytanie 10-bit wartości z potencjometru
        value = ADC_Read10bit(ADC_CHANNEL_POTENTIOMETER);
        // Błąd?
        if (value == 0xFFFF) {
            // W razie czego przechodzimy do kolejnej iteracji
            continue;
        }
        // Sprawdzenie, czy wartość przekracza wartość nastawy alarmu
        if (value > ALARM_THRESHOLD) {
            // Jeśli alarm jest nieaktywny, włączamy go
            if (!alarm_active) {
                alarm_active = true;
                alarm_counter = 0;
            }
        } else {
            // Jeśli wartość spadła poniżej wartości nastawy, wyłączamy alarm
            __delay32(500000);
            alarm_active = false;
            LED_OFF(); // Wyłączamy wszystkie diody
        }
        // Obsługa alarmu
        if (alarm_active) {
            if (alarm_counter < 5000) {
                // Włączamy jedną diodę i mrugamy nią przez pierwsze 5 sekund
                __delay32(500000);
                LATA = led_state ? 0b00000001 : 0x00; // Przełączanie stanu jednej diody
                led_state = !led_state; // Zmiana stanu diody
            } else {
                __delay32(500000);
                // Po upływie 5 sekund włączamy wszystkie diody
                LED_ON(); // Włącz wszystkie diody
            }
            alarm_counter += 100; // Inkrementujemy licznik czasu (odczyt co 100ms)
        } else {
            // Jeśli alarm nie jest aktywny, wyłączamy wszystkie diody
            LED_OFF(); // Wyłącz wszystkie diody
            led_state = false; // Reset stanu diod
        }
    }
    return 0;
}
Leave a Comment