diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3b8da3a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.pio +.vscode \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..db39033 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,18 @@ +[submodule "lib/zh_avr_free_rtos"] + path = lib/zh_avr_free_rtos + url = http://git.zh.com.ru/avr_libraries/zh_avr_free_rtos +[submodule "lib/zh_avr_vector"] + path = lib/zh_avr_vector + url = http://git.zh.com.ru/avr_libraries/zh_avr_vector +[submodule "lib/zh_avr_i2c"] + path = lib/zh_avr_i2c + url = http://git.zh.com.ru/avr_libraries/zh_avr_i2c +[submodule "lib/zh_avr_common"] + path = lib/zh_avr_common + url = http://git.zh.com.ru/avr_libraries/zh_avr_common +[submodule "lib/zh_avr_pcf8574"] + path = lib/zh_avr_pcf8574 + url = http://git.zh.com.ru/avr_libraries/zh_avr_pcf8574 +[submodule "lib/zh_avr_160x_i2c"] + path = lib/zh_avr_160x_i2c + url = http://git.zh.com.ru/avr_libraries/zh_avr_160x_i2c diff --git a/BOM_ATE0003.000.001.xlsx b/BOM_ATE0003.000.001.xlsx index 37e88dc..e2aa1d9 100644 Binary files a/BOM_ATE0003.000.001.xlsx and b/BOM_ATE0003.000.001.xlsx differ diff --git a/cad/BP-522/BP-522.m3d b/cad/BP-522/BP-522.m3d new file mode 100644 index 0000000..73db7e4 Binary files /dev/null and b/cad/BP-522/BP-522.m3d differ diff --git a/cad/BP-522/BP-522_1.m3d b/cad/BP-522/BP-522_1.m3d new file mode 100644 index 0000000..66b9176 Binary files /dev/null and b/cad/BP-522/BP-522_1.m3d differ diff --git a/cad/BP-522/BP-522_2.m3d b/cad/BP-522/BP-522_2.m3d new file mode 100644 index 0000000..e2051c4 Binary files /dev/null and b/cad/BP-522/BP-522_2.m3d differ diff --git a/cad/BP-522/BP-522_3.m3d b/cad/BP-522/BP-522_3.m3d new file mode 100644 index 0000000..e50c68e Binary files /dev/null and b/cad/BP-522/BP-522_3.m3d differ diff --git a/cad/CASE/ATE0003.000.00 СБ _ Корпус.a3d b/cad/CASE/ATE0003.000.00 СБ _ Корпус.a3d index 7ed9f70..dd65ae7 100644 Binary files a/cad/CASE/ATE0003.000.00 СБ _ Корпус.a3d and b/cad/CASE/ATE0003.000.00 СБ _ Корпус.a3d differ diff --git a/cad/CASE/ATE0003.000.001 _ Низ.m3d b/cad/CASE/ATE0003.000.001 _ Низ.m3d index 1eca7f7..d5acc30 100644 Binary files a/cad/CASE/ATE0003.000.001 _ Низ.m3d and b/cad/CASE/ATE0003.000.001 _ Низ.m3d differ diff --git a/cad/CASE/ATE0003.000.002 _ Перед.m3d b/cad/CASE/ATE0003.000.002 _ Перед.m3d index f5568db..2240f6c 100644 Binary files a/cad/CASE/ATE0003.000.002 _ Перед.m3d and b/cad/CASE/ATE0003.000.002 _ Перед.m3d differ diff --git a/cad/CASE/ATE0003.000.003 _ Зад.m3d b/cad/CASE/ATE0003.000.003 _ Зад.m3d index 9272b25..9f6b2e7 100644 Binary files a/cad/CASE/ATE0003.000.003 _ Зад.m3d and b/cad/CASE/ATE0003.000.003 _ Зад.m3d differ diff --git a/cad/CASE/ATE0003.000.004 _ Верх.m3d b/cad/CASE/ATE0003.000.004 _ Верх.m3d new file mode 100644 index 0000000..65459e1 Binary files /dev/null and b/cad/CASE/ATE0003.000.004 _ Верх.m3d differ diff --git a/cad/CASE/ATE0003.000.006 _ Кнопка.m3d b/cad/CASE/ATE0003.000.006 _ Кнопка.m3d new file mode 100644 index 0000000..9510817 Binary files /dev/null and b/cad/CASE/ATE0003.000.006 _ Кнопка.m3d differ diff --git a/cad/DUWI 26840/DUWI 26840.m3d b/cad/DUWI 26840/DUWI 26840.m3d new file mode 100644 index 0000000..678975c Binary files /dev/null and b/cad/DUWI 26840/DUWI 26840.m3d differ diff --git a/cad/DUWI 26840/DUWI 26840_1.m3d b/cad/DUWI 26840/DUWI 26840_1.m3d new file mode 100644 index 0000000..1878ce8 Binary files /dev/null and b/cad/DUWI 26840/DUWI 26840_1.m3d differ diff --git a/cad/LCD1604/+LCD1604.a3d b/cad/LCD1604/+LCD1604.a3d deleted file mode 100644 index 145e068..0000000 Binary files a/cad/LCD1604/+LCD1604.a3d and /dev/null differ diff --git a/cad/LCD1604/LCD_SCREEN_16x4_10.a3d b/cad/LCD1604/LCD_SCREEN_16x4_10.a3d new file mode 100644 index 0000000..609cce0 Binary files /dev/null and b/cad/LCD1604/LCD_SCREEN_16x4_10.a3d differ diff --git a/cad/PCB/+PCB.a3d b/cad/PCB/PCB_21.a3d similarity index 100% rename from cad/PCB/+PCB.a3d rename to cad/PCB/PCB_21.a3d diff --git a/lib/zh_avr_160x_i2c b/lib/zh_avr_160x_i2c new file mode 160000 index 0000000..d958232 --- /dev/null +++ b/lib/zh_avr_160x_i2c @@ -0,0 +1 @@ +Subproject commit d95823281ba3a732351fb576f62b558708d603ce diff --git a/lib/zh_avr_common b/lib/zh_avr_common new file mode 160000 index 0000000..1cb4a4c --- /dev/null +++ b/lib/zh_avr_common @@ -0,0 +1 @@ +Subproject commit 1cb4a4cc768e1c86aadd8e5baca5f78ac6745580 diff --git a/lib/zh_avr_free_rtos b/lib/zh_avr_free_rtos new file mode 160000 index 0000000..a408615 --- /dev/null +++ b/lib/zh_avr_free_rtos @@ -0,0 +1 @@ +Subproject commit a408615f7d297e59665592f7442642b272bcf89b diff --git a/lib/zh_avr_i2c b/lib/zh_avr_i2c new file mode 160000 index 0000000..da2fd0d --- /dev/null +++ b/lib/zh_avr_i2c @@ -0,0 +1 @@ +Subproject commit da2fd0d2a801653da6a308299ebcd5800fe10296 diff --git a/lib/zh_avr_pcf8574 b/lib/zh_avr_pcf8574 new file mode 160000 index 0000000..6b8b8c3 --- /dev/null +++ b/lib/zh_avr_pcf8574 @@ -0,0 +1 @@ +Subproject commit 6b8b8c33143c23f67273e70cb7844feefee1624a diff --git a/lib/zh_avr_vector b/lib/zh_avr_vector new file mode 160000 index 0000000..eddd461 --- /dev/null +++ b/lib/zh_avr_vector @@ -0,0 +1 @@ +Subproject commit eddd461e96050498585b03d4b75db94a398c3a14 diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..64f8a5b --- /dev/null +++ b/platformio.ini @@ -0,0 +1,4 @@ +[env:ATmega328P] +platform = atmelavr +board = ATmega328P +framework = arduino \ No newline at end of file diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..c712388 --- /dev/null +++ b/src/main.c @@ -0,0 +1,110 @@ +#include "FreeRTOS.h" +#include "task.h" +#include "avr/io.h" +#include "zh_avr_160x_i2c.h" + +// #define DEBUG + +#define BUTTON_I2C_ADDRESS 0x00 +#define LED1_I2C_ADDRESS 0x00 +#define LED2_I2C_ADDRESS 0x00 +#define RELAY_I2C_ADDRESS 0x00 +#define LCD_I2C_ADDRESS 0x00 + +#ifdef DEBUG +#define BAUD_RATE 9600 +#define BAUD_PRESCALE (F_CPU / 16 / BAUD_RATE - 1) + +int usart(char byte, FILE *stream) +{ + while ((UCSR0A & (1 << UDRE0)) == 0) + { + } + UDR0 = byte; + return 0; +} +FILE uart = FDEV_SETUP_STREAM(usart, NULL, _FDEV_SETUP_WRITE); +#endif + +zh_avr_pcf8574_handle_t button_handle = {0}; +zh_avr_pcf8574_handle_t led1_handle = {0}; +zh_avr_pcf8574_handle_t led2_handle = {0}; +zh_avr_pcf8574_handle_t relay_handle = {0}; +zh_avr_pcf8574_handle_t lcd_handle = {0}; + +// void led_flash_task(void *pvParameters) +// { +// DDRB |= (1 << PORTB5); +// for (;;) +// { +// PORTB ^= (1 << PORTB5); +// vTaskDelay(1000 / portTICK_PERIOD_MS); +// } +// vTaskDelete(NULL); +// } + +int main(void) +{ +#ifdef DEBUG + UBRR0H = (BAUD_PRESCALE >> 8); + UBRR0L = BAUD_PRESCALE; + UCSR0B = (1 << RXEN0) | (1 << TXEN0); + UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); + stdout = &uart; +#endif + zh_avr_i2c_master_init(false); + zh_avr_pcf8574_init_config_t pcf8574_init_config = ZH_AVR_PCF8574_INIT_CONFIG_DEFAULT(); + pcf8574_init_config.i2c_address = LED1_I2C_ADDRESS; + zh_avr_pcf8574_init(&pcf8574_init_config, &led1_handle); + zh_avr_pcf8574_write(&led1_handle, 0xFF); + pcf8574_init_config.i2c_address = LED2_I2C_ADDRESS; + zh_avr_pcf8574_init(&pcf8574_init_config, &led2_handle); + zh_avr_pcf8574_write(&led2_handle, 0x0F); + pcf8574_init_config.i2c_address = RELAY_I2C_ADDRESS; + zh_avr_pcf8574_init(&pcf8574_init_config, &relay_handle); + pcf8574_init_config.i2c_address = LCD_I2C_ADDRESS; + zh_avr_pcf8574_init(&pcf8574_init_config, &lcd_handle); + pcf8574_init_config.p0_gpio_work_mode = true; + pcf8574_init_config.p1_gpio_work_mode = true; + pcf8574_init_config.p2_gpio_work_mode = true; + pcf8574_init_config.p3_gpio_work_mode = true; + pcf8574_init_config.p4_gpio_work_mode = true; + pcf8574_init_config.p5_gpio_work_mode = true; + pcf8574_init_config.interrupt_port = AVR_PORTD; + pcf8574_init_config.interrupt_gpio = PORTD2; + pcf8574_init_config.i2c_address = BUTTON_I2C_ADDRESS; + zh_avr_pcf8574_init(&pcf8574_init_config, &button_handle); + zh_avr_160x_init(&lcd_handle, ZH_LCD_16X4); + zh_avr_160x_set_cursor(&lcd_handle, 0, 0); + zh_avr_160x_print_char(&lcd_handle, "LLC AEROTECH"); + zh_avr_160x_set_cursor(&lcd_handle, 1, 0); + zh_avr_160x_print_char(&lcd_handle, "ATE0003.000.000"); + zh_avr_160x_set_cursor(&lcd_handle, 2, 0); + zh_avr_160x_print_char(&lcd_handle, "Firmware v1.0.0"); + zh_avr_160x_set_cursor(&lcd_handle, 3, 0); + zh_avr_160x_print_char(&lcd_handle, "Loading: "); + for (uint8_t i = 0; i <= 100; ++i) + { + zh_avr_160x_set_cursor(&lcd_handle, 3, 10); // For LCD 16X4. + zh_avr_160x_print_int(&lcd_handle, i); + zh_avr_160x_print_char(&lcd_handle, "%"); + _delay_ms(50); + } + // xTaskCreate(led_flash_task, "led flash task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL); + vTaskStartScheduler(); + return 0; +} + +void zh_avr_pcf8574_event_handler(zh_avr_pcf8574_event_on_isr_t *event) +{ + 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)); +} + +ISR(PCINT2_vect) +{ + if (zh_avr_pcf8574_isr_handler() == pdTRUE) + { + portYIELD(); + } +} \ No newline at end of file