# saulius1005/avr64dd32-main-controller architecture

> Architecture diagram of the GitHub repository saulius1005/avr64dd32-main-controller, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/saulius1005/avr64dd32-main-controller
- Repository: https://github.com/saulius1005/avr64dd32-main-controller

## Overview

This is AVR64DD32 firmware for a dual-axis solar tracker. Its main loop initializes hardware, receives Top Controller telemetry over the fiber/UART link and weather data over RS485, then runs motor actions and updates the display. The documented product also includes automatic weather protection, manual joystick control, fault reporting, and live electrical telemetry. The excerpts show the loop, RS485 parsing, display rendering, ADC sensing, and motor drivers; action logic and the fiber/UART parser were not sampled, so those links rely on README documentation or are marked unverified.

Main entry points: [`AVR64DD32-MAIN-Controller/Actions.c`](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/Actions.c) (Motor actions), [`AVR64DD32-MAIN-Controller/main.c`](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/main.c) (Controller loop), [`AVR64DD32-MAIN-Controller/RS485USART.c`](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/RS485USART.c) (Weather RS485), [`AVR64DD32-MAIN-Controller/FOUSART.c`](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/FOUSART.c) (Fiber/UART receiver)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_communications["Communications"]
  node_rs485["Weather RS485<br/>[RS485USART.c]"]
  node_fiber_uart["Fiber/UART receiver<br/>[FOUSART.c]"]
  node_crc["CRC validation<br/>[CRC.c]"]
  node_weather_data["Weather measurements<br/>[RS485USARTVar.h]"]
  node_sensor_data["Top-controller telemetry<br/>[FOUSARTVar.h]"]
end

subgraph group_control["Tracking control"]
  node_mcu["Controller loop<br/>[main.c]"]
  node_actions["Motor actions<br/>[Actions.c]"]
end

subgraph group_hardware["Sensing and motion"]
  node_i2c["I2C bus<br/>[i2c.c]"]
  node_adc["Analog sensing<br/>[ADC.c]"]
  node_stepper["Azimuth stepper<br/>[StepperMotor.c]"]
  node_linear["Elevation linear motor<br/>[LinearMotor.c]"]
end

subgraph group_interface["Operator interface"]
  node_joystick["Joystick input<br/>[Joystick.c]"]
  node_windows["Screen navigation<br/>[Windows.c]"]
  node_display["LCD rendering<br/>[SSD1306.c]"]
end

node_weather(("Weather station"))
node_top_controller(("Top Controller"))

node_mcu -->|"polls"| node_fiber_uart
node_mcu -->|"polls"| node_rs485
node_mcu -->|"runs"| node_actions
node_mcu -->|"updates"| node_windows
node_weather -->|"sends data"| node_rs485
node_top_controller -->|"sends telemetry"| node_fiber_uart
node_rs485 -->|"validates"| node_crc
node_rs485 -->|"stores"| node_weather_data
node_fiber_uart -.->|"stores"| node_sensor_data
node_actions -->|"controls"| node_stepper
node_actions -->|"controls"| node_linear
node_joystick -->|"provides input"| node_windows
node_windows -->|"renders screens"| node_display
node_display -->|"writes display"| node_i2c
node_adc -->|"measures current"| node_stepper
node_adc -->|"measures current"| node_linear
node_actions -.->|"uses conditions"| node_weather_data
node_actions -.->|"uses telemetry"| node_sensor_data

click node_mcu "https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/main.c"
click node_rs485 "https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/RS485USART.c"
click node_fiber_uart "https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/FOUSART.c"
click node_crc "https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/CRC.c"
click node_actions "https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/Actions.c"
click node_joystick "https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/Joystick.c"
click node_windows "https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/Windows.c"
click node_display "https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/SSD1306.c"
click node_i2c "https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/i2c.c"
click node_adc "https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/ADC.c"
click node_stepper "https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/StepperMotor.c"
click node_linear "https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/LinearMotor.c"
click node_weather_data "https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/RS485USARTVar.h"
click node_sensor_data "https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/FOUSARTVar.h"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_rs485,node_fiber_uart,node_crc,node_weather_data,node_sensor_data toneBlue
class node_mcu,node_actions toneAmber
class node_i2c,node_adc,node_stepper,node_linear toneMint
class node_joystick,node_windows,node_display toneRose
class node_weather,node_top_controller toneIndigo
```

## Components

### Communications

- [Weather RS485](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/RS485USART.c): `AVR64DD32-MAIN-Controller/RS485USART.c`
- [Fiber/UART receiver](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/FOUSART.c): `AVR64DD32-MAIN-Controller/FOUSART.c`
- [CRC validation](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/CRC.c): `AVR64DD32-MAIN-Controller/CRC.c`
- [Weather measurements](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/RS485USARTVar.h): `AVR64DD32-MAIN-Controller/RS485USARTVar.h`
- [Top-controller telemetry](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/FOUSARTVar.h): `AVR64DD32-MAIN-Controller/FOUSARTVar.h`

### Tracking control

- [Controller loop](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/main.c): `AVR64DD32-MAIN-Controller/main.c`
- [Motor actions](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/Actions.c): `AVR64DD32-MAIN-Controller/Actions.c`

### Sensing and motion

- [I2C bus](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/i2c.c): `AVR64DD32-MAIN-Controller/i2c.c`
- [Analog sensing](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/ADC.c): `AVR64DD32-MAIN-Controller/ADC.c`
- [Azimuth stepper](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/StepperMotor.c): `AVR64DD32-MAIN-Controller/StepperMotor.c`
- [Elevation linear motor](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/LinearMotor.c): `AVR64DD32-MAIN-Controller/LinearMotor.c`

### Operator interface

- [Joystick input](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/Joystick.c): `AVR64DD32-MAIN-Controller/Joystick.c`
- [Screen navigation](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/Windows.c): `AVR64DD32-MAIN-Controller/Windows.c`
- [LCD rendering](https://github.com/saulius1005/avr64dd32-main-controller/blob/main/AVR64DD32-MAIN-Controller/SSD1306.c): `AVR64DD32-MAIN-Controller/SSD1306.c`

### Other components

- **Weather station**
- **Top Controller**

## Connections

- Controller loop → Fiber/UART receiver: polls (evidence: `AVR64DD32-MAIN-Controller/main.c`)
- Controller loop → Weather RS485: polls (evidence: `AVR64DD32-MAIN-Controller/main.c`)
- Controller loop → Motor actions: runs (evidence: `AVR64DD32-MAIN-Controller/main.c`)
- Controller loop → Screen navigation: updates (evidence: `AVR64DD32-MAIN-Controller/main.c`)
- Weather station → Weather RS485: sends data (evidence: `README.md`)
- Top Controller → Fiber/UART receiver: sends telemetry (evidence: `README.md`)
- Weather RS485 → CRC validation: validates (evidence: `AVR64DD32-MAIN-Controller/RS485USART.c`)
- Weather RS485 → Weather measurements: stores (evidence: `AVR64DD32-MAIN-Controller/RS485USART.c`)
- Fiber/UART receiver → Top-controller telemetry: stores
- Motor actions → Azimuth stepper: controls (evidence: `README.md`)
- Motor actions → Elevation linear motor: controls (evidence: `README.md`)
- Joystick input → Screen navigation: provides input (evidence: `AVR64DD32-MAIN-Controller/Windows.c`)
- Screen navigation → LCD rendering: renders screens (evidence: `AVR64DD32-MAIN-Controller/Windows.c`)
- LCD rendering → I2C bus: writes display (evidence: `AVR64DD32-MAIN-Controller/SSD1306.c`)
- Analog sensing → Azimuth stepper: measures current (evidence: `AVR64DD32-MAIN-Controller/StepperMotor.c`)
- Analog sensing → Elevation linear motor: measures current (evidence: `AVR64DD32-MAIN-Controller/LinearMotor.c`)
- Motor actions → Weather measurements: uses conditions (evidence: `README.md`)
- Motor actions → Top-controller telemetry: uses telemetry (evidence: `README.md`)
