Untitled
unknown
plain_text
2 years ago
3.9 kB
7
Indexable
// 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;
}
Editor is loading...
Leave a Comment