├── lib ├── arduino-softpwm │ ├── .gitignore │ ├── library.properties │ ├── keywords.txt │ ├── README.md │ ├── examples │ │ └── SoftPWM_example │ │ │ └── SoftPWM_example.ino │ └── src │ │ └── SoftPWM.h └── readme.txt ├── .gitattributes ├── .gitignore ├── docs └── scope.png ├── platformio.ini ├── LICENSE ├── .travis.yml ├── README.md ├── firmware ├── DYS.hex ├── KingKong.hex ├── SKGeneric.hex └── Afro.hex └── src └── megaBrush.cpp /lib/arduino-softpwm/.gitignore: -------------------------------------------------------------------------------- 1 | SoftPWM.h.gch -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .pioenvs 2 | .piolibdeps 3 | .clang_complete 4 | .gcc-flags.json 5 | -------------------------------------------------------------------------------- /docs/scope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/amcchord/MegaBrush/HEAD/docs/scope.png -------------------------------------------------------------------------------- /lib/arduino-softpwm/library.properties: -------------------------------------------------------------------------------- 1 | name=arduino-softpwm 2 | version=1.0.1 3 | author=Victor Tseng 4 | maintainer=Victor Tseng 5 | sentence=Software PWM library for Arduino. 6 | paragraph=Provides PWM on any pin. 7 | category=Signal Input/Output 8 | url=https://github.com/Palatis/arduino-softpwm 9 | architectures=avr 10 | -------------------------------------------------------------------------------- /platformio.ini: -------------------------------------------------------------------------------- 1 | ; PlatformIO Project Configuration File 2 | ; 3 | ; Build options: build flags, source filter 4 | ; Upload options: custom upload port, speed and extra flags 5 | ; Library options: dependencies, extra library storages 6 | ; Advanced options: extra scripting 7 | ; 8 | ; Please visit documentation for the other options and examples 9 | ; http://docs.platformio.org/page/projectconf.html 10 | 11 | [env:atmegangatmega8] 12 | platform = atmelavr 13 | board = atmegangatmega8 14 | framework = arduino 15 | upload_protocol = stk500v2 16 | #upload_flags = -P$UPLOAD_PORT -b$UPLOAD_SPEED 17 | -------------------------------------------------------------------------------- /lib/readme.txt: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for the project specific (private) libraries. 3 | PlatformIO will compile them to static libraries and link to executable file. 4 | 5 | The source code of each library should be placed in separate directory, like 6 | "lib/private_lib/[here are source files]". 7 | 8 | For example, see how can be organized `Foo` and `Bar` libraries: 9 | 10 | |--lib 11 | | |--Bar 12 | | | |--docs 13 | | | |--examples 14 | | | |--src 15 | | | |- Bar.c 16 | | | |- Bar.h 17 | | |--Foo 18 | | | |- Foo.c 19 | | | |- Foo.h 20 | | |- readme.txt --> THIS FILE 21 | |- platformio.ini 22 | |--src 23 | |- main.c 24 | 25 | Then in `src/main.c` you should use: 26 | 27 | #include 28 | #include 29 | 30 | // rest H/C/CPP code 31 | 32 | PlatformIO will find your libraries automatically, configure preprocessor's 33 | include paths and build them. 34 | 35 | More information about PlatformIO Library Dependency Finder 36 | - http://docs.platformio.org/page/librarymanager/ldf.html 37 | -------------------------------------------------------------------------------- /lib/arduino-softpwm/keywords.txt: -------------------------------------------------------------------------------- 1 | ####################################### 2 | # Syntax Coloring Map SoftPWM 3 | ####################################### 4 | ####################################### 5 | # Datatypes (KEYWORD1) 6 | ####################################### 7 | Palatis KEYWORD1 8 | SoftPWM KEYWORD1 9 | ####################################### 10 | # Methods and Functions (KEYWORD2) 11 | ####################################### 12 | begin KEYWORD2 13 | set KEYWORD2 14 | size KEYWORD2 15 | PWMlevels KEYWORD2 16 | allOff KEYWORD2 17 | update KEYWORD2 18 | printInterruptLoad KEYWORD2 19 | 20 | ####################################### 21 | # Constants (LITERAL1) 22 | ####################################### 23 | SOFTPWM_DEFINE_PINMODE LITERAL1 24 | SOFTPWM_DEFINE_CHANNEL LITERAL1 25 | SOFTPWM_DEFINE_CHANNEL_INVERT LITERAL1 26 | SOFTPWM_DEFINE_OBJECT_WITH_PWM_LEVELS LITERAL1 27 | SOFTPWM_DEFINE_OBJECT LITERAL1 28 | SOFTPWM_DEFINE_EXTERN_OBJECT_WITH_PWM_LEVELS LITERAL1 29 | SOFTPWM_DEFINE_EXTERN_OBJECT LITERAL1 30 | SOFTPWM_OUTPUT_DELAY LITERAL1 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Austin McChord 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # Continuous Integration (CI) is the practice, in software 2 | # engineering, of merging all developer working copies with a shared mainline 3 | # several times a day < http://docs.platformio.org/page/ci/index.html > 4 | # 5 | # Documentation: 6 | # 7 | # * Travis CI Embedded Builds with PlatformIO 8 | # < https://docs.travis-ci.com/user/integration/platformio/ > 9 | # 10 | # * PlatformIO integration with Travis CI 11 | # < http://docs.platformio.org/page/ci/travis.html > 12 | # 13 | # * User Guide for `platformio ci` command 14 | # < http://docs.platformio.org/page/userguide/cmd_ci.html > 15 | # 16 | # 17 | # Please choice one of the following templates (proposed below) and uncomment 18 | # it (remove "# " before each line) or use own configuration according to the 19 | # Travis CI documentation (see above). 20 | # 21 | 22 | 23 | # 24 | # Template #1: General project. Test it using existing `platformio.ini`. 25 | # 26 | 27 | # language: python 28 | # python: 29 | # - "2.7" 30 | # 31 | # sudo: false 32 | # cache: 33 | # directories: 34 | # - "~/.platformio" 35 | # 36 | # install: 37 | # - pip install -U platformio 38 | # 39 | # script: 40 | # - platformio run 41 | 42 | 43 | # 44 | # Template #2: The project is intended to by used as a library with examples 45 | # 46 | 47 | # language: python 48 | # python: 49 | # - "2.7" 50 | # 51 | # sudo: false 52 | # cache: 53 | # directories: 54 | # - "~/.platformio" 55 | # 56 | # env: 57 | # - PLATFORMIO_CI_SRC=path/to/test/file.c 58 | # - PLATFORMIO_CI_SRC=examples/file.ino 59 | # - PLATFORMIO_CI_SRC=path/to/test/directory 60 | # 61 | # install: 62 | # - pip install -U platformio 63 | # 64 | # script: 65 | # - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N 66 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MegaBrush 2 | MegaBrush is a firmware for common atmel based brushless ESCs. 3 | This library makes it possible easily convert a brushless ESC into a brushed ESC. 4 | 5 | ## Features 6 | * 1khz PWM with 128 levels per motor direction. 7 | * Forward and Reverse Operation 8 | * Runtime configurable Min and Max PPM inputs 9 | * Simple PPM Smoothing 10 | * Deadband for throttle center 11 | * Easy to install when using SimonK Bootloader 12 | * Failsafe on signal loss 13 | * Throttle must pass through deadband before ESC will spin motor 14 | 15 | ## Installation Instructions (For SimonK ESCs) 16 | 1. Look for the .hex file for your ESC in the firmware directory. 17 | 1. Download the [BLHeli flashing tool](https://blhelisuite.wordpress.com/) and flash the .hex file 18 | 1. Use the "Flash Other" Option to flash the hex file. 19 | 20 | ## Tested firmware 21 | * SKGeneric 22 | * KingKong 12a - https://hobbyking.com/en_us/2-4s-12a-esc-opto.html 23 | * T-Motor S35A - https://www.amazon.com/gp/product/B00JWTDYEE/ref=oh_aui_search_detailpage?ie=UTF8&psc=1 24 | 25 | ## ESC Performance 26 | ![Oscilloscope](/docs/scope.png) 27 | 28 | 29 | ## Operating Instructions 30 | * Wire the ESC to your brushed motor 31 | * MegaBrush uses phases A + C from the brushless motor controller. 32 | * Phase B is not used. 33 | * Program Min/Max for your RC Transmitter 34 | * Power on the ESC with the transmitter transmitting the MAX value 35 | * You should hear 3 beeps from the motor indicating you are in programming mode 36 | * After 2 seconds you will here 1 beep, Move the transmitter so you are transmitting RC Min 37 | * After 2 seconds you should here 3 beeps indicating successful programming of Min/Max 38 | * Return the RC transmitter to the neutral setting 39 | * If the motor is making a fast quiet beep it's likely because your transmitter sticks are not centered. Center your sticks at power up to enable the ESC. 40 | -------------------------------------------------------------------------------- /lib/arduino-softpwm/README.md: -------------------------------------------------------------------------------- 1 | arduino-softpwm 2 | =============== 3 | 4 | Software PWM library for [Arduino](https://arduino.cc/), and other compatible AVR boards. 5 | 6 | AVR microcontrollers provide hardware PWM on some pins but if you need PWM on other pins then it must be implemented in software. This library provides easy and efficient software PWM on any pin. Each channel can be set to a different PWM duty cycle. 7 | 8 | This library is licensed under [BSD3](https://opensource.org/licenses/BSD-3-Clause) 9 | 10 | #### Installation 11 | - Download the most recent version here: https://github.com/Palatis/arduino-softpwm/archive/master.zip 12 | - Using Arduino IDE 1.0.x: 13 | - Sketch > Import Library... > Add Library... > select the downloaded file > Open 14 | - Using Arduino IDE 1.5+: 15 | - Sketch > Include Library > Add ZIP Library... > select the downloaded file > Open 16 | 17 | 18 | #### Usage 19 | See **File > Examples > arduino-softpwm > SoftPWM_example** for demonstration of library usage. 20 | 21 | Everything in this library except for preprocessor defines are wrapped in `namespace Palatis {}`, so if your compiler blames you about symbol not found, try add `Palatis::` before that thing. For example, `Palatis::SoftPWM.size()`. 22 | 23 | Alternatively, you can add `using namespace Palatis;` at the top of the source file to import everything under the `Palatis` namespace, this might be convenient if you're using my other libraries. 24 | 25 | `#define SOFTPWM_OUTPUT_DELAY` - Add this line above `#include ` for a 1 PWM clock cycle delay between outputs to prevent large in-rush currents. 26 | 27 | `SOFTPWM_DEFINE_CHANNEL(CHANNEL, PMODE, PORT, BIT)` - Configure a pin for software PWM use. Consult the datasheet for your microcontroller for the appropriate `PORT` and `BIT` values for the physical pin. This information is shown in the pinout diagram, for example: [ATmega328P datasheet](http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Summary.pdf) **Figure 1-1** found on page 3. If you want to determine the Arduino pin assigned to the physical pin http://www.pighixxx.com/test/pinoutspg/boards/ provides this information for the most popular Arduino boards or you can look at the pins_arduino.h file in the **variant** folder used by your board. 28 | - Parameter: **CHANNEL** - The channel number is used as an ID for the pin. 29 | - Parameter: **PMODE** - DDRx register of the pin's port. Append the port letter to `DDR`. For example: The [Arduino UNO diagram](http://www.pighixxx.com/test/portfolio-items/uno/?portfolioID=314) shows that Arduino pin 13 is **PB5** which means that the port is **B** so you should use the value `DDRB` for that pin. 30 | - Parameter: **PORT** - The port of the pin. For example: Arduino pin 13 is **PB5** so you should use the value `PORTB` for that pin. 31 | - Parameter: **BIT** - The bit of the pin. For example: Arduino pin 13 is **PB5** so you should use the value `PORTB5` for that pin. 32 | 33 | `SOFTPWM_DEFINE_CHANNEL_INVERT( CHANNEL, PMODE, PORT, BIT )` - Depending on your application you may prefer to invert the output. See `SOFTPWM_DEFINE_CHANNEL()` for description of parameters. 34 | 35 | `SOFTPWM_DEFINE_OBJECT(CHANNEL_CNT)` - Define the softPWM object with the default 256 PWM levels. 36 | - Parameter: **CHANNEL_CNT** - The number of channels that are defined. 37 | 38 | `SOFTPWM_DEFINE_OBJECT_WITH_PWM_LEVELS(CHANNEL_CNT, PWM_LEVELS)` - Define the softPWM object with the specified number of PWM levels. 39 | - Parameter: **CHANNEL_CNT** - The number of channels that are defined. 40 | - Parameter: **PWM_LEVELS** - The number of PWM levels. Using less PWM levels may allow a higher PWM frequency. The maximum value is 256. 41 | 42 | `SOFTPWM_DEFINE_EXTERN_OBJECT(CHANNEL_CNT)` - Add this if you want to use the SoftPWM object outside where it's defined. See `SOFTPWM_DEFINE_OBJECT()` for description of the parameter. 43 | 44 | `SOFTPWM_DEFINE_EXTERN_OBJECT_WITH_PWM_LEVELS(CHANNEL_CNT, PWM_LEVELS)` - Add this if you want to use the SoftPWM object outside where it's defined. See `SOFTPWM_DEFINE_OBJECT_WITH_PWM_LEVELS()` for description of parameters. 45 | 46 | `SoftPWM.begin(hertz)` - Initialize SoftPWM. 47 | - Parameter: **hertz** - The PWM frequency. Setting the value too high will cause incorrect operation, too low will cause a visible flicker. 48 | - Type: long 49 | 50 | `SoftPWM.printInterruptLoad()` - Prints diagnostic information to the serial monitor. This can be used to find the optimal PWM frequency by setting different PWM frequency values in begin() and then checking the resulting interrupt load. Calling this function will momentarily turn off the PWM on all channels. 51 | 52 | `SoftPWM.set(channel_idx, value)` - Set the PWM level of the given channel. 53 | - Parameter: **channel_idx** - The channel to set. 54 | - Type: int 55 | - Parameter: **value** - The PWM level to set. 56 | - Type: byte 57 | 58 | `SoftPWM.size()` 59 | - Returns: Number of channels defined. 60 | - Type: size_t 61 | 62 | `SoftPWM.PWMlevels()` 63 | - Returns: The number of PWM levels. 64 | - Type: unsigned int 65 | 66 | `SoftPWM.allOff()` - Set the PWM value of all channels to 0. 67 | 68 | 69 | #### Troubleshooting 70 | - LEDs have a visible flicker, especially noticeable when the LED is moving relative to the viewer. 71 | - The PWM frequency set in `SoftPWM.begin()` is too low. Use `SoftPWM.printInterruptLoad()` to determine the optimum PWM frequency. You may be able to achieve a higher PWM frequency by setting less PWM levels with `SOFTPWM_DEFINE_OBJECT_WITH_PWM_LEVELS()` or `SOFTPWM_DEFINE_EXTERN_OBJECT_WITH_PWM_LEVELS()`. 72 | - Erratic PWM operation 73 | - The interrupt load is too high. Use `SoftPWM.printInterruptLoad()` to determine the interrupt load. You can decrease the interrupt load by setting less PWM levels with `SOFTPWM_DEFINE_OBJECT_WITH_PWM_LEVELS()` or `SOFTPWM_DEFINE_EXTERN_OBJECT_WITH_PWM_LEVELS()` or setting the PWM frequency lower in `SoftPWM.begin()`. 74 | - LED brightness changes between low brightness PWM values are larger than at brighter PWM values. 75 | - This is caused by the way LEDs work and is not caused by a problem with the library. If possible, use more PWM levels or never allow the LED to get dimmer than the level below which the difference between PWM levels is too distinct. 76 | -------------------------------------------------------------------------------- /lib/arduino-softpwm/examples/SoftPWM_example/SoftPWM_example.ino: -------------------------------------------------------------------------------- 1 | /* 2 | Arduino-SoftPWM: a software PWM library for Arduino 3 | Copyright 2016, Victor Tseng 4 | 5 | All rights reserved. 6 | 7 | Redistribution and use in source and binary forms, with or without 8 | modification, are permitted provided that the following conditions 9 | are met: 10 | 11 | 1. Redistributions of source code must retain the above copyright 12 | notice, this list of conditions and the following disclaimer. 13 | 14 | 2. Redistributions in binary form must reproduce the above copyright 15 | notice, this list of conditions and the following disclaimer in the 16 | documentation and/or other materials provided with the distribution. 17 | 18 | 3. Neither the name of the copyright holder nor the names of its 19 | contributors may be used to endorse or promote products derived 20 | from this software without specific prior written permission. 21 | 22 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 23 | IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 24 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 25 | PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 26 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 27 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 28 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 29 | OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 30 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 31 | OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 32 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 | */ 34 | 35 | #include 36 | 37 | /* pins_arduino.h defines the pin-port/bit mapping as PROGMEM so 38 | you have to read them with pgm_read_xxx(). That's generally okay 39 | for ordinary use, but really bad when you're writing super fast 40 | codes because the compiler doesn't treat them as constants and 41 | cannot optimize them away with sbi/cbi instructions. 42 | 43 | Therefore we have to tell the compiler the PORT and BIT here. 44 | Hope someday we can find a way to workaround this. 45 | 46 | Check the manual of your MCU for port/bit mapping. 47 | 48 | The following example demonstrates setting channels for all pins 49 | on the ATmega328P or ATmega168 used on Arduino Uno, Pro Mini, 50 | Nano and other boards. */ 51 | SOFTPWM_DEFINE_CHANNEL(0, DDRD, PORTD, PORTD0); //Arduino pin 0 52 | SOFTPWM_DEFINE_CHANNEL(1, DDRD, PORTD, PORTD1); //Arduino pin 1 53 | SOFTPWM_DEFINE_CHANNEL(2, DDRD, PORTD, PORTD2); //Arduino pin 2 54 | SOFTPWM_DEFINE_CHANNEL(3, DDRD, PORTD, PORTD3); //Arduino pin 3 55 | SOFTPWM_DEFINE_CHANNEL(4, DDRD, PORTD, PORTD4); //Arduino pin 4 56 | SOFTPWM_DEFINE_CHANNEL(5, DDRD, PORTD, PORTD5); //Arduino pin 5 57 | SOFTPWM_DEFINE_CHANNEL(6, DDRD, PORTD, PORTD6); //Arduino pin 6 58 | SOFTPWM_DEFINE_CHANNEL(7, DDRD, PORTD, PORTD7); //Arduino pin 7 59 | SOFTPWM_DEFINE_CHANNEL(8, DDRB, PORTB, PORTB0); //Arduino pin 8 60 | SOFTPWM_DEFINE_CHANNEL(9, DDRB, PORTB, PORTB1); //Arduino pin 9 61 | SOFTPWM_DEFINE_CHANNEL(10, DDRB, PORTB, PORTB2); //Arduino pin 10 62 | SOFTPWM_DEFINE_CHANNEL(11, DDRB, PORTB, PORTB3); //Arduino pin 11 63 | SOFTPWM_DEFINE_CHANNEL(12, DDRB, PORTB, PORTB4); //Arduino pin 12 64 | SOFTPWM_DEFINE_CHANNEL(13, DDRB, PORTB, PORTB5); //Arduino pin 13 65 | SOFTPWM_DEFINE_CHANNEL(14, DDRC, PORTC, PORTC0); //Arduino pin A0 66 | SOFTPWM_DEFINE_CHANNEL(15, DDRC, PORTC, PORTC1); //Arduino pin A1 67 | SOFTPWM_DEFINE_CHANNEL(16, DDRC, PORTC, PORTC2); //Arduino pin A2 68 | SOFTPWM_DEFINE_CHANNEL(17, DDRC, PORTC, PORTC3); //Arduino pin A3 69 | SOFTPWM_DEFINE_CHANNEL(18, DDRC, PORTC, PORTC4); //Arduino pin A4 70 | SOFTPWM_DEFINE_CHANNEL(19, DDRC, PORTC, PORTC5); //Arduino pin A5 71 | 72 | 73 | /* Or you may want inverted outputs: */ 74 | /* 75 | SOFTPWM_DEFINE_CHANNEL_INVERT(0, DDRD, PORTD, PORTD0); //Arduino pin 0 76 | SOFTPWM_DEFINE_CHANNEL_INVERT(1, DDRD, PORTD, PORTD1); //Arduino pin 1 77 | SOFTPWM_DEFINE_CHANNEL_INVERT(2, DDRD, PORTD, PORTD2); //Arduino pin 2 78 | SOFTPWM_DEFINE_CHANNEL_INVERT(3, DDRD, PORTD, PORTD3); //Arduino pin 3 79 | SOFTPWM_DEFINE_CHANNEL_INVERT(4, DDRD, PORTD, PORTD4); //Arduino pin 4 80 | SOFTPWM_DEFINE_CHANNEL_INVERT(5, DDRD, PORTD, PORTD5); //Arduino pin 5 81 | SOFTPWM_DEFINE_CHANNEL_INVERT(6, DDRD, PORTD, PORTD6); //Arduino pin 6 82 | SOFTPWM_DEFINE_CHANNEL_INVERT(7, DDRD, PORTD, PORTD7); //Arduino pin 7 83 | SOFTPWM_DEFINE_CHANNEL_INVERT(8, DDRB, PORTB, PORTB0); //Arduino pin 8 84 | SOFTPWM_DEFINE_CHANNEL_INVERT(9, DDRB, PORTB, PORTB2); //Arduino pin 9 85 | SOFTPWM_DEFINE_CHANNEL_INVERT(10, DDRB, PORTB, PORTB2); //Arduino pin 10 86 | SOFTPWM_DEFINE_CHANNEL_INVERT(11, DDRB, PORTB, PORTB3); //Arduino pin 11 87 | SOFTPWM_DEFINE_CHANNEL_INVERT(12, DDRB, PORTB, PORTB4); //Arduino pin 12 88 | SOFTPWM_DEFINE_CHANNEL_INVERT(13, DDRB, PORTB, PORTB5); //Arduino pin 13 89 | SOFTPWM_DEFINE_CHANNEL_INVERT(14, DDRC, PORTC, PORTC0); //Arduino pin A0 90 | SOFTPWM_DEFINE_CHANNEL_INVERT(15, DDRC, PORTC, PORTC1); //Arduino pin A1 91 | SOFTPWM_DEFINE_CHANNEL_INVERT(16, DDRC, PORTC, PORTC2); //Arduino pin A2 92 | SOFTPWM_DEFINE_CHANNEL_INVERT(17, DDRC, PORTC, PORTC3); //Arduino pin A3 93 | SOFTPWM_DEFINE_CHANNEL_INVERT(18, DDRC, PORTC, PORTC4); //Arduino pin A4 94 | SOFTPWM_DEFINE_CHANNEL_INVERT(19, DDRC, PORTC, PORTC5); //Arduino pin A5 95 | */ 96 | 97 | /* Here you make an instance of desired channel counts you want 98 | with the default 256 PWM levels (0 ~ 255). */ 99 | //SOFTPWM_DEFINE_OBJECT(20); 100 | 101 | /* Or you can make one with only 100 PWM levels (0 ~ 99). 102 | By using less PWM levels, you may be able to use higher 103 | pwm frequencies. */ 104 | SOFTPWM_DEFINE_OBJECT_WITH_PWM_LEVELS(20, 100); 105 | 106 | /* If you want to use the SoftPWM object outside where it's defined, 107 | add the following line to the file. */ 108 | //SOFTPWM_DEFINE_EXTERN_OBJECT(16); 109 | SOFTPWM_DEFINE_EXTERN_OBJECT_WITH_PWM_LEVELS(20, 100); 110 | 111 | void setup() { 112 | Serial.begin(19200); 113 | 114 | // begin with 60hz pwm frequency 115 | Palatis::SoftPWM.begin(60); 116 | 117 | // print interrupt load for diagnostic purposes 118 | Palatis::SoftPWM.printInterruptLoad(); 119 | } 120 | 121 | static volatile uint8_t v = 0; 122 | void loop() { 123 | for (uint8_t i = 0; i < Palatis::SoftPWM.size(); ++i) { 124 | Serial.print(micros()); 125 | Serial.print(" loop(): "); 126 | Serial.println(i); 127 | 128 | unsigned long const WAIT = 1000000 / Palatis::SoftPWM.PWMlevels() / 2; 129 | unsigned long nextMicros = 0; 130 | for (unsigned int v = 0; v < Palatis::SoftPWM.PWMlevels() - 1; ++v) { 131 | while (micros() < nextMicros); 132 | nextMicros = micros() + WAIT; 133 | Palatis::SoftPWM.set(i, v); 134 | } 135 | for (unsigned int v = Palatis::SoftPWM.PWMlevels() - 1; v >= 0; --v) { 136 | while (micros() < nextMicros); 137 | nextMicros = micros() + WAIT; 138 | } 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /lib/arduino-softpwm/src/SoftPWM.h: -------------------------------------------------------------------------------- 1 | /* 2 | Arduino-SoftPWM: a software PWM library for Arduino 3 | Copyright 2016, Victor Tseng 4 | 5 | All rights reserved. 6 | 7 | Redistribution and use in source and binary forms, with or without 8 | modification, are permitted provided that the following conditions 9 | are met: 10 | 11 | 1. Redistributions of source code must retain the above copyright 12 | notice, this list of conditions and the following disclaimer. 13 | 14 | 2. Redistributions in binary form must reproduce the above copyright 15 | notice, this list of conditions and the following disclaimer in the 16 | documentation and/or other materials provided with the distribution. 17 | 18 | 3. Neither the name of the copyright holder nor the names of its 19 | contributors may be used to endorse or promote products derived 20 | from this software without specific prior written permission. 21 | 22 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 23 | IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 24 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 25 | PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 26 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 27 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 28 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 29 | OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 30 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 31 | OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 32 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 | */ 34 | 35 | #ifndef _SOFTPWM_H_ 36 | #define _SOFTPWM_H_ 37 | 38 | #include 39 | 40 | // helper macros 41 | #define SOFTPWM_DEFINE_PINMODE(CHANNEL, PMODE, PORT, BIT) \ 42 | namespace Palatis { \ 43 | template <> \ 44 | inline void pinModeStatic(uint8_t const mode) { \ 45 | if (mode == INPUT) { \ 46 | bitClear(PMODE, BIT); bitClear(PORT, BIT); \ 47 | } \ 48 | else if (mode == INPUT_PULLUP) { \ 49 | bitClear(PMODE, BIT); bitSet(PORT, BIT); \ 50 | } \ 51 | else { \ 52 | bitSet(PMODE, BIT); \ 53 | } \ 54 | } \ 55 | } 56 | 57 | #define SOFTPWM_DEFINE_CHANNEL(CHANNEL, PMODE, PORT, BIT) \ 58 | namespace Palatis { \ 59 | template <> \ 60 | inline void bitWriteStatic(bool const value) { \ 61 | bitWrite( PORT, BIT, value ); \ 62 | } \ 63 | } \ 64 | SOFTPWM_DEFINE_PINMODE(CHANNEL, PMODE, PORT, BIT) 65 | 66 | #define SOFTPWM_DEFINE_CHANNEL_INVERT(CHANNEL, PMODE, PORT, BIT) \ 67 | namespace Palatis { \ 68 | template <> \ 69 | inline void bitWriteStatic(bool const value) { \ 70 | bitWrite(PORT, BIT, !value); \ 71 | } \ 72 | } \ 73 | SOFTPWM_DEFINE_PINMODE(CHANNEL, PMODE, PORT, BIT) 74 | 75 | #if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) 76 | #define SOFTPWM_DEFINE_OBJECT_WITH_PWM_LEVELS(CHANNEL_CNT, PWM_LEVELS) \ 77 | namespace Palatis { \ 78 | CSoftPWM SoftPWM; \ 79 | } \ 80 | ISR(TIM1_COMPA_vect) { \ 81 | interrupts(); \ 82 | Palatis::SoftPWM.update(); \ 83 | } 84 | #else 85 | #if defined (__AVR_ATmega8__) || defined (__AVR_ATmega8A__) 86 | #define TIMSK1 TIMSK 87 | #endif 88 | #define SOFTPWM_DEFINE_OBJECT_WITH_PWM_LEVELS(CHANNEL_CNT, PWM_LEVELS) \ 89 | namespace Palatis { \ 90 | CSoftPWM SoftPWM; \ 91 | } \ 92 | ISR(TIMER1_COMPA_vect) { \ 93 | interrupts(); \ 94 | Palatis::SoftPWM.update(); \ 95 | } 96 | #endif 97 | 98 | #define SOFTPWM_DEFINE_OBJECT(CHANNEL_CNT) \ 99 | SOFTPWM_DEFINE_OBJECT_WITH_PWM_LEVELS(CHANNEL_CNT, 0) 100 | 101 | #define SOFTPWM_DEFINE_EXTERN_OBJECT_WITH_PWM_LEVELS(CHANNEL_CNT, PWM_LEVELS) \ 102 | namespace Palatis { \ 103 | extern CSoftPWM SoftPWM; \ 104 | } 105 | 106 | #define SOFTPWM_DEFINE_EXTERN_OBJECT(CHANNEL_CNT) \ 107 | SOFTPWM_DEFINE_EXTERN_OBJECT_WITH_PWM_LEVELS(CHANNEL_CNT, 0) 108 | 109 | // here comes the magic @o@ 110 | namespace Palatis { 111 | 112 | template inline void bitWriteStatic(bool value) {} 113 | template inline void pinModeStatic(uint8_t mode) {} 114 | 115 | template 116 | struct bitWriteStaticExpander { 117 | void operator() (bool value) const { 118 | bitWriteStatic(value); 119 | bitWriteStaticExpander < channel - 1 > ()(value); 120 | } 121 | 122 | void operator() (uint8_t const &count, uint8_t const * const &channels) const { 123 | #ifdef SOFTPWM_OUTPUT_DELAY 124 | bitWriteStatic((count + channel) < channels[channel]); 125 | #else 126 | bitWriteStatic(count < channels[channel]); 127 | #endif 128 | bitWriteStaticExpander < channel - 1 > ()(count, channels); 129 | } 130 | }; 131 | 132 | template <> 133 | struct bitWriteStaticExpander < -1 > { 134 | void operator() (bool) const {} 135 | void operator() (uint8_t const &, uint8_t const * const &) const {} 136 | }; 137 | 138 | template 139 | struct pinModeStaticExpander { 140 | void operator() (uint8_t const mode) const 141 | { 142 | pinModeStatic(mode); 143 | pinModeStaticExpander < channel - 1 > ()(mode); 144 | } 145 | }; 146 | 147 | template <> 148 | struct pinModeStaticExpander < -1 > { 149 | void operator() (uint8_t const mode) const {} 150 | }; 151 | 152 | template 153 | class CSoftPWM { 154 | public: 155 | void begin(const unsigned long hertz) { 156 | allOff(); //this prevents inverted channels from momentarily going LOW 157 | asm volatile ("/************ pinModeStaticExpander begin ************/"); 158 | const uint8_t oldSREG = SREG; 159 | noInterrupts(); 160 | pinModeStaticExpander < num_channels - 1 > ()( OUTPUT ); 161 | SREG = oldSREG; 162 | asm volatile ("/************ pinModeStaticExpander end ************/"); 163 | 164 | /* the setup of timer1 is stolen from ShiftPWM :-P 165 | http://www.elcojacobs.com/shiftpwm/ */ 166 | asm volatile ("/************ timer setup begin ************/"); 167 | TCCR1A = 0b00000000; 168 | TCCR1B = 0b00001001; 169 | OCR1A = (F_CPU - hertz * PWMlevels() / 2) / (hertz * PWMlevels()); 170 | bitSet(TIMSK1, OCIE1A); 171 | asm volatile ("/************ timer setup end ************/"); 172 | 173 | _count = 0; 174 | } 175 | 176 | void set(const int channel_idx, const uint8_t value) { 177 | _channels[channel_idx] = value; 178 | } 179 | 180 | size_t size() const { 181 | return num_channels; 182 | } 183 | 184 | unsigned int PWMlevels() const { 185 | return num_PWM_levels ? num_PWM_levels : 256; 186 | } 187 | 188 | void allOff() { 189 | asm volatile ("/********** CSoftPWM::allOff() begin **********/"); 190 | const uint8_t oldSREG = SREG; 191 | noInterrupts(); 192 | for (int i = 0; i < num_channels; ++i) 193 | _channels[i] = 0; 194 | bitWriteStaticExpander < num_channels - 1 > ()(false); 195 | SREG = oldSREG; 196 | asm volatile ("/********** CSoftPWM::allOff() end **********/"); 197 | } 198 | 199 | /* This function cannot be private because the ISR uses it, and I have 200 | no idea about how to make friends with ISR. :-( */ 201 | void update() __attribute__((always_inline)) { 202 | asm volatile ("/********** CSoftPWM::update() begin **********/"); 203 | const uint8_t count = _count; 204 | bitWriteStaticExpander < num_channels - 1 > ()(count, _channels); 205 | ++_count; 206 | if (_count == PWMlevels()) 207 | _count = 0; 208 | asm volatile ("/********** CSoftPWM::update() end **********/"); 209 | } 210 | 211 | /* this function is stolen from ShiftPWM :-P 212 | http://www.elcojacobs.com/shiftpwm/ */ 213 | void printInterruptLoad() { 214 | unsigned long time1, time2; 215 | 216 | bitSet(TIMSK1, OCIE1A); // enable interrupt 217 | time1 = micros(); 218 | delayMicroseconds(5000); 219 | time1 = micros() - time1; 220 | 221 | bitClear(TIMSK1, OCIE1A); // disable interrupt 222 | time2 = micros(); 223 | delayMicroseconds(5000); 224 | time2 = micros() - time2; 225 | 226 | const double load = static_cast(time1 - time2) / time1; 227 | const double interrupt_frequency = static_cast(F_CPU) / (OCR1A + 1); 228 | const double cycles_per_interrupt = load * F_CPU / interrupt_frequency; 229 | 230 | Serial.println(F("SoftPWM::printInterruptLoad():")); 231 | Serial.print(F(" Load of interrupt: ")); 232 | Serial.println(load, 10); 233 | Serial.print(F(" Clock cycles per interrupt: ")); 234 | Serial.println( cycles_per_interrupt ); 235 | Serial.print(F(" Interrupt frequency: ")); 236 | Serial.print(interrupt_frequency); 237 | Serial.println(F(" Hz")); 238 | Serial.print(F(" PWM frequency: ")); 239 | Serial.print(interrupt_frequency / PWMlevels()); 240 | Serial.println(F(" Hz")); 241 | Serial.print(F(" PWM levels: ")); 242 | Serial.println(PWMlevels()); 243 | 244 | bitSet(TIMSK1, OCIE1A); // enable interrupt again 245 | } 246 | 247 | private: 248 | uint8_t _channels[num_channels]; 249 | uint8_t _count; 250 | }; 251 | 252 | } // namespace Palatis 253 | #endif // #ifndef _SOFTPWM_H_ 254 | -------------------------------------------------------------------------------- /firmware/DYS.hex: -------------------------------------------------------------------------------- 1 | :1000000035C04FC04EC04DC04CC04BC026C249C0C9 2 | :1000100048C0D9C146C045C044C043C042C041C029 3 | :1000200040C03FC03EC00000000038003500320034 4 | :1000300000000000370034003100000000003600EE 5 | :100040003300300004040404040404040202020225 6 | :10005000020203030303030301020408102040808B 7 | :1000600001020408102001020408102011241FBE00 8 | :10007000CFE5D4E0DEBFCDBF20E0AAE6B0E001C00E 9 | :100080001D92A838B207E1F710E0A0E6B0E0E2E187 10 | :10009000FDE002C005900D92AA36B107D9F757D2FC 11 | :1000A00036C6AECF3FB7F89480917F009091800024 12 | :1000B000A0918100B091820022B708B600FE05C071 13 | :1000C0002F3F19F00196A11DB11D3FBFBA2FA92FD7 14 | :1000D000982F8827820F911DA11DB11DBC01CD0154 15 | :1000E00042E0660F771F881F991F4A95D1F7089540 16 | :1000F0008F929F92AF92BF92CF92DF92EF92FF9238 17 | :100100006B017C01CFDF4B015C01C114D104E10420 18 | :10011000F104E9F0C7DFDC01CB0188199909AA09CC 19 | :10012000BB09883E9340A105B10578F321E0C21ACE 20 | :10013000D108E108F10888EE880E83E0981EA11C22 21 | :10014000B11CC114D104E104F10421F7DECFFF900A 22 | :10015000EF90DF90CF90BF90AF909F908F900895D9 23 | :100160002FB7F89460917B0070917C0080917D00A6 24 | :1001700090917E002FBF089581382FEF920714F4DD 25 | :1001800081E89FEF9C018038910514F02FE730E063 26 | :10019000C9014396879708F43FC012161306D4F49A 27 | :1001A000C901330FAA0BBB0B9C01AD0124513109CE 28 | :1001B00041095109AFE7B0E072D52BE630E040E0ED 29 | :1001C00050E051D520938300109284008FE78093F4 30 | :1001D000850028C021153105F9F010928300319572 31 | :1001E00021953109C901330FAA0BBB0B9C01AD014D 32 | :1001F0002451310941095109AFE7B0E050D52BE650 33 | :1002000030E040E050E02FD520938400109285002C 34 | :100210008FE78093860008951092830010928400E7 35 | :1002200010928500109286000895EF92FF920F932E 36 | :100230001F93CF93DF937C01C0E0D0E003EE13E087 37 | :10024000CE15DF0574F48DE590E096DFF801319767 38 | :10025000F1F783EA9FEF90DFF8013197F1F72196EC 39 | :10026000EFCF80E090E088DF64E670E080E090E02F 40 | :10027000DF91CF911F910F91FF90EF9039CF0F93A6 41 | :100280001F93E4E6F0E06491E0E5F0E0E491F0E053 42 | :10029000EE0FFF1FE65CFF4F8591949108EA11E68F 43 | :1002A00020E030E0462F0ED16115710581059105E2 44 | :1002B00049F0DC01CB010196A11DB11DBC01CD01AE 45 | :1002C0009F7003C060E070E0CB011F910F91089513 46 | :1002D0008FB7F894E3E8F0E0108211821282138263 47 | :1002E000C1989598949A929A8FBF0895CF92DF9271 48 | :1002F000EF92FF920F931F93CF936B017C01CB0181 49 | :100300009DD4182FC601019699D4C82FC601029614 50 | :1003100095D4082FC601039691D44C2F50E060E08D 51 | :1003200070E0762F652F542F4427410F511D611D1A 52 | :10033000711D10E020E030E0980111270027400FE8 53 | :10034000511F621F731F90E0A0E0B0E0B82FAA27F2 54 | :10035000992788278A019B01080F191F2A1F3B1F15 55 | :10036000C901B801CF911F910F91FF90EF90DF90DD 56 | :10037000CF900895CF92DF92EF92FF92CF93DF93C9 57 | :10038000EC016A017B01642F61D49927F7FC9A95EF 58 | :100390008F2D7E2D6D2DCE01019658D4B701992752 59 | :1003A00077FD9095892FCE01029650D46F2D772737 60 | :1003B00088279927CE010396DF91CF91FF90EF9088 61 | :1003C000DF90CF9043C41F920F920FB60F9211246B 62 | :1003D0002F933F938F939F93AF93BF9380917B0015 63 | :1003E00090917C00A0917D00B0917E0030917A00C8 64 | :1003F00023E0230F2D3720F40196A11DB11D05C068 65 | :1004000026E8230F0296A11DB11D20937A00809348 66 | :100410007B0090937C00A0937D00B0937E00809140 67 | :100420007F0090918000A0918100B09182000196A0 68 | :10043000A11DB11D80937F0090938000A093810047 69 | :10044000B0938200BF91AF919F918F913F912F9177 70 | :100450000F900FBE0F901F9018951F920F920FB61E 71 | :100460000F9211248F939F9378948091870090919D 72 | :100470008600891710F4C19A01C0C1989091850037 73 | :10048000891710F4959A01C0959890918400891766 74 | :1004900010F0949A01C0949890918300891710F0FD 75 | :1004A000929A01C092988F5F8E3719F080938700DF 76 | :1004B00002C0109287009F918F910F900FBE0F90F6 77 | :1004C0001F901895CF92DF92EF92FF920F931F9398 78 | :1004D000E82FF92F05C0015011092109310961F1F7 79 | :1004E000908196239417B9F305C001501109210991 80 | :1004F000310911F1908196239413F7CFC12CD12C9F 81 | :10050000E12CF12C0AC08FEFC81AD80AE80AF80AC1 82 | :100510000C151D052E053F0579F080818623841773 83 | :1005200091F36C2D7D2D8E2D9F2D1F910F91FF909E 84 | :10053000EF90DF90CF90089560E070E080E090E071 85 | :100540001F910F91FF90EF90DF90CF9008957894D6 86 | :1005500083B7826083BF83B7816083BF89B78160BF 87 | :1005600089BF1EBC8EB582608EBD8EB581608EBD8A 88 | :100570008FB581608FBD85B5846085BD85B580648C 89 | :1005800085BD329A319A309A379A1AB8E4E6F0E08B 90 | :100590002491E0E5F0E084918823C1F090E0880F99 91 | :1005A000991FFC01E05DFF4FC591D491FC01EA5D0C 92 | :1005B000FF4FA591B4919FB7F8948881E22FE09501 93 | :1005C0008E2388838C91E823EC939FBF81DE8FB7C5 94 | :1005D000F894899ABD9AA49A8A9A8FBF1FBC89E021 95 | :1005E0008EBD8EE790E09BBD8ABD89B7806189BFD3 96 | :1005F000109287006DDE82E390E017DE82E390E0E8 97 | :1006000014DE60ED77E080E090E072DD38DE672B8D 98 | :10061000682B692B49F468EB7BE080E090E068DDB3 99 | :1006200082E390E002DEF2CF2ADE6B017C01609370 100 | :10063000760070937700809378009093790060E45F 101 | :1006400070E080E090E052DE1616170618061906D4 102 | :1006500024F4709361006093600060E870E080E0D3 103 | :1006600090E044DE20916000309161008901330FF9 104 | :10067000220B330B061717072807390724F470934A 105 | :10068000630060936200C701B601C1D16B017C01B8 106 | :100690008091620090916300BC01990F880B990BC7 107 | :1006A000B6D12DEC3CEC4CE45FE3F0D19B01AC0106 108 | :1006B000C701B601E7D118160CF0BAC084E690E085 109 | :1006C000B4DD84E690E0B1DD84E690E0AEDD48DDA7 110 | :1006D0006093720070937300809374009093750020 111 | :1006E000C12CD12C76013CDD009172001091730079 112 | :1006F0002091740030917500DC01CB01801B910BBF 113 | :10070000A20BB30B803D9740A105B105E0F4B7DD26 114 | :100710004B015C01609376007093770080937800C2 115 | :1007200090937900C616D706E806F906E4F618DDB8 116 | :1007300060937200709373008093740090937500BF 117 | :1007400075016401D0CF88EC90E06FDD09DD609326 118 | :10075000720070937300809374009093750080E131 119 | :10076000882E87E2982EA12CB12CFADC0091720021 120 | :10077000109173002091740030917500DC01CB0161 121 | :10078000801B910BA20BB30B803D9740A105B105D7 122 | :10079000E0F475DD2B013C016093760070937700E7 123 | :1007A0008093780090937900681579058A059B05F8 124 | :1007B000E4F6D6DC6093720070937300809374004B 125 | :1007C0009093750053014201D0CFD701C60188191B 126 | :1007D0009909AA09BB094497A105B10574F484EFEE 127 | :1007E00091E023DD68EE73E080E090E081DC64EF6F 128 | :1007F00071E080E090E07CDC61CF82E390E015DD89 129 | :1008000084E690E012DD82E390E00FDD84E690E084 130 | :100810000CDDB501A40180E490E0ACDDB701A601D8 131 | :1008200080E890E0A7DD68EE73E080E090E060DCB7 132 | :1008300080E090E0A1DC60E470E080E090E056DDD4 133 | :10084000709361006093600060E870E080E090E089 134 | :100850004DDD7093630060936200C3E0D0E000E080 135 | :1008600010E00DDD6B017C016093760070937700E2 136 | :100870008093780090937900809164009091650056 137 | :10088000092E000CAA0BBB0BC816D906EA06FB06FC 138 | :1008900069F0D0926500C092640062DC60937200DF 139 | :1008A00070937300809374009093750059DC80906E 140 | :1008B000720090907300A0907400B0907500DC01FD 141 | :1008C000CB0188199909AA09BB09813D9740A10567 142 | :1008D000B10508F059C0C114D104E104F10409F4D0 143 | :1008E00053C08090600090906100092C000CAA0811 144 | :1008F000BB08A7019601281939094A095B09AEEF1F 145 | :10090000B0E0CDD120916200309163006901330FD6 146 | :10091000EE08FF08A7019601281939094A095B0961 147 | :10092000A2D169017A018FE7C81AD108E108F1085C 148 | :10093000D0927100C092700080916E0090916F0013 149 | :1009400090936D0080936C0060916A0070916B00D1 150 | :1009500070936F0060936E00D0926B00C0926A003B 151 | :100960009B012C0D3D1D820F931FBE0127D0CB0193 152 | :1009700003DC6AE070E080E090E0BADB011511056D 153 | :1009800009F46FCF3DDB6DCFEBDB603D7740810538 154 | :10099000910538F481ED881687E09806A104B1042A 155 | :1009A0001CF480E090E0E4CFDBDB60937200709396 156 | :1009B00073008093740090937500F3CF97FB072E1C 157 | :1009C00016F4009406D077FD08D00BD007FC05D0B4 158 | :1009D0003EF4909581959F4F0895709561957F4F56 159 | :1009E0000895AA1BBB1B51E107C0AA1FBB1FA61776 160 | :1009F000B70710F0A61BB70B881F991F5A95A9F7C8 161 | :100A000080959095BC01CD010895E89409C097FBAD 162 | :100A10003EF490958095709561957F4F8F4F9F4FD5 163 | :100A20009923A9F0F92F96E9BB279395F695879519 164 | :100A300077956795B795F111F8CFFAF4BB0F11F4DC 165 | :100A400060FF1BC06F5F7F4F8F4F9F4F16C0882383 166 | :100A500011F096E911C0772321F09EE8872F762FB9 167 | :100A600005C0662371F096E8862F70E060E02AF0FA 168 | :100A70009A95660F771F881FDAF7880F96958795E6 169 | :100A800097F9089566D008F48FEF08950BD09CC0B5 170 | :100A90008DD028F092D018F0952309F07EC083C045 171 | :100AA0001124C6C0A2D0A0F3959FD1F3950F50E0BA 172 | :100AB000551F629FF001729FBB27F00DB11D639F10 173 | :100AC000AA27F00DB11DAA1F649F6627B00DA11DB6 174 | :100AD000661F829F2227B00DA11D621F739FB00D5C 175 | :100AE000A11D621F839FA00D611D221F749F3327CC 176 | :100AF000A00D611D231F849F600D211D822F762F65 177 | :100B00006A2F11249F5750408AF0E1F088234AF061 178 | :100B1000EE0FFF1FBB1F661F771F881F91505040AD 179 | :100B2000A9F79E3F510570F038C082C05F3FECF3DB 180 | :100B3000983EDCF3869577956795B795F795E79599 181 | :100B40009F5FC1F7FE2B880F911D9695879597F9AA 182 | :100B50000895990F0008550FAA0BE0E8FEEF16164E 183 | :100B60001706E807F907C0F012161306E407F507A1 184 | :100B700098F0621B730B840B950B39F40A2661F015 185 | :100B8000232B242B252B21F408950A2609F4A140B8 186 | :100B9000A6958FEF811D811D089597F99F6780E8C5 187 | :100BA00070E060E008959FEF80EC089500240A94BF 188 | :100BB0001616170618060906089500240A94121638 189 | :100BC0001306140605060895092E0394000C11F46B 190 | :100BD000882352F0BB0F40F4BF2B11F460FF04C018 191 | :100BE0006F5F7F4F8F4F9F4F089557FD9058440F71 192 | :100BF000551F59F05F3F71F04795880F97FB991F7C 193 | :100C000061F09F3F79F08795089512161306140638 194 | :100C1000551FF2CF4695F1DF08C0161617061806C5 195 | :100C2000991FF1CF86957105610508940895E894A0 196 | :100C3000BB2766277727CB0197F90895E199FECF67 197 | :100C40009FBB8EBBE09A99278DB30895262FE1991B 198 | :100C5000FECF9FBB8EBB2DBB0FB6F894E29AE19AF4 199 | :100C60000FBE01960895052E97FB16F400940FD041 200 | :100C700057FD05D01ED007FC02D046F408C05095A1 201 | :100C80004095309521953F4F4F4F5F4F0895909578 202 | :100C90008095709561957F4F8F4F9F4F08952BD012 203 | :100CA000A59F900DB49F900DA49F800D911D1124C0 204 | :100CB0000895A1E21A2EAA1BBB1BFD010DC0AA1F9D 205 | :100CC000BB1FEE1FFF1FA217B307E407F50720F0B5 206 | :100CD000A21BB30BE40BF50B661F771F881F991F30 207 | :100CE0001A9469F760957095809590959B01AC0179 208 | :100CF000BD01CF010895A29FB001B39FC001A39F82 209 | :100D000001D0B29F700D811D1124911D0895F8949A 210 | :020D1000FFCF13 211 | :0A0D120096002C01640001000000AF 212 | :00000001FF 213 | -------------------------------------------------------------------------------- /src/megaBrush.cpp: -------------------------------------------------------------------------------- 1 | /*MegaBush... A Brushed motor controller firmware for BLHELI compatible ESCs 2 | 3 | Copyright 2017 Austin McChord 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | */ 23 | 24 | 25 | #include 26 | #include 27 | #include 28 | #include 29 | 30 | 31 | 32 | //Settings for KingKong 12a (Also works for HobbyKing 30A and ) 33 | #define rcIN 2 34 | #define hasLED false 35 | #define redLED 0 36 | #define greenLED 0 37 | SOFTPWM_DEFINE_CHANNEL_INVERT(0, DDRD, PORTD, PORTD4); //Arduino pin 2 ApFET 38 | SOFTPWM_DEFINE_CHANNEL_INVERT(1, DDRC, PORTC, PORTC3); //Arduino pin 4 CpFET 39 | SOFTPWM_DEFINE_CHANNEL(2, DDRB, PORTB, PORTB0); //Arduino pin 5 CnFET 40 | SOFTPWM_DEFINE_CHANNEL(3, DDRD, PORTD, PORTD5); //Arduino pin 13 AnFET 41 | 42 | //Settings for Afro ESC 43 | // #define rcIN 8 // PORTB0 44 | // #define hasLED true 45 | // #define redLED 16 // PORTC3 46 | // #define greenLED 17 // PORTC2 47 | // SOFTPWM_DEFINE_CHANNEL_INVERT(0, DDRD, PORTD, PORTD2); //Arduino pin 2 ApFET 48 | // SOFTPWM_DEFINE_CHANNEL_INVERT(1, DDRB, PORTB, PORTB1); //Arduino pin 4 CpFET 49 | // SOFTPWM_DEFINE_CHANNEL(2, DDRD, PORTD, PORTD5); //Arduino pin 5 CnFET 50 | // SOFTPWM_DEFINE_CHANNEL(3, DDRD, PORTD, PORTD3); //Arduino pin 13 AnFET 51 | 52 | 53 | #define PPM_MAX_LOC 32 54 | #define PPM_MIN_LOC 48 55 | #define PPM_NEVER_SET 40 56 | #define PWM_LEVELS 127 57 | #define PWM_HZ 1000 58 | #define SERIAL_DEBUG false 59 | 60 | #define RC_MIN_DEFAULT 445 61 | #define RC_MAX_DEFAULT 800 62 | 63 | #define DEADBAND 10 64 | #define TIMEOUT 2000 65 | 66 | 67 | 68 | SOFTPWM_DEFINE_OBJECT_WITH_PWM_LEVELS(4, PWM_LEVELS - 1); 69 | SOFTPWM_DEFINE_EXTERN_OBJECT_WITH_PWM_LEVELS(4, PWM_LEVELS - 1); 70 | 71 | int finalSpeed = 0; //-250 - 0 - 250 72 | long pulse_time = 0; 73 | 74 | int lastPulse = 100; 75 | long lastUpdate = 0; 76 | 77 | int rcMin = RC_MIN_DEFAULT; 78 | int rcMax = RC_MAX_DEFAULT; 79 | 80 | int smoothSpeed1 = 0; 81 | int smoothSpeed2 = 0; 82 | int smoothSpeed3 = 0; 83 | 84 | int printUpdate = 1; 85 | 86 | bool waitingForDeadBand = 1; 87 | 88 | 89 | //This function sets the actual speed to the motor 90 | void applySpeed(int speed){ 91 | if (speed > PWM_LEVELS){ 92 | speed = PWM_LEVELS; 93 | } 94 | else if (speed < PWM_LEVELS * -1){ 95 | speed = PWM_LEVELS * -1; 96 | } 97 | if (speed < DEADBAND && speed > DEADBAND * -1){ 98 | speed = 0; 99 | } 100 | 101 | if (speed > 0){ 102 | speed = map(speed, DEADBAND, PWM_LEVELS, 0, PWM_LEVELS); 103 | Palatis::SoftPWM.set(0, speed); //CLOSE ApFET //Chop the high side 104 | Palatis::SoftPWM.set(1, 0); //OPEN CpFET 105 | Palatis::SoftPWM.set(2, PWM_LEVELS); //CLOSE CnFET 106 | Palatis::SoftPWM.set(3, 0); //OPEN AnFET 107 | } 108 | else if (speed < 0){ 109 | speed = map(speed * -1, DEADBAND, PWM_LEVELS, 0, PWM_LEVELS) * -1; 110 | Palatis::SoftPWM.set(0, 0); //OPEN th ApFET 111 | Palatis::SoftPWM.set(1, speed * -1); // CLOSECpFET //Chop the high side 112 | Palatis::SoftPWM.set(2, 0); //OPEN at CnFET 113 | Palatis::SoftPWM.set(3, PWM_LEVELS); //CLOSE AnFET 114 | } 115 | else { 116 | //Lets disconnect the motor 117 | Palatis::SoftPWM.set(0, 0); //OPEN ApFET 118 | Palatis::SoftPWM.set(1, 0); //OPEN CpFET 119 | Palatis::SoftPWM.set(2, 0); //OPEN CnFET 120 | Palatis::SoftPWM.set(3, 0); //OPEN AnFET 121 | } 122 | 123 | } 124 | 125 | void doBeep(int cMax){ 126 | for (int cnt = 0; cnt < cMax; cnt++){ 127 | applySpeed((PWM_LEVELS/4)*3); 128 | delayMicroseconds(250); 129 | applySpeed((PWM_LEVELS/4)*3 * -1); 130 | delayMicroseconds(250); 131 | } 132 | applySpeed(0); 133 | delay(100); 134 | } 135 | 136 | void EEPROMWritelong(int address, long value){ 137 | //Decomposition from a long to 4 bytes by using bitshift. 138 | //One = Most significant -> Four = Least significant byte 139 | byte four = (value & 0xFF); 140 | byte three = ((value >> 8) & 0xFF); 141 | byte two = ((value >> 16) & 0xFF); 142 | byte one = ((value >> 24) & 0xFF); 143 | 144 | //Write the 4 bytes into the eeprom memory. 145 | EEPROM.write(address, four); 146 | EEPROM.write(address + 1, three); 147 | EEPROM.write(address + 2, two); 148 | EEPROM.write(address + 3, one); 149 | } 150 | 151 | long EEPROMReadlong(long address) { 152 | //Read the 4 bytes from the eeprom memory. 153 | long four = EEPROM.read(address); 154 | long three = EEPROM.read(address + 1); 155 | long two = EEPROM.read(address + 2); 156 | long one = EEPROM.read(address + 3); 157 | 158 | //Return the recomposed long by using bitshift. 159 | return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF); 160 | } 161 | 162 | bool programMinMax(){ 163 | if (SERIAL_DEBUG){Serial.println("Programming Min Max");} 164 | doBeep(100); 165 | doBeep(100); 166 | doBeep(100); 167 | long max = 0; 168 | long min = 10000; 169 | lastUpdate = millis(); 170 | while(millis() - lastUpdate < TIMEOUT){ 171 | pulse_time = pulseIn(rcIN, HIGH, 25000); 172 | if (pulse_time > max){ 173 | max = pulse_time; 174 | lastUpdate = millis(); 175 | } 176 | } 177 | if (SERIAL_DEBUG){ 178 | Serial.print("Max Set: "); 179 | Serial.println(max); 180 | } 181 | doBeep(200); 182 | lastUpdate = millis(); 183 | while(millis() - lastUpdate < TIMEOUT){ 184 | pulse_time = pulseIn(rcIN, HIGH, 25000); 185 | if (pulse_time < min){ 186 | min = pulse_time; 187 | lastUpdate = millis(); 188 | } 189 | } 190 | if (SERIAL_DEBUG){ 191 | Serial.print("Min Set: "); 192 | Serial.println(min); 193 | } 194 | 195 | 196 | if (max - min < 20){ 197 | //Not enough different between max and min; 198 | if (SERIAL_DEBUG){Serial.print("FAIL: Points too close");} 199 | doBeep(500); 200 | delay(1000); 201 | return false; 202 | 203 | } 204 | if (SERIAL_DEBUG){Serial.print("SUCCESS:");} 205 | doBeep(50); 206 | doBeep(100); 207 | doBeep(50); 208 | doBeep(100); 209 | EEPROMWritelong(PPM_MIN_LOC, min); 210 | EEPROMWritelong(PPM_MAX_LOC, max); 211 | delay(1000); 212 | return true; 213 | 214 | } 215 | 216 | 217 | // the setup function runs once when you press reset or power the board 218 | void setup() { 219 | if (SERIAL_DEBUG){Serial.begin(9600);} 220 | pinMode(rcIN, INPUT); 221 | if (hasLED){ 222 | pinMode(redLED, OUTPUT); 223 | pinMode(greenLED, OUTPUT); 224 | digitalWrite(redLED, HIGH); 225 | digitalWrite(greenLED, HIGH); 226 | } 227 | Palatis::SoftPWM.begin(PWM_HZ); 228 | Palatis::SoftPWM.allOff(); 229 | doBeep(50); 230 | doBeep(50); 231 | delay(2000); 232 | 233 | while(pulseIn(rcIN, HIGH, 25000) == 0){ 234 | delay(3000); 235 | if (hasLED){ 236 | digitalWrite(redLED, LOW); 237 | digitalWrite(greenLED, LOW); 238 | } 239 | doBeep(50); 240 | if (hasLED){ 241 | digitalWrite(redLED, LOW); 242 | digitalWrite(greenLED, LOW); 243 | } 244 | Serial.println("No Pulse Found"); 245 | } 246 | 247 | 248 | //If the EEPROM is empty lets load some sain defaults into the system. 249 | if (EEPROM.read(PPM_NEVER_SET) == 255){ 250 | EEPROM.write(PPM_NEVER_SET, 32); 251 | EEPROMWritelong(PPM_MIN_LOC, RC_MIN_DEFAULT); 252 | EEPROMWritelong(PPM_MAX_LOC, RC_MAX_DEFAULT); 253 | } 254 | 255 | pulse_time = pulseIn(rcIN, HIGH, 25000); 256 | if (EEPROMReadlong(PPM_MIN_LOC) > 0){ 257 | rcMin = EEPROMReadlong(PPM_MIN_LOC); 258 | } 259 | if (EEPROMReadlong(PPM_MAX_LOC) > rcMin){ 260 | rcMax = EEPROMReadlong(PPM_MAX_LOC); 261 | } 262 | 263 | if (pulse_time > rcMax * 0.9){ 264 | if (hasLED){ 265 | digitalWrite(redLED, HIGH); 266 | digitalWrite(greenLED, LOW); 267 | } 268 | while (!programMinMax()){ //If min max failed... try again forever 269 | delay (500); 270 | } 271 | } 272 | applySpeed(0); 273 | rcMin = EEPROMReadlong(PPM_MIN_LOC); 274 | rcMax = EEPROMReadlong(PPM_MAX_LOC); 275 | if (hasLED){ 276 | digitalWrite(redLED, LOW); 277 | digitalWrite(greenLED, HIGH); 278 | } 279 | } 280 | 281 | 282 | // the loop function runs over and over again forever 283 | void loop() { 284 | 285 | pulse_time = pulseIn(rcIN, HIGH, 25000); 286 | if (pulse_time != lastPulse){ 287 | lastPulse = pulse_time; 288 | lastUpdate = millis(); 289 | } 290 | if (millis() - lastUpdate > TIMEOUT || pulse_time == 0){ 291 | //In the event the ESC is running for 31 days an the varible flips over. Lets not thow an error :) 292 | if (millis() < 2000 && lastUpdate > 2000 ){ 293 | lastUpdate = millis(); 294 | } 295 | if (SERIAL_DEBUG){ 296 | Serial.write(0xFE); 297 | Serial.write(0x58); 298 | Serial.println("Signal Lost."); 299 | } 300 | applySpeed(0); 301 | } 302 | else { 303 | 304 | finalSpeed = pulse_time; 305 | smoothSpeed3 = smoothSpeed2; 306 | smoothSpeed2 = smoothSpeed1; 307 | smoothSpeed1 = finalSpeed; 308 | 309 | //lets send the median 310 | if ((smoothSpeed1 <= smoothSpeed2 && smoothSpeed1 >= smoothSpeed3) || (smoothSpeed1 >= smoothSpeed2 && smoothSpeed1 <= smoothSpeed3)){ 311 | finalSpeed = smoothSpeed1; 312 | } 313 | else if ((smoothSpeed2 <= smoothSpeed1 && smoothSpeed1 >= smoothSpeed3) || (smoothSpeed1 >= smoothSpeed1 && smoothSpeed1 <= smoothSpeed3)){ 314 | finalSpeed = smoothSpeed2; 315 | } 316 | else if ((smoothSpeed3 <= smoothSpeed1 && smoothSpeed1 >= smoothSpeed2) || (smoothSpeed3 >= smoothSpeed1 && smoothSpeed1 <= smoothSpeed2)){ 317 | finalSpeed = smoothSpeed3; 318 | } 319 | 320 | finalSpeed = map(finalSpeed, rcMin, rcMax, PWM_LEVELS * -1, PWM_LEVELS); 321 | 322 | 323 | if (!waitingForDeadBand){ 324 | applySpeed(finalSpeed); 325 | } else { 326 | if (finalSpeed < DEADBAND && finalSpeed > DEADBAND * -1){ 327 | waitingForDeadBand = 0; 328 | } 329 | delay(50); 330 | doBeep(10); 331 | } 332 | } 333 | if (SERIAL_DEBUG){ 334 | delay(8); 335 | if (printUpdate > 10){ 336 | Serial.write(0xFE); 337 | Serial.write(0x58); 338 | Serial.print("Pls: "); 339 | Serial.print(pulse_time); 340 | Serial.print(" Spd: "); 341 | Serial.print(finalSpeed); 342 | printUpdate = 1; 343 | } else { 344 | delay(2); 345 | } 346 | printUpdate++; 347 | } 348 | else { 349 | delay(10); 350 | } 351 | } 352 | -------------------------------------------------------------------------------- /firmware/KingKong.hex: -------------------------------------------------------------------------------- 1 | :1000000036C05AC059C058C057C056C090C354C01B 2 | :1000100053C0ECC251C059C333C34EC04DC04CC0D5 3 | :100020004BC04AC049C00000000038003500320013 4 | :1000300000000000370034003100000000003600EE 5 | :100040003300300004040404040404040202020225 6 | :10005000020203030303030301020408102040808B 7 | :100060000102040810200102040810208E06112449 8 | :100070001FBECFE5D4E0DEBFCDBF21E0A0E9B0E0F8 9 | :1000800001C01D92AB34B207E1F710E0A0E6B0E08A 10 | :10009000EEE8F0E102C005900D92A039B107D9F762 11 | :1000A00010E0C7E3D0E003C02197FE0162D6C6335B 12 | :1000B000D107D1F7B6D3E9C7A3CFFC01538D448D47 13 | :1000C000252F30E0842F90E0821B930B541710F003 14 | :1000D000CF96089501970895FC01918D828D981710 15 | :1000E00061F0828DDF01A80FB11D5D968C91928D1C 16 | :1000F0009F5F9F73928F90E008958FEF9FEF089519 17 | :10010000FC01918D828D981731F0828DE80FF11DE1 18 | :10011000858D90E008958FEF9FEF0895FC01918DFC 19 | :10012000228D892F90E0805C9F4F821B91098F73F5 20 | :1001300099270895FC01848DDF01A80FB11DA35AF2 21 | :10014000BF4F2C91848D90E001968F739927848FF7 22 | :10015000A689B7892C93A089B1898C9180648C93EE 23 | :10016000938D848D981306C00288F389E02D8081D9 24 | :100170008F7D80830895EF92FF920F931F93CF930B 25 | :10018000DF93EC0181E0888F9B8D8C8D981305C0E7 26 | :10019000E889F989808185FD23C0F62E0B8D10E05A 27 | :1001A0000F5F1F4F0F731127E02E8C8DE8120BC0CD 28 | :1001B0000FB607FCFACFE889F989808185FFF5CF72 29 | :1001C000CE01B8DFF2CF8B8DFE01E80FF11DE35AAF 30 | :1001D000FF4FF0820B8FEA89FB898081806207C024 31 | :1001E000EE89FF896083E889F98980818064808352 32 | :1001F00081E090E0DF91CF911F910F91FF90EF9000 33 | :100200000895CF93DF93EC01888D8823C1F0EA89AC 34 | :10021000FB89808185FD05C0A889B9898C9186FDFF 35 | :100220000EC00FB607FCF5CF808185FFF2CFA889FD 36 | :10023000B9898C9185FFEDCFCE017CDFE8CFDF91CE 37 | :10024000CF91089580E990E069DF21E0892B09F4DE 38 | :1002500020E0822F089580E090E0892B19F0F2DFF2 39 | :100260008111CECE08953FB7F894809142019091CC 40 | :100270004301A0914401B091450122B708B600FEA8 41 | :1002800005C02F3F19F00196A11DB11D3FBFBA2F28 42 | :10029000A92F982F8827820F911DA11DB11DBC0188 43 | :1002A000CD0142E0660F771F881F991F4A95D1F74D 44 | :1002B00008958F929F92AF92BF92CF92DF92EF926A 45 | :1002C000FF926B017C01CFDF4B015C01C114D104B3 46 | :1002D000E104F104E9F0C7DFDC01CB0188199909D9 47 | :1002E000AA09BB09883E9340A105B10578F321E036 48 | :1002F000C21AD108E108F10888EE880E83E0981E42 49 | :10030000A11CB11CC114D104E104F10421F7DECF1A 50 | :10031000FF90EF90DF90CF90BF90AF909F908F9025 51 | :1003200008952FB7F89460913E0170913F0180913C 52 | :100330004001909141012FBF0895CF92DF92EF923B 53 | :10034000FF920F931F93CF93DF936C017A018B0180 54 | :10035000C0E0D0E0CE15DF0589F0D8016D918D01A8 55 | :10036000D601ED91FC910190F081E02DC601099537 56 | :10037000892B11F47E0102C02196ECCFC701DF91D9 57 | :10038000CF911F910F91FF90EF90DF90CF90089544 58 | :10039000089580E090E0089581382FEF920714F4DB 59 | :1003A00081E89FEF9C018038910514F02FE730E041 60 | :1003B000C9010996439708F43FC012161306D4F4F6 61 | :1003C000C901330FAA0BBB0B9C01AD012A503109A7 62 | :1003D00041095109AFE7B0E020D625E730E040E021 63 | :1003E00050E0FFD520934601109247018FE780939C 64 | :1003F000480128C021153105F9F0109246013195C8 65 | :1004000021953109C901330FAA0BBB0B9C01AD012A 66 | :100410002A50310941095109AFE7B0E0FED525E77F 67 | :1004200030E040E050E0DDD52093470110924801D4 68 | :100430008FE7809349010895109246011092470179 69 | :1004400010924801109249010895EF92FF920F9384 70 | :100450001F93CF93DF937C01C0E0D0E003EE13E065 71 | :10046000CE15DF0574F48DE590E096DFF801319745 72 | :10047000F1F783EA9FEF90DFF8013197F1F72196CA 73 | :10048000EFCF80E090E088DF64E670E080E090E00D 74 | :10049000DF91CF911F910F91FF90EF900ACF0F93B3 75 | :1004A0001F93EAE5F0E06491E6E4F0E0E491F0E027 76 | :1004B000EE0FFF1FE65CFF4F8591949108EA11E66D 77 | :1004C00020E030E0462F68D1611571058105910566 78 | :1004D00049F0DC01CB010196A11DB11DBC01CD018C 79 | :1004E0009F7003C060E070E0CB011F910F910895F1 80 | :1004F0008FB7F894E6E4F1E0108211821282138241 81 | :100500009598C098AB9A949A8FBF089551D55CC5C1 82 | :10051000CF92DF92EF92FF92CF93DF93EC016A01CB 83 | :100520007B01642FF4DF9927F7FC9A958F2D7E2DA0 84 | :100530006D2DCE010196EBDFB701992777FD9095E0 85 | :10054000892FCE010296E3DF6F2D77278827992721 86 | :10055000CE010396DF91CF91FF90EF90DF90CF9087 87 | :10056000D6CF2AC5CF92DF92EF92FF920F931F93BF 88 | :10057000CF936B017C01CB01F4DF182FC6010196EC 89 | :10058000F0DFC82FC6010296ECDF082FC6010396E4 90 | :10059000E8DF4C2F50E060E070E0762F652F542F9D 91 | :1005A0004427410F511D611D711D10E020E030E016 92 | :1005B000980111270027400F511F621F731F90E001 93 | :1005C000A0E0B0E0B82FAA27992788278A019B01CD 94 | :1005D000080F191F2A1F3B1FC901B801CF911F9196 95 | :1005E0000F91FF90EF90DF90CF9008951F920F92A0 96 | :1005F0000FB60F9211242F933F938F939F93AF9336 97 | :10060000BF9380913E0190913F01A0914001B09134 98 | :10061000410130913D0123E0230F2D3720F4019655 99 | :10062000A11DB11D05C026E8230F0296A11DB11D15 100 | :1006300020933D0180933E0190933F01A0934001A0 101 | :10064000B09341018091420190914301A0914401F6 102 | :10065000B09145010196A11DB11D80934201909377 103 | :100660004301A0934401B0934501BF91AF919F9185 104 | :100670008F913F912F910F900FBE0F901F90189563 105 | :100680001F920F920FB60F9211242F933F934F9307 106 | :100690005F936F937F938F939F93AF93BF93EF93EA 107 | :1006A000FF9380E990E046DDFF91EF91BF91AF911C 108 | :1006B0009F918F917F916F915F914F913F912F917A 109 | :1006C0000F900FBE0F901F9018951F920F920FB6AC 110 | :1006D0000F9211242F938F939F93EF93FF93E091A9 111 | :1006E000A000F091A1008081E091A600F091A70008 112 | :1006F00082FD12C090818091A9008F5F8F7320913D 113 | :10070000AA00821751F0E091A900F0E0E057FF4FF6 114 | :10071000958F8093A90001C08081FF91EF919F91F7 115 | :100720008F912F910F900FBE0F901F9018951F92D1 116 | :100730000F920FB60F9211248F939F93789480910C 117 | :100740004A0190914901891710F4959A01C0959832 118 | :1007500090914801891710F4C09A01C0C0989091F7 119 | :100760004701891710F0AB9A01C0AB9890914601F0 120 | :10077000891710F0949A01C094988F5F8E3719F002 121 | :1007800080934A0102C010924A019F918F910F906D 122 | :100790000FBE0F901F901895CF92DF92EF92FF92AD 123 | :1007A0000F931F93E82FF92F05C00150110921095C 124 | :1007B000310961F1908196239417B9F305C0015076 125 | :1007C00011092109310911F1908196239413F7CF72 126 | :1007D000C12CD12CE12CF12C0AC08FEFC81AD80AF9 127 | :1007E000E80AF80A0C151D052E053F0579F08081F1 128 | :1007F0008623841791F36C2D7D2D8E2D9F2D1F91B7 129 | :100800000F91FF90EF90DF90CF90089560E070E03F 130 | :1008100080E090E01F910F91FF90EF90DF90CF90DC 131 | :100820000895789483B7826083BF83B7816083BF64 132 | :1008300089B7816089BF1EBC8EB582608EBD8EB5C2 133 | :1008400081608EBD8FB581608FBD85B5846085BDAB 134 | :1008500085B5806485BD329A319A309A379A1AB834 135 | :10086000EAE5F0E02491E6E4F0E084918823C1F029 136 | :1008700090E0880F991FFC01E05DFF4FC591D49176 137 | :10088000FC01EA5DFF4FA591B4919FB7F894888170 138 | :10089000E22FE0958E2388838C91E823EC939FBF11 139 | :1008A00027DE8FB7F8948D9AB89AA39A8C9A8FBF47 140 | :1008B0001FBC89E08EBD8EE790E09BBD8ABD89B7E5 141 | :1008C000806189BF10924A0113DE82E390E0BDDDB2 142 | :1008D00082E390E0BADD60ED77E080E090E0E9DC73 143 | :1008E000DEDD672B682B692BB9F468EB7BE080E0D9 144 | :1008F00090E0DFDC82E390E0A8DD4EE050E06DE7C1 145 | :1009000070E080E990E019DD42E050E06CE870E0D2 146 | :1009100080E990E012DDE4CF88E290E022DE8F3FB4 147 | :1009200091F460E288E290E0F2DD4DEB51E060E0AE 148 | :1009300070E080E390E0ECDD40E253E060E070E0E6 149 | :1009400080E290E0E5DDABDD6B017C016093390175 150 | :1009500070933A0180933B0190933C0160E370E017 151 | :1009600080E090E0FFDD161617061806190624F43D 152 | :10097000709362006093610060E270E080E090E05C 153 | :10098000F1DD20916100309162004901330FAA0826 154 | :10099000BB0886169706A806B90624F4709364006F 155 | :1009A00060936300C701B601ECD16B017C018091BB 156 | :1009B000630090916400BC01990F880B990BE1D101 157 | :1009C00026E636E646E65FE31BD29B01AC01C70193 158 | :1009D000B60112D218160CF0BAC084E690E035DDEC 159 | :1009E00084E690E032DD84E690E02FDD9ADC6093CF 160 | :1009F0003501709336018093370190933801C12CF3 161 | :100A0000D12C76018EDC8090350190903601A0903B 162 | :100A10003701B0903801DC01CB0188199909AA0986 163 | :100A2000BB09803D9740A105B105E0F438DD4B01DD 164 | :100A30005C016093390170933A0180933B0190937C 165 | :100A40003C01C616D706E806F906E4F66ADC6093B0 166 | :100A50003501709336018093370190933801750109 167 | :100A60006401D0CF88EC90E0F0DC5BDC6093350172 168 | :100A700070933601809337019093380180E1882E7E 169 | :100A800087E2982EA12CB12C4CDC4090350150907F 170 | :100A900036016090370170903801DC01CB01841978 171 | :100AA0009509A609B709803D9740A105B105E0F475 172 | :100AB000F6DC2B013C016093390170933A0180937D 173 | :100AC0003B0190933C01681579058A059B05E4F686 174 | :100AD00028DC609335017093360180933701909341 175 | :100AE000380153014201D0CFD701C60188199909B5 176 | :100AF000AA09BB094497A105B10574F484EF91E0FC 177 | :100B0000A4DC68EE73E080E090E0D3DB64EF71E09A 178 | :100B100080E090E0CEDB61CF82E390E096DC84E67B 179 | :100B200090E093DC82E390E090DC84E690E08DDC62 180 | :100B3000B501A40180E390E0EBDCB701A60180E2FF 181 | :100B400090E0E6DC68EE73E080E090E0B2DB80E00D 182 | :100B500090E022DC60E370E080E090E003DD7093E1 183 | :100B600062006093610060E270E080E090E0FADC97 184 | :100B7000709364006093630092DC6B017C0160936E 185 | :100B8000390170933A0180933B0190933C0180912D 186 | :100B9000650090916600092E000CAA0BBB0BC816CD 187 | :100BA000D906EA06FB0669F0D0926600C09265009D 188 | :100BB000B8DB6093350170933601809337019093D1 189 | :100BC0003801AFDB8090350190903601A09037015D 190 | :100BD000B0903801DC01CB0188199909AA09BB0939 191 | :100BE000813D9740A105B10508F079C0C114D10439 192 | :100BF000E104F10409F473C09601D0923401C0926B 193 | :100C000033014091310150913201509330014093B2 194 | :100C10002F0180912D0190912E01909332018093AC 195 | :100C20003101D0922E01C0922D018C159D050CF43E 196 | :100C300070C0241735073CF42817390724F4909323 197 | :100C4000340180933301C0906100D09062000D2C7C 198 | :100C5000000CEE08FF082091330130913401C901E6 199 | :100C6000330FAA0BBB0B9C01AD012C193D094E099A 200 | :100C70005F09AEEFB0E0D1D1209163003091640004 201 | :100C80008901330F220B330BA90198012C193D095F 202 | :100C90004E095F09A6D1DA01C9018F579109A1094F 203 | :100CA000B1099093340180933301209160002111A8 204 | :100CB00002C072DB0DC00996439710F410926000D9 205 | :100CC00062E370E080E090E0F4DA8AE090E0BDDB7F 206 | :100CD0006AE070E080E090E0ECDABDDA4DCF21DB35 207 | :100CE000603D77408105910538F481ED881687E0F5 208 | :100CF0009806A104B1041CF480E090E0DACF11DB87 209 | :100D000060933501709336018093370190933801D9 210 | :100D1000F3CF4C155D050CF096CF91CFE0E9F0E0F4 211 | :100D20001382128288EE93E0A0E0B0E08483958382 212 | :100D3000A683B7838FE690E09183808380E490E080 213 | :100D40009587848729E230E0378726872BE230E0D9 214 | :100D5000318B208B2AE230E0338B228B958B848B76 215 | :100D60008CE290E0978B868B118E128E138E148EF0 216 | :100D70000895EE0FFF1F0590F491E02D0994E8947B 217 | :100D800009C097FB3EF490958095709561957F4FD3 218 | :100D90008F4F9F4F9923A9F0F92F96E9BB27939581 219 | :100DA000F695879577956795B795F111F8CFFAF491 220 | :100DB000BB0F11F460FF1BC06F5F7F4F8F4F9F4FC2 221 | :100DC00016C0882311F096E911C0772321F09EE820 222 | :100DD000872F762F05C0662371F096E8862F70E086 223 | :100DE00060E02AF09A95660F771F881FDAF7880F60 224 | :100DF0009695879597F9089566D008F48FEF089532 225 | :100E00000BD09CC08DD028F092D018F0952309F01B 226 | :100E10007EC083C01124C6C0A2D0A0F3959FD1F399 227 | :100E2000950F50E0551F629FF001729FBB27F00D98 228 | :100E3000B11D639FAA27F00DB11DAA1F649F6627ED 229 | :100E4000B00DA11D661F829F2227B00DA11D621F3C 230 | :100E5000739FB00DA11D621F839FA00D611D221FF6 231 | :100E6000749F3327A00D611D231F849F600D211DDA 232 | :100E7000822F762F6A2F11249F5750408AF0E1F07D 233 | :100E800088234AF0EE0FFF1FBB1F661F771F881FC6 234 | :100E900091505040A9F79E3F510570F038C082C074 235 | :100EA0005F3FECF3983EDCF3869577956795B795B1 236 | :100EB000F795E7959F5FC1F7FE2B880F911D9695DB 237 | :100EC000879597F90895990F0008550FAA0BE0E848 238 | :100ED000FEEF16161706E807F907C0F012161306FC 239 | :100EE000E407F50798F0621B730B840B950B39F43C 240 | :100EF0000A2661F0232B242B252B21F408950A26A2 241 | :100F000009F4A140A6958FEF811D811D089597F9E1 242 | :100F10009F6780E870E060E008959FEF80EC08959F 243 | :100F200000240A94161617061806090608950024C8 244 | :100F30000A9412161306140605060895092E039442 245 | :100F4000000C11F4882352F0BB0F40F4BF2B11F4B6 246 | :100F500060FF04C06F5F7F4F8F4F9F4F089557FD15 247 | :100F60009058440F551F59F05F3F71F04795880F17 248 | :100F700097FB991F61F09F3F79F0879508951216AE 249 | :100F800013061406551FF2CF4695F1DF08C016165A 250 | :100F900017061806991FF1CF86957105610508940B 251 | :100FA0000895E894BB2766277727CB0197F9089522 252 | :100FB00081E090E0F89469C0E199FECF9FBB8EBBC1 253 | :100FC000E09A99278DB30895262FE199FECF9FBB14 254 | :100FD0008EBB2DBB0FB6F894E29AE19A0FBE019634 255 | :100FE0000895052E97FB16F400940FD057FD05D0F9 256 | :100FF0001ED007FC02D046F408C0509540953095AD 257 | :1010000021953F4F4F4F5F4F089590958095709574 258 | :1010100061957F4F8F4F9F4F08952BD0A59F900DC7 259 | :10102000B49F900DA49F800D911D11240895A1E2FD 260 | :101030001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F52 261 | :10104000FF1FA217B307E407F50720F0A21BB30B9D 262 | :10105000E40BF50B661F771F881F991F1A9469F719 263 | :1010600060957095809590959B01AC01BD01CF0175 264 | :101070000895A29FB001B39FC001A39F01D0B29F6A 265 | :0E108000700D811D1124911D0895F894FFCF6D 266 | :10108E0001BD01200364000100000000000000BB50 267 | :10109E00009D015D0001018E006C0080004E6F20EE 268 | :1010AE0050756C736520466F756E64000D0A0000F6 269 | :00000001FF 270 | -------------------------------------------------------------------------------- /firmware/SKGeneric.hex: -------------------------------------------------------------------------------- 1 | :1000000036C05AC059C058C057C056C090C354C01B 2 | :1000100053C0ECC251C059C333C34EC04DC04CC0D5 3 | :100020004BC04AC049C00000000038003500320013 4 | :1000300000000000370034003100000000003600EE 5 | :100040003300300004040404040404040202020225 6 | :10005000020203030303030301020408102040808B 7 | :100060000102040810200102040810208E06112449 8 | :100070001FBECFE5D4E0DEBFCDBF21E0A0E9B0E0F8 9 | :1000800001C01D92AB34B207E1F710E0A0E6B0E08A 10 | :10009000EEE8F0E102C005900D92A039B107D9F762 11 | :1000A00010E0C7E3D0E003C02197FE0162D6C6335B 12 | :1000B000D107D1F7B6D3E9C7A3CFFC01538D448D47 13 | :1000C000252F30E0842F90E0821B930B541710F003 14 | :1000D000CF96089501970895FC01918D828D981710 15 | :1000E00061F0828DDF01A80FB11D5D968C91928D1C 16 | :1000F0009F5F9F73928F90E008958FEF9FEF089519 17 | :10010000FC01918D828D981731F0828DE80FF11DE1 18 | :10011000858D90E008958FEF9FEF0895FC01918DFC 19 | :10012000228D892F90E0805C9F4F821B91098F73F5 20 | :1001300099270895FC01848DDF01A80FB11DA35AF2 21 | :10014000BF4F2C91848D90E001968F739927848FF7 22 | :10015000A689B7892C93A089B1898C9180648C93EE 23 | :10016000938D848D981306C00288F389E02D8081D9 24 | :100170008F7D80830895EF92FF920F931F93CF930B 25 | :10018000DF93EC0181E0888F9B8D8C8D981305C0E7 26 | :10019000E889F989808185FD23C0F62E0B8D10E05A 27 | :1001A0000F5F1F4F0F731127E02E8C8DE8120BC0CD 28 | :1001B0000FB607FCFACFE889F989808185FFF5CF72 29 | :1001C000CE01B8DFF2CF8B8DFE01E80FF11DE35AAF 30 | :1001D000FF4FF0820B8FEA89FB898081806207C024 31 | :1001E000EE89FF896083E889F98980818064808352 32 | :1001F00081E090E0DF91CF911F910F91FF90EF9000 33 | :100200000895CF93DF93EC01888D8823C1F0EA89AC 34 | :10021000FB89808185FD05C0A889B9898C9186FDFF 35 | :100220000EC00FB607FCF5CF808185FFF2CFA889FD 36 | :10023000B9898C9185FFEDCFCE017CDFE8CFDF91CE 37 | :10024000CF91089580E990E069DF21E0892B09F4DE 38 | :1002500020E0822F089580E090E0892B19F0F2DFF2 39 | :100260008111CECE08953FB7F894809142019091CC 40 | :100270004301A0914401B091450122B708B600FEA8 41 | :1002800005C02F3F19F00196A11DB11D3FBFBA2F28 42 | :10029000A92F982F8827820F911DA11DB11DBC0188 43 | :1002A000CD0142E0660F771F881F991F4A95D1F74D 44 | :1002B00008958F929F92AF92BF92CF92DF92EF926A 45 | :1002C000FF926B017C01CFDF4B015C01C114D104B3 46 | :1002D000E104F104E9F0C7DFDC01CB0188199909D9 47 | :1002E000AA09BB09883E9340A105B10578F321E036 48 | :1002F000C21AD108E108F10888EE880E83E0981E42 49 | :10030000A11CB11CC114D104E104F10421F7DECF1A 50 | :10031000FF90EF90DF90CF90BF90AF909F908F9025 51 | :1003200008952FB7F89460913E0170913F0180913C 52 | :100330004001909141012FBF0895CF92DF92EF923B 53 | :10034000FF920F931F93CF93DF936C017A018B0180 54 | :10035000C0E0D0E0CE15DF0589F0D8016D918D01A8 55 | :10036000D601ED91FC910190F081E02DC601099537 56 | :10037000892B11F47E0102C02196ECCFC701DF91D9 57 | :10038000CF911F910F91FF90EF90DF90CF90089544 58 | :10039000089580E090E0089581382FEF920714F4DB 59 | :1003A00081E89FEF9C018038910514F02FE730E041 60 | :1003B000C9010996439708F43FC012161306D4F4F6 61 | :1003C000C901330FAA0BBB0B9C01AD012A503109A7 62 | :1003D00041095109AFE7B0E020D625E730E040E021 63 | :1003E00050E0FFD520934601109247018FE780939C 64 | :1003F000480128C021153105F9F0109246013195C8 65 | :1004000021953109C901330FAA0BBB0B9C01AD012A 66 | :100410002A50310941095109AFE7B0E0FED525E77F 67 | :1004200030E040E050E0DDD52093470110924801D4 68 | :100430008FE7809349010895109246011092470179 69 | :1004400010924801109249010895EF92FF920F9384 70 | :100450001F93CF93DF937C01C0E0D0E003EE13E065 71 | :10046000CE15DF0574F48DE590E096DFF801319745 72 | :10047000F1F783EA9FEF90DFF8013197F1F72196CA 73 | :10048000EFCF80E090E088DF64E670E080E090E00D 74 | :10049000DF91CF911F910F91FF90EF900ACF0F93B3 75 | :1004A0001F93EAE5F0E06491E6E4F0E0E491F0E027 76 | :1004B000EE0FFF1FE65CFF4F8591949108EA11E66D 77 | :1004C00020E030E0462F68D1611571058105910566 78 | :1004D00049F0DC01CB010196A11DB11DBC01CD018C 79 | :1004E0009F7003C060E070E0CB011F910F910895F1 80 | :1004F0008FB7F894E6E4F1E0108211821282138241 81 | :100500009598C098AB9A949A8FBF089551D55CC5C1 82 | :10051000CF92DF92EF92FF92CF93DF93EC016A01CB 83 | :100520007B01642FF4DF9927F7FC9A958F2D7E2DA0 84 | :100530006D2DCE010196EBDFB701992777FD9095E0 85 | :10054000892FCE010296E3DF6F2D77278827992721 86 | :10055000CE010396DF91CF91FF90EF90DF90CF9087 87 | :10056000D6CF2AC5CF92DF92EF92FF920F931F93BF 88 | :10057000CF936B017C01CB01F4DF182FC6010196EC 89 | :10058000F0DFC82FC6010296ECDF082FC6010396E4 90 | :10059000E8DF4C2F50E060E070E0762F652F542F9D 91 | :1005A0004427410F511D611D711D10E020E030E016 92 | :1005B000980111270027400F511F621F731F90E001 93 | :1005C000A0E0B0E0B82FAA27992788278A019B01CD 94 | :1005D000080F191F2A1F3B1FC901B801CF911F9196 95 | :1005E0000F91FF90EF90DF90CF9008951F920F92A0 96 | :1005F0000FB60F9211242F933F938F939F93AF9336 97 | :10060000BF9380913E0190913F01A0914001B09134 98 | :10061000410130913D0123E0230F2D3720F4019655 99 | :10062000A11DB11D05C026E8230F0296A11DB11D15 100 | :1006300020933D0180933E0190933F01A0934001A0 101 | :10064000B09341018091420190914301A0914401F6 102 | :10065000B09145010196A11DB11D80934201909377 103 | :100660004301A0934401B0934501BF91AF919F9185 104 | :100670008F913F912F910F900FBE0F901F90189563 105 | :100680001F920F920FB60F9211242F933F934F9307 106 | :100690005F936F937F938F939F93AF93BF93EF93EA 107 | :1006A000FF9380E990E046DDFF91EF91BF91AF911C 108 | :1006B0009F918F917F916F915F914F913F912F917A 109 | :1006C0000F900FBE0F901F9018951F920F920FB6AC 110 | :1006D0000F9211242F938F939F93EF93FF93E091A9 111 | :1006E000A000F091A1008081E091A600F091A70008 112 | :1006F00082FD12C090818091A9008F5F8F7320913D 113 | :10070000AA00821751F0E091A900F0E0E057FF4FF6 114 | :10071000958F8093A90001C08081FF91EF919F91F7 115 | :100720008F912F910F900FBE0F901F9018951F92D1 116 | :100730000F920FB60F9211248F939F93789480910C 117 | :100740004A0190914901891710F4959A01C0959832 118 | :1007500090914801891710F4C09A01C0C0989091F7 119 | :100760004701891710F0AB9A01C0AB9890914601F0 120 | :10077000891710F0949A01C094988F5F8E3719F002 121 | :1007800080934A0102C010924A019F918F910F906D 122 | :100790000FBE0F901F901895CF92DF92EF92FF92AD 123 | :1007A0000F931F93E82FF92F05C00150110921095C 124 | :1007B000310961F1908196239417B9F305C0015076 125 | :1007C00011092109310911F1908196239413F7CF72 126 | :1007D000C12CD12CE12CF12C0AC08FEFC81AD80AF9 127 | :1007E000E80AF80A0C151D052E053F0579F08081F1 128 | :1007F0008623841791F36C2D7D2D8E2D9F2D1F91B7 129 | :100800000F91FF90EF90DF90CF90089560E070E03F 130 | :1008100080E090E01F910F91FF90EF90DF90CF90DC 131 | :100820000895789483B7826083BF83B7816083BF64 132 | :1008300089B7816089BF1EBC8EB582608EBD8EB5C2 133 | :1008400081608EBD8FB581608FBD85B5846085BDAB 134 | :1008500085B5806485BD329A319A309A379A1AB834 135 | :10086000EAE5F0E02491E6E4F0E084918823C1F029 136 | :1008700090E0880F991FFC01E05DFF4FC591D49176 137 | :10088000FC01EA5DFF4FA591B4919FB7F894888170 138 | :10089000E22FE0958E2388838C91E823EC939FBF11 139 | :1008A00027DE8FB7F8948D9AB89AA39A8C9A8FBF47 140 | :1008B0001FBC89E08EBD8EE790E09BBD8ABD89B7E5 141 | :1008C000806189BF10924A0113DE82E390E0BDDDB2 142 | :1008D00082E390E0BADD60ED77E080E090E0E9DC73 143 | :1008E000DEDD672B682B692BB9F468EB7BE080E0D9 144 | :1008F00090E0DFDC82E390E0A8DD4EE050E06DE7C1 145 | :1009000070E080E990E019DD42E050E06CE870E0D2 146 | :1009100080E990E012DDE4CF88E290E022DE8F3FB4 147 | :1009200091F460E288E290E0F2DD4DEB51E060E0AE 148 | :1009300070E080E390E0ECDD40E253E060E070E0E6 149 | :1009400080E290E0E5DDABDD6B017C016093390175 150 | :1009500070933A0180933B0190933C0160E370E017 151 | :1009600080E090E0FFDD161617061806190624F43D 152 | :10097000709362006093610060E270E080E090E05C 153 | :10098000F1DD20916100309162004901330FAA0826 154 | :10099000BB0886169706A806B90624F4709364006F 155 | :1009A00060936300C701B601ECD16B017C018091BB 156 | :1009B000630090916400BC01990F880B990BE1D101 157 | :1009C00026E636E646E65FE31BD29B01AC01C70193 158 | :1009D000B60112D218160CF0BAC084E690E035DDEC 159 | :1009E00084E690E032DD84E690E02FDD9ADC6093CF 160 | :1009F0003501709336018093370190933801C12CF3 161 | :100A0000D12C76018EDC8090350190903601A0903B 162 | :100A10003701B0903801DC01CB0188199909AA0986 163 | :100A2000BB09803D9740A105B105E0F438DD4B01DD 164 | :100A30005C016093390170933A0180933B0190937C 165 | :100A40003C01C616D706E806F906E4F66ADC6093B0 166 | :100A50003501709336018093370190933801750109 167 | :100A60006401D0CF88EC90E0F0DC5BDC6093350172 168 | :100A700070933601809337019093380180E1882E7E 169 | :100A800087E2982EA12CB12C4CDC4090350150907F 170 | :100A900036016090370170903801DC01CB01841978 171 | :100AA0009509A609B709803D9740A105B105E0F475 172 | :100AB000F6DC2B013C016093390170933A0180937D 173 | :100AC0003B0190933C01681579058A059B05E4F686 174 | :100AD00028DC609335017093360180933701909341 175 | :100AE000380153014201D0CFD701C60188199909B5 176 | :100AF000AA09BB094497A105B10574F484EF91E0FC 177 | :100B0000A4DC68EE73E080E090E0D3DB64EF71E09A 178 | :100B100080E090E0CEDB61CF82E390E096DC84E67B 179 | :100B200090E093DC82E390E090DC84E690E08DDC62 180 | :100B3000B501A40180E390E0EBDCB701A60180E2FF 181 | :100B400090E0E6DC68EE73E080E090E0B2DB80E00D 182 | :100B500090E022DC60E370E080E090E003DD7093E1 183 | :100B600062006093610060E270E080E090E0FADC97 184 | :100B7000709364006093630092DC6B017C0160936E 185 | :100B8000390170933A0180933B0190933C0180912D 186 | :100B9000650090916600092E000CAA0BBB0BC816CD 187 | :100BA000D906EA06FB0669F0D0926600C09265009D 188 | :100BB000B8DB6093350170933601809337019093D1 189 | :100BC0003801AFDB8090350190903601A09037015D 190 | :100BD000B0903801DC01CB0188199909AA09BB0939 191 | :100BE000813D9740A105B10508F079C0C114D10439 192 | :100BF000E104F10409F473C09601D0923401C0926B 193 | :100C000033014091310150913201509330014093B2 194 | :100C10002F0180912D0190912E01909332018093AC 195 | :100C20003101D0922E01C0922D018C159D050CF43E 196 | :100C300070C0241735073CF42817390724F4909323 197 | :100C4000340180933301C0906100D09062000D2C7C 198 | :100C5000000CEE08FF082091330130913401C901E6 199 | :100C6000330FAA0BBB0B9C01AD012C193D094E099A 200 | :100C70005F09AEEFB0E0D1D1209163003091640004 201 | :100C80008901330F220B330BA90198012C193D095F 202 | :100C90004E095F09A6D1DA01C9018F579109A1094F 203 | :100CA000B1099093340180933301209160002111A8 204 | :100CB00002C072DB0DC00996439710F410926000D9 205 | :100CC00062E370E080E090E0F4DA8AE090E0BDDB7F 206 | :100CD0006AE070E080E090E0ECDABDDA4DCF21DB35 207 | :100CE000603D77408105910538F481ED881687E0F5 208 | :100CF0009806A104B1041CF480E090E0DACF11DB87 209 | :100D000060933501709336018093370190933801D9 210 | :100D1000F3CF4C155D050CF096CF91CFE0E9F0E0F4 211 | :100D20001382128288EE93E0A0E0B0E08483958382 212 | :100D3000A683B7838FE690E09183808380E490E080 213 | :100D40009587848729E230E0378726872BE230E0D9 214 | :100D5000318B208B2AE230E0338B228B958B848B76 215 | :100D60008CE290E0978B868B118E128E138E148EF0 216 | :100D70000895EE0FFF1F0590F491E02D0994E8947B 217 | :100D800009C097FB3EF490958095709561957F4FD3 218 | :100D90008F4F9F4F9923A9F0F92F96E9BB27939581 219 | :100DA000F695879577956795B795F111F8CFFAF491 220 | :100DB000BB0F11F460FF1BC06F5F7F4F8F4F9F4FC2 221 | :100DC00016C0882311F096E911C0772321F09EE820 222 | :100DD000872F762F05C0662371F096E8862F70E086 223 | :100DE00060E02AF09A95660F771F881FDAF7880F60 224 | :100DF0009695879597F9089566D008F48FEF089532 225 | :100E00000BD09CC08DD028F092D018F0952309F01B 226 | :100E10007EC083C01124C6C0A2D0A0F3959FD1F399 227 | :100E2000950F50E0551F629FF001729FBB27F00D98 228 | :100E3000B11D639FAA27F00DB11DAA1F649F6627ED 229 | :100E4000B00DA11D661F829F2227B00DA11D621F3C 230 | :100E5000739FB00DA11D621F839FA00D611D221FF6 231 | :100E6000749F3327A00D611D231F849F600D211DDA 232 | :100E7000822F762F6A2F11249F5750408AF0E1F07D 233 | :100E800088234AF0EE0FFF1FBB1F661F771F881FC6 234 | :100E900091505040A9F79E3F510570F038C082C074 235 | :100EA0005F3FECF3983EDCF3869577956795B795B1 236 | :100EB000F795E7959F5FC1F7FE2B880F911D9695DB 237 | :100EC000879597F90895990F0008550FAA0BE0E848 238 | :100ED000FEEF16161706E807F907C0F012161306FC 239 | :100EE000E407F50798F0621B730B840B950B39F43C 240 | :100EF0000A2661F0232B242B252B21F408950A26A2 241 | :100F000009F4A140A6958FEF811D811D089597F9E1 242 | :100F10009F6780E870E060E008959FEF80EC08959F 243 | :100F200000240A94161617061806090608950024C8 244 | :100F30000A9412161306140605060895092E039442 245 | :100F4000000C11F4882352F0BB0F40F4BF2B11F4B6 246 | :100F500060FF04C06F5F7F4F8F4F9F4F089557FD15 247 | :100F60009058440F551F59F05F3F71F04795880F17 248 | :100F700097FB991F61F09F3F79F0879508951216AE 249 | :100F800013061406551FF2CF4695F1DF08C016165A 250 | :100F900017061806991FF1CF86957105610508940B 251 | :100FA0000895E894BB2766277727CB0197F9089522 252 | :100FB00081E090E0F89469C0E199FECF9FBB8EBBC1 253 | :100FC000E09A99278DB30895262FE199FECF9FBB14 254 | :100FD0008EBB2DBB0FB6F894E29AE19A0FBE019634 255 | :100FE0000895052E97FB16F400940FD057FD05D0F9 256 | :100FF0001ED007FC02D046F408C0509540953095AD 257 | :1010000021953F4F4F4F5F4F089590958095709574 258 | :1010100061957F4F8F4F9F4F08952BD0A59F900DC7 259 | :10102000B49F900DA49F800D911D11240895A1E2FD 260 | :101030001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F52 261 | :10104000FF1FA217B307E407F50720F0A21BB30B9D 262 | :10105000E40BF50B661F771F881F991F1A9469F719 263 | :1010600060957095809590959B01AC01BD01CF0175 264 | :101070000895A29FB001B39FC001A39F01D0B29F6A 265 | :0E108000700D811D1124911D0895F894FFCF6D 266 | :10108E0001BD01200364000100000000000000BB50 267 | :10109E00009D015D0001018E006C0080004E6F20EE 268 | :1010AE0050756C736520466F756E64000D0A0000F6 269 | :00000001FF 270 | -------------------------------------------------------------------------------- /firmware/Afro.hex: -------------------------------------------------------------------------------- 1 | :1000000040C064C063C062C061C060C010C45EC054 2 | :100010005DC06CC35BC0D9C3B3C358C057C056C022 3 | :1000200055C054C053C000000000370034003100F8 4 | :100030000000000038003500320000000000000021 5 | :1000400000000003040600000000000000000000A3 6 | :1000500000003600330030000404040404040404E7 7 | :100060000202020202020303030303030102040863 8 | :100070001020408001020408102001020408102012 9 | :10008000130711241FBECFE5D4E0DEBFCDBF10E0C3 10 | :10009000A0E6B0E0E8E9F1E102C005900D92AC38CD 11 | :1000A000B107D9F721E0ACE8B0E001C01D92A5345A 12 | :1000B000B207E1F710E0C1E4D0E003C02197FE01F0 13 | :1000C00046D7C034D107D1F72CD464C899CF8FB7A5 14 | :1000D000F894E0E4F1E01082118212821382939886 15 | :1000E0009598C19A929A8FBF0895FC01538D448DC3 16 | :1000F000252F30E0842F90E0821B930B541710F0D3 17 | :10010000CF96089501970895FC01918D828D9817DF 18 | :1001100061F0828DDF01A80FB11D5D968C91928DEB 19 | :100120009F5F9F73928F90E008958FEF9FEF0895E8 20 | :10013000FC01918D828D981731F0828DE80FF11DB1 21 | :10014000858D90E008958FEF9FEF0895FC01918DCC 22 | :10015000228D892F90E0805C9F4F821B91098F73C5 23 | :1001600099270895FC01848DDF01A80FB11DA35AC2 24 | :10017000BF4F2C91848D90E001968F739927848FC7 25 | :10018000A689B7892C93A089B1898C9182748C93AC 26 | :10019000938D848D981306C00288F389E02D8081A9 27 | :1001A0008F7D80830895EF92FF920F931F93CF93DB 28 | :1001B000DF93EC0181E0888F9B8D8C8D981305C0B7 29 | :1001C000E889F989808185FD25C0F62E0B8D10E028 30 | :1001D0000F5F1F4F0F731127E02E8C8DE8120BC09D 31 | :1001E0000FB607FCFACFE889F989808185FFF5CF42 32 | :1001F000CE01B8DFF2CF8B8DFE01E80FF11DE35A7F 33 | :10020000FF4FF0829FB7F8940B8FEA89FB898081BA 34 | :10021000806209C09FB7F894EE89FF896083E889FE 35 | :10022000F9898081827480839FBF81E090E0DF91B3 36 | :10023000CF911F910F91FF90EF900895CF93DF938F 37 | :10024000EC01888D8823C1F0EA89FB89808185FDD6 38 | :1002500005C0A889B9898C9186FD0EC00FB607FC30 39 | :10026000F5CF808185FFF2CFA889B9898C9185FF70 40 | :10027000EDCFCE0177DFE8CFDF91CF9108958CE805 41 | :1002800090E064DF21E0892B09F420E0822F0895BB 42 | :1002900080E090E0892B19F0F2DF8111B1CE089552 43 | :1002A00090E0FC01E65CFF4F3491FC01E459FF4F04 44 | :1002B0002491FC01E85AFF4FE491EE2331F13323FE 45 | :1002C00081F0343039F0363049F0333051F48FB5A5 46 | :1002D0008F7702C08FB58F7D8FBD03C085B58F7DB1 47 | :1002E00085BDF0E0EE0FFF1FE05DFF4FA591B491DB 48 | :1002F0009FB7F894611105C08C91E22FE095E82337 49 | :1003000002C0EC91E22BEC939FBF0895CF93DF9353 50 | :1003100090E0FC01E459FF4F2491FC01E85AFF4FA3 51 | :100320008491882361F190E0880F991FFC01EA5DB8 52 | :10033000FF4FC591D491FC01E05DFF4FA591B491B1 53 | :10034000611109C09FB7F894888120958223888322 54 | :10035000EC912E230BC0623061F49FB7F894888132 55 | :10036000322F309583238883EC912E2B2C939FBFC3 56 | :1003700006C08FB7F894E8812E2B28838FBFDF91BA 57 | :10038000CF9108953FB7F89480913C0190913D0141 58 | :10039000A0913E01B0913F0122B708B600FE05C012 59 | :1003A0002F3F19F00196A11DB11D3FBFBA2FA92FF4 60 | :1003B000982F8827820F911DA11DB11DBC01CD0171 61 | :1003C00042E0660F771F881F991F4A95D1F708955D 62 | :1003D0008F929F92AF92BF92CF92DF92EF92FF9255 63 | :1003E0006B017C01CFDF4B015C01C114D104E1043E 64 | :1003F000F104E9F0C7DFDC01CB0188199909AA09EA 65 | :10040000BB09883E9340A105B10578F321E0C21AEB 66 | :10041000D108E108F10888EE880E83E0981EA11C3F 67 | :10042000B11CC114D104E104F10421F7DECFFF9027 68 | :10043000EF90DF90CF90BF90AF909F908F900895F6 69 | :100440002FB7F894609138017091390180913A0189 70 | :1004500090913B012FBF0895CF92DF92EF92FF92D0 71 | :100460000F931F93CF93DF936C017A018B01C0E050 72 | :10047000D0E0CE15DF0581F0D8016D918D01D60158 73 | :10048000ED91FC910190F081E02DC6010995892B39 74 | :1004900011F02196EECF7E01C701DF91CF911F9120 75 | :1004A0000F91FF90EF90DF90CF900895089580E036 76 | :1004B00090E0089581382FEF920714F481E89FEFC0 77 | :1004C0009C018038910514F02FE730E0C9010996AE 78 | :1004D000439708F43FC012161306D4F4C901330F32 79 | :1004E000AA0BBB0B9C01AD012A50310941095109EE 80 | :1004F000AFE7B0E0F4D425E730E040E050E0D3D4FB 81 | :1005000020934001109241018FE78093420128C05F 82 | :1005100021153105F9F010924001319521953109ED 83 | :10052000C901330FAA0BBB0B9C01AD012A50310945 84 | :1005300041095109AFE7B0E0D2D425E730E040E00F 85 | :1005400050E0B1D420934101109242018FE7809393 86 | :10055000430108951092400110924101109242010E 87 | :10056000109243010895EF92FF920F931F93CF9340 88 | :10057000DF937C01C0E0D0E003EE13E0CE15DF0591 89 | :1005800074F48DE590E096DFC8010197F1F783EAF6 90 | :100590009FEF90DFC8010197F1F72196EFCF80E040 91 | :1005A00090E088DF64E670E080E090E0DF91CF913A 92 | :1005B0001F910F91FF90EF900BCF0F931F93E4E7E4 93 | :1005C000F0E06491E0E6F0E0E491F0E0EE0FFF1F70 94 | :1005D000E25BFF4F8591949108EA11E620E030E05C 95 | :1005E000462F5AD1611571058105910549F0DC014D 96 | :1005F000CB010196A11DB11DBC01CD019F7003C0AF 97 | :1006000060E070E0CB011F910F910895BFD53EC40B 98 | :10061000CF92DF92EF92FF92CF93DF93EC016A01CA 99 | :100620007B01642FF4DF9927F7FC9A958F2D7E2D9F 100 | :100630006D2DCE010196EBDFB701992777FD9095DF 101 | :10064000892FCE010296E3DF6F2D77278827992720 102 | :10065000CE010396DF91CF91FF90EF90DF90CF9086 103 | :10066000D6CF0CC4CF92DF92EF92FF920F931F93DD 104 | :10067000CF936B017C01CB01F4DFC82FC60101963B 105 | :10068000F0DF182FC6010296ECDF082FC601039693 106 | :10069000E8DF412F50E060E070E0762F652F542FA7 107 | :1006A00044274C0F511D611D711D10E020E030E00A 108 | :1006B000980111270027400F511F621F731F90E000 109 | :1006C000A0E0B0E0B82FAA27992788278A019B01CC 110 | :1006D000080F191F2A1F3B1FC901B801CF911F9195 111 | :1006E0000F91FF90EF90DF90CF9008951F920F929F 112 | :1006F0000FB60F9211242F933F938F939F93AF9335 113 | :10070000BF938091380190913901A0913A01B09145 114 | :100710003B013091370123E0230F2D3720F4019660 115 | :10072000A11DB11D05C026E8230F0296A11DB11D14 116 | :10073000209337018093380190933901A0933A01B7 117 | :10074000B0933B0180913C0190913D01A0913E010D 118 | :10075000B0913F010196A11DB11D80933C01909382 119 | :100760003D01A0933E01B0933F01BF91AF919F9196 120 | :100770008F913F912F910F900FBE0F901F90189562 121 | :100780001F920F920FB60F9211242F933F934F9306 122 | :100790005F936F937F938F939F93AF93BF93EF93E9 123 | :1007A000FF938CE890E0DEDCFF91EF91BF91AF9179 124 | :1007B0009F918F917F916F915F914F913F912F9179 125 | :1007C0000F900FBE0F901F9018951F920F920FB6AB 126 | :1007D0000F9211242F938F939F93EF93FF93E091A8 127 | :1007E0009C00F0919D008081E091A200F091A30017 128 | :1007F00082FD12C090818091A5008F5F8F73209140 129 | :10080000A600821751F0E091A500F0E0E457FF4FF9 130 | :10081000958F8093A50001C08081FF91EF919F91FA 131 | :100820008F912F910F900FBE0F901F9018951F92D0 132 | :100830000F920FB60F9211248F939F93789480910B 133 | :10084000440190914301891710F4939A01C0939841 134 | :1008500090914201891710F4959A01C09598909152 135 | :100860004101891710F0C19A01C0C19890914001CF 136 | :10087000891710F0929A01C092988F5F8E3719F005 137 | :100880008093440102C0109244019F918F910F9078 138 | :100890000FBE0F901F901895CF92DF92EF92FF92AC 139 | :1008A0000F931F93E82FF92F05C00150110921095B 140 | :1008B000310961F1908196239417B9F305C0015075 141 | :1008C00011092109310911F1908196239413F7CF71 142 | :1008D000C12CD12CE12CF12C0AC08FEFC81AD80AF8 143 | :1008E000E80AF80A0C151D052E053F0579F08081F0 144 | :1008F0008623841791F36C2D7D2D8E2D9F2D1F91B6 145 | :100900000F91FF90EF90DF90CF90089560E070E03E 146 | :1009100080E090E01F910F91FF90EF90DF90CF90DB 147 | :100920000895789483B7826083BF83B7816083BF63 148 | :1009300089B7816089BF1EBC8EB582608EBD8EB5C1 149 | :1009400081608EBD8FB581608FBD85B5846085BDAA 150 | :1009500085B5806485BD329A319A309A379A1AB833 151 | :1009600060E088E0D3DC61E080E1D0DC61E081E13F 152 | :10097000CDDC61E080E194DC61E081E191DCA7DB2A 153 | :100980008FB7F8948B9A8D9AB99A8A9A8FBF1FBCA9 154 | :1009900089E08EBD8EE790E09BBD8ABD89B78061FE 155 | :1009A00089BF1092440193DB82E390E0DCDD82E3B7 156 | :1009B00090E0D9DD60ED77E080E090E009DDFDDDDD 157 | :1009C000672B682B692B19F568EB7BE080E090E0E2 158 | :1009D000FFDC60E080E164DC60E081E161DC82E317 159 | :1009E00090E0C1DD60E080E15BDC60E081E158DC4B 160 | :1009F0004EE050E069E770E08CE890E02DDD42E0E9 161 | :100A000050E068E870E08CE890E026DDD8CF88E21E 162 | :100A100090E027DE8F3F91F460E288E290E0F7DD1E 163 | :100A20004DEB51E060E070E080E390E0F1DD40E20A 164 | :100A300053E060E070E080E290E0EADDBEDD6B0153 165 | :100A40007C0160933301709334018093350190935E 166 | :100A5000360160E370E080E090E004DE16161706D1 167 | :100A60001806190624F4709362006093610060E236 168 | :100A700070E080E090E0F6DD20916100309162004E 169 | :100A80004901330FAA08BB0886169706A806B906BF 170 | :100A900024F47093640060936300C701B6015FD2D1 171 | :100AA0006B017C016091630070916400072E000C63 172 | :100AB000880B990B54D226E636E646E65FE38ED2E3 173 | :100AC0009B01AC01C701B60185D218160CF0C0C05D 174 | :100AD00061E080E1E5DB60E081E1E2DB84E690E07B 175 | :100AE00042DD84E690E03FDD84E690E03CDDA8DC7A 176 | :100AF00060932F0170933001809331019093320104 177 | :100B0000C12CD12C76019CDC80902F01909030017B 178 | :100B1000A0903101B0903201DC01CB018819990914 179 | :100B2000AA09BB09803D9740A105B105E0F445DD68 180 | :100B30004B015C0160933301709334018093350164 181 | :100B400090933601C616D706E806F906E4F678DC77 182 | :100B500060932F01709330018093310190933201A3 183 | :100B600075016401D0CF88EC90E0FDDC69DC609316 184 | :100B70002F0170933001809331019093320180E115 185 | :100B8000882E87E2982EA12CB12C5ADC40902F01A0 186 | :100B9000509030016090310170903201DC01CB0146 187 | :100BA00084199509A609B709803D9740A105B105AB 188 | :100BB000E0F403DD2B013C016093330170933401B9 189 | :100BC0008093350190933601681579058A059B0558 190 | :100BD000E4F636DC60932F0170933001809331018D 191 | :100BE0009093320153014201D0CFD701C601881939 192 | :100BF0009909AA09BB094497A105B10574F484EFCA 193 | :100C000091E0B1DC68EE73E080E090E0E1DB64EF5E 194 | :100C100071E080E090E0DCDB61CF82E390E0A3DC78 195 | :100C200084E690E0A0DC82E390E09DDC84E690E046 196 | :100C30009ADCB501A40180E390E0EADCB701A601EB 197 | :100C400080E290E0E5DC68EE73E080E090E0C0DBFD 198 | :100C500080E090E02FDC60E370E080E090E002DD77 199 | :100C6000709362006093610060E270E080E090E069 200 | :100C7000F9DC709364006093630060E080E110DB56 201 | :100C800061E081E10DDB99DC6B017C016093330154 202 | :100C90007093340180933501909336018091650003 203 | :100CA00090916600092E000CAA0BBB0BC816D90642 204 | :100CB000EA06FB0669F0D0926600C0926500C0DBD0 205 | :100CC00060932F0170933001809331019093320132 206 | :100CD000B7DB80902F0190903001A0903101B0904F 207 | :100CE0003201DC01CB0188199909AA09BB09813DB0 208 | :100CF0009740A105B10528F4C114D104E104F10421 209 | :100D000089F49EDB603D77408105910540F481EDDB 210 | :100D1000881687E09806A104B1040CF075C080E045 211 | :100D200090E053C09601D0922E01C0922D014091C7 212 | :100D30002B0150912C018091290190912A019093CF 213 | :100D40002C0180932B01D0922A01C09229018C158D 214 | :100D50009D050CF463C0241735070CF44CC0C090FB 215 | :100D60006100D09062000D2C000CEE08FF0820916D 216 | :100D70002D0130912E01C901330FAA0BBB0B9C0131 217 | :100D8000AD012C193D094E095F09AEEFB0E0A7D0C7 218 | :100D900020916300309164008901330F220B330BE3 219 | :100DA000A90198012C193D094E095F097CD0DA018F 220 | :100DB000C9018F579109A109B10990932E01809320 221 | :100DC0002D0120916000211102C074DB0DC0099635 222 | :100DD000439710F41092600062E370E080E090E0CE 223 | :100DE000F7DA8AE090E0BFDB6AE070E080E090E054 224 | :100DF000EFDA4EDA48CF281739070CF0B0CF9093CE 225 | :100E00002E0180932D01ABCF1BDB60932F017093DC 226 | :100E10003001809331019093320181CF4C155D05F3 227 | :100E20000CF09DCFECCFECE8F0E01382128288EE5C 228 | :100E300093E0A0E0B0E084839583A683B7838BE63C 229 | :100E400090E09183808380E490E09587848729E215 230 | :100E500030E0378726872BE230E0318B208B2AE287 231 | :100E600030E0338B228B958B848B8CE290E0978BD8 232 | :100E7000868B118E128E138E148E0895E199FECFFB 233 | :100E80009FBB8EBBE09A99278DB30895262FE199D9 234 | :100E9000FECF9FBB8EBB2DBB0FB6F894E29AE19AB2 235 | :100EA0000FBE01960895052E97FB16F400940FD0FF 236 | :100EB00057FD05D01ED007FC02D046F408C050955F 237 | :100EC0004095309521953F4F4F4F5F4F0895909536 238 | :100ED0008095709561957F4F8F4F9F4F08952BD0D0 239 | :100EE000A59F900DB49F900DA49F800D911D11247E 240 | :100EF0000895A1E21A2EAA1BBB1BFD010DC0AA1F5B 241 | :100F0000BB1FEE1FFF1FA217B307E407F50720F072 242 | :100F1000A21BB30BE40BF50B661F771F881F991FED 243 | :100F20001A9469F760957095809590959B01AC0136 244 | :100F3000BD01CF010895A29FB001B39FC001A39F3F 245 | :100F400001D0B29F700D811D1124911D0895EE0FE7 246 | :100F5000FF1F0590F491E02D0994E89409C097FBD8 247 | :100F60003EF490958095709561957F4F8F4F9F4F80 248 | :100F70009923A9F0F92F96E9BB279395F6958795C4 249 | :100F800077956795B795F111F8CFFAF4BB0F11F487 250 | :100F900060FF1BC06F5F7F4F8F4F9F4F16C088232E 251 | :100FA00011F096E911C0772321F09EE8872F762F64 252 | :100FB00005C0662371F096E8862F70E060E02AF0A5 253 | :100FC0009A95660F771F881FDAF7880F9695879591 254 | :100FD00097F9089566D008F48FEF08950BD09CC060 255 | :100FE0008DD028F092D018F0952309F07EC083C0F0 256 | :100FF0001124C6C0A2D0A0F3959FD1F3950F50E065 257 | :10100000551F629FF001729FBB27F00DB11D639FBA 258 | :10101000AA27F00DB11DAA1F649F6627B00DA11D60 259 | :10102000661F829F2227B00DA11D621F739FB00D06 260 | :10103000A11D621F839FA00D611D221F749F332776 261 | :10104000A00D611D231F849F600D211D822F762F0F 262 | :101050006A2F11249F5750408AF0E1F088234AF00C 263 | :10106000EE0FFF1FBB1F661F771F881F9150504058 264 | :10107000A9F79E3F510570F038C082C05F3FECF386 265 | :10108000983EDCF3869577956795B795F795E79544 266 | :101090009F5FC1F7FE2B880F911D9695879597F955 267 | :1010A0000895990F0008550FAA0BE0E8FEEF1616F9 268 | :1010B0001706E807F907C0F012161306E407F5074C 269 | :1010C00098F0621B730B840B950B39F40A2661F0C0 270 | :1010D000232B242B252B21F408950A2609F4A14063 271 | :1010E000A6958FEF811D811D089597F99F6780E870 272 | :1010F00070E060E008959FEF80EC089500240A946A 273 | :101100001616170618060906089500240A941216E2 274 | :101110001306140605060895092E0394000C11F415 275 | :10112000882352F0BB0F40F4BF2B11F460FF04C0C2 276 | :101130006F5F7F4F8F4F9F4F089557FD9058440F1B 277 | :10114000551F59F05F3F71F04795880F97FB991F26 278 | :1011500061F09F3F79F087950895121613061406E3 279 | :10116000551FF2CF4695F1DF08C016161706180670 280 | :10117000991FF1CF86957105610508940895E8944B 281 | :10118000BB2766277727CB0197F9089581E090E088 282 | :08119000F89400C0F894FFCFB1 283 | :1011980001BD012003640000000000D3002C02758B 284 | :1011A800001E01A600840098004E6F2050756C73D5 285 | :0C11B8006520466F756E64000D0A000093 286 | :00000001FF 287 | --------------------------------------------------------------------------------