wip:
This commit is contained in:
@@ -1,4 +1,13 @@
|
|||||||
[env:ATmega328P]
|
[env:ATmega328P]
|
||||||
platform = atmelavr
|
platform = atmelavr
|
||||||
board = ATmega328P
|
board = ATmega328P
|
||||||
|
board_build.mcu = atmega328
|
||||||
|
board_build.f_cpu = 8000000L
|
||||||
framework = arduino
|
framework = arduino
|
||||||
|
#upload_protocol = usbasp
|
||||||
|
#board_fuses.hfuse = 0xDF
|
||||||
|
#board_fuses.lfuse = 0xE2
|
||||||
|
#board_fuses.efuse = 0x07
|
||||||
|
#upload_flags =
|
||||||
|
# -Pusb
|
||||||
|
# -e
|
145
src/main.c
145
src/main.c
@@ -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(PCINT2_vect)
|
ISR(PCINT1_vect)
|
||||||
{
|
{
|
||||||
zh_avr_encoder_isr_handler(&power_encoder_handle);
|
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||||
if (zh_avr_pcf8574_isr_handler() == pdTRUE)
|
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)
|
||||||
|
{
|
||||||
|
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||||
|
if (zh_avr_pcf8574_isr_handler() == pdTRUE)
|
||||||
|
{
|
||||||
|
xHigherPriorityTaskWoken = pdTRUE;
|
||||||
|
}
|
||||||
|
if (xHigherPriorityTaskWoken == pdTRUE)
|
||||||
{
|
{
|
||||||
portYIELD();
|
portYIELD();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user