Нужна помощь в смещении массивов в скетче

platnik
Offline
Зарегистрирован: 06.07.2019

Здравствуйте,столкнулся с проблемой неровного становления массивов в проекте генератор частоты на ардуино  Версия 2.5 написана под микроконтроллер LGT8F328P.

Там от автора есть уточнение для корректного отображения сигналов проделать следующее  Функция на ассемблере использует не стандартный способ чтения массива, записанного через PROGMEM Для этого способа требуется что бы расположение всех таблиц-массивов было кратно адресу 0x100 В ардуино нет штатных средств что бы положить конкретный массив по конкретному адресу во флэш область, поэтому пришлось обойти этот недостаток не очень красивым способом.  Я создал специальный массив musor_mass, который занимает всё свободное место вплоть до адреса 0x100, а после него массивы с таблицами сами попадают точно на нужные адреса. Что бы компилятор не выбросил этот массив пришлось его как-то задействовать ( в строке 147 сетапа). При изменении в коде или при использовании версии ардуино отличной от 1.6.8 возможно потребуется изменение размера мусорного массива таким образом, что бы первый байт табличных массивов сел точно на адрес 0x100. Возможно в какой-то версии компилятора musor_mass нужно будет расположить в скетче не последним, а первым. После нажатия кнопки "проверить" лучше сразу заглянуть в скомпилившийся hex файл. Пример правильного расположения массивов на картинке. Но вот беда я ни как не могу сообразить как это сделать,может кто скоректирует  у меня такой скетч /* Генератор с регулируемой частотой и скважностью  v 2.5

 
/* Генератор с регулируемой частотой и скважностью  v 2.5
 *  предназначен только для МК lgt8f328p 
 * Распиновка: Энкодер пин A0,A1  (PC0,PC1)
 * Кнопка энкодера пин 2 (PD2) 
 * Дисплей nokia 5110 - 13,12,11,10 (PB5,PB4,PB3,PB2)
 *  Выход генератора DDS пин 4 (PD4)     
 *  Выход генератора PWM пин 9 (PB1)  
 *  Вход вольтметра  пин A3 (ADC3)
 *  Вход частотометра пин 5 (PD5) 
 */ 



const PROGMEM uint8_t  sinewave[]= // массив синуса
{
0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,
0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,
0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,
0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,
0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,
0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c
};

const PROGMEM uint8_t squarewave[]= //массив меандра
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
};

const PROGMEM uint8_t trianglewave[]= //массив треугольника
{
0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e,0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,
0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x3e,
0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4e,0x50,0x52,0x54,0x56,0x58,0x5a,0x5c,0x5e,
0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e,0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e,
0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,
0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xac,0xae,0xb0,0xb2,0xb4,0xb6,0xb8,0xba,0xbc,0xbe,
0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc,0xce,0xd0,0xd2,0xd4,0xd6,0xd8,0xda,0xdc,0xde,
0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xee,0xf0,0xf2,0xf4,0xf6,0xf8,0xfa,0xfc,0xfe,
0xff,0xfd,0xfb,0xf9,0xf7,0xf5,0xf3,0xf1,0xef,0xef,0xeb,0xe9,0xe7,0xe5,0xe3,0xe1,
0xdf,0xdd,0xdb,0xd9,0xd7,0xd5,0xd3,0xd1,0xcf,0xcf,0xcb,0xc9,0xc7,0xc5,0xc3,0xc1,
0xbf,0xbd,0xbb,0xb9,0xb7,0xb5,0xb3,0xb1,0xaf,0xaf,0xab,0xa9,0xa7,0xa5,0xa3,0xa1,
0x9f,0x9d,0x9b,0x99,0x97,0x95,0x93,0x91,0x8f,0x8f,0x8b,0x89,0x87,0x85,0x83,0x81,
0x7f,0x7d,0x7b,0x79,0x77,0x75,0x73,0x71,0x6f,0x6f,0x6b,0x69,0x67,0x65,0x63,0x61,
0x5f,0x5d,0x5b,0x59,0x57,0x55,0x53,0x51,0x4f,0x4f,0x4b,0x49,0x47,0x45,0x43,0x41,
0x3f,0x3d,0x3b,0x39,0x37,0x35,0x33,0x31,0x2f,0x2f,0x2b,0x29,0x27,0x25,0x23,0x21,
0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x11,0x0f,0x0f,0x0b,0x09,0x07,0x05,0x03,0x01
};

const PROGMEM uint8_t sawtoothwave[]= //массив пила1
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,
0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
};

const PROGMEM uint8_t rewsawtoothwave[]= //массив пила2
{
0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,
0xef,0xee,0xed,0xec,0xeb,0xea,0xe9,0xe8,0xe7,0xe6,0xe5,0xe4,0xe3,0xe2,0xe1,0xe0,
0xdf,0xde,0xdd,0xdc,0xdb,0xda,0xd9,0xd8,0xd7,0xd6,0xd5,0xd4,0xd3,0xd2,0xd1,0xd0,
0xcf,0xce,0xcd,0xcc,0xcb,0xca,0xc9,0xc8,0xc7,0xc6,0xc5,0xc4,0xc3,0xc2,0xc1,0xc0,
0xbf,0xbe,0xbd,0xbc,0xbb,0xba,0xb9,0xb8,0xb7,0xb6,0xb5,0xb4,0xb3,0xb2,0xb1,0xb0,
0xaf,0xae,0xad,0xac,0xab,0xaa,0xa9,0xa8,0xa7,0xa6,0xa5,0xa4,0xa3,0xa2,0xa1,0xa0,
0x9f,0x9e,0x9d,0x9c,0x9b,0x9a,0x99,0x98,0x97,0x96,0x95,0x94,0x93,0x92,0x91,0x90,
0x8f,0x8e,0x8d,0x8c,0x8b,0x8a,0x89,0x88,0x87,0x86,0x85,0x84,0x83,0x82,0x81,0x80,
0x7f,0x7e,0x7d,0x7c,0x7b,0x7a,0x79,0x78,0x77,0x76,0x75,0x74,0x73,0x72,0x71,0x70,
0x6f,0x6e,0x6d,0x6c,0x6b,0x6a,0x69,0x68,0x67,0x66,0x65,0x64,0x63,0x62,0x61,0x60,
0x5f,0x5e,0x5d,0x5c,0x5b,0x5a,0x59,0x58,0x57,0x56,0x55,0x54,0x53,0x52,0x51,0x50,
0x4f,0x4e,0x4d,0x4c,0x4b,0x4a,0x49,0x48,0x47,0x46,0x45,0x44,0x43,0x42,0x41,0x40,
0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,
0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,
0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,
0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,
};


const PROGMEM char musor_mass[]= //массив для подгонки адреса в флэш-памяти
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};

// пользовательские настройки переменных по умолчанию
//режимы 0-синус dds, 1-треугольник dds, 2-меандр dds, 3 пила1 dds, 4 пила2 dds
//5- гегулировка частоты pwm, 6- Duty pwm, 7-частотометр, 8 -вольтметр
volatile uint8_t regim=5; //выбор режима генератора по умолчанию 
volatile int32_t freq=1000;// частота по умолчанию
volatile uint16_t shag=100; //шаг энкодера по умолчанию
#define dac_trim 5 //  настройка выходного уровня ЦАП
// 0 -переменный резистор на пине aref, 1 -1.024V; 2-2.048v; 4-4.096V; 5-Vcc
#define F_CPU 32E6 //нужно указать фактическую частоту МК 


volatile uint16_t int_tic=0;//переменная частотометра (переполнение таймера) 
uint16_t Vbg, involt;//переменные вольтметра
volatile uint32_t icr=0;  //переменная для управления регистром сравнения таймера1
volatile uint8_t monitor_flag; // флаг для вывода на дисплей
volatile uint8_t duty=50; //скважность по умолчанию
//volatile uint8_t main_flag=0;//флаг работа в режиме генератора или нет
volatile uint8_t modebit=1;//флаг смены режимов.(для анализа действия энкодера)
#include "lgtx8p.h"
#define int_on() PCMSK1=(1<<PCINT9); PCICR=(1<<PCIE1); EIMSK=1<<INT0; //прерывание на А1
//включить прерывание PCINT1, выбор пинов прерывания A1,
#define int_off() PCMSK1=0; PCICR=0; EIMSK=0; ///отключить прерывания энкодера и кнопки
#include <LCD5110_SSVS.h>
#include <avr/delay.h>
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
LCD5110 lcd(10,11,12,13);

// DDS algorithm 
static inline void signalOUT(uint16_t ad01,uint8_t ad2, const uint8_t *wvt){ 
 asm volatile(  
  "ldi r28,0xA1; "            "\n\t" 
   "clr r29;"                     "\n\t" 
    "eor r18, r18;"            "\n\t"
    "eor r19, r19;"            "\n\t"
     "1:"                            "\n\t"
     "add r18, %A0;"        "\n\t" 
     "adc r19, %B0;"        "\n\t" 
     "adc %A2, %1;"        "\n\t" 
     "lpm      ;"                 "\n\t" 
    "st Y, __tmp_reg__  ;" "\n\t" 
   "sbis %3, 7   ;"           "\n\t" 
  "rjmp 1b;"                  "\n\t" 
 ::"r" (ad01),"r" (ad2),"e" (wvt), "I" (_SFR_IO_ADDR(PORTF))
 :"r18", "r19","r28", "r29" );
}

void setup(){
lcd.InitLCD();
for (int n=0; n <sizeof(musor_mass); n++ ) {PORTF=musor_mass[n]&0xFC; }   
pinMode(A0,INPUT_PULLUP); //encoder
pinMode(A1,INPUT_PULLUP); // encoder
pinMode(2,INPUT_PULLUP); //encoder key
pinMode(3,OUTPUT);// buzzer
TCCR1A=0; TCCR1B=0; TIMSK1=0; 
EICRA=3; //INT0 -RISING+FALLING 
EIFR==EIFR; //flag clear
TCCR0B=0;  check_regim(); 
//разгон до 32 МГц от внутреннего RC генератора
CLKPR = 1<<PMCE;//разрешить изменение
CLKPR = 0; //делитель =1
} //end setup


        
/////////////// ПРЕРЫВАНИЕ от кн0пки//////////////////////////         
ISR (INT0_vect){ // прерывание от кнопки энкодера 
int_off();
if ( (TIFR3&(1<<0))==0 ){TIFR3|=1<<0;} // флаг выходы из режима частотометра
if (!modebit) { modebit=1; int_on(); return;} //меняли режим, просто выйти
if (regim==6) { regim=5; check_regim();  return; }
          switch (shag){ 
                   case 1: shag=10;     break;
                   case 10: shag=100;    break;
                   case 100: shag=1000;   break;
                   case 1000: shag=1; break; 
                  } check_regim(); return;
            } //конец прерывания *если нажата кнопка энкодера*
////////////////////////////////////////////////////////////
 
 
 ISR (PCINT1_vect){ //прерывание при вращении энкодера
// static boolean n=0;  if (n=!n){return;} // снять ремарку для энкодеров с двойным щелчком
int_off();
 bool x = (PINC&1)^((PINC&2)>>1);
if ( (TIFR3&(1<<0))==0 ){TIFR3|=1<<0;} // флаг выхода из режима частотометра
 //////////////////// переключение режимов при нажатой кнопке//////////////////////
 modebit= (PIND&(1<<2)); //0 -кнопка нажата. 1 -не нажата
         if (!modebit) { //если кнопка нажата
         //флаг что переключаю режимы
       if (x) { regim++; if (regim>8) {regim=0;} }
       else {regim-- ; if (regim>8) {regim=8;}}         
       check_regim(); return;
       }
////////////////// переключение частоты/////////////////////////////////////////
if (TCCR1B==17 && ICR1<2800 && regim==5){ //если > 2800 герц
if(x) {if (icr<1000 && shag > 100) shag=100; 
       if (icr<100 && shag > 10) shag=10;
       if (icr<10 && shag > 1) shag=1;          
       icr-=shag;
         if (icr<2) icr=2;    }//ограничитель
         else {  if (icr > 1800 && shag >100) shag =100; icr+=shag ;  } 
  check_regim(); return;   }
///////////////////////////переключение Duty//////////////////////////////////
if (regim==6){if (ICR1>100){ 
                if (x){if(duty<100) {duty++; }  }
                if (!x){ if(duty>0) {duty--; }} }
              else{ 
                    if (x){if(OCR1A<ICR1) {OCR1A++; }  }         
                    else {if(OCR1A>0) {OCR1A--; }  }         
                    if(OCR1A>ICR1) OCR1A=ICR1-1;
                   
                    duty=(uint32_t)100*OCR1A/ICR1;  }
         check_regim(); return;
     } // end перекл. duty
   x? freq+=shag : freq-=shag ;  //изменение частоты менее 2800 Герц
if (freq < 1) freq=1; check_regim();
} // end isr pcint
         


void pwm_gen(){ //настройка таймера1
 uint16_t divider=1; 
  icr = (uint32_t)(F_CPU / freq /2 /divider); 
   byte shifts[] = {3,3,2,2};
     for(byte i = 0; i < 4; i++){
        if (icr > 65536) {
           divider <<= shifts[i];
           icr = (uint32_t)F_CPU / freq /2 /divider; }
        else {  TCCR1B = (i+1)|(1<<WGM13);  break;  } }
ICR1=icr-1; 
set_duty();
} //end pwm_gen

    
void loop() {
   if (regim <5){ dds_set();} 
   if (regim==7) {freq_meter();}
   if (regim==8) {volt_meter();}
   if (monitor_flag) { monitor_flag=0; monitor_out(); }
 }//end loop


void monitor_out(){
char mystr[14];//массив для вывода строк на дисплей
lcd.clrScr();
//Вывод первой строчки
lcd.setFont(SmallFont);
if (regim<8){
if (freq <1E4) {lcd.print("Frequency, Hz",CENTER,0 );  }
if (freq >=1E4) {lcd.print("Frequency, kHz",CENTER,0 );  }
} if (regim==8){lcd.print("Voltage, Volt",CENTER,0 );  }
//Вывод второй строчки
lcd.setFont(MediumNumbers);
if (regim<8){
if (freq <10000) { lcd.printNumI(freq, CENTER, 8); }
if (freq >=10000u && freq < 1000000ul ) { lcd.printNumF( ((float)freq/1000),3 ,CENTER, 8);  }
if (freq >=1000000ul ) { lcd.printNumF( ((float)freq/1000),2 ,CENTER, 8);  }
} if (regim==8){ lcd.printNumF( ((float)involt/1000),3 ,CENTER, 8);  }
//Вывод третьей строчки
   lcd.setFont(SmallFont);
     switch(regim){ 
       case 0: lcd.print("Sinus DDS",CENTER, 32); break;
        case 1: lcd.print("Triangle DDS",CENTER, 32); break;
         case 2: lcd.print("Meandr DDS",CENTER, 32); break;
        case 3: lcd.print("Pila1 DDS",CENTER, 32); break;
       case 4: lcd.print("Pila2 DDS",CENTER, 32); break;
      case 5: lcd.print("PWM Mode",CENTER,32); break;
    case 6: lcd.print("Duty Mode", CENTER, 32);break;
   case 7: lcd.print("Freq counter", CENTER, 32);break;
  case 8: lcd.print("Volt meter", CENTER, 32);
     }
//Вывод четвёртой строчки  
 if (regim==6) { sprintf(mystr, "Duty=%d %%", duty);
         lcd.print(mystr, CENTER, 40);}
         else if (regim < 6) {sprintf(mystr, "Step=%d", shag);
          lcd.print(mystr, CENTER, 40);}
if (regim==8){
   sprintf(mystr, "Vcc= %d.%02d v", (int)(Vbg/1000), (int)Vbg%1000   );
   lcd.print(mystr, CENTER, 40);
   }//end if regim 8
}
//end monitor out


void set_duty(){
if (regim==6&&ICR1<100) return;
  if (regim==5 && ICR1<100){
    OCR1A=ICR1/2; duty=50; 
    return;   }
   static uint16_t ocr;
 ocr=(uint32_t)ICR1*duty/100;
OCR1A=ocr;
}

void check_regim(){// проверка и установка режимов работы
if (regim <5){ // если DDS режимы:
  if (freq > 100000) { freq=100000;}
    TCCR1B=0; TCCR1A=0;  DDRB&=~(1<<DDB1); // 9 pin arduino set Z-mode 
    }// end if regim <5
  if (regim==5 || regim==6) {// если PWM или Duty 
      TCCR1A=1<<COM1A1; DDRB|=1<<DDB1; // 9 pin set output (pwm out)
      if (TCCR1B==17 && ICR1<2800){ 
              ICR1=icr; freq= F_CPU/2/ICR1;  
              set_duty();                      }
       else { pwm_gen(); } 
         }
   PORTF|= 1<<7; //поставить флаг что-б выйти из цикла DDS, если были в цикле
if (regim==7){ freq=0;} //если частотометр то обнулить частоту
monitor_flag=1;
int_on()

}


ISR (TIMER1_OVF_vect){ int_tic++; } // прерывание частотомера

void freq_meter(){
//подготовка таймера1
TCCR1B=0; TCCR1A=0; TIMSK1 = 1<<TOIE1;// подключить прерывание
 int_tic=0; TCNT1=0; TIFR1=TIFR1;//всё обнулить
  //подготовка таймера3
   TCCR3B=0;TCCR3A=0; TIFR3=TIFR3; 
   //все 3 регистра стравнения что б удобнее смотреть регистр флагов
     uint16_t ocr = ( (uint32_t)F_CPU/1024) -1;
     OCR3AH=ocr>>8; OCR3AL=ocr;// -2 sec
     OCR3BH=ocr>>8; OCR3BL=ocr;// -2 sec
     OCR3CH=ocr>>8; OCR3CL=ocr;// -2 sec  
    TCCR3B=5<<CS30; //старт счёта 2х секунд
   TCCR1B=7<<CS10;//старт счёта таймера1 от тактового входа
  while(TIFR3==0);// крутится пока не будет флагов конца счёта 
 TCCR1B=0;// стоп Тimer1
TIMSK1=0;
if ( (TIFR3&(1<<0))==0){// если не было переполнения, то считаем
 freq= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
  int_tic=0; TCNT1 = 0; 
  } monitor_flag=1;
 }


//////////////////////ВОЛЬТМЕТР/////////////////////////////////
void volt_meter() {
 Vbg=Vbg_read();//измерить напряжение на Vcc
  involt=auto_range_read(3);//измерить на входе А3
 monitor_flag=1;
}//end volt meter


// функция для измерения напряжения с автоматическим переключением референса
uint16_t auto_range_read(uint8_t in){
 uint16_t an_in;
  an_in= _adc(in,3);//вкючение референса 1024
   if (an_in <=(800*4)) {return (an_in/4);} 
    an_in= _adc(in,2); //вкючение референса 2048
    if (an_in <=(1800*2)) {return (an_in/2); } 
    an_in=_adc(in,4); //вкючение референса 4096
   if (an_in <3800) {return an_in; }
  an_in= _adc(in,1);
 an_in= (uint32_t)an_in * Vbg / 4096;
return an_in; 
} 


//////  analog Read (input, reference)
uint16_t _adc( uint8_t in, uint8_t refs){ 
uint16_t adc; ADCSRA=1<<ADEN | 1<<ADPS2 |0<<ADPS1 |1<<ADPS0; // clk /32
 ADCSRB=0; ADCSRC=0; DIDR0=1<<in;
  switch(refs) { //0 -ext, 1-Vcc, 2-2048, 3-1024,  4-4096 
   case 0: ADCSRD=0; break; // AREF ничего не меняется, REFS=0
    case 1: ADCSRD=0;break; // VCC ничего не меняется, REFS=1
   case 2: ADCSRD=0; VCAL=VCAL2; break; // 2v048
   case 3: ADCSRD=0; VCAL=VCAL1; break; // 1v1024
  case 4: refs=0;  ADCSRD=1<<REFS2; VCAL=VCAL3; break; // 4v096  
 }
ADMUX=in&0xF | refs<<6;
 uint32_t akkum=0;
 for (int n=0x0; n<=0xff; n++ ) {
  ADCSRA |= (1<<ADSC);   
  while (ADCSRA&(1<<ADSC));
 akkum += ADC; }
akkum>>=8; 
return (uint16_t)akkum;

}
//функция для измерения напряжения на Vcc
uint16_t Vbg_read(){
ADCSRB=0; ADCSRC=0;
 ADCSRA=1<<ADEN | 1<<ADPS2 |0<<ADPS1 |1<<ADPS0; // adc enable , clk/32
  ADMUX=1<<REFS0 | 1<<3 | 1<<2 | 1<<0; //ref=avcc, input= ivref 
   ADCSRD=1<<BGEN ; //ivref=1v024
    VCAL=VCAL1;//load 1v024 calibrate byte
     uint32_t bgaread=0;
      //собрать 256 семплов для усреднения
     for (int n=0x0; n<=0xff; n++ ) {
     ADCSRA |= (1<<ADSC);   
    while (bit_is_set(ADCSRA,ADSC));
    bgaread += ADC;
   }
  bgaread>>=8; 
 bgaread= ((uint32_t)1024<<12) / bgaread;
return (uint16_t)bgaread;
}

void dds_set(){
                PORTF&= ~(1<<7); //флаг DDS
               switch (dac_trim) {
              case 0:  DACON=1<<DACEN|1<<DAOE|1<<DAVS0; break; 
             case 1:  DACON=1<<DACEN|1<<DAOE|1<<DAVS1; ADCSRD= 1<BGEN; break; 
            case 2:  DACON=1<<DACEN|1<<DAOE|1<<DAVS1; ADCSRD= 1<BGEN|1<<IVSEL0; break; 
           case 4:  DACON=1<<DACEN|1<<DAOE|1<<DAVS1; ADCSRD= 1<BGEN|1<<IVSEL1; break; 
           case 5:  DACON= 1<<DACEN | 1<<DAOE; break; 
           } uint32_t temp=  (float)0x1000000ul / (F_CPU/8ul) * freq;
              switch (regim){ 
               case 0: signalOUT(temp, temp>>16,sinewave); break;
                case 1: signalOUT(temp, temp>>16,trianglewave); break;
                 case 2: signalOUT(temp, temp>>16,squarewave); break;
                   case 3: signalOUT(temp, temp>>16,sawtoothwave); break;
                    case 4: signalOUT(temp, temp>>16,rewsawtoothwave);
                       } //end switch      
}

А получается такой Hex 

:100000000C9465050C9424090C9499050C9499059D
:100010000C9484090C9499050C9499050C949905F9
:100020000C9499050C9499050C9499050C949905D8
:100030000C9499050C94560B0C9499050C94990505
:100040000C9402110C9499050C9499050C94990543
:100050000C9499050C9499050C9499050C949905A8
:100060000C9499050C949905D406D706DA06DD069A
:10007000E006E306E606E906EC0600407A10F35ACD
:1000800000A0724E18090010A5D4E80000E87648D8
:10009000170000E40B54020000CA9A3B000000E184
:1000A000F505000080969800000040420F00000017
:1000B000A08601000000102700000000E8030000F7
:1000C00000006400000000000A00000000000100C1
:1000D000000000002C76D888DC674F0823DFC1DFE2
:1000E000AE59E1B1B796E5E3E453C63AE6519976E5
:1000F00096E8E6C28426EB898C9B62ED407C6FFC1F
:10010000EFBC9C9F40F2BAA56FA5F490055A2AF760
:100110005C936B6CF9676DC11BFCE0E40D47FEF569
:1001200020E6B500D0ED902E0300943577050080D1
:10013000841E080000204E0A000000C80C33333330
:10014000330F986E12831141EF8D2114893BE655D0
:1001500016CFFEE6DB18D1844B381BF77C1D901DB3
:10016000A4BBE424203284725E228100C9F124EC15
:10017000A1E53D2700000000000000000000000095
:10018000000000000000000000000000000000006F
:10019000000000000000000000000000000000005F
:1001A000000000000000000000000000000000004F
:1001B000000000000000000000000000000000003F
:1001C000000000000000000000000000000000002F
:1001D000000000000000000000000000000000001F
:1001E000000000000000000000000000000000000F
:1001F00000000000000000000000000000000000FF
:10020000FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F076
:10021000EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E066
:10022000DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D056
:10023000CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C046
:10024000BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B036
:10025000AFAEADACABAAA9A8A7A6A5A4A3A2A1A026
:100260009F9E9D9C9B9A9998979695949392919016
:100270008F8E8D8C8B8A8988878685848382818006
:100280007F7E7D7C7B7A79787776757473727170F6
:100290006F6E6D6C6B6A69686766656463626160E6
:1002A0005F5E5D5C5B5A59585756555453525150D6
:1002B0004F4E4D4C4B4A49484746454443424140C6
:1002C0003F3E3D3C3B3A39383736353433323130B6
:1002D0002F2E2D2C2B2A29282726252423222120A6
:1002E0001F1E1D1C1B1A1918171615141312111096
:1002F0000F0E0D0C0B0A0908070605040302010086
:10030000000102030405060708090A0B0C0D0E0F75
:10031000101112131415161718191A1B1C1D1E1F65
:10032000202122232425262728292A2B2C2D2E2F55
:10033000303132333435363738393A3B3C3D3E3F45
:10034000404142434445464748494A4B4C4D4E4F35
:10035000505152535455565758595A5B5C5D5E5F25
:10036000606162636465666768696A6B6C6D6E6F15
:10037000707172737475767778797A7B7C7D7E7F05
:10038000808182838485868788898A8B8C8D8E8FF5
:10039000909192939495969798999A9B9C9D9E9FE5
:1003A000A0A1A2A3A4A5A6A7A8A9AAABACADAEAFD5
:1003B000B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC5
:1003C000C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFB5
:1003D000D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFA5
:1003E000E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF95
:1003F000F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF85
:1004000000020406080A0C0E10121416181A1C1EFC
:1004100020222426282A2C2E30323436383A3C3EEC
:1004200040424446484A4C4E50525456585A5C5EDC
:1004300060626466686A6C6E70727476787A7C7ECC
:1004400080828486888A8C8E90929496989A9C9EBC
:10045000A0A2A4A6A8AAACAEB0B2B4B6B8BABCBEAC
:10046000C0C2C4C6C8CACCCED0D2D4D6D8DADCDE9C
:10047000E0E2E4E6E8EAECEEF0F2F4F6F8FAFCFE8C
:10048000FFFDFBF9F7F5F3F1EFEFEBE9E7E5E3E16A
:10049000DFDDDBD9D7D5D3D1CFCFCBC9C7C5C3C15A
:1004A000BFBDBBB9B7B5B3B1AFAFABA9A7A5A3A14A
:1004B0009F9D9B99979593918F8F8B89878583813A
:1004C0007F7D7B79777573716F6F6B69676563612A
:1004D0005F5D5B59575553514F4F4B49474543411A
:1004E0003F3D3B39373533312F2F2B29272523210A
:1004F0001F1D1B19171513110F0F0B0907050301FA
:1005000000000000000000000000000000000000EB
:1005100000000000000000000000000000000000DB
:1005200000000000000000000000000000000000CB
:1005300000000000000000000000000000000000BB
:1005400000000000000000000000000000000000AB
:10055000000000000000000000000000000000009B
:10056000000000000000000000000000000000008B
:10057000000000000000000000000000000000007B
:10058000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B
:10059000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B
:1005A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B
:1005B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B
:1005C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B
:1005D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B
:1005E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B
:1005F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B
:10060000808386898C8F9295989C9FA2A5A8ABAE7B
:10061000B0B3B6B9BCBFC1C4C7C9CCCED1D3D5D88D
:10062000DADCDEE0E2E4E6E8EAECEDEFF0F2F3F546
:10063000F6F7F8F9FAFBFCFCFDFEFEFFFFFFFFFFFB
:10064000FFFFFFFFFFFFFEFEFDFCFCFBFAF9F8F7E2
:10065000F6F5F3F2F0EFEDECEAE8E6E4E2E0DEDCFA
:10066000DAD8D5D3D1CECCC9C7C4C1BFBCB9B6B313
:10067000B0AEABA8A5A29F9C9895928F8C898683DB
:10068000807C797673706D6A6763605D5A575451E8
:100690004F4C494643403E3B383633312E2C2A27B7
:1006A0002523211F1D1B1917151312100F0D0C0ADE
:1006B0000908070605040303020101000000000009
:1006C0000000000000000101020303040506070802
:1006D000090A0C0D0F1012131517191B1D1F2123CA
:1006E00025272A2C2E313336383B3E404346494C91
:1006F0004F5154575A5D6063676A6D707376797CA9
:100700000C102D0D00000080808080808000000093
:1007100000000103030303030301000000000000C5
:1007200000000000000000000000000000C0C00049
:100730000000000000000286868686868602000091
:10074000000081C3C3C3C3C3C381000000FC7A0699
:1007500006060606067AFC00007EBCC0C0C0C0C00B
:10076000C0BC7E0000000000000000000078FC001B
:100770000000000000000000003C7E000000028637
:1007800086868686867AFC00007EBDC3C3C3C3C34B
:10079000C38100000000028686868686867AFC0079
:1007A000000081C3C3C3C3C3C3BD7E0000FC788007
:1007B000808080808078FC00000001030303030335
:1007C000033D7E0000FC7A868686868686020000CF
:1007D000000081C3C3C3C3C3C3BD7E0000FC7A86CF
:1007E0008686868686020000007EBDC3C3C3C3C35F
:1007F000C3BD7E000000020606060606067AFC005F
:100800000000000000000000003C7E0000FC7A8632
:1008100086868686867AFC00007EBDC3C3C3C3C3BA
:10082000C3BD7E0000FC7A8686868686867AFC00BA
:10083000000081C3C3C3C3C3C3BD7E000608205FDD
:100840000000000000000000002F00000000070072
:10085000070000147F147F1400242A7F2A1200232B
:100860001308646200364955225000000503000059
:1008700000001C224100000041221C000014083E20
:1008800008140008083E0808000000A060000008E6
:10089000080808080000606000000020100804023A
:1008A000003E5149453E0000427F400000426151F8
:1008B0004946002141454B31001814127F10002792
:1008C00045454539003C4A49493000017109050355
:1008D00000364949493600064949291E0000363686
:1008E00000000000563600000008142241000014E9
:1008F00014141414000041221408000201510906C6
:1009000000324959513E007C1211127C007F494946
:100910004936003E41414122007F4141221C007F77
:1009200049494941007F09090901003E4149497A85
:10093000007F0808087F0000417F410000204041FF
:100940003F01007F08142241007F40404040007F6B
:10095000020C027F007F0408107F003E4141413EAF
:10096000007F09090906003E4151215E007F0919F7
:1009700029460046494949310001017F0101003FF4
:100980004040403F001F2040201F003F4038403F74
:1009900000631408146300070870080700615149D8
:1009A000454300007F414100AA55AA55AA550000C1
:1009B00041417F00000402010204004040404040E9
:1009C000000003050000002054545478007F484480
:1009D000443800384444442000384444487F0038B8
:1009E0005454541800087E0901020018A4A4A47CE1
:1009F000007F080404780000447D400000408084AB
:100A00007D00007F102844000000417F4000007CF2
:100A100004180478007C08040478003844444438FE
:100A200000FC242424180018242418FC007C08044A
:100A3000040800485454542000043F444020003C23
:100A40004040207C001C2040201C003C4030403CAA
:100A5000004428102844001CA0A0A07C004464543A
:100A60004C440000107C8200000000FF00000000E9
:100A7000827C10000000060909060102040810200B
:100A8000408001020408102001020408102002081E
:100A900001041020400404040404040404020202BB
:100AA000020202030303030303050505050505050B
:100AB00000000000250028002B00A9000000000015
:100AC000240027002A00A800090D11241FBECFEF23
:100AD000D8E0DEBFCDBF14BE0FB6F894A8958091C4
:100AE0006000886180936000109260000FBE11E08A
:100AF000A0E0B1E0EEE1F4E302C005900D92AC3B62
:100B0000B107D9F721E0ACEBB1E001C01D92A83EDE
:100B1000B207E1F715E0C5E6D5E004C02197FE0174
:100B20000E94BC14C436D107C9F70E9473120C94FA
:100B30000D1A0C940000CF93DF93FA01C1EADD2770
:100B400022273327280F391FE61FC8950882A79B45
:100B5000F9CFDF91CF9108958F92AF92BF92CF924C
:100B6000DF92EF92FF920F931F93CF93DF93CDB756
:100B7000DEB72E970FB6F894DEBF0FBECDBF8CEB5D
:100B800091E00E94340E6CE378E08CEB91E00E94DF
:100B9000E41080910801883008F040C060910401A1
:100BA0007091050180910601909107010E94311317
:100BB00020E030E44CE156E40E94821287FF0EC030
:100BC00030E2E32E00E010E020E030E04EE057E2BB
:100BD0006DE071E08CEB91E00E94F80E60910401F1
:100BE0007091050180910601909107010E943113D7
:100BF00020E030E44CE156E40E94E11387FD0EC092
:100C000020E2E22E00E010E020E030E04EE057E28B
:100C10006BE171E08CEB91E00E94F80E809108018D
:100C2000883071F490E2E92E00E010E020E030E03E
:100C30004EE057E26AE271E08CEB91E00E94F80E20
:100C400060E077E08CEB91E00E94E4108091080175
:100C5000883008F06BC08091040190910501A0914B
:100C60000601B091070180319742A105B105A4F4B6
:100C700040910401509105016091060170910701B6
:100C800080E2C82EE12CF12C08E010E02EE037E2E3
:100C90008CEB91E00E946A0F809104019091050114
:100CA000A0910601B091070180319742A105B105DD
:100CB00074F08091040190910501A0910601B0911A
:100CC000070180349244AF40B10508F4F3C080912D
:100CD000040190910501A0910601B09107018034B3
:100CE0009244AF40B10510F160910401709105018B
:100CF00080910601909107010E94311320E030E0BD
:100D00004AE754E40E948712AB01BC01B0E28B2E8B
:100D1000A12CB12C1EE2C12E08E0E02EF12C0EE039
:100D200017E222E08CEB91E00E945B1080910801B9
:100D3000883001F56091D9017091DA0180E090E08E
:100D40000E942F1320E030E04AE754E40E9487120B
:100D5000AB01BC01E0E28E2EA12CB12CFEE2CF2E25
:100D6000A8E0EA2EF12C0EE017E223E08CEB91E0F4
:100D70000E945B106CE378E08CEB91E00E94E41041
:100D8000E09108018E2F90E08930910558F5FC0123
:100D9000EC5CFF4F50E2E52E00E010E020E230E096
:100DA0004EE057E20C94BC1468E371E017C062E4B3
:100DB00071E014C06FE471E011C06AE571E00EC02B
:100DC00064E671E00BC06EE671E008C067E771E0B1
:100DD00005C061E871E002C06EE871E08CEB91E063
:100DE0000E94F80E80910801863039F4809101014B
:100DF0001F928F9389E991E00CC0809108018630A1
:100E000020F580910201909103019F938F9384EAD2
:100E100091E09F938F93CE0101966C019F938F93E6
:100E20000E94F11440E2E42E00E010E028E230E0FD
:100E30004EE057E2B6018CEB91E00E94F80E0F9065
:100E40000F900F900F900F900F90809108018830B5
:100E500009F053C0E091DB01F091DC0128EE33E0B2
:100E6000CF01B9010E9467149F938F93CF01B901FD
:100E70000E9453147F936F938CEA91E09F938F931A
:100E8000CE0101966C019F938F930E94F11430E282
:100E9000E32E00E010E028E230E04EE057E2B60139
:100EA0008CEB91E00E94F80E0FB6F894DEBF0FBEF7
:100EB000CDBF23C0609104017091050180910601AE
:100EC000909107010E94311320E030E04AE754E49A
:100ED0000E948712AB01BC0180E2882EA12CB12CAC
:100EE0009EE2C92E28E0E22EF12C0EE017E223E06C
:100EF0008CEB91E00E945B10EACE2E960FB6F89430
:100F0000DEBF0FBECDBFDF91CF911F910F91FF903C
:100F1000EF90DF90CF90BF90AF908F900895809129
:100F20000801863039F480918600909187008436DC
:100F3000910560F1809108018530A9F480918600C7
:100F4000909187008436910570F48091860090918D
:100F5000870096958795909389008093880082E317
:100F6000809301010895A0918600B091870020919F
:100F7000010130E00E94C21424E630E040E050E07D
:100F80000E947B14309389002093880008954F922B
:100F90005F926F927F928F929F92AF92BF92CF9209
:100FA000DF92EF92FF921F93CF93DF9300D000D098
:100FB000CDB7DEB760910401709105018091060103
:100FC000909107010E9431139B01AC0160E074E233
:100FD00084EF9BE40E94871220E030E040E05FE372
:100FE0000E94E6130E9400136093D5017093D6010E
:100FF0008093D7019093D8018091090190910A01C3
:10100000A0910B01B0910C0189839A83AB83BC83BF
:10101000CE0101966C0180E0EE24E394F12C812C4A
:1010200024E2922E24EFA22EB12C4091D5015091B2
:10103000D6016091D7017091D80111E0180F4130AD
:1010400051056140710548F1F601019002C0EE0CB6
:10105000FF1C0A94E2F76F01209104013091050111
:101060004091060150910701C501B4010E947B1413
:101070002701612C712CCA01B901A30192010E94C0
:101080007B142093D5013093D6014093D701509320
:10109000D801812F143049F604C0812F80618093DC
:1010A00081008091D5019091D601A091D701B09196
:1010B000D801019790938700809386000F900F903E
:1010C0000F900F90DF91CF911F91FF90EF90DF90E5
:1010D000CF90BF90AF909F908F907F906F905F90D8
:1010E0004F900C948F07809108018530F0F4809127
:1010F000040190910501A0910601B0910701813A88
:101100009648A140B10564F080EA96E8A1E0B0E01D
:101110008093040190930501A0930601B093070109
:1011200010928100109280002198809108018530F2
:1011300021F0809108018630C9F580E88093800015
:10114000219A80918100813109F047C08091860009
:1011500090918700803F9A4008F03FC08091D50170
:101160009091D601A091D701B091D80190938700BA
:1011700080938600609186007091870080E090E007
:101180000E942F139B01AC0160E074E284E79BE4B2
:101190000E9487120E94F912609304017093050166
:1011A00080930601909307010E948F07A79A809170
:1011B0000801873041F41092040110920501109249
:1011C00006011092070181E08093D40192E0909390
:1011D0006C00909368008DBB08950E94C707E6CF0E
:1011E00066E470E08CEB91E00E94BB0DE4E7F1E077
:1011F00082E0E030F80721F081918C7F84BBF8CF4A
:1012000062E08EE00E94D21162E08FE00E94D21173
:1012100062E082E00E94D21161E083E00E94D2117C
:10122000109280001092810010926F0083E08093F2
:1012300069008CB38CB315BC0E94730880E880935E
:1012400061001092610008951F920F920FB60F92E5
:1012500011242F933F934F935F936F937F938F93BB
:101260009F93AF93BF93EF93FF9310926C001092F4
:1012700068001DBAC09BC09A8091000181110AC00C
:1012800081E08093000192E090936C00909368005D
:101290008DBB29C080910801863021F485E08093C0
:1012A00008011FC080910201909103018A309105CD
:1012B00079F028F40197A9F48AE090E00EC0843612
:1012C000910549F0883E934061F481E090E005C0CB
:1012D00084E690E002C088EE93E09093030180934F
:1012E00002010E947308FF91EF91BF91AF919F910E
:1012F0008F917F916F915F914F913F912F910F90BF
:101300000FBE0F901F9018951F920F920FB60F925D
:1013100011242F933F934F935F936F937F938F93FA
:101320009F93AF93BF93EF93FF9310926C00109233
:1013300068001DBA46B1842F817090E046B141FB30
:10134000222720F930E0C09BC09A49B144704093F5
:1013500000014091000141112EC08217930761F0F6
:10136000809108018F5F8093080180910801893086
:1013700078F0109208010CC0809108018150809390
:10138000080180910801893018F088E080930801F5
:101390000E947308FF91EF91BF91AF919F918F9140
:1013A0007F916F915F914F913F912F910F900FBE61
:1013B0000F901F90189540918100413109F0A5C010
:1013C0004091860050918700403F5A4008F09DC0F0
:1013D00040910801453009F098C08217930709F43D
:1013E00066C08091D5019091D601A091D701B091AE
:1013F000D801883E9340A105B10540F480910201D7
:10140000909103018536910508F034C18091D50192
:101410009091D601A091D701B091D8018436910561
:10142000A105B10538F480910201909103010B9759
:1014300008F027C18091D5019091D601A091D701E4
:10144000B091D8010A97A105B10538F48091020145
:1014500090910301029708F01BC120910201309185
:1014600003018091D5019091D601A091D701B0914F
:10147000D801821B930BA109B1098093D5019093E8
:10148000D601A093D701B093D8018091D501909156
:10149000D601A091D701B091D8010297A105B1055D
:1014A00008F076CF82E090E0A0E0B0E025C0809127
:1014B000D5019091D601A091D701B091D801893082
:1014C0009740A105B10540F0809102019091030180
:1014D0008536910508F0E3C02091020130910301A7
:1014E0008091D5019091D601A091D701B091D801FA
:1014F000820F931FA11DB11D8093D5019093D6013A
:10150000A093D701B093D80143CF40910801463052
:1015100009F069C040918600509187004536510519
:10152000B8F08217930749F080910101843608F0E2
:101530002FCF809101018F5F08C080910101882326
:1015400009F426CF8091010181508093010120CFC1
:101550008217930789F0209188003091890080914B
:1015600086009091870028173907A8F48091880099
:101570009091890001960BC080918800909189001C
:10158000892B49F080918800909189000197909370
:101590008900809388002091880030918900809193
:1015A0008600909187008217930748F48091860007
:1015B00090918700019790938900809388002091F3
:1015C0008800309189004091860050918700A4E600
:1015D000B0E00E94C2149A0140E050E00E947B14E7
:1015E00020930101D5CE8217930789F02091020143
:1015F000309103018091040190910501A0910601B1
:10160000B0910701820F931FA11DB11D10C0209141
:101610000201309103018091040190910501A09194
:101620000601B0910701821B930BA109B1098093B8
:10163000040190930501A0930601B09307018091E6
:10164000040190910501A0910601B09107011816BF
:1016500019061A061B060CF49BCE81E090E0A0E070
:10166000B0E08093040190930501A0930601B0932C
:1016700007018ECE84E690E09093030180930201EF
:10168000C5CE8AE090E09093030180930201D2CE10
:1016900081E090E09093030180930201DECE84E626
:1016A00090E0909303018093020116CF1F920F9256
:1016B0000FB60F9211248F939F938091DD0190912B
:1016C000DE0101969093DE018093DD019F918F9161
:1016D0000F900FBE0F901F901895109281001092DE
:1016E000800081E080936F001092DE011092DD0196
:1016F000109285001092840086B386BB10929100F0
:101700001092900088B388BB9AE79093990081E18A
:101710008093980090939B0080939A0090939F00F1
:1017200080939E0085E08093910087E08093810004
:1017300088B38823E9F31092810010926F00C0995A
:1017400023C08091DD019091DE0140918400509191
:101750008500A0E0B0E0DC019927882760E070E018
:10176000842B952BA62BB72B809304019093050116
:10177000A0930601B09307011092DE011092DD01E3
:10178000109285001092840081E08093D401089526
:1017900095E890937A0010927B0010927D0021E0F2
:1017A00030E0082E01C0220F0A94EAF720937E0051
:1017B0006230B1F028F4662381F0613071F01BC013
:1017C000633099F06430B9F490E49093AD00909157
:1017D000CC009093C80060E00EC01092AD000BC02A
:1017E0001092AD009091CE0004C01092AD00909187
:1017F000CD009093C8008F7090E4699FB0011124D0
:10180000682B60937C0020E031E080E090E0DC0118
:1018100040917A00406440937A0040917A0046FDFE
:10182000FCCF4091780050917900840F951FA11D45
:10183000B11D2150310961F7892F9A2FAB2FBB279A
:101840000895CF93C82F63E00E94C80B81382CE025
:10185000920728F4969587959695879527C062E01C
:101860008C2F0E94C80B81312EE0920718F49695B8
:1018700087951CC064E08C2F0E94C80B883D2EE029
:101880009207A0F061E08C2F0E94C80BA091DB01B1
:10189000B091DC019C010E94C214DC01CB012CE060
:1018A000B695A795979587952A95D1F7CF910895E5
:1018B0000F931F9310927B0010927D0085E8809318
:1018C0007A008DE480937C0080E88093AD00809165
:1018D000CD008093C80080E091E000E010E0980126
:1018E00060917A00606460937A0060917A0066FD8E
:1018F000FCCF6091780070917900060F171F211DB1
:10190000311D019769F75527432F322F212F60E0B2
:1019100070E080E490E00E947B14C9011F910F9158
:1019200008950E94580C9093DC018093DB0183E0C2
:101930000E94210C9093DA018093D90181E0809379
:10194000D40108950F931F93A7988CE08093A00073
:101950006091040170910501809106019091070149
:101960000E9431132DEB37E346E850E40E94E61362
:101970000E940013DC01CB01209108012230D9F034
:1019800050F4222391F0213031F58D0122273327A5
:1019900040E054E01BC02330A1F02430E1F48D017D
:1019A0002227332740E052E011C08D012227332740
:1019B00040E056E00BC08D012227332740E055E080
:1019C00005C08D012227332740E053E0602F1F918F
:1019D0000F910C949B051F910F9108958091080120
:1019E000853010F40E94A20C80910801873011F418
:1019F0000E946D0B80910801883011F40E94910CB7
:101A00008091D401882321F01092D4010C94AC056C
:101A100008950F931F930DE010E02CE030E04BE0B1
:101A200050E06AE070E08CEB91E00E941A0D1F918B
:101A30000F910895DF92EF92FF920F931F93CF9330
:101A4000DF93EC01F62ED42EE22E862F972FFC0189
:101A5000EB56F54FE491F0E0EE0FFF1FE055F54F28
:101A60006591749179836883FC01E658F54FE491A0
:101A7000E887842F952FFC01EB56F54FE491F0E0B9
:101A8000EE0FFF1FE055F54F459154915B834A835C
:101A9000FC01E658F54FE491E9878E2D932FFC0168
:101AA000EB56F54FE491F0E0EE0FFF1FE055F54FD8
:101AB000259134913D832C83FC01E658F54FE49148
:101AC000EA87F801EB56F54FE491F0E0EE0FFF1FC7
:101AD000E055F54F259134913F832E83F801E65868
:101AE000F54FE491EB8761E08F2D0E94D21161E008
:101AF0008D2D0E94D21161E08E2D0E94D21161E0E5
:101B0000802F0E94D211FC860D87DF91CF911F910B
:101B10000F91FF90EF90DF900895FC01A481B581B3
:101B2000411105C082859C918095892303C09285CF
:101B30008C91892B8C9388E0A281B38167FF04C0CC
:101B400021859C91922B04C091852C919095922394
:101B50009C93660F9085A081B1812C9190959223E2
:101B60009C9300002085A081B1819C91922B9C9335
:101B7000815011F70895EF92FF920F931F93CF9327
:101B8000DF93EC018B01603871052CF477FF05C001
:101B900000E010E002C00FE710E09A85EC81FD81C3
:101BA0008081892B80839985EA81FB818081892BC3
:101BB00080839885E881F9818081892B80838B855A
:101BC000EE81FF8190818095892380836AE070E0B7
:101BD00080E090E00E9471119B85EE81FF81808101
:101BE000892B808340E061E2CE010E948D0D40E0B0
:101BF000602F6068CE010E948D0D40E066E0CE014E
:101C00000E948D0D40E063E1CE010E948D0D40E009
:101C100060E2CE010E948D0D40E060E4CE010E94A2
:101C20008D0D40E060E8CE010E948D0D88EFE82E1A
:101C3000FF24F39441E060E0CE010E948D0D81E02D
:101C4000E81AF108B9F740E06CE0CE010E948D0D72
:101C50001F861E861D8A1F8B0E8BDF91CF911F91D1
:101C60000F91FF90EF9008950F931F93CF93DF9301
:101C7000FC012589211114C0EC0140E060E40E94C0
:101C80008D0D40E060E8CE010E948D0D08EF11E05F
:101C900041E060E0CE010E948D0D01501109C1F7B5
:101CA000DF91CF911F910F9108957F928F929F9214
:101CB000AF92BF92CF92DF92EF92FF920F931F935A
:101CC000CF93DF93EC018D89811184C08889FA015B
:101CD000E80FF11DE535F1050CF07CC0898986958A
:101CE00086958695F901E80FF11D37970CF072C0C3
:101CF0005901E12CF12CF42FF0687F2EC62ED12C47
:101D0000898986958695869590E0E816F9060CF007
:101D10004AC06A2D6E0D606440E0CE010E948D0DB8
:101D200040E0672DCE010E948D0D988989898695A6
:101D3000869586952A89A601421B5109989FC00164
:101D40001124489F8001499F100D589F100D1124A8
:101D50000C5F1F4F812C912C288930E0821693064E
:101D6000F4F44C89E29EC001E39E900DF29E900D2A
:101D70001124EE85FF85800F911FE80FF91F411197
:101D800002C0649102C06491609541E0CE010E945E
:101D90008D0D5FEF851A950A0F5F1F4FDDCF8FEF17
:101DA000E81AF80AADCF40E060E4CE010E948D0D44
:101DB00040E060E8CE01DF91CF911F910F91FF903D
:101DC000EF90DF90CF90BF90AF909F908F907F90DB
:101DD0000C948D0DDF91CF911F910F91FF90EF909B
:101DE000DF90CF90BF90AF909F908F907F9008959D
:101DF0008F929F92AF92BF92CF92DF92EF92FF921B
:101E00000F931F93CF93DF937C01FC018589811190
:101E100054C0FB0101900020E9F731978F01061BA8
:101E2000170B4F30F7E25F0759F4F7014089409FE5
:101E3000C001419F900D112444E550E0481B590B0F
:101E40004E30F7E25F0789F4F7014089409FC001F7
:101E5000419F900D112444E550E0481B590B57FF5A
:101E600002C04F5F5F4F55954795EA0157FF02C08B
:101E7000C0E0D0E0C90137FD07966C0183E0D5943E
:101E8000C7948A95E1F74B01A12CB12CA016B1069D
:101E9000A4F4F40161914F01F70180898A9DA001AA
:101EA0008B9D500D11244C0F5D1F9601C7010E94A0
:101EB000550EFFEFAF1ABF0AE9CFDF91CF911F9107
:101EC0000F91FF90EF90DF90CF90BF90AF909F90D9
:101ED0008F9008952F923F924F925F926F927F92D0
:101EE0008F929F92AF92BF92CF92DF92EF92FF922A
:101EF0000F931F93CF93DF93CDB7DEB7E8970FB65D
:101F0000F894DEBF0FBECDBF1C012A013B013EABE2
:101F10002DAB18AF0FABFC0185898111B3C0411502
:101F2000510561057105F1F4E114F104B9F0DE0128
:101F3000119680E090E0FD0121E0E21AF1088E1593
:101F40009F051CF4CD920196FACFE80FF91F20E30C
:101F50002083FE01E80FF91F128286C080E3898387
:101F60001A8282C077FF0BC07094609450944094A2
:101F7000411C511C611C711CDD24D39401C0D12C67
:101F80005E013CE1A30EB11C8501C301B2012AE050
:101F900030E040E050E00E949D1420E3260FF8015D
:101FA00021938F014F018A189B08A3019201261BE0
:101FB000370B480B590BCA01B9012AE030E040E069
:101FC00050E00E949D1429013A01232B242B252B3C
:101FD000E1F6F501E80DF91D1082DD2011F08DE22A
:101FE00089838D2D90E09C01280D391D2E153F050C
:101FF000B4F4E1E0F0E0EC0FFD1FE80FF91FE81882
:10200000F908E81AF90AAF01BF01641B750B6E15D8
:102010007F051CF0F7FE05C002C0C192F5CFE12C90
:10202000F12CD501A80DB91D40E050E08E0D9F1D8B
:1020300011974815590571F0FA01E80FF91F61E091
:1020400070E06C0F7D1FE60FF71F6C9160834F5F90
:102050005F4FEECF81E090E08C0F9D1FE80EF91EE0
:10206000F701E20FF31F108280E2E82E00E010E09B
:102070002FA938AD4DA95EA9BE016F5F7F4FC10189
:102080000E94F80EE8960FB6F894DEBF0FBECDBFE3
:10209000DF91CF911F910F91FF90EF90DF90CF9044
:1020A000BF90AF909F908F907F906F905F904F9078
:1020B0003F902F9008952F923F924F925F926F9290
:1020C0007F928F92AF92BF92CF92DF92EF92FF9268
:1020D0000F931F93CF93DF93CDB7DEB76B970FB6F8
:1020E000F894DEBF0FBECDBFFC013589311154C05D
:1020F000BC2C170128016A017B013C018E010F5F96
:102100001F4F4A2DC701B6010E94D114FEE2BF162F
:1021100061F0F801CE014C96E817F90731F0208103
:102120002E3209F4B0823196F7CF80E2881641F161
:1021300020E030E0A901C701B6010E94821287FFAA
:1021400012C08DE28983FE0131969E01255E3F4FCC
:102150002E173F07A9F08181803211F08D3209F4EA
:1021600081823196F5CFFE013196CE014C96E8176B
:10217000F90731F02081203209F480823196F7CFBF
:1021800080E2E82E00E010E09101A201BE016F5F45
:102190007F4FC3010E94F80E6B960FB6F894DEBF16
:1021A0000FBECDBFDF91CF911F910F91FF90EF90A8
:1021B000DF90CF90BF90AF908F907F906F905F90A7
:1021C0004F903F902F900895DC011F967C936E9363
:1021D0001E97FB01849150968C9350973196E49111
:1021E0005196EC935197FB013296E4915296EC9301
:1021F0005297FB013396649153966C935397549680
:102200001C9208951F920F920FB60F9211242F93D4
:102210003F938F939F93AF93BF938091E0019091F1
:10222000E101A091E201B091E3013091DF0123E0EF
:10223000230F2D3720F40196A11DB11D05C026E8FE
:10224000230F0296A11DB11D2093DF018093E001B1
:102250009093E101A093E201B093E3018091E40146
:102260009091E501A091E601B091E7010196A11DD1
:10227000B11D8093E4019093E501A093E601B09332
:10228000E701BF91AF919F918F913F912F910F9057
:102290000FBE0F901F9018953FB7F8948091E401FE
:1022A0009091E501A091E601B091E70126B5A89BC8
:1022B00005C02F3F19F00196A11DB11D3FBFBA2FD8
:1022C000A92F982F8827820F911DA11DB11DBC0138
:1022D000CD0142E0660F771F881F991F4A95D1F7FD
:1022E0000895CF92DF92EF92FF92CF93DF936B012D
:1022F0007C010E944C11EB01C114D104E104F104F2
:1023000079F00E944C116C1B7D0B683E7340A0F36A
:1023100081E0C81AD108E108F108C851DC4FECCFC0
:10232000DF91CF91FF90EF90DF90CF900895789458
:1023300084B5826084BD84B5816084BD85B58260CA
:1023400085BD85B5816085BDEEE6F0E08081816068
:102350008083E1E8F0E01082808182608083808168
:1023600081608083E0E8F0E0808181608083E1EB40
:10237000F0E0808184608083E0EBF0E08081816028
:102380008083EAE7F0E080818460808380818260DE
:10239000808380818E7F808380818068808310929B
:1023A000C1000895CF93DF93282F30E0F901E6585C
:1023B000F54F9491F901EB56F54F24916330E9F410
:1023C000843071F43091F00038603EBB30E83093D7
:1023D000F0003EB33093F00030B7306430BF0DC032
:1023E000863159F43091F00030613EBB30E83093D3
:1023F000F0003EB33093F0007E9A222381F130E06A
:10240000220F331FF901E454F54FA591B491F9015E
:10241000E055F54FC591D491611109C02FB7F894DB
:102420008C91909589238C93E8819E230BC0623018
:1024300061F42FB7F8948C91392F309583238C93C6
:10244000E8819E2B98832FBF0AC0843041F08631EB
:1024500031F08FB7F894EC919E2B9C938FBFDF9156
:10246000CF9108951F93CF93DF93C2EFD0E088817F
:1024700084608EBB10E818838EB3888364E170E0BB
:1024800080E090E00E94711188818F7980628EBB1C
:1024900018838EB38883E1E6F0E010831082DF9129
:1024A000CF911F9108958091CD008ABD8091CE007B
:1024B0008BBD8091EE0087608EBB80E88093EE003C
:1024C0009EB39093EE0086BF90E496BF9091620019
:1024D0009C709C3011F40C9432128093610081E066
:1024E0008093610008950E9453120E9497110E94E8
:1024F000F008C0E0D0E00E94EE0C2097E1F30E94CB
:102500000000F9CF0E946C1308F481E008950E9446
:102510009B120C94A7130E94A01358F00E949913C9
:1025200040F029F45F3F29F00C94901351110C9462
:10253000DB130C9496130E94B81368F39923B1F33C
:10254000552391F3951B550BBB27AA2762177307D9
:10255000840738F09F5F5F4F220F331F441FAA1F6D
:10256000A9F335D00E2E3AF0E0E832D09150504029
:10257000E695001CCAF72BD0FE2F29D0660F771FD7
:10258000881FBB1F261737074807AB07B0E809F0BD
:10259000BB0B802DBF01FF2793585F4F3AF09E3F42
:1025A000510578F00C9490130C94DB135F3FE4F327
:1025B000983ED4F3869577956795B795F7959F5F85
:1025C000C9F7880F911D9695879597F90895E1E0D1
:1025D000660F771F881FBB1F621773078407BA0730
:1025E00020F0621B730B840BBA0BEE1F88F7E0958B
:1025F00008950E9400136894B1110C94DB130895A0
:102600000E94C01388F09F5798F0B92F9927B751AF
:10261000B0F0E1F0660F771F881F991F1AF0BA9586
:10262000C9F714C0B13091F00E94DA13B1E00895F7
:102630000C94DA13672F782F8827B85F39F0B93FE9
:10264000CCF3869577956795B395D9F73EF4909539
:102650008095709561957F4F8F4F9F4F0895E894B7
:1026600009C097FB3EF490958095709561957F4FDA
:102670008F4F9F4F9923A9F0F92F96E9BB27939588
:10268000F695879577956795B795F111F8CFFAF498
:10269000BB0F11F460FF1BC06F5F7F4F8F4F9F4FC9
:1026A00016C0882311F096E911C0772321F09EE827
:1026B000872F762F05C0662371F096E8862F70E08D
:1026C00060E02AF09A95660F771F881FDAF7880F67
:1026D0009695879597F90895990F0008550FAA0BBD
:1026E000E0E8FEEF16161706E807F907C0F0121625
:1026F0001306E407F50798F0621B730B840B950B28
:1027000039F40A2661F0232B242B252B21F408957C
:102710000A2609F4A140A6958FEF811D811D089519
:1027200097F99F6780E870E060E008959FEF80EC84
:10273000089500240A941616170618060906089527
:1027400000240A9412161306140605060895092E8D
:102750000394000C11F4882352F0BB0F40F4BF2BFC
:1027600011F460FF04C06F5F7F4F8F4F9F4F08953C
:1027700057FD9058440F551F59F05F3F71F0479532
:10278000880F97FB991F61F09F3F79F08795089517
:10279000121613061406551FF2CF4695F1DF08C036
:1027A000161617061806991FF1CF86957105610553
:1027B00008940895E894BB2766277727CB0197F9FB
:1027C00008950E946C1308F48FEF08950E94F91386
:1027D0000C94A7130E94991338F00E94A01320F0C4
:1027E000952311F00C9490130C94961311240C94CF
:1027F000DB130E94B81370F3959FC1F3950F50E05F
:10280000551F629FF001729FBB27F00DB11D639FA2
:10281000AA27F00DB11DAA1F649F6627B00DA11D48
:10282000661F829F2227B00DA11D621F739FB00DEE
:10283000A11D621F839FA00D611D221F749F33275E
:10284000A00D611D231F849F600D211D822F762FF7
:102850006A2F11249F5750409AF0F1F088234AF0D4
:10286000EE0FFF1FBB1F661F771F881F9150504040
:10287000A9F79E3F510580F00C9490130C94DB1344
:102880005F3FE4F3983ED4F3869577956795B795C7
:10289000F795E7959F5FC1F7FE2B880F911D9695E1
:1028A000879597F90895AA1BBB1B51E107C0AA1F82
:1028B000BB1FA617B70710F0A61BB70B881F991FE1
:1028C0005A95A9F780959095BC01CD01089597FB85
:1028D000072E16F4009407D077FD09D00E945314F8
:1028E00007FC05D03EF4909581959F4F0895709513
:1028F00061957F4F0895A1E21A2EAA1BBB1BFD0113
:102900000DC0AA1FBB1FEE1FFF1FA217B307E407CE
:10291000F50720F0A21BB30BE40BF50B661F771F26
:10292000881F991F1A9469F7609570958095909506
:102930009B01AC01BD01CF010895052E97FB1EF44C
:1029400000940E94B41457FD07D00E947B1407FC2A
:1029500003D04EF40C94B4145095409530952195C5
:102960003F4F4F4F5F4F08959095809570956195BB
:102970007F4F8F4F9F4F0895EE0FFF1F0590F491EB
:10298000E02D0994A29FB001B39FC001A39F700DD9
:10299000811D1124911DB29F700D811D1124911D67
:1029A0000895EF920F931F93CF93DF93E80147FDB4
:1029B00002C034E001C034E1042E000C550B57FF77
:1029C00003C0519541955109E32E022F242FAE01EA
:1029D0000E94F416CE01DF91CF911F910F91EF90DD
:1029E0000895AEE0B0E0E7EFF4E10C94E4190D894E
:1029F0001E8986E08C831A8309838FEF9FE79E836D
:102A00008D83AE01475E5F4F6F89788DCE01019651
:102A10000E941315EF81F885E00FF11F10822E96AA
:102A2000E4E00C94001AABE0B0E0E9E1F5E10C94CD
:102A3000D6196C017B018A01FC0117821682838101
:102A400081FFCCC1CE0101963C01F6019381F701D3
:102A500093FD859193FF81917F01882309F4BAC189
:102A6000853239F493FD859193FF81917F01853201
:102A700029F4B60190E00E943C19E7CF912C212C5B
:102A8000312CFFE1F315D8F08B3279F038F4803235
:102A900079F08332A1F4232D20611DC08D3261F0C5
:102AA000803369F4232D216016C0832D8260382E77
:102AB000E32DE4603E2E2AC0F32DF8601DC037FCE4
:102AC0002DC020ED280F2A3040F08E32B9F436FCAC
:102AD00081C1232D2064322E19C036FE06C08AE043
:102AE000989E200D1124922E11C0EAE02E9E200DFA
:102AF0001124222EF32DF0623F2E08C08C3621F4D3
:102B0000832D8068382E02C0883641F4F70193FD8A
:102B1000859193FF81917F018111B3CF982F9F7D84
:102B20009554933028F40C5F1F4F9FE399830DC099
:102B3000833631F0833771F0833509F059C021C0F5
:102B4000F801808189830E5F1F4F88248394912C24
:102B5000530113C02801F2E04F0E511CF801A08070
:102B6000B18036FE03C0692D70E002C06FEF7FEFC9
:102B7000C5010E9431194C018201F32DFF773F2ED0
:102B800016C0280122E0420E511CF801A080B1803D
:102B900036FE03C0692D70E002C06FEF7FEFC50104
:102BA0000E9426194C01F32DF0683F2E820133FC60
:102BB0001BC0822D90E088169906B0F4B60180E221
:102BC00090E00E943C192A94F4CFF50137FC8591DE
:102BD00037FE81915F01B60190E00E943C192110FF
:102BE0002A9421E0821A91088114910471F7E8C0B7
:102BF000843611F0893641F5F80137FE07C060814F
:102C00007181828193810C5F1F4F08C06081718147
:102C1000072E000C880B990B0E5F1F4FF32DFF76CC
:102C20003F2E97FF09C090958095709561957F4FD5
:102C30008F4F9F4FF0683F2E2AE030E0A3010E94A3
:102C40007819882E861845C0853731F4232D2F7EBC
:102C5000B22E2AE030E025C0932D997FB92E8F3611
:102C6000C1F018F4883579F0B5C0803719F088378D
:102C700021F0B0C0E92FE061BE2EB4FE0DC0FB2DE7
:102C8000F460BF2E09C034FE0AC0292F2660B22E80
:102C900006C028E030E005C020E130E002C020E1BD
:102CA00032E0F801B7FE07C06081718182819381B3
:102CB0000C5F1F4F06C06081718180E090E00E5F65
:102CC0001F4FA3010E947819882E8618FB2DFF77CD
:102CD0003F2E36FE0DC0232D2E7FA22E891458F4D0
:102CE00034FE0BC032FC09C0832D8E7EA82E05C099
:102CF000B82CA32C03C0B82C01C0B92CA4FE0FC063
:102D0000FE01E80DF11D8081803321F49A2D997E1A
:102D1000A92E09C0A2FE06C0B394B39404C08A2DA4
:102D2000867809F0B394A3FC11C0A0FE06C0B214CB
:102D300088F4280C922C9B180EC0B21460F4B601D3
:102D400080E290E00E943C19B394F7CFB21418F4DB
:102D50002B1802C0982C212CA4FE10C0B60180E3D1
:102D600090E00E943C19A2FE17C0A1FC03C088E7B6
:102D700090E002C088E590E0B6010CC08A2D86780C
:102D800059F0A1FE02C08BE201C080E2A7FC8DE2F7
:102D9000B60190E00E943C19891438F4B60180E332
:102DA00090E00E943C199A94F7CF8A94F301E80DC1
:102DB000F11D8081B60190E00E943C198110F5CF91
:102DC000222009F442CEB60180E290E00E943C1934
:102DD0002A94F6CFF6018681978102C08FEF9FEF8C
:102DE0002B96E2E10C94F219A9E0B0E0EAEFF6E1EB
:102DF0000C94DC196A01122FB02E2BE3201720F05F
:102E0000FF24F394F00E02C02CE3F22E0F2D27E0E6
:102E1000AE014F5F5F4F0E944E18BC014981842F65
:102E20008970813031F0E1FC06C0E0FE06C090E21E
:102E300005C09DE203C09BE201C090E05E2D507191
:102E400043FF3CC0911102C083E001C084E08117C0
:102E500018F4212F281B01C020E051110BC0F601EE
:102E6000822F30E2882319F031938150FBCFC20EBC
:102E7000D11C20E0992329F0D6019C93F6013196CC
:102E80006F01C6010396E2FE0AC03EE4D6013C9300
:102E900041E411964C93119712963C9306C03EE67E
:102EA000F601308341E641833283FC01322F40E258
:102EB000332309F442C041933150FACF42FF44C05A
:102EC000911102C083E001C084E0811718F4212F22
:102ED000281B01C020E051110BC0F601822F30E207
:102EE000882319F031938150FBCFC20ED11C20E012
:102EF000992329F0D6019C93F60131966F01C60102
:102F00000396E2FE0BC039E4D6013C933EE41196F1
:102F10003C93119736E412963C9307C039E6F601CC
:102F200030833EE6318336E63283FC01322F40E2C5
:102F3000332319F041933150FBCFFC01E20FF11D17
:102F400010828EEF9FEFA6C021E030E0911102C009
:102F500020E030E0161617061CF4FB01319602C083
:102F6000E1E0F0E02E0F3F1FBB2021F0EB2DF0E061
:102F7000319602C0E0E0F0E02E0F3F1FE12FF0E0BD
:102F80002E173F071CF4121B212F01C020E08E2DAD
:102F9000887159F4F601822F30E2882319F03193B9
:102FA0008150FBCFC20ED11C20E0992329F0D6011D
:102FB0009C93F60131966F0151110BC0F601822FDF
:102FC00090E3882319F091938150FBCFC20ED11C5E
:102FD00020E00F2D060F9A81342F307144FF03C07B
:102FE000913309F40150101624F4093018F008E068
:102FF00001C001E0AB0177FF02C040E050E0FB01FF
:10300000E41BF50BA1E0B0E0AC0FBD1FEA0FFB1F06
:103010008EE2A82E4B01801A91080B2D10E011951D
:10302000019511094F3FBFEF5B0721F4D601AC9228
:1030300011966D01641775072CF08416950614F42B
:10304000818101C080E3415051093196D60111962A
:103050007D014017510724F0D6018C936701E2CF20
:103060006417750739F4963320F4953319F4311148
:1030700001C081E3F6018083F701822F90E288236B
:1030800019F091938150FBCFF701E20FF11D1082EF
:1030900080E090E02996ECE00C94F819283008F0D4
:1030A00027E03327DA01990F311D87FD91600096E3
:1030B0006105710539F432602E5F3D9330E32A9546
:1030C000E1F708959F3F30F080387105610509F000
:1030D0003C5F3C5F3D93913008F08068911DDF9329
:1030E000CF931F930F93FF92EF92192F987F96958E
:1030F000E92F96959695E90FFF27EC52FF4F9927F8
:103100003327EE24FF24A701E701059008940794D4
:1031100028F4360FE71EF81E491F511D660F771F52
:10312000881F991F0694A1F70590079428F4E70ECD
:10313000F81E491F561FC11D770F881F991F661F54
:103140000694A1F70590079428F4F80E491F561F1E
:10315000C71FD11D880F991F661F771F0694A1F7FF
:103160000590079420F4490F561FC71FD81F990FC9
:10317000661F771F881F0694A9F784911095177012
:1031800041F0D695C79557954795F794E7941A95CA
:10319000C1F7EAE7F0E068941590159135916591D3
:1031A000959105907FE27395E118F10A430B560B58
:1031B000C90BD009C0F7E10CF11E431F561FC91FF0
:1031C000D01D7EF4703311F48A95E6CFE894015057
:1031D00030F0080F0AF40027021708F4202F239577
:1031E000022F7A3328F079E37D932A95E9F710C00E
:1031F0007D932A9589F60694979567953795179547
:103200001794E118F10A430B560BC90BD00998F03B
:1032100023957E9173957A3308F070E37C932013A5
:10322000B8F77E9170617D9330F0839571E37D9363
:1032300070E32A95E1F71124EF90FF900F911F9111
:10324000CF91DF91992787FD90950895FC01059016
:10325000615070400110D8F7809590958E0F9F1F98
:103260000895FC016150704001900110D8F78095DD
:1032700090958E0F9F1F08950F931F93CF93DF9309
:10328000FB01238121FD03C08FEF9FEF2CC022FFA4
:1032900016C046815781248135814217530744F473
:1032A000A081B1819D012F5F3F4F318320838C939B
:1032B000268137812F5F3F4F3783268314C08B01D0
:1032C000EC01FB010084F185E02D0995892BE1F6E5
:1032D000D80116968D919C911797019617969C93FD
:1032E0008E931697CE01DF91CF911F910F91089584
:1032F000FA01AA27283051F1203181F1E8946F9327
:103300006E7F6E5F7F4F8F4F9F4FAF4FB1E03ED0CC
:10331000B4E03CD0670F781F891F9A1FA11D680F6A
:10332000791F8A1F911DA11D6A0F711D811D911D9D
:10333000A11D20D009F468943F912AE0269F112412
:103340003019305D3193DEF6CF010895462F477076
:10335000405D4193B3E00FD0C9F7F6CF462F4F70D1
:10336000405D4A3318F0495D31FD4052419302D02F
:10337000A9F7EACFB4E0A6959795879577956795D5
:10338000BA95C9F700976105710508959B01AC01D5
:103390000A2E06945795479537952795BA95C9F7FC
:1033A000620F731F841F951FA01D08952F923F92D7
:1033B0004F925F926F927F928F929F92AF92BF9245
:1033C000CF92DF92EF92FF920F931F93CF93DF93F1
:1033D000CDB7DEB7CA1BDB0B0FB6F894DEBF0FBE4E
:1033E000CDBF09942A88398848885F846E847D849B
:1033F0008C849B84AA84B984C884DF80EE80FD809D
:103400000C811B81AA81B981CE0FD11D0FB6F89412
:0E341000DEBF0FBECDBFED010895F894FFCFD3
:10341E0001326400E80300000503030202467265F0
:10342E007175656E63792C20487A004672657175E8
:10343E00656E63792C206B487A00566F6C746167E9
:10344E00652C20566F6C740053696E75732044445E
:10345E005300547269616E676C6520444453004D8D
:10346E0065616E6472204444530050696C61312072
:10347E004444530050696C61322044445300505709
:10348E004D204D6F64650044757479204D6F6465F1
:10349E00004672657120636F756E74657200566FAB
:1034AE006C74206D6574657200447574793D256485
:1034BE0020252500537465703D2564005663633DD9
:0C34CE002025642E25303264207600009A
:00000001FF

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Как-то через задницу ты собираешься решать проблему. Не проще ли как-то разобраться с фразой

platnik пишет:
В ардуино нет штатных средств что бы положить конкретный массив по конкретному адресу во флэш область

Понять, что это, на самом деле, не так, и набить руку в этом (а заодно и морду тому, кто тебе это сказал)?

Вот, смотри, оба массива выровнены на границу, кратную 0x100 безо всяких проблем. Запускай, смотри какие у них адреса

#define	Align100	__attribute__ ((aligned (0x100)))
const char array1[] PROGMEM Align100 = "String 1";
const char array2[] PROGMEM Align100 = "String 1";

void setup(void) {
	Serial.begin(57600);
	Serial.print("Address of array1: 0x");
	Serial.println((uint16_t) array1, HEX);
	Serial.print("Address of array2: 0x");
	Serial.println((uint16_t) array2, HEX);
} 

void loop(void) {}
bwn
Offline
Зарегистрирован: 25.08.2014

А у самого Dimax-a чего не спросите. Чет мне чудится, что это его генератор.

Green
Offline
Зарегистрирован: 01.10.2015

Только там Dimax ещё сам этого не знал.)

platnik
Offline
Зарегистрирован: 06.07.2019

Если можно,то удалите тему,получилось...Dimax помог.Спасибо за "советы"

b707
Offline
Зарегистрирован: 26.05.2017

platnik пишет:

Спасибо за "советы"

как-то неуважительно звучит. а чем совет Ворота не устроил?