This commit is contained in:
2025-09-11 13:38:49 +03:00
parent ac5d8c5d88
commit 251d86940b
2 changed files with 134 additions and 18 deletions

View File

@@ -1,4 +1,13 @@
[env:ATmega328P] [env:ATmega328P]
platform = atmelavr platform = atmelavr
board = ATmega328P board = ATmega328P
framework = arduino 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

View File

@@ -5,7 +5,10 @@
#include "zh_avr_encoder.h" #include "zh_avr_encoder.h"
#include "zh_avr_ac_dimmer.h" #include "zh_avr_ac_dimmer.h"
#define DEBUG // #define DEBUG
#define HIGH true
#define LOW false
#define BUTTON_I2C_ADDRESS 0x00 #define BUTTON_I2C_ADDRESS 0x00
#define LED1_I2C_ADDRESS 0x00 #define LED1_I2C_ADDRESS 0x00
@@ -16,6 +19,13 @@
#define POWER_ENCODER 1 #define POWER_ENCODER 1
#define COMPONENT_ENCODER 2 #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 #ifdef DEBUG
#define BAUD_RATE 9600 #define BAUD_RATE 9600
#define BAUD_PRESCALE (F_CPU / 16 / BAUD_RATE - 1) #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_pcf8574_handle_t lcd_handle = {0};
zh_avr_encoder_handle_t power_encoder_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) int main(void)
{ {
//** Encoders init **/ //** Encoders init **/
zh_avr_encoder_init_config_t encoder_init_config = ZH_AVR_ENCODER_INIT_CONFIG_DEFAULT(); 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.gpio_port = AVR_PORTC;
encoder_init_config.b_gpio_number = PORTD6; encoder_init_config.a_gpio_number = PORTC0;
encoder_init_config.pullup = true; encoder_init_config.b_gpio_number = PORTC1;
encoder_init_config.encoder_min_value = 0; encoder_init_config.encoder_min_value = 0;
encoder_init_config.encoder_max_value = 100; encoder_init_config.encoder_max_value = 100;
encoder_init_config.encoder_step = 1;
encoder_init_config.encoder_number = POWER_ENCODER; encoder_init_config.encoder_number = POWER_ENCODER;
zh_avr_encoder_init(&encoder_init_config, &power_encoder_handle); 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 **/ //** AC dimmer init **/
zh_avr_ac_dimmer_init_config_t ac_dimmer_init_config = ZH_AVR_AC_DIMMER_INIT_CONFIG_DEFAULT(); 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; 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_port = AVR_PORTD;
ac_dimmer_init_config.triac_gpio = PORTD3; ac_dimmer_init_config.triac_gpio = PORTD3;
zh_avr_ac_dimmer_init(&ac_dimmer_init_config); zh_avr_ac_dimmer_init(&ac_dimmer_init_config);
zh_avr_ac_dimmer_start();
#ifdef DEBUG #ifdef DEBUG
UBRR0H = (BAUD_PRESCALE >> 8); UBRR0H = (BAUD_PRESCALE >> 8);
UBRR0L = BAUD_PRESCALE; UBRR0L = BAUD_PRESCALE;
UCSR0B = (1 << RXEN0) | (1 << TXEN0); UCSR0B = (1 << RXEN0) | (1 << TXEN0);
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
stdout = &uart; 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 #else
xTaskCreate(system_setup_task, NULL, 107, NULL, tskIDLE_PRIORITY, NULL); xTaskCreate(system_setup_task, NULL, 107, NULL, tskIDLE_PRIORITY, NULL);
#endif #endif
vTaskStartScheduler(); vTaskStartScheduler();
for (;;)
{
}
return 0; return 0;
} }
@@ -125,7 +141,11 @@ void system_setup_task(void *pvParameters)
zh_avr_160x_print_char(&lcd_handle, "%"); zh_avr_160x_print_char(&lcd_handle, "%");
vTaskDelay(50 / portTICK_PERIOD_MS); 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); 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) 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 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("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) ISR(PCINT2_vect)
{ {
zh_avr_encoder_isr_handler(&power_encoder_handle); BaseType_t xHigherPriorityTaskWoken = pdFALSE;
if (zh_avr_pcf8574_isr_handler() == pdTRUE) if (zh_avr_pcf8574_isr_handler() == pdTRUE)
{
xHigherPriorityTaskWoken = pdTRUE;
}
if (xHigherPriorityTaskWoken == pdTRUE)
{ {
portYIELD(); portYIELD();
} }