This is a copy of the code originally written by RC911 for the KK2 flight controller board. In this project you will find one branch for each version of his firmware (All-in-one for KK2.1.x) and each receiver type (for the KK2).
I published a series of blog posts as a proof of concept that's possible to mix an AVR Studio 4 Assembly project with an avr-gcc C project. Since the original firmware is almost 13K LOC it is unthinkable to rewrite all code in one pass. That's why the plan is to mix the original code with newer C code and migrate the implementation to C in parts.
The idea behind this migration is that I think having the code written in C will lower the barrier to new contributors for the project.
The research can be found here: http://daltonmatos.com/pages/avrgcc-avrasm2-en.html
There is a Makefile that builds all necessary parts of the project. Things you need to know brefore running make:
- You will need to have a working copy of
avrasm2.exe
. It will run just fine with wine. Remember to edit Makefile and change the lineAVRASM2 = wine ~/bin/AvrAssembler2/avrasm2.exe
to point to your copy ofavrasm2.exe
To build the project:
- Clone the project
cd
into the cloned project- run
make
A new binary will be available at bin/kk2++.elf
(if you need to disassembly) and a bin/kk2++.hex
file will be ready to be flashed into the micro-controller's memory. All intermediate objectswill also be avilable inside bin/
folder.
-
Migrate the interrupt handler vector to C, still keeping all code in AVR Assembly;Change of plans: Will keep the assembly code as the main code (compiling with-nostartfiles
). -
Rewrite the EEPROM driver in C so it will be possible do read and write config values;Not needed, will use<avr/eeprom.h>
functions; -
Migrate simple logics do C, for example, theMigrated.reset
interrupt handler; This handler just reads EEPROM values and call the correctmain
routine, based on the Receiver type (Standard, CPPM, S.Bus, Satellite); -
Rewrite the LCD display driver and use it from the Assembly code;First attempt: Done.Still does not work, for now the C code uses the original Assembly implementation.The lcd_update() not working was due to gcc optimizing too much. Making some parts of the codevolatile
seems to solve the problem. C Implemented screens already uses the lcd_update() implemented in C. -
Start to migrate each configuration screen to C;
- Remote Tuning
- PI Editor
Self-level SettingsStick ScalingMode SettingsMisc. Settings- Gimbal Settings
Advanced SettingsChannel MappingSensor Settings- Mixer Editor
Board orientation
- AUX Switch Setup
DG2 Switch SetupInitial Setup- Load Motor Layout
- ACC Calibration
- Trim Battery Voltage
Select RX Mode
- Receiver Test
- Sensor Test
Show Motor Layout- User Profile
Extra Features- Check Motor Outputs
Gimbal Controller- View Serial RX Data
ESC CalibrationVersion ScreenMigratedLCD Contrast ScreenMigratedLCD Display driverLcdClearLcdUpdatePrintCharSpriteSetPixel
-
Reduce overal refresh rate from 400Hz to about 100Hz, if possible. This would leave room for flight loop new implementations to run.
-
Migrate the main loop to C, still calling the routines in Assembly;
-
Start to migrate each mainloop routine to C;
-
....
Of course, each migration step must leave a code that's able to fly a Quad. Currently the migration is still in the first steps. I will be updating this readme as soon as I evolve in this journey.
If you like AVR micro controllers and would like to help this project, don't hesitate to get in touch and/or start openning pull requests to help make it happen!
Here I will try to document all flights made with this code, what problems they had and any relevant results.
commit: 257ee6d5e385cc648cd40d7ea9513f02cf81be65 Show final size ater project build
It flies!!! Same response as the original firmware: Roll, Pitch, yaw. I tried a "throtle punch" and crashed. The error log says: CPPM Sync Error. The behavior of the code seems to be different when no load is on the motors. Without the props it is possible to arm and go full throttle, but with props I had this CPPM Sync problem. Too bad I didn't do any bench test before this first flight. Lesson learned! =D
Results: 3 props broken. =D
Dalton Barreto, http://daltonmatos.com