fork download
  1. // CONFIG2
  2. #pragma config POSCMOD = XT
  3. #pragma config OSCIOFNC = ON
  4. #pragma config FCKSM = CSDCMD
  5. #pragma config FNOSC = PRI
  6. #pragma config IESO = ON
  7.  
  8. // CONFIG1
  9. #pragma config WDTPS = PS32768
  10. #pragma config FWPSA = PR128
  11. #pragma config WINDIS = ON
  12. #pragma config FWDTEN = ON
  13. #pragma config ICS = PGx2
  14. #pragma config GWRP = OFF
  15. #pragma config GCP = OFF
  16. #pragma config JTAGEN = OFF
  17.  
  18. #include <xc.h>
  19. #include <stdint.h>
  20. #include <stdbool.h>
  21. #include "libpic30.h"
  22. #include "adc.h"
  23. #include "buttons.h"
  24.  
  25. #define FCY 16000000UL
  26.  
  27. // LED3–LED6
  28. #define LED3 LATDbits.LATD6
  29. #define LED4 LATDbits.LATD7
  30. #define LED5 LATDbits.LATD13
  31. #define LED6 LATAbits.LATA7
  32.  
  33. #define LED3_TRIS TRISDbits.TRISD6
  34. #define LED4_TRIS TRISDbits.TRISD7
  35. #define LED5_TRIS TRISDbits.TRISD13
  36. #define LED6_TRIS TRISAbits.TRISA7
  37.  
  38. typedef enum {
  39. IDLE,
  40. MIGANIE,
  41. ALARM_AKTYWNY
  42. } ALARM_STATE;
  43.  
  44. void init(void) {
  45. LED3_TRIS = 0;
  46. LED4_TRIS = 0;
  47. LED5_TRIS = 0;
  48. LED6_TRIS = 0;
  49.  
  50. LED3 = 0;
  51. LED4 = 0;
  52. LED5 = 0;
  53. LED6 = 0;
  54.  
  55. ADC_SetConfiguration(ADC_CONFIGURATION_DEFAULT);
  56. ADC_ChannelEnable(ADC_CHANNEL_5);
  57. BUTTON_Enable(BUTTON_S3);
  58. }
  59.  
  60. void zgasLEDy(void) {
  61. LED3 = 0;
  62. LED4 = 0;
  63. LED5 = 0;
  64. LED6 = 0;
  65. }
  66.  
  67. void zapalLEDy(void) {
  68. LED3 = 1;
  69. LED4 = 1;
  70. LED5 = 1;
  71. LED6 = 1;
  72. }
  73.  
  74. int main(void) {
  75. init();
  76. ALARM_STATE state = IDLE;
  77. uint32_t czas_migania = 0;
  78.  
  79. while (1) {
  80. uint16_t adcVal = ADC_Read10bit(ADC_CHANNEL_5);
  81. bool przycisk = BUTTON_IsPressed(BUTTON_S3);
  82.  
  83. // PRZERWANIE alarmu — dowolny stan -> IDLE
  84. if (przycisk || adcVal <= 512) {
  85. state = IDLE;
  86. zgasLEDy();
  87. }
  88.  
  89. switch (state) {
  90. case IDLE:
  91. zgasLEDy();
  92. if (adcVal > 512) {
  93. state = MIGANIE;
  94. czas_migania = 0;
  95. }
  96. break;
  97.  
  98. case MIGANIE:
  99. LED5 = !LED5;
  100. __delay32(250 * (FCY / 1000)); // 250 ms
  101. czas_migania += 250;
  102. if (czas_migania >= 5000) {
  103. state = ALARM_AKTYWNY;
  104. zapalLEDy();
  105. }
  106. break;
  107.  
  108. case ALARM_AKTYWNY:
  109. // LEDy już świecą, nic więcej tu nie robimy
  110. __delay32(50 * (FCY / 1000));
  111. break;
  112. }
  113. }
  114.  
  115. return 0;
  116. }
Success #stdin #stdout 0.03s 25812KB
stdin
Standard input is empty
stdout
// CONFIG2
#pragma config POSCMOD = XT
#pragma config OSCIOFNC = ON
#pragma config FCKSM = CSDCMD
#pragma config FNOSC = PRI
#pragma config IESO = ON

// CONFIG1
#pragma config WDTPS = PS32768
#pragma config FWPSA = PR128
#pragma config WINDIS = ON
#pragma config FWDTEN = ON
#pragma config ICS = PGx2
#pragma config GWRP = OFF
#pragma config GCP = OFF
#pragma config JTAGEN = OFF

#include <xc.h>
#include <stdint.h>
#include <stdbool.h>
#include "libpic30.h"
#include "adc.h"
#include "buttons.h"

#define FCY 16000000UL

// LED3–LED6
#define LED3 LATDbits.LATD6
#define LED4 LATDbits.LATD7
#define LED5 LATDbits.LATD13
#define LED6 LATAbits.LATA7

#define LED3_TRIS TRISDbits.TRISD6
#define LED4_TRIS TRISDbits.TRISD7
#define LED5_TRIS TRISDbits.TRISD13
#define LED6_TRIS TRISAbits.TRISA7

typedef enum {
    IDLE,
    MIGANIE,
    ALARM_AKTYWNY
} ALARM_STATE;

void init(void) {
    LED3_TRIS = 0;
    LED4_TRIS = 0;
    LED5_TRIS = 0;
    LED6_TRIS = 0;

    LED3 = 0;
    LED4 = 0;
    LED5 = 0;
    LED6 = 0;

    ADC_SetConfiguration(ADC_CONFIGURATION_DEFAULT);
    ADC_ChannelEnable(ADC_CHANNEL_5);
    BUTTON_Enable(BUTTON_S3);
}

void zgasLEDy(void) {
    LED3 = 0;
    LED4 = 0;
    LED5 = 0;
    LED6 = 0;
}

void zapalLEDy(void) {
    LED3 = 1;
    LED4 = 1;
    LED5 = 1;
    LED6 = 1;
}

int main(void) {
    init();
    ALARM_STATE state = IDLE;
    uint32_t czas_migania = 0;

    while (1) {
        uint16_t adcVal = ADC_Read10bit(ADC_CHANNEL_5);
        bool przycisk = BUTTON_IsPressed(BUTTON_S3);

        // PRZERWANIE alarmu — dowolny stan -> IDLE
        if (przycisk || adcVal <= 512) {
            state = IDLE;
            zgasLEDy();
        }

        switch (state) {
            case IDLE:
                zgasLEDy();
                if (adcVal > 512) {
                    state = MIGANIE;
                    czas_migania = 0;
                }
                break;

            case MIGANIE:
                LED5 = !LED5;
                __delay32(250 * (FCY / 1000)); // 250 ms
                czas_migania += 250;
                if (czas_migania >= 5000) {
                    state = ALARM_AKTYWNY;
                    zapalLEDy();
                }
                break;

            case ALARM_AKTYWNY:
                // LEDy już świecą, nic więcej tu nie robimy
                __delay32(50 * (FCY / 1000));
                break;
        }
    }

    return 0;
}