Untitled
unknown
plain_text
a year ago
3.9 kB
6
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