first commit
commit
6230d6dc18
|
|
@ -0,0 +1,24 @@
|
|||
Модуль для управления поворотными устройствами Yaesu серий DXA/DXC через usb
|
||||
Эмулирует протокол Yaesu GS232B для повороток с углом 450 градусов
|
||||
Параметры порта: 9600 8N1
|
||||
Поддерживаемые команды:
|
||||
BOOT - переход в bootloader
|
||||
0x18 (hex) - переход в bootloader
|
||||
CAL0 - калибровка в позиции 0 градусов(левый концевик)
|
||||
CAL90 - калибровка в позиции 90 градусов
|
||||
CAL180 - калибровка в позиции 180 градусов
|
||||
CAL270 - калибровка в позиции 270 градусов
|
||||
CAL360 - калибровка в позиции 360 градусов
|
||||
CAL450 - калибровка в позиции 450 градусов(overlap, правый концевик)
|
||||
C - чтения текущего азимута
|
||||
S - остановка вращения
|
||||
L - вращение в лево(против часовой стрелки)
|
||||
R - вращение в право(по часовой стрелке)
|
||||
Mxxx - вращение на заданный азимут, xxx - азимут
|
||||
X1 - установка скорости вращения, минимум
|
||||
X2 - установка скорости вращения, средняя 1
|
||||
X3 - установка скорости вращения, средняя 2
|
||||
X4 - установка скорости вращения, максимальная
|
||||
|
||||
Каждая команда должна заканчиваться символом возврата каретки(0x0D, \r)
|
||||
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
# Название проекта
|
||||
PRG=dxa_rotor_ctl
|
||||
# МК
|
||||
MCU=atmega88
|
||||
# Частота МК в герцах
|
||||
FREQ=8000000UL
|
||||
# GCC
|
||||
CC=avr-gcc
|
||||
# OBJCOPY
|
||||
OBJCOPY= avr-objcopy
|
||||
# SIZE
|
||||
SIZE=avr-size
|
||||
# Флаги GCC
|
||||
CFLAGS= -Wall -Os -std=gnu99 -lm
|
||||
# Флаги LD
|
||||
LDFLAGS= -Wall -lm
|
||||
# Папка с промежуточными файлами
|
||||
OBJDIR=obj
|
||||
#
|
||||
OUTDIR=out
|
||||
|
||||
# Cписок .c файлов
|
||||
C_SRC= \
|
||||
main.c
|
||||
|
||||
# Список объектных файлов (формируется автоматически на основе списка .с файлов)
|
||||
OBJS=$(C_SRC:.c=.o)
|
||||
OBJ=$(addprefix $(OBJDIR)/, $(OBJS))
|
||||
|
||||
.PHONY: all LD DIR clean
|
||||
|
||||
# Выполняем цели в указанном порядке
|
||||
all: DIR $(C_SRC) $(OBJS) LD
|
||||
|
||||
# Линковка
|
||||
LD: $(OBJ)
|
||||
$(CC) $^ -o $(OBJDIR)/$(PRG).elf $(LDFLAGS) -mmcu=$(MCU)
|
||||
$(OBJCOPY) -O ihex -R .eeprom -R .fuse -R .lock $(OBJDIR)/$(PRG).elf $(OUTDIR)/$(PRG).hex
|
||||
$(OBJCOPY) -O ihex -j .eeprom --change-section-lma .eeprom=0 $(OBJDIR)/$(PRG).elf $(OUTDIR)/$(PRG).eep
|
||||
$(SIZE) -C --format=avr --mcu=$(MCU) $(OBJDIR)/$(PRG).elf
|
||||
|
||||
#
|
||||
%.o: %.c
|
||||
$(CC) $< -o $(OBJDIR)/$@ $(CFLAGS) -mmcu=$(MCU) -DF_CPU=$(FREQ) -c
|
||||
|
||||
# Создание папок
|
||||
DIR:
|
||||
mkdir -p $(OBJDIR)
|
||||
mkdir -p $(OUTDIR)
|
||||
|
||||
#
|
||||
clean:
|
||||
rm -rf $(OBJDIR) $(OUTDIR) *.hex *.eep
|
||||
|
|
@ -0,0 +1,511 @@
|
|||
/*
|
||||
* USB rotor card
|
||||
*
|
||||
* Created: 30.05.2022
|
||||
* Update: 11.06.2022 00:34:00
|
||||
* Author : R5CA
|
||||
* Support only GS232B 450deg
|
||||
*/
|
||||
#include <avr/io.h>
|
||||
#include <util/delay.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <avr/eeprom.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include <avr/wdt.h>
|
||||
#include <avr/interrupt.h>
|
||||
|
||||
#define BAUD 9600
|
||||
#define MYUBRR F_CPU/16/BAUD-1
|
||||
|
||||
volatile uint8_t uartRXBuf[16]; // Буфер для данных принятых по UART
|
||||
volatile uint8_t uartRXBufNum = 0; // Кол-во принятых байт по UART
|
||||
volatile uint8_t uartRXC = 0; // Флаг окончания приема данных по UART
|
||||
|
||||
#define ROTOR_DDR DDRD
|
||||
#define ROTOR_PORT PORTD
|
||||
#define ROTOR_CW PD5
|
||||
#define ROTOR_CCW PD6
|
||||
#define ROTOR_AZ_IN 0 // Канал АЦП измерения азимута
|
||||
#define ROTOR_SPEED_DDR DDRB // DDR регулировки скорости
|
||||
#define ROTOR_SPEED_PORT PORTB // Порт регулировки скорости
|
||||
#define ROTOR_SPEED_PINNUM PB3 // Номер пина регулировки скорости(обязательно OC2A)
|
||||
|
||||
#define STOP 0
|
||||
#define SLOW_START 1
|
||||
#define ROTARY 2
|
||||
#define SLOW_DOWN 3
|
||||
|
||||
#define SLOW_DOWN_AZ 20 // Расстояние начала плавной остановки
|
||||
|
||||
uint16_t EEMEM EEPcal0 = 0; // EEProm значение калибровки 0 градусов
|
||||
uint16_t EEMEM EEPcal90 = 0; // EEProm значение калибровки 90 градусов
|
||||
uint16_t EEMEM EEPcal180 = 0; // EEProm значение калибровки 180 градусов
|
||||
uint16_t EEMEM EEPcal270 = 0; // EEProm значение калибровки 270 градусов
|
||||
uint16_t EEMEM EEPcal360 = 0; // EEProm значение калибровки 360 градусов
|
||||
uint16_t EEMEM EEPcal450 = 0; // EEProm значение калибровки 450 градусов
|
||||
uint8_t EEMEM EEPspeed = 128; // EEProm скорость вращения
|
||||
|
||||
uint16_t cal0 = 0; // Значение калибровки 0 градусов
|
||||
uint16_t cal90 = 0; // Значение калибровки 90 градусов
|
||||
uint16_t cal180 = 0; // Значение калибровки 180 градусов
|
||||
uint16_t cal270 = 0; // Значение калибровки 270 градусов
|
||||
uint16_t cal360 = 0; // Значение калибровки 360 градусов
|
||||
uint16_t cal450 = 0; // Значение калибровки 450 градусов
|
||||
|
||||
uint8_t rot_cw = 0; // Вращение по часовой
|
||||
uint8_t rot_ccw = 0; // Вращение против часовой
|
||||
|
||||
volatile uint8_t timer = 0; // Переменная таймера задержки плавного старта/остановки
|
||||
volatile uint16_t timer2 = 0; // Переменная таймера
|
||||
|
||||
void uartbuf_zero(void) // Обнуление буфера UART
|
||||
{
|
||||
for(uint8_t i=0; i<16; i++) // Обнуление буфера UART
|
||||
{
|
||||
uartRXBuf[i] = 0x00; // Обнуление буфера UART
|
||||
}
|
||||
}
|
||||
|
||||
void usart_init(unsigned int ubrr) // Инициализация USART
|
||||
{
|
||||
UBRR0H = (unsigned char) (ubrr >> 8); // Установка скорости
|
||||
UBRR0L = (unsigned char) ubrr; // Установка скорости
|
||||
UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); // Включаем приемник, передатчик и прерывание по приходу байта
|
||||
UCSR0C = (1<<UCSZ00)|(1<<UCSZ01); //
|
||||
}
|
||||
|
||||
void usart_tx(uint8_t data) // Передача байта по USART
|
||||
{
|
||||
while (!(UCSR0A & (1<<UDRE0))){}; // Проверяем ушел-ли предыдущий байт
|
||||
UDR0 = data; // отправляем байт
|
||||
}
|
||||
|
||||
static int uart_putchar(char c, FILE *stream);
|
||||
|
||||
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
|
||||
|
||||
static int uart_putchar(char c, FILE *stream)
|
||||
{
|
||||
if (c == '\n')
|
||||
uart_putchar('\r', stream);
|
||||
loop_until_bit_is_set(UCSR0A, UDRE0);
|
||||
UDR0 = c;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ISR(USART_RX_vect) // Прерывание по приходу байта в USART
|
||||
{
|
||||
uartRXBuf[uartRXBufNum] = UDR0; // Чтение байта
|
||||
if(uartRXBuf[uartRXBufNum] == 0x0D) // Если пришел символ конца строки
|
||||
{
|
||||
uartRXBuf[uartRXBufNum] = 0x00; // То заменяем его на 0х00
|
||||
uartRXC = 1; // Ставим флаг замершения приема строки
|
||||
}
|
||||
else if(uartRXBuf[uartRXBufNum] == 0x18) // Если надо в бут
|
||||
{
|
||||
wdt_disable(); // Ребутимся
|
||||
wdt_enable(WDTO_15MS); // Ребутимся
|
||||
while(1) {}; // Ребутимся
|
||||
}
|
||||
uartRXBufNum++; // Счетчик принятых символов
|
||||
}
|
||||
|
||||
void adc_init(void) // Инициализация АЦП
|
||||
{
|
||||
ADMUX |= (1<<REFS0); // Опора - AVCC + конденсатор на AREF
|
||||
ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1); // Включаем АЦП и устанавливаем делитель тактовой частоты
|
||||
}
|
||||
|
||||
|
||||
uint16_t adc_read(uint8_t ch) // Чтение значения АЦП
|
||||
{
|
||||
ch &= 0b00000111; // Выбор канала АЦП
|
||||
ADMUX = (ADMUX & 0xF8)|ch; // Выбор канала АЦП
|
||||
ADCSRA |= (1<<ADSC); // Старт измерения
|
||||
while(ADCSRA & (1<<ADSC)){}; // Ожидание завершения измерения
|
||||
return (ADC); // Возврат измеренного значения
|
||||
}
|
||||
|
||||
uint16_t az_raw(void) // Определение текущего азимута
|
||||
{
|
||||
uint16_t adc_val; // Переменная для хранения значения АЦП
|
||||
adc_val = adc_read(ROTOR_AZ_IN); // Чтение АЦП
|
||||
int16_t az_raw_data; // Переменная для хранения азимута
|
||||
az_raw_data = lround((adc_val - cal0)*450.0/(cal450-cal0)); // Приблизительный расчет по полной шкале 0-450
|
||||
if(adc_val <= cal0) // Если считанное значение АЦП меньше 0-ой калибровки
|
||||
{
|
||||
return 0; // То возвращаем 0
|
||||
}
|
||||
else if(adc_val >= cal450) // Если считанное значение АЦП больше 450-ой калибровки
|
||||
{
|
||||
return 450; // То возвращаем 450
|
||||
}
|
||||
else if(az_raw_data > 0 && az_raw_data < 90) // Если приблизительный азимут от 0 до 90 градусов
|
||||
{
|
||||
az_raw_data = lround((adc_val - cal0)*90.0/(cal90-cal0)); // То делаем уточненный расчет по части шкалы в 90 градусов(0-90) с использованием дополнительных калибровок
|
||||
return az_raw_data; // Возвращаем значчение азимута
|
||||
}
|
||||
else if(az_raw_data >= 90 && az_raw_data < 180) // Если приблизительный азимут от 90 до 180 градусов
|
||||
{
|
||||
az_raw_data = lround(90.0+((adc_val - cal90)*90.0/(cal180-cal90))); // То делаем уточненный расчет по части шкалы в 90 градусов(90-180) с использованием дополнительных калибровок
|
||||
return az_raw_data; // Возвращаем значчение азимута
|
||||
}
|
||||
else if(az_raw_data >= 180 && az_raw_data < 270) // Если приблизительный азимут от 180 до 270 градусов
|
||||
{
|
||||
az_raw_data = lround(180.0+((adc_val - cal180)*90.0/(cal270-cal180))); // То делаем уточненный расчет по части шкалы в 90 градусов(180-270) с использованием дополнительных калибровок
|
||||
return az_raw_data; // Возвращаем значчение азимута
|
||||
}
|
||||
else if(az_raw_data >= 270 && az_raw_data < 360) // Если приблизительный азимут от 270 до 360 градусов
|
||||
{
|
||||
az_raw_data = lround(270.0+((adc_val - cal270)*90.0/(cal360-cal270))); // То делаем уточненный расчет по части шкалы в 90 градусов(270-360) с использованием дополнительных калибровок
|
||||
return az_raw_data; // Возвращаем значчение азимута
|
||||
}
|
||||
else if(az_raw_data >= 360 && az_raw_data <= 450) // Если приблизительный азимут от 360 до 450 градусов
|
||||
{
|
||||
az_raw_data = lround(360.0+((adc_val - cal360)*90.0/(cal450-cal360))); // То делаем уточненный расчет по части шкалы в 90 градусов(360-450) с использованием дополнительных калибровок
|
||||
return az_raw_data; // Возвращаем значчение азимута
|
||||
}
|
||||
else
|
||||
{
|
||||
return az_raw_data;
|
||||
}
|
||||
}
|
||||
|
||||
void set_az(uint16_t az_r, uint16_t az_n) // Расчет кратчайшего пути для поворота антенны
|
||||
{
|
||||
int16_t cw; // Переменная для длины пути по часовой стрелке
|
||||
int16_t ccw; // Переменная для длины пути против часовой стрелки
|
||||
ccw = az_r - az_n; // Расчет пути против часовой стрелки
|
||||
if(ccw < 0) // Расчет пути против часовой стрелки
|
||||
{
|
||||
ccw += 360; // Расчет пути против часовой стрелки
|
||||
}
|
||||
cw = az_n - az_r; // Расчет пути по часовой стрелке
|
||||
if(cw < 0) // Расчет пути по часовой стрелке
|
||||
{
|
||||
cw += 360; // Расчет пути по часовой стрелке
|
||||
}
|
||||
if(cw < ccw) // Если по часовой короче, чем против
|
||||
{
|
||||
if(cw + az_r <= 450) // и получившийся азимут не выходит за возможности редуктора
|
||||
{
|
||||
rot_cw = 1; // То вращаем по часовой стрелке
|
||||
}
|
||||
else // Иначе
|
||||
{
|
||||
rot_ccw = 1; // против часовой стрелки
|
||||
}
|
||||
}
|
||||
else // Если против часовой короче, чем по
|
||||
{
|
||||
if((int16_t)az_r - (int16_t)ccw > 0) // и получившийся азимут не выходит за возможности редуктора
|
||||
{
|
||||
rot_ccw = 1; // То вращаем против часовой
|
||||
}
|
||||
else // Иначе
|
||||
{
|
||||
rot_cw = 1; // По часовой
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void pwm_init(void) // Инициализация ШИМ
|
||||
{
|
||||
TCCR2A |= (1<<COM2A1)|(1<<WGM21)|(1<<WGM20); // OC2A, Fast PWM
|
||||
TCCR2B |= (1<<CS20); // Установка делителя тактовой частоты
|
||||
}
|
||||
|
||||
ISR(TIMER0_OVF_vect) // Прерывание по переполнению таймера 0
|
||||
{
|
||||
if(timer < 255)
|
||||
{
|
||||
timer++;
|
||||
}
|
||||
if(timer2 > 0)
|
||||
{
|
||||
timer2--;
|
||||
}
|
||||
}
|
||||
|
||||
void timer0_stop(void) // Остановка таймера 0
|
||||
{
|
||||
TCCR0B &= ~(1<<CS02); // Отключаем тактирование
|
||||
TIMSK0 &= ~(1<<TOIE0); // Запрещаем прерывание
|
||||
timer = 0; // Обнуляем переменную
|
||||
}
|
||||
|
||||
void timer0_start(void) // Запуск таймера 0
|
||||
{
|
||||
TCCR0B |= (1<<CS02); // Включаем тактирование и устанавливаем делитель тактовой частоты
|
||||
TIMSK0 |= (1<<TOIE0); // Разрешаем прерывание по переполнению таймера
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
wdt_enable(WDTO_2S);
|
||||
wdt_reset();
|
||||
uint8_t step_val = 31; // Значение ШИМ для регулировки скорости
|
||||
uint8_t manual = 0; // Ручное вращение - 0, установка по азимуту - 1
|
||||
uint8_t rot_stat = 0; // Текущее состояние, 0 - остановле, 1 - плавный пуск, 2 - вращение на установленной скорости, 3 - плавная остановка
|
||||
uint8_t speed = 0; // Скорость вращения, значения для ШИМ
|
||||
uint16_t raw_az = 0; // Текущий азимут 0-450
|
||||
uint16_t new_az = 0; // Азимут установки
|
||||
uint8_t need_stop = 0;
|
||||
ROTOR_DDR |= (1<<ROTOR_CW)|(1<<ROTOR_CCW); // Настройка портов
|
||||
ROTOR_PORT &= ~((1<<ROTOR_CW)|(1<<ROTOR_CCW)); // Настройка портов
|
||||
ROTOR_SPEED_DDR |= (1<<ROTOR_SPEED_PINNUM); // Настройка портов
|
||||
ROTOR_SPEED_PORT &= ~(1<<ROTOR_SPEED_PINNUM); // Настройка портов
|
||||
adc_init(); // Инициализация АЦП
|
||||
usart_init(MYUBRR); // Инициализация UART
|
||||
stdout = &mystdout;
|
||||
cal0 = eeprom_read_word(&EEPcal0); // Чтение калибровок
|
||||
cal90 = eeprom_read_word(&EEPcal90); // Чтение калибровок
|
||||
cal180 = eeprom_read_word(&EEPcal180); // Чтение калибровок
|
||||
cal270 = eeprom_read_word(&EEPcal270); // Чтение калибровок
|
||||
cal360 = eeprom_read_word(&EEPcal360); // Чтение калибровок
|
||||
cal450 = eeprom_read_word(&EEPcal450); // Чтение калибровок
|
||||
speed = eeprom_read_byte(&EEPspeed); // Чтение максимальной скорости
|
||||
pwm_init(); // Инициализация ШИМ
|
||||
OCR2A = 0; // Скважность ШИМ - 0
|
||||
printf_P(PSTR("YAESU DXA ROTOR CARD by R5CA\n")); // Печатаем в порт
|
||||
sei(); // Глобально разрешаем прерывания
|
||||
timer0_start(); // Запускаем таймер
|
||||
wdt_reset();
|
||||
while(1)
|
||||
{
|
||||
wdt_reset();
|
||||
raw_az = az_raw(); // Считывание и расчет азимута
|
||||
if(rot_cw == 1 && (new_az - raw_az) < 1 && manual == 0) // Если разница между текущим азимутом и заданным меньше 1 градуса
|
||||
{
|
||||
rot_cw = 0; // Останавливаем вращение
|
||||
}
|
||||
if(rot_ccw == 1 && (raw_az - new_az) < 1 && manual == 0) // Если разница между текущим азимутом и заданным меньше 1 градуса
|
||||
{
|
||||
rot_ccw = 0; // Останавливаем вращение
|
||||
}
|
||||
if(rot_stat != STOP && rot_cw == 0 && rot_ccw == 0) // Ротор не остановлен и задание на вращение закончилось
|
||||
{
|
||||
ROTOR_PORT &= ~((1<<ROTOR_CW)|(1<<ROTOR_CCW)); // Останавливаем вращение
|
||||
rot_stat = STOP; // Меняем статус
|
||||
OCR2A = 0; // Скважность ШИМ - 0
|
||||
//timer0_stop(); // Останавливаем таймер
|
||||
|
||||
}
|
||||
if(timer2 == 0)
|
||||
{
|
||||
if(rot_stat == STOP && rot_cw == 1) // Ротор остановлен и получено задание на вращение по часовой стрелке
|
||||
{
|
||||
ROTOR_PORT |= (1<<ROTOR_CW); // Начинаем вращение
|
||||
rot_stat = SLOW_START; // Меняем статус
|
||||
step_val = 31; // Устанавливаем начальную скорость
|
||||
OCR2A = step_val; // Устанавливаем начальную скорость
|
||||
//timer0_start(); // Запускаем таймер
|
||||
}
|
||||
else if(rot_stat == STOP && rot_ccw == 1) // Ротор остановлен и получено задание на вращение против часовой стрелки
|
||||
{
|
||||
ROTOR_PORT |= (1<<ROTOR_CCW); // Начинаем вращение
|
||||
rot_stat = SLOW_START; // Меняем статус
|
||||
step_val = 31; // Устанавливаем начальную скорость
|
||||
OCR2A = step_val; // Устанавливаем начальную скорость
|
||||
//timer0_start(); // Запускаем таймер
|
||||
}
|
||||
}
|
||||
if(rot_stat == SLOW_START) // Плавный пуск
|
||||
{
|
||||
if(step_val < speed && timer > 20) // Текущая скорость меньше максимальной и таймер дотикал до переключения
|
||||
{
|
||||
step_val += 16; // чуть добавляем скорость
|
||||
OCR2A = step_val; // чуть добавляем скорость
|
||||
timer = 0; // обнуляем таймер
|
||||
}
|
||||
if(step_val == speed) // Если достигли максимальной скорости
|
||||
{
|
||||
rot_stat = ROTARY; // Меняем статус
|
||||
}
|
||||
}
|
||||
if((rot_stat == SLOW_START || rot_stat == ROTARY) && ((rot_ccw == 1 && ((raw_az - new_az) < SLOW_DOWN_AZ)) || (rot_cw == 1 && ((new_az - raw_az) < SLOW_DOWN_AZ))) && manual == 0) // Разница между текущим и заданным азимутом меньше, чем задана для плавной остановки
|
||||
{
|
||||
rot_stat = SLOW_DOWN; // Меняем статус
|
||||
}
|
||||
if(rot_stat == SLOW_DOWN) // Плавная остановка
|
||||
{
|
||||
if(step_val > 31 && timer > 15) // Если значение скорости больше минимальной и таймер дотикал до переключения
|
||||
{
|
||||
OCR2A = step_val; // Чуть уменьшаем скорость
|
||||
step_val -= 16; // Чуть уменьшаем скорость
|
||||
timer = 0; // обнуляем таймер
|
||||
}
|
||||
if(step_val <= 31 && need_stop == 1)
|
||||
{
|
||||
ROTOR_PORT &= ~((1<<ROTOR_CW)|(1<<ROTOR_CCW)); // Останавливаем вращение
|
||||
rot_stat = STOP; // Меняем статус
|
||||
OCR2A = 0; // Скважность ШИМ - 0
|
||||
need_stop = 0;
|
||||
}
|
||||
}
|
||||
if(uartRXC == 1) // Принята строка по UART
|
||||
{
|
||||
char uart_tmp[10];
|
||||
if(strcmp_P((char*)uartRXBuf, PSTR("BOOT")) == 0) // Получено слово для перехода в boot
|
||||
{
|
||||
wdt_disable(); // Ребутимся
|
||||
wdt_enable(WDTO_15MS); // Ребутимся
|
||||
while(1) {}; // Ребутимся
|
||||
}
|
||||
else if(strcmp_P((char*)uartRXBuf, PSTR("CAL0")) == 0) // Калибровка 0 градусов
|
||||
{
|
||||
cal0 = adc_read(ROTOR_AZ_IN); // Чтение АЦП
|
||||
eeprom_write_word(&EEPcal0, cal0); // Запись в EEPROM
|
||||
printf_P(PSTR("OK\n")); // Печатаем в порт
|
||||
}
|
||||
else if(strcmp_P((char*)uartRXBuf, PSTR("CAL90")) == 0) // Калибровка 90 градусов
|
||||
{
|
||||
cal90 = adc_read(ROTOR_AZ_IN); // Чтение АЦП
|
||||
eeprom_write_word(&EEPcal90, cal90); // Запись в EEPROM
|
||||
printf_P(PSTR("OK\n")); // Печатаем в порт
|
||||
}
|
||||
else if(strcmp_P((char*)uartRXBuf, PSTR("CAL180")) == 0) // Калибровка 180 градусов
|
||||
{
|
||||
cal180 = adc_read(ROTOR_AZ_IN); // Чтение АЦП
|
||||
eeprom_write_word(&EEPcal180, cal180); // Запись в EEPROM
|
||||
printf_P(PSTR("OK\n")); // Печатаем в порт
|
||||
}
|
||||
else if(strcmp_P((char*)uartRXBuf, PSTR("CAL270")) == 0) // Калибровка 270 градусов
|
||||
{
|
||||
cal270 = adc_read(ROTOR_AZ_IN); // Чтение АЦП
|
||||
eeprom_write_word(&EEPcal270, cal270); // Запись в EEPROM
|
||||
printf_P(PSTR("OK\n")); // Печатаем в порт
|
||||
}
|
||||
else if(strcmp_P((char*)uartRXBuf, PSTR("CAL360")) == 0) // Калибровка 360 градусов
|
||||
{
|
||||
cal360 = adc_read(ROTOR_AZ_IN); // Чтение АЦП
|
||||
eeprom_write_word(&EEPcal360, cal360); // Запись в EEPROM
|
||||
printf_P(PSTR("OK\n")); // Печатаем в порт
|
||||
}
|
||||
else if(strcmp_P((char*)uartRXBuf, PSTR("CAL450")) == 0) // Калибровка 450 градусов
|
||||
{
|
||||
cal450 = adc_read(ROTOR_AZ_IN); // Чтение АЦП
|
||||
eeprom_write_word(&EEPcal450, cal450); // Запись в EEPROM
|
||||
printf_P(PSTR("OK\n")); // Печатаем в порт
|
||||
}
|
||||
else if(strlen((char*)uartRXBuf) == 1)
|
||||
{
|
||||
if(((char*) uartRXBuf)[0] == 'C') // Получен запрос азимута
|
||||
{
|
||||
usart_tx('A'); // Печатаем в порт
|
||||
usart_tx('Z'); // Печатаем в порт
|
||||
usart_tx('='); // Печатаем в порт
|
||||
memset(uart_tmp, 0x00, 10); // Очищаем строку
|
||||
sprintf(uart_tmp, "%03d", raw_az); // печатаем азимут в строку
|
||||
for(uint8_t i=0; i < strlen(uart_tmp); i++) // Отправляем в порт строку
|
||||
{
|
||||
usart_tx(uart_tmp[i]); // Печатаем в порт
|
||||
}
|
||||
usart_tx(0x0D); // Печатаем в порт
|
||||
}
|
||||
else if(((char*) uartRXBuf)[0] == 'S') // остановка
|
||||
{
|
||||
rot_cw = 0; // Отменяем задание на вращение
|
||||
rot_ccw = 0; // Отменяем задание на вращение
|
||||
usart_tx(0x0D); // Печатаем в порт
|
||||
}
|
||||
else if(((char*) uartRXBuf)[0] == 'L' && rot_stat == STOP) // вращение против часовой
|
||||
{
|
||||
rot_ccw = 1; // Задание на вращение против часовой
|
||||
manual = 1; // Ручной режим
|
||||
usart_tx(0x0D); // Печатаем в порт
|
||||
}
|
||||
else if(((char*) uartRXBuf)[0] == 'R' && rot_stat == STOP) // вращение по часовой
|
||||
{
|
||||
rot_cw = 1; // Задание на вращение по часовой
|
||||
manual = 1; // Ручной режим
|
||||
usart_tx(0x0D); // Печатаем в порт
|
||||
}
|
||||
}
|
||||
else if(strlen((char*)uartRXBuf) == 4 && ((char*) uartRXBuf)[0] == 'M') // установка азимута
|
||||
{
|
||||
uartRXBuf[0] = uartRXBuf[1]; // Сдвиг в массиве
|
||||
uartRXBuf[1] = uartRXBuf[2]; // Сдвиг в массиве
|
||||
uartRXBuf[2] = uartRXBuf[3]; // Сдвиг в массиве
|
||||
uartRXBuf[3] = 0x00; // Конец строки
|
||||
usart_tx(0x0D); // Печатаем в порт
|
||||
new_az = atoi((char*)uartRXBuf); // Преобразуем ASCII число в значение
|
||||
uint8_t tmp1 = 0;
|
||||
uint8_t tmp2 = 0;
|
||||
if(rot_cw == 1)
|
||||
{
|
||||
tmp1 = 1;
|
||||
}
|
||||
else if(rot_ccw == 1)
|
||||
{
|
||||
tmp1 = 2;
|
||||
}
|
||||
rot_cw = 0;
|
||||
rot_ccw = 0;
|
||||
set_az(raw_az, new_az); // Устанавливаем азимут назначения
|
||||
if(rot_cw == 1)
|
||||
{
|
||||
tmp2 = 1;
|
||||
}
|
||||
else if(rot_ccw == 1)
|
||||
{
|
||||
tmp2 = 2;
|
||||
}
|
||||
if(tmp1 != 0)
|
||||
{
|
||||
if(tmp1 != tmp2)
|
||||
{
|
||||
if(rot_stat != STOP)
|
||||
{
|
||||
rot_stat = SLOW_DOWN; // Меняем статус
|
||||
need_stop = 1;
|
||||
timer2 = 375;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(rot_stat == SLOW_DOWN)
|
||||
{
|
||||
rot_stat = SLOW_START; // Меняем статус
|
||||
}
|
||||
}
|
||||
}
|
||||
manual = 0; // Автоматический режим
|
||||
}
|
||||
else if(strlen((char*)uartRXBuf) == 2)
|
||||
{
|
||||
if(strcmp_P((char*)uartRXBuf, PSTR("X1")) == 0) // Команда изменения максимальной скорости
|
||||
{
|
||||
usart_tx(0x0D); // Печатаем в порт
|
||||
speed = 63; // Устанавливаем значение скорости(скважность ШИМ 0-255)
|
||||
eeprom_write_byte(&EEPspeed, speed); // Запись в EEPROM
|
||||
}
|
||||
else if(strcmp_P((char*)uartRXBuf, PSTR("X2")) == 0) // Команда изменения максимальной скорости
|
||||
{
|
||||
usart_tx(0x0D); // Печатаем в порт
|
||||
speed = 127; // Устанавливаем значение скорости(скважность ШИМ 0-255)
|
||||
eeprom_write_byte(&EEPspeed, speed); // Запись в EEPROM
|
||||
}
|
||||
else if(strcmp_P((char*)uartRXBuf, PSTR("X3")) == 0) // Команда изменения максимальной скорости
|
||||
{
|
||||
usart_tx(0x0D); // Печатаем в порт
|
||||
speed = 191; // Устанавливаем значение скорости(скважность ШИМ 0-255)
|
||||
eeprom_write_byte(&EEPspeed, speed); // Запись в EEPROM
|
||||
}
|
||||
else if(strcmp_P((char*)uartRXBuf, PSTR("X4")) == 0) // Команда изменения максимальной скорости
|
||||
{
|
||||
usart_tx(0x0D); // Печатаем в порт
|
||||
speed = 255; // Устанавливаем значение скорости(скважность ШИМ 0-255)
|
||||
eeprom_write_byte(&EEPspeed, speed); // Запись в EEPROM
|
||||
}
|
||||
}
|
||||
cli(); // Глобально запрещаем прерывания
|
||||
uartbuf_zero(); // Обнуляем буфер UART
|
||||
uartRXBufNum = 0; // Обнуляем кол-во принятых байт
|
||||
uartRXC = 0; // Обнуляем флаг окончания приема строки
|
||||
sei(); // Глобально разрешаем прерывания
|
||||
}
|
||||
}//
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,2 @@
|
|||
:0D0000008000000000000000000000000073
|
||||
:00000001FF
|
||||
|
|
@ -0,0 +1,336 @@
|
|||
:1000000050C06AC069C068C067C066C065C064C0CF
|
||||
:1000100063C062C061C060C05FC05EC05DC05CC0E4
|
||||
:1000200037C25AC087C058C057C056C055C054C008
|
||||
:1000300053C052C058340058330058320058310071
|
||||
:100040004F4B0A0043414C343530004F4B0A0043BC
|
||||
:10005000414C333630004F4B0A0043414C3237306D
|
||||
:10006000004F4B0A0043414C313830004F4B0A00DF
|
||||
:1000700043414C3930004F4B0A0043414C30004261
|
||||
:100080004F4F540059414553552044584120524F39
|
||||
:10009000544F52204341524420627920523543410B
|
||||
:1000A0000A0011241FBECFEFD4E0DEBFCDBF11E0A8
|
||||
:1000B000A0E0B1E0E8ECF4E102C005900D92A431BB
|
||||
:1000C000B107D9F721E0A4E1B1E001C01D92AD3341
|
||||
:1000D000B207E1F717D2F6C993CFCF93C82F8A3072
|
||||
:1000E00011F48DE0FADF8091C00085FFFCCFC09352
|
||||
:1000F000C60080E090E0CF91089580E090E0FC01A0
|
||||
:10010000E95DFE4F1082019680319105C1F7089597
|
||||
:100110009093C5008093C40088E98093C10086E075
|
||||
:100120008093C20008959091C00095FFFCCF80930A
|
||||
:10013000C60008951F920F920FB60F9211248F934D
|
||||
:100140009F93EF93FF93E0912601F0E08091C6002A
|
||||
:10015000E95DFE4F8083E0912601F0E0E95DFE4F0E
|
||||
:100160008081E0912601F0E0E95DFE4F8D3029F4B9
|
||||
:10017000108281E08093250119C080818831B1F41B
|
||||
:100180000FB6F894A8958091600088618093600014
|
||||
:10019000109260000FBE98E088E10FB6F894A89521
|
||||
:1001A000809360000FBE90936000FFCF8091260186
|
||||
:1001B0008F5F80932601FF91EF919F918F910F9018
|
||||
:1001C0000FBE0F901F901895ECE7F0E080818064DF
|
||||
:1001D0008083EAE7F0E080818668808308959091CB
|
||||
:1001E0007C00987F8770892B80937C0080917A00B7
|
||||
:1001F000806480937A0080917A0086FDFCCF8091A4
|
||||
:1002000078009091790008954F925F926F927F925B
|
||||
:100210008F929F92AF92BF92EF92FF920F931F9394
|
||||
:10022000CF93DF9380E0DBDF8C01E0902301F0903F
|
||||
:100230002401BC016E197F0980E090E0CBD44B0112
|
||||
:100240005C01C0911901D0911A0120E030E041EE2B
|
||||
:1002500053E47ED52B013C01BE016E197F0980E07D
|
||||
:1002600090E0B8D49B01AC01C301B2014BD440D59E
|
||||
:10027000E016F10608F0C9C00C171D0708F0C8C049
|
||||
:100280009B012150310929353105C0F420E030E0CF
|
||||
:1002900044EB52E4C501B4015BD54B015C016091B4
|
||||
:1002A0002101709122016E197F0980E090E092D4C3
|
||||
:1002B0009B01AC01C501B40125D4A5C09B012A5501
|
||||
:1002C00031092A35310520F5C0912101D091220153
|
||||
:1002D000B8016C1B7D0B80E090E07CD420E030E026
|
||||
:1002E00044EB52E435D54B015C0160911F017091E4
|
||||
:1002F00020016C1B7D0B80E090E06CD49B01AC0175
|
||||
:10030000C501B401FFD320E030E044EB52E47AC0F1
|
||||
:100310009B01245B31092A35310520F5C0911F016D
|
||||
:10032000D0912001B8016C1B7D0B80E090E052D48D
|
||||
:1003300020E030E044EB52E40BD54B015C016091CE
|
||||
:100340001D0170911E016C1B7D0B80E090E042D47A
|
||||
:100350009B01AC01C501B401D5D320E030E044E3FA
|
||||
:1003600053E450C09B012E5031402A35310520F511
|
||||
:10037000C0911D01D0911E01B8016C1B7D0B80E066
|
||||
:1003800090E028D420E030E044EB52E4E1D44B018B
|
||||
:100390005C0160911B0170911C016C1B7D0B80E066
|
||||
:1003A00090E018D49B01AC01C501B401ABD320E0AF
|
||||
:1003B00030E047E853E426C09B01285631402B35F6
|
||||
:1003C000310548F5E0901B01F0901C01B8016E1951
|
||||
:1003D0007F0980E090E0FED320E030E044EB52E47F
|
||||
:1003E000B7D44B015C01CE19DF09BE0180E090E07B
|
||||
:1003F000F1D39B01AC01C501B40184D320E030E00E
|
||||
:1004000044EB53E41BD374D406C080E090E004C0F6
|
||||
:1004100082EC91E001C0CB01DF91CF911F910F9150
|
||||
:10042000FF90EF90BF90AF909F908F907F906F90D4
|
||||
:100430005F904F9008959C01261B370B37FF02C039
|
||||
:1004400028593E4F681B790B77FF02C068597E4FD1
|
||||
:10045000621773074CF4860F971F833C914048F452
|
||||
:1004600081E0809318010895821B930B18161906DA
|
||||
:10047000BCF781E0809317010895E0EBF0E0808104
|
||||
:1004800083688083E1EBF0E0808181608083089560
|
||||
:100490001F920F920FB60F9211248F939F9380910A
|
||||
:1004A00016018F3F29F0809116018F5F809316010E
|
||||
:1004B0008091140190911501892B49F080911401CC
|
||||
:1004C00090911501019790931501809314019F91CC
|
||||
:1004D0008F910F900FBE0F901F90189585B58B7F51
|
||||
:1004E00085BDEEE6F0E080818E7F8083109216015C
|
||||
:1004F000089585B5846085BDEEE6F0E08081816079
|
||||
:1005000080830895CF93DF93CDB7DEB72A970FB6D8
|
||||
:10051000F894DEBF0FBECDBF9FE088E10FB6F89420
|
||||
:10052000A895809360000FBE90936000A8958AB153
|
||||
:1005300080668AB98BB18F798BB9239A2B9844DE68
|
||||
:1005400083E390E0E5DD80E091E090933A018093D1
|
||||
:1005500039018BE090E059D79093240180932301D7
|
||||
:1005600089E090E052D7909322018093210187E0A7
|
||||
:1005700090E04BD79093200180931F0185E090E09D
|
||||
:1005800044D790931E0180931D0183E090E03DD7F6
|
||||
:1005900090931C0180931B0181E090E036D79093EB
|
||||
:1005A0001A018093190180E090E027D7682E65DF5B
|
||||
:1005B0001092B30084E890E09F938F935AD478947C
|
||||
:1005C00098DFA8950F900F90512CC12CD12C10E0E2
|
||||
:1005D000712C0FE14424439447E7242E33243394B1
|
||||
:1005E000CE0101965C0156E7852E50E0952EA89528
|
||||
:1005F0000BDE7C0180911801813039F4CE14DF04C8
|
||||
:1006000021F4711002C010921801809117018130FD
|
||||
:1006100039F4CE14DF0421F4711002C010921701D6
|
||||
:10062000112371F08091180181110AC08091170186
|
||||
:10063000811106C08BB18F798BB91092B30010E095
|
||||
:100640008091140190911501892BA1F4111112C010
|
||||
:1006500080911801813029F45D9A9FE19093B30055
|
||||
:10066000EAC1809117018130B9F45E9AEFE1E0931D
|
||||
:10067000B300E1C1113081F4061548F480911601F0
|
||||
:10068000853128F0005F0093B30010921601061127
|
||||
:1006900002C012E001C011E08FEF810F8230A8F498
|
||||
:1006A00080911701813029F4C7018C199D09449765
|
||||
:1006B00048F080911801813019F5C6018E199F0903
|
||||
:1006C0004497F0F4772019F01BC01330C9F40032BE
|
||||
:1006D00058F080911601803190F00093B3000051E2
|
||||
:1006E00010921601003258F4F1E05F1208C08BB18D
|
||||
:1006F0008F798BB91092B300512C10E001C013E038
|
||||
:1007000080912501813009F072CF6FE770E087E2B8
|
||||
:1007100091E09ED3892BB1F40FB6F894A8958091FF
|
||||
:100720006000886180936000109260000FBE98E0C6
|
||||
:1007300088E10FB6F894A895809360000FBE90935F
|
||||
:100740006000FFCF6AE770E087E291E081D3892BF8
|
||||
:1007500069F480E044DD9093240180932301BC017F
|
||||
:100760008BE090E065D69F928F9215C060E770E0B5
|
||||
:1007700087E291E06DD3892B91F480E030DD909396
|
||||
:10078000220180932101BC0189E090E051D68CE6E2
|
||||
:1007900090E09F938F936DD30F900F9044C165E6C7
|
||||
:1007A00070E087E291E054D3892B69F480E017DD93
|
||||
:1007B0009093200180931F01BC0187E090E038D620
|
||||
:1007C00081E690E0E6CF6AE570E087E291E040D311
|
||||
:1007D000892B69F480E003DD90931E0180931D0155
|
||||
:1007E000BC0185E090E024D686E590E0D2CF6FE4AE
|
||||
:1007F00070E087E291E02CD3892B69F480E0EFDC94
|
||||
:1008000090931C0180931B01BC0183E090E010D603
|
||||
:100810008BE490E0BECF64E470E087E291E018D30F
|
||||
:10082000892B69F480E0DBDC90931A018093190135
|
||||
:10083000BC0181E090E0FCD580E490E0AACFE7E243
|
||||
:10084000F1E001900020E9F73197CF018752914004
|
||||
:100850008130910509F04EC080912701833471F5F4
|
||||
:1008600081E461DC8AE55FDC8DE35DDC8AE0F50133
|
||||
:1008700011928A95E9F7FF92EF928EE091E09F93B3
|
||||
:100880008F93BF92AF9218D30F900F900F900F904D
|
||||
:100890000F900F90F12CF50101900020E9F73197AE
|
||||
:1008A000EA19FB098F2D90E08E179F0768F4F50178
|
||||
:1008B000E80FF91F808137DCF394EDCF833539F4ED
|
||||
:1008C00010921801109217018DE02DDCACC08C3411
|
||||
:1008D00029F41111A8C04092170107C0823509F010
|
||||
:1008E000A2C01111A0C0409218018DE01CDC772439
|
||||
:1008F000739499C08430910509F051C0809127010B
|
||||
:100900008D3409F090C08091280180932701809157
|
||||
:1009100029018093280180912A0180932901109256
|
||||
:100920002A018DE000DC87E291E075D26C018091B4
|
||||
:100930001801813039F080911701813031F432E0B3
|
||||
:10094000732E04C07724739401C0712C1092180187
|
||||
:1009500010921701B601C7016EDD80911801813038
|
||||
:1009600031F080911701813021F482E003C081E0F1
|
||||
:1009700001C080E0772009F455C0781659F01123A2
|
||||
:1009800009F450C03092150120921401552453945B
|
||||
:1009900013E048C0133009F045C011E043C002978E
|
||||
:1009A00009F041C06DE370E087E291E051D2892BFC
|
||||
:1009B00049F48DE0B8DB6FE380E090E02BD52FE3C6
|
||||
:1009C000622E31C06AE370E087E291E041D2892B68
|
||||
:1009D00049F48DE0A8DB6FE780E090E01BD59FE74E
|
||||
:1009E000692E21C067E370E087E291E031D2892B64
|
||||
:1009F00049F48DE098DB6FEB80E090E00BD58FEB56
|
||||
:100A0000682E11C064E370E087E291E021D2892B67
|
||||
:100A100051F48DE088DB6FEF80E090E0FBD466243A
|
||||
:100A20006A9401C0712CF89468DB10922601109230
|
||||
:100A300025017894DCCD0FE11FCE5058BB27AA27A3
|
||||
:100A40000ED01CC10DD130F012D120F031F49F3FF7
|
||||
:100A500011F41EF402C10EF4E095E7FBF8C0E92F93
|
||||
:100A60001ED180F3BA17620773078407950718F041
|
||||
:100A700071F49EF536C10EF4E0950B2EBA2FA02D21
|
||||
:100A80000B01B90190010C01CA01A0011124FF273B
|
||||
:100A9000591B99F0593F50F4503E68F11A16F04036
|
||||
:100AA000A22F232F342F4427585FF3CF4695379535
|
||||
:100AB0002795A795F0405395C9F77EF41F16BA0BFA
|
||||
:100AC000620B730B840BBAF09150A1F0FF0FBB1FA8
|
||||
:100AD000661F771F881FC2F70EC0BA0F621F731FF1
|
||||
:100AE000841F48F4879577956795B795F7959E3F4E
|
||||
:100AF00008F0B3CF9395880F08F09927EE0F9795DC
|
||||
:100B0000879508950CD0BAC0B2D040F0A9D030F08B
|
||||
:100B100021F45F3F19F09BC05111E4C09EC0BFD0CB
|
||||
:100B200098F39923C9F35523B1F3951B550BBB27B4
|
||||
:100B3000AA2762177307840738F09F5F5F4F220F61
|
||||
:100B4000331F441FAA1FA9F333D00E2E3AF0E0E85A
|
||||
:100B500030D091505040E695001CCAF729D0FE2FA6
|
||||
:100B600027D0660F771F881FBB1F26173707480738
|
||||
:100B7000AB07B0E809F0BB0B802DBF01FF279358EE
|
||||
:100B80005F4F2AF09E3F510568F061C0ABC05F3FE8
|
||||
:100B9000ECF3983EDCF3869577956795B795F795D6
|
||||
:100BA0009F5FC9F7880F911D9695879597F90895CE
|
||||
:100BB000E1E0660F771F881FBB1F6217730784076A
|
||||
:100BC000BA0720F0621B730B840BBA0BEE1F88F779
|
||||
:100BD000E0950895E89409C097FB3EF490958095C0
|
||||
:100BE000709561957F4F8F4F9F4F9923A9F0F92FF3
|
||||
:100BF00096E9BB279395F695879577956795B79571
|
||||
:100C0000F111F8CFFAF4BB0F11F460FF1BC06F5F56
|
||||
:100C10007F4F8F4F9F4F16C0882311F096E911C068
|
||||
:100C2000772321F09EE8872F762F05C0662371F089
|
||||
:100C300096E8862F70E060E02AF09A95660F771F9D
|
||||
:100C4000881FDAF7880F9695879597F9089597F991
|
||||
:100C50009F6780E870E060E008959FEF80EC089562
|
||||
:100C600000240A941616170618060906089500248B
|
||||
:100C70000A9412161306140605060895092E039405
|
||||
:100C8000000C11F4882352F0BB0F40F4BF2B11F479
|
||||
:100C900060FF04C06F5F7F4F8F4F9F4F089557FDD8
|
||||
:100CA0009058440F551F59F05F3F71F04795880FDA
|
||||
:100CB00097FB991F61F09F3F79F087950895121671
|
||||
:100CC00013061406551FF2CF4695F1DF08C016161D
|
||||
:100CD00017061806991FF1CF8695710561050894CE
|
||||
:100CE0000895E894BB2766277727CB0197F90895E5
|
||||
:100CF000DEDF58F19E5758F19851A0F0E9F0983096
|
||||
:100D000020F5092E9927660F771F881F991F0A94CF
|
||||
:100D1000D1F712C0062E672F782F8827985F11F41D
|
||||
:100D2000000C07C0993FB4F3869577956795939526
|
||||
:100D3000D9F7611D711D811D3EF4909580957095C8
|
||||
:100D400061957F4F8F4F9F4F08956894CBCFC9CF48
|
||||
:100D50000BD094CF85DF28F08ADF18F0952309F0B7
|
||||
:100D600076CF7BCF1124BECF9ADFA0F3959FD1F32E
|
||||
:100D7000950F50E0551F629FF001729FBB27F00D49
|
||||
:100D8000B11D639FAA27F00DB11DAA1F649F66279E
|
||||
:100D9000B00DA11D661F829F2227B00DA11D621FED
|
||||
:100DA000739FB00DA11D621F839FA00D611D221FA7
|
||||
:100DB000749F3327A00D611D231F849F600D211D8B
|
||||
:100DC000822F762F6A2F11249F5750408AF0E1F02E
|
||||
:100DD00088234AF0EE0FFF1FBB1F661F771F881F77
|
||||
:100DE00091505040A9F79E3F510570F030CF7ACF17
|
||||
:100DF0005F3FECF3983EDCF3869577956795B79562
|
||||
:100E0000F795E7959F5FC1F7FE2B880F911D96958B
|
||||
:100E1000879597F90895FC0188279927E8942191EF
|
||||
:100E20002032E9F3293010F02E30C8F32B3239F09C
|
||||
:100E30002D3231F4689403C014D0820F911D21919A
|
||||
:100E400020532A30C8F31EF4909581959F4F089542
|
||||
:100E5000FB01DC018D91059080190110D9F3990BEC
|
||||
:100E600008957AE0979F902D879F802D910D1124F2
|
||||
:100E70000895A0E0B0E0EEE3F7E0FBC2AE01495F09
|
||||
:100E80005F4FDA016D917D91AD0107E311E0F8014B
|
||||
:100E900082819381DC0113962C911397286013961D
|
||||
:100EA0002C9329D0D8011296ED91FC9113972381B0
|
||||
:100EB000277F2383E4E0F9C2AEE0B0E0E1E6F7E0AB
|
||||
:100EC000D8C20D891E8986E08C831A8309838FEF2F
|
||||
:100ED0009FE79E838D83AE01475E5F4F6F89788D5C
|
||||
:100EE000CE01019608D0EF81F885E00FF11F108246
|
||||
:100EF0002E96E4E0DAC2ABE0B0E0E0E8F7E0ABC2A7
|
||||
:100F00006C017B018A01FC0117821682838181FFBB
|
||||
:100F1000BFC1CE0101963C01F6019381F70193FD1B
|
||||
:100F2000859193FF81917F01882309F4ADC18532BA
|
||||
:100F300039F493FD859193FF81917F01853221F4EE
|
||||
:100F4000B60190E0C0D1E8CF912C212C312CFFE1EB
|
||||
:100F5000F315D8F08B3279F038F4803279F083329F
|
||||
:100F6000A1F4232D20611DC08D3261F0803369F41E
|
||||
:100F7000232D216016C0832D8260382EE32DE4607E
|
||||
:100F80003E2E2AC0F32DF8601DC037FC2DC020ED89
|
||||
:100F9000280F2A3040F08E32B9F436FC75C1232D6B
|
||||
:100FA0002064322E19C036FE06C08AE0989E200DBD
|
||||
:100FB0001124922E11C0EAE02E9E200D1124222E23
|
||||
:100FC000F32DF0623F2E08C08C3621F4832D80680B
|
||||
:100FD000382E02C0883641F4F70193FD859193FFC6
|
||||
:100FE00081917F018111B3CF982F9F7D95549330CC
|
||||
:100FF00028F40C5F1F4F9FE399830DC0833631F0B7
|
||||
:10100000833771F0833509F055C020C0F801808125
|
||||
:1010100089830E5F1F4F88248394912C530112C043
|
||||
:101020002801F2E04F0E511CF801A080B18036FE7D
|
||||
:1010300003C0692D70E002C06FEF7FEFC50138D1AA
|
||||
:101040004C018201F32DFF773F2E15C0280122E0CD
|
||||
:10105000420E511CF801A080B18036FE03C0692DFC
|
||||
:1010600070E002C06FEF7FEFC50117D14C01F32D87
|
||||
:10107000F0683F2E820133FC19C0822D90E0881663
|
||||
:101080009906A0F4B60180E290E01DD12A94F5CF34
|
||||
:10109000F50137FC859137FE81915F01B60190E043
|
||||
:1010A00012D121102A9421E0821A9108811491040E
|
||||
:1010B00079F7E1C0843611F0893639F5F80137FE49
|
||||
:1010C00007C060817181828193810C5F1F4F08C0CE
|
||||
:1010D00060817181072E000C880B990B0E5F1F4FEA
|
||||
:1010E000F32DFF763F2E97FF09C090958095709560
|
||||
:1010F00061957F4F8F4F9F4FF0683F2E2AE030E081
|
||||
:10110000A3011DD1882E861844C0853731F4232DC4
|
||||
:101110002F7EB22E2AE030E025C0932D997FB92E84
|
||||
:101120008F36C1F018F4883579F0AEC0803719F0E9
|
||||
:10113000883721F0A9C0E92FE061BE2EB4FE0DC0B2
|
||||
:10114000FB2DF460BF2E09C034FE0AC0292F266093
|
||||
:10115000B22E06C028E030E005C020E130E002C039
|
||||
:1011600020E132E0F801B7FE07C060817181828121
|
||||
:1011700093810C5F1F4F06C06081718180E090E019
|
||||
:101180000E5F1F4FA301DBD0882E8618FB2DFF7743
|
||||
:101190003F2E36FE0DC0232D2E7FA22E891458F42B
|
||||
:1011A00034FE0BC032FC09C0832D8E7EA82E05C0F4
|
||||
:1011B000B82CA32C03C0B82C01C0B92CA4FE0FC0BE
|
||||
:1011C000FE01E80DF11D8081803321F49A2D997E76
|
||||
:1011D000A92E09C0A2FE06C0B394B39404C08A2D00
|
||||
:1011E000867809F0B394A3FC10C0A0FE06C0B21428
|
||||
:1011F00080F4280C922C9B180DC0B21458F4B60140
|
||||
:1012000080E290E060D0B394F8CFB21418F42B18B9
|
||||
:1012100002C0982C212CA4FE0FC0B60180E390E000
|
||||
:1012200052D0A2FE16C0A1FC03C088E790E002C025
|
||||
:1012300088E590E0B6010CC08A2D867851F0A1FEB9
|
||||
:1012400002C08BE201C080E2A7FC8DE2B60190E013
|
||||
:101250003AD0891430F4B60180E390E034D09A9407
|
||||
:10126000F8CF8A94F301E80DF11D8081B60190E07A
|
||||
:101270002AD08110F6CF222009F44ECEB60180E2AA
|
||||
:1012800090E021D02A94F7CFF6018681978102C0A1
|
||||
:101290008FEF9FEF2B96E2E1FAC0FC0105906150C1
|
||||
:1012A00070400110D8F7809590958E0F9F1F08957C
|
||||
:1012B000FC016150704001900110D8F78095909525
|
||||
:1012C0008E0F9F1F08950F931F93CF93DF93FB0102
|
||||
:1012D000238121FD03C08FEF9FEF2CC022FF16C09A
|
||||
:1012E00046815781248135814217530744F4A081F8
|
||||
:1012F000B1819D012F5F3F4F318320838C932681E5
|
||||
:1013000037812F5F3F4F3783268314C08B01EC0159
|
||||
:10131000FB010084F185E02D0995892BE1F6D801C8
|
||||
:1013200016968D919C911797019617969C938E9384
|
||||
:101330001697CE01DF91CF911F910F910895FA0179
|
||||
:10134000AA27283051F1203181F1E8946F936E7F04
|
||||
:101350006E5F7F4F8F4F9F4FAF4FB1E03ED0B4E0F5
|
||||
:101360003CD0670F781F891F9A1FA11D680F791F36
|
||||
:101370008A1F911DA11D6A0F711D811D911DA11D47
|
||||
:1013800020D009F468943F912AE0269F1124301957
|
||||
:10139000305D3193DEF6CF010895462F4770405DF2
|
||||
:1013A0004193B3E00FD0C9F7F6CF462F4F70405DA1
|
||||
:1013B0004A3318F0495D31FD4052419302D0A9F7FC
|
||||
:1013C000EACFB4E0A6959795879577956795BA95F6
|
||||
:1013D000C9F700976105710508959B01AC010A2EBC
|
||||
:1013E00006945795479537952795BA95C9F7620F93
|
||||
:1013F000731F841F951FA01D0895F999FECF92BDFC
|
||||
:1014000081BDF89A992780B50895A8E1B0E042E03F
|
||||
:1014100050E013C0262FF999FECF1FBA92BD81BDAF
|
||||
:1014200020BD0FB6F894FA9AF99A0FBE0196089566
|
||||
:10143000F1DF272FF0CFDC01CB01FC01F999FECFC2
|
||||
:1014400006C0F2BDE1BDF89A319600B40D9241504C
|
||||
:101450005040B8F708952F923F924F925F926F924B
|
||||
:101460007F928F929F92AF92BF92CF92DF92EF9234
|
||||
:10147000FF920F931F93CF93DF93CDB7DEB7CA1BB5
|
||||
:10148000DB0B0FB6F894DEBF0FBECDBF09942A88E0
|
||||
:10149000398848885F846E847D848C849B84AA8488
|
||||
:1014A000B984C884DF80EE80FD800C811B81AA8115
|
||||
:1014B000B981CE0FD11D0FB6F894DEBF0FBECDBFE0
|
||||
:0814C000ED010895F894FFCF3F
|
||||
:1014C80000000002000000006D0000000000253050
|
||||
:0414D8003364000079
|
||||
:00000001FF
|
||||
Loading…
Reference in New Issue