Untitled

mail@pastecode.io avatar
unknown
plain_text
2 months ago
3.9 kB
4
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

// #pragma config statements should precede project file includes.

// Use project enums instead of #define for ON and OFF.

#include <math.h>

#include <xc.h>

#include <stdlib.h>

#include "adc.h"

#include "buttons.h"

#define ALARM_THRESHOLD 512 // 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;
    
    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 < 800) {
                // W??czamy jedn? diod? i mrugamy ni? przez pierwsze 5 sekund
                __delay32(2500000);
                LATA = 0b00000001; // W??cz jedn? diod?
                __delay32(2500000);
                LATA = 0b00000000; 
            } else {
                  while(1){
                    LATA = 0xFF;
                    __delay32(2500000);
                    LATA = 0x00;
                    __delay32(2500000);
                    value = ADC_Read10bit(ADC_CHANNEL_POTENTIOMETER);
                     if(BUTTON_IsPressed(BUTTON_S4) || BUTTON_IsPressed(BUTTON_S3)){
                         alarm_active = false;
                         break;
                     }
                    if (value < 400) {
                     alarm_active = false;
                     break;
                    }
                    
                    
    }
            }
            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
        }
    }
    return 0;
}
Leave a Comment