diff --git a/platformio.ini b/platformio.ini index 64f8a5b..add7f2c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1,4 +1,13 @@ [env:ATmega328P] platform = atmelavr board = ATmega328P -framework = arduino \ No newline at end of file +board_build.mcu = atmega328 +board_build.f_cpu = 8000000L +framework = arduino +#upload_protocol = usbasp +#board_fuses.hfuse = 0xDF +#board_fuses.lfuse = 0xE2 +#board_fuses.efuse = 0x07 +#upload_flags = +# -Pusb +# -e \ No newline at end of file diff --git a/src/main.c b/src/main.c index c3cea5d..1610ae0 100644 --- a/src/main.c +++ b/src/main.c @@ -5,7 +5,10 @@ #include "zh_avr_encoder.h" #include "zh_avr_ac_dimmer.h" -#define DEBUG +// #define DEBUG + +#define HIGH true +#define LOW false #define BUTTON_I2C_ADDRESS 0x00 #define LED1_I2C_ADDRESS 0x00 @@ -16,6 +19,13 @@ #define POWER_ENCODER 1 #define COMPONENT_ENCODER 2 +#define DMM_BUTTON 0 +#define FIX_BUTTON 1 +#define NUM1_BUTTON 2 +#define NUM2_BUTTON 3 +#define NUM3_BUTTON 4 +#define NUM4_BUTTON 5 + #ifdef DEBUG #define BAUD_RATE 9600 #define BAUD_PRESCALE (F_CPU / 16 / BAUD_RATE - 1) @@ -44,21 +54,31 @@ zh_avr_pcf8574_handle_t relay_handle = {0}; zh_avr_pcf8574_handle_t lcd_handle = {0}; zh_avr_encoder_handle_t power_encoder_handle = {0}; -// zh_avr_encoder_handle_t component_encoder_handle = {0}; +zh_avr_encoder_handle_t component_encoder_handle = {0}; + +volatile bool is_work = false; +volatile bool is_dmm = false; +volatile bool is_fix = false; int main(void) { //** Encoders init **/ zh_avr_encoder_init_config_t encoder_init_config = ZH_AVR_ENCODER_INIT_CONFIG_DEFAULT(); - encoder_init_config.a_gpio_number = PORTD5; - encoder_init_config.b_gpio_number = PORTD6; - encoder_init_config.pullup = true; + encoder_init_config.gpio_port = AVR_PORTC; + encoder_init_config.a_gpio_number = PORTC0; + encoder_init_config.b_gpio_number = PORTC1; encoder_init_config.encoder_min_value = 0; encoder_init_config.encoder_max_value = 100; - encoder_init_config.encoder_step = 1; encoder_init_config.encoder_number = POWER_ENCODER; zh_avr_encoder_init(&encoder_init_config, &power_encoder_handle); - zh_avr_encoder_set(&power_encoder_handle, 50); + zh_avr_encoder_set(&power_encoder_handle, 100); + encoder_init_config.a_gpio_number = PORTC2; + encoder_init_config.b_gpio_number = PORTC3; + encoder_init_config.encoder_min_value = 1; + encoder_init_config.encoder_max_value = 100; // Check. + encoder_init_config.encoder_number = COMPONENT_ENCODER; + zh_avr_encoder_init(&encoder_init_config, &component_encoder_handle); + zh_avr_encoder_set(&component_encoder_handle, 1); //** AC dimmer init **/ zh_avr_ac_dimmer_init_config_t ac_dimmer_init_config = ZH_AVR_AC_DIMMER_INIT_CONFIG_DEFAULT(); ac_dimmer_init_config.ac_dimmer_frequency = ZH_50HZ; @@ -67,21 +87,17 @@ int main(void) ac_dimmer_init_config.triac_port = AVR_PORTD; ac_dimmer_init_config.triac_gpio = PORTD3; zh_avr_ac_dimmer_init(&ac_dimmer_init_config); - zh_avr_ac_dimmer_start(); #ifdef DEBUG UBRR0H = (BAUD_PRESCALE >> 8); UBRR0L = BAUD_PRESCALE; UCSR0B = (1 << RXEN0) | (1 << TXEN0); UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); stdout = &uart; - xTaskCreate(system_setup_task, "system_setup_task", 107, NULL, tskIDLE_PRIORITY, &system_setup_task_handle); + xTaskCreate(system_setup_task, "system_setup", 107, NULL, tskIDLE_PRIORITY, &system_setup_task_handle); #else xTaskCreate(system_setup_task, NULL, 107, NULL, tskIDLE_PRIORITY, NULL); #endif vTaskStartScheduler(); - for (;;) - { - } return 0; } @@ -125,7 +141,11 @@ void system_setup_task(void *pvParameters) zh_avr_160x_print_char(&lcd_handle, "%"); vTaskDelay(50 / portTICK_PERIOD_MS); } - printf("Ok\n"); + zh_avr_160x_lcd_clear(&lcd_handle); + zh_avr_160x_set_cursor(&lcd_handle, 0, 0); + zh_avr_160x_print_char(&lcd_handle, "AC POWER: "); + zh_avr_160x_set_cursor(&lcd_handle, 1, 0); + zh_avr_160x_print_char(&lcd_handle, "COMPONENT: "); vTaskDelete(NULL); } @@ -138,20 +158,107 @@ void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) void zh_avr_pcf8574_event_handler(zh_avr_pcf8574_event_on_isr_t *event) { + switch (event->gpio_number) + { + case DMM_BUTTON: + if (event->gpio_level == LOW && is_work == false) + { + if (is_dmm == true) + { + // DMM Bypas Relay ON. + // DMM LED Red ON. + // DMM LED Green OFF. + is_dmm = false; + } + else + { + // DMM Bypas Relay OFF. + // DMM LED Red OFF. + // DMM LED Green ON. + is_dmm = true; + } + } + break; + case FIX_BUTTON: + if (event->gpio_level == LOW) + { + // Fix LED Red OFF. + // Fix LED Green ON. + is_fix = true; + } + else + { + // Fix LED Red ON. + // Fix LED Green OFF. + is_fix = false; + } + break; + case NUM1_BUTTON: + break; + case NUM2_BUTTON: + break; + case NUM3_BUTTON: + break; + case NUM4_BUTTON: + break; + default: + break; + } +#ifdef DEBUG printf("Interrupt happened on device address 0x%02X on GPIO number %d at level %d.\n", event->i2c_address, event->gpio_number, event->gpio_level); - printf("Interrupt Task Remaining Stack Size %d.\n", uxTaskGetStackHighWaterMark(NULL)); +#endif } -void zh_avr_encoder_event_handler(zh_avr_encoder_event_on_isr_t *event) // Do not delete! +void zh_avr_encoder_event_handler(zh_avr_encoder_event_on_isr_t *event) { + switch (event->encoder_number) + { + case POWER_ENCODER: + zh_avr_ac_dimmer_set(event->encoder_position); + zh_avr_160x_set_cursor(&lcd_handle, 0, 10); + zh_avr_160x_print_int(&lcd_handle, (uint8_t)event->encoder_position); + zh_avr_160x_print_char(&lcd_handle, "% "); + break; + case COMPONENT_ENCODER: + zh_avr_160x_set_cursor(&lcd_handle, 1, 10); + // Set system. + break; + default: + break; + } +#ifdef DEBUG printf("Encoder number %d position %0.2f.\n", event->encoder_number, event->encoder_position); - printf("Interrupt Task Remaining Stack Size %d.\n", uxTaskGetStackHighWaterMark(NULL)); +#endif +} + +ISR(PCINT1_vect) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + if (zh_avr_encoder_isr_handler(&power_encoder_handle) == pdTRUE) + { + xHigherPriorityTaskWoken = pdTRUE; + } + if (is_work == false) + { + if (zh_avr_encoder_isr_handler(&component_encoder_handle) == pdTRUE) + { + xHigherPriorityTaskWoken = pdTRUE; + } + } + if (xHigherPriorityTaskWoken == pdTRUE) + { + portYIELD(); + } } ISR(PCINT2_vect) { - zh_avr_encoder_isr_handler(&power_encoder_handle); + BaseType_t xHigherPriorityTaskWoken = pdFALSE; if (zh_avr_pcf8574_isr_handler() == pdTRUE) + { + xHigherPriorityTaskWoken = pdTRUE; + } + if (xHigherPriorityTaskWoken == pdTRUE) { portYIELD(); }