fixed error: STM8S have NO opendrain mode for Tx of UART!!!

This commit is contained in:
eddyem 2018-10-11 18:15:29 +03:00
parent 994a2cdf27
commit eacc8ec5f5
12 changed files with 414 additions and 338 deletions

View File

@ -1,88 +1,87 @@
Протокол работы.
Протокол работы.
Внимание! Направление вращения (по или против часовой стрелки) относительно вида на мотор сзади!
Внимание! Направление вращения (по или против часовой стрелки) относительно вида на мотор сзади!
Контроллер поддерживает независимое управление:
- двумя униполярными шаговыми двигателями, движение которых ограничено парой концевых выключателей:
"нулевой", движение за который запрещено, и "вспомогательный", движение за который допускается, -
"вспомогательный" концевик блокирует движение в обоих направлениях, "нулевой" - только в отрицательном;
- "набортным" светодиодом (управление - только "включить/выключить");
- тремя ШИМ-каналами (частота таймера ШИМ - 200кГц, на 8 битах это дает частоту ШИМ в 781 Гц),
выходное напряжение (5В) снимается с "набортного" LDO, поэтому при необходимости отбора более
200-300мА тока (суммарно) следует использовать дополнительный MOSFET.
Контроллер поддерживает независимое управление:
- двумя униполярными шаговыми двигателями, движение которых ограничено парой концевых выключателей:
"нулевой", движение за который запрещено, и "вспомогательный", движение за который допускается, -
"вспомогательный" концевик блокирует движение в обоих направлениях, "нулевой" - только в отрицательном;
- "набортным" светодиодом (управление - только "включить/выключить");
- тремя ШИМ-каналами (частота таймера ШИМ - 200кГц, на 8 битах это дает частоту ШИМ в 781 Гц),
выходное напряжение (5В) снимается с "набортного" LDO, поэтому при необходимости отбора более
200-300мА тока (суммарно) следует использовать дополнительный MOSFET.
Управление шаговыми двигателями выполняется в полушаговом режиме.
Концевые выключатели имеют встроенные слабые подтяжки к шине питания 5В и защищены резисторами 220Ом
и суппрессором, поэтому при необходимости прокладки длинной линии к концевику следует установить
сильные внешние подтяжки. Схема: https://github.com/eddyem/scorpio/tree/master/kicad/stm8_platform
Код: https://github.com/eddyem/scorpio/tree/master/STM8/2stepper4reductor
Управление шаговыми двигателями выполняется в полушаговом режиме.
Концевые выключатели имеют встроенные слабые подтяжки к шине питания 5В и защищены резисторами 220Ом
и суппрессором, поэтому при необходимости прокладки длинной линии к концевику следует установить
сильные внешние подтяжки. Схема: https://github.com/eddyem/scorpio/tree/master/kicad/stm8_platform
Код: https://github.com/eddyem/scorpio/tree/master/STM8/2stepper4reductor
Передача данных выполняется по шине UART (5 Вольт), 9600 бит/с, 8-N-1. Для возможности установки
восьми устройств на одной линии связи, Tx микроконтроллера - открытый коллектор, поэтому необходима
внешняя подтяжка линии Rx преобразователя USB<->TTL (если таковая в нем отсутствует).
Передача данных выполняется по шине UART (5 Вольт), 9600 бит/с, 8-N-1. STM8 не имеет возможности работы
линии Tx USART в режиме "открытый коллектор", поэтому для возможности установки восьми устройств на
одной линии связи, Tx микроконтроллера включается лишь на время ответа.
Сразу после включения микроконтроллер выдает свой адрес и текст справки по доступным командам.
Базовый протокол имеет вид: `[ addr command data ]`, где
`addr` - адрес устройства (устанавливается перемычками или чип-переключателями на плате);
`command` - команда на исполнение;
`data` - (опциональные) данные команды.
В случае правильного задания параметров команд возвращается эхо команды с параметрами, иначе в ответе
присутствует err либо -1 вместо параметра. В случае ошибочной команды возвращается справка с полным
их перечнем.
Базовый протокол имеет вид: `[ addr command data ]`, где
`addr` - адрес устройства (устанавливается перемычками или чип-переключателями на плате);
`command` - команда на исполнение;
`data` - (опциональные) данные команды.
В случае правильного задания параметров команд возвращается эхо команды с параметрами, иначе в ответе
присутствует err либо -1 вместо параметра. В случае ошибочной команды возвращается справка с полным
их перечнем.
Помимо "собственного" адреса каждый контроллер откликается на команды, отправленные по адресу
"широковещательному", для этого в поле addr должна стоять литера `b`. На широковещательные посылки
контроллеры не отвечают.
Помимо "собственного" адреса каждый контроллер откликается на команды, отправленные по адресу
"широковещательному", для этого в поле addr должна стоять литера `b`.
Список команд:
`0`, `1` - команды для мотора 0 или 1;
`r` - аппаратный (при помощи watchdog'а) сброс микроконтроллера;
`G` - запрос адреса платы;
`L [параметр]` - запрос состояния "набортного" светодиода (без параметра), либо включить/выключить
светодиод (параметр, соответственно, имеет значение 1/0);
`P ch [параметр]` - запрос величины заполнения ШИМ на канале ch (ch принимает значение от 0 до 2,
отсутствие сигнала - 0, 5В - 255), либо установка значения заполнения (параметр=0..255);
`T` - запрос значения внутреннего счетчика миллисекунд (по встроенному RC-генератору).
Список команд:
`0`, `1` - команды для мотора 0 или 1;
`r` - аппаратный (при помощи watchdog'а) сброс микроконтроллера;
`G` - запрос адреса платы;
`L [параметр]` - запрос состояния "набортного" светодиода (без параметра), либо включить/выключить
светодиод (параметр, соответственно, имеет значение 1/0);
`P ch [параметр]` - запрос величины заполнения ШИМ на канале ch (ch принимает значение от 0 до 2,
отсутствие сигнала - 0, 5В - 255), либо установка значения заполнения (параметр=0..255);
`T` - запрос значения внутреннего счетчика миллисекунд (по встроенному RC-генератору).
Команды для управления моторами:
`E` - запрос состояния концевиков;
`L` - движение против часовой стрелки;
`M` - получение состояния мотора;
`N [шаги]` - если параметр "шаги" опущен, получение значения оставшихся до остановки шагов (при движении
по командам R и L эта величина равна количеству уже пройденных шагов с обратным знаком), иначе -
движение на заданное количество шагов (отрицательное значение - против часовой стрелки);
`O [шаги]` - движение по команде `N` прерывается на каждом вспомогательном концевике, чтобы сойти
с него, необходимо использовать эту команду; при опущенном значении "шаги" будет произведено
PULLOFFTHESW_STEPS (100) шагов; вне зависимости от параметра "шаги", если по истечению
PULLOFFTHESW_STEPS шагов двигатель не съедет с концевика, он будет остановлен;
`P` - получение текущей позиции (в шагах);
`R` - движение по часовой стрелке;
`S [время]` - получить ("время" опущено) или задать текущую скорость вращения; фактически эта команда
устанавливает период таймеров, генерирующих прерывания для каждого микрошага; основная частота
работы таймера - 1МГц, поэтому, например, значение время=5000 соответствует 100 шагам в секунду;
`X` - остановить двигатель;
`Z` - остановить двигатель и обнулить значение счетчика позиции; счетчик текущей позиции каждого
шагового двигателя обнуляется либо вручную при помощи данной команды, либо автоматически при
движении против часовой стрелки по команде `L` (команды `N` и `O` не сбрасывают счетчик положения
на нулевом концевике!).
Команды для управления моторами:
`E` - запрос состояния концевиков;
`L` - движение против часовой стрелки;
`M` - получение состояния мотора;
`N [шаги]` - если параметр "шаги" опущен, получение значения оставшихся до остановки шагов (при движении
по командам R и L эта величина равна количеству уже пройденных шагов с обратным знаком), иначе -
движение на заданное количество шагов (отрицательное значение - против часовой стрелки);
`O [шаги]` - движение по команде `N` прерывается на каждом вспомогательном концевике, чтобы сойти
с него, необходимо использовать эту команду; при опущенном значении "шаги" будет произведено
PULLOFFTHESW_STEPS (100) шагов; вне зависимости от параметра "шаги", если по истечению
PULLOFFTHESW_STEPS шагов двигатель не съедет с концевика, он будет остановлен;
`P` - получение текущей позиции (в шагах);
`R` - движение по часовой стрелке;
`S [время]` - получить ("время" опущено) или задать текущую скорость вращения; фактически эта команда
устанавливает период таймеров, генерирующих прерывания для каждого микрошага; основная частота
работы таймера - 1МГц, поэтому, например, значение время=5000 соответствует 100 шагам в секунду;
`X` - остановить двигатель;
`Z` - остановить двигатель и обнулить значение счетчика позиции; счетчик текущей позиции каждого
шагового двигателя обнуляется либо вручную при помощи данной команды, либо автоматически при
движении против часовой стрелки по команде `L` (команды `N` и `O` не сбрасывают счетчик положения
на нулевом концевике!).
Выводимое по команде `M` состояние двигателя фактически отражает состояние соответствующего конечного
автомата:
- `RELAX` - двигатель остановлен, напряжение питание с него снято;
- `INFMV+/-` - неограниченное по количеству шагов движение по командам `L` (-) или `R` (+);
- `STOP` - по завершению текущего шага двигатель будет остановлен;
- `MVSTP+/-` - движение на заданное количество шагов (влево/вправо в соответствии со знаком);
- `OFFSW+/-` - первые PULLOFFTHESW_STEPS шагов "съезда" с концевика (после этого состояние переходит
в `MVSTP+/-` или `STOP`);
- `UNDEF` - ошибочное (несуществующее) состояние.
Выводимое по команде `M` состояние двигателя фактически отражает состояние соответствующего конечного
автомата:
- `RELAX` - двигатель остановлен, напряжение питание с него снято;
- `INFMV+/-` - неограниченное по количеству шагов движение по командам `L` (-) или `R` (+);
- `STOP` - по завершению текущего шага двигатель будет остановлен;
- `MVSTP+/-` - движение на заданное количество шагов (влево/вправо в соответствии со знаком);
- `OFFSW+/-` - первые PULLOFFTHESW_STEPS шагов "съезда" с концевика (после этого состояние переходит
в `MVSTP+/-` или `STOP`);
- `UNDEF` - ошибочное (несуществующее) состояние.
Скорость вращения шаговых двигателей лежит в пределах от MIN_USTEP_PERIOD (800мкс на полушаг, т.е.
625 шагов в секунду) до MAX_USTEP_PERIOD (20000мкс на полушаг, т.е. 25 шагов в секунду). Первые
ACCEL_USTEPS (100) полушагов двигатели вращаются с постоянным ускорением вплоть до достижения
заданной скорости движения, по умолчанию эта скорость составляет DEFAULT_USTEP_PERIOD (2500мкс на
полушаг, т.е. 200 шагов в секунду).
Скорость вращения шаговых двигателей лежит в пределах от MIN_USTEP_PERIOD (800мкс на полушаг, т.е.
625 шагов в секунду) до MAX_USTEP_PERIOD (20000мкс на полушаг, т.е. 25 шагов в секунду). Первые
ACCEL_USTEPS (100) полушагов двигатели вращаются с постоянным ускорением вплоть до достижения
заданной скорости движения, по умолчанию эта скорость составляет DEFAULT_USTEP_PERIOD (2500мкс на
полушаг, т.е. 200 шагов в секунду).
Примеры:
Примеры:
[00E] -> [ 0 0 E 0 ] (no esw)
[01E] -> [ 0 1 E 3 ] (both - bad situation)
[00L] -> [ 0 0 L ] (all OK)
@ -99,7 +98,7 @@ ACCEL_USTEPS (100) полушагов двигатели вращаются с
[01S1500] -> [ 0 1 S 1500 ] (set speed value)
[01X] -> [ 0 1 X ]
[01Z] -> [ 0 1 Z ]
[0r] -> сброс
[0r] -> сброс
[0G] -> [ 0 G 0 ]
[0L] -> [ 0 L 0 ], [0L1] -> [ 0 L 1 ], [0L] -> [ 0 L 1 ]
[0P] -> [ 0 P 0 0 ], [0P0100] -> [ 0 P 0 100 ], [0P0] -> [ 0 P 0 100 ], [0P510] -> [ 0 P -1 ], [0P0500] -> [ 0 P 0 -1 ]

View File

@ -123,23 +123,7 @@ INTERRUPT_HANDLER(I2C_IRQHandler, 19){}
#if defined(STM8S105) || defined(STM8S005) || defined (STM8AF626x)
// UART2 TX interrupt
INTERRUPT_HANDLER(UART2_TX_IRQHandler, 20){
if(UART2_SR & UART_SR_TXE){
if(tx_len == 0){
UART2_CR2 &= ~UART_CR2_TIEN; // disable TXE interrupt
tx_idx = 0;
return;
}
if(tx_idx < tx_len){
UART2_DR = UART_tx[tx_idx++];
}else{
UART2_CR2 &= ~UART_CR2_TIEN;
tx_idx = 0;
tx_len = 0;
return;
}
}
}
INTERRUPT_HANDLER(UART2_TX_IRQHandler, 20){}
// UART2 RX interrupt
INTERRUPT_HANDLER(UART2_RX_IRQHandler, 21){

View File

@ -25,8 +25,8 @@
#include "motors.h"
int main() {
char A[3] = {'x', '\n', 0};
unsigned long T = 0L;
//char A[3] = {'x', '\n', 0};
//unsigned long T = 0L;
if(RST_SR) RST_SR = 0x1f; // clear reset flags writing 1
hw_init();
@ -34,21 +34,23 @@ int main() {
uart_init();
// enable all interrupts
enableInterrupts();
// remove this code if nesessary
/* remove this code if nesessary
uart_write("\n\nHello! My address is ");
A[0] = MCU_no + '0';
uart_write(A);
show_help(); // show protocol help @start
*/
// Loop
do{
/*if(Global_time - T > paused_val){
/*if(Global_time - T > 10000){
;
}*/
IWDG_KR = KEY_REFRESH; // refresh watchdog
if(uart_rdy){
process_string();
}
process_stepper(0);
process_stepper(1);
/*process_stepper(0);
process_stepper(1);*/
}while(1);
}

View File

@ -123,6 +123,8 @@ static void stop_motor(U8 motorNum){
}
Steps_left[motorNum] = 0;
Dir[motorNum] = DIR_STOP;
if(state[motorNum] == MOTOR_ZEROSTOP) Current_pos[motorNum] = 0;
state[motorNum] = MOTOR_RELAX;
}
static void strtobuf(const char *str, char **buff){
@ -332,6 +334,8 @@ void motor_command(const char *cmd, char **buff){
void stepper_interrupt(U8 motor_num){
U8 tmp;
U16 spd;
U8 sw = check_endsw(motor_num), st = state[motor_num];
U8 ccw = (Dir[motor_num] == DIR_CCW) ? 1 : 0;
//irq_flag ^= 1 << motor_num;
switch(motor_num){
case 0:
@ -367,25 +371,44 @@ void stepper_interrupt(U8 motor_num){
default: return;
}
if(Ustep[motor_num] % 2 == 0){ // full amount of half-steps - increment step counters & check for stop
--Steps_left[motor_num];
if(Dir[motor_num] == DIR_CCW) --Current_pos[motor_num];
if(0 == --Steps_left[motor_num]) st = MOTOR_STOP;
if(ccw) --Current_pos[motor_num];
else ++Current_pos[motor_num];
if(state[motor_num] == MOTOR_STOP || state[motor_num] == MOTOR_ZEROSTOP){
if(st == MOTOR_STOP || st == MOTOR_ZEROSTOP){
stop_motor(motor_num);
return;
}
}
if(Dir[motor_num] == DIR_CCW){ // counter-clockwise
if(ccw){ // counter-clockwise
if(Ustep[motor_num] == 0) Ustep[motor_num] = 7;
else --Ustep[motor_num];
}else{ // clockwise
if(++Ustep[motor_num] > 7) Ustep[motor_num] = 0;
}
switch(st){
case MOTOR_OFFSWITCH: // don't care about endswitch for first PULLOFFTHESW_STEPS steps
if(Steps_left_at_esw[motor_num] - Steps_left[motor_num] >= PULLOFFTHESW_STEPS)
state[motor_num] = MOTOR_MOVENSTEPS;
break;
case MOTOR_MOVENSTEPS:
case MOTOR_INFMOVE: // set curpos to zero only in this state (after reaching ESW1)
if(sw){
if(ccw){
if(st == MOTOR_INFMOVE){
if(sw & 1) state[motor_num] = MOTOR_ZEROSTOP; // esw1 - stop @ zero when inf. left move
}else state[motor_num] = MOTOR_STOP; // just stop at any esw in steps move
}else{ // +switch when move CW
if(sw & 2) state[motor_num] = MOTOR_STOP; // stop in CW only on esw2 !!!
}
}
break;
default: break;
}
}
/**
* Main state-machine process
*/
*
void process_stepper(U8 motor_num){
U8 sw = check_endsw(motor_num);
U8 ccw = (Dir[motor_num] == DIR_CCW) ? 1 : 0;
@ -408,18 +431,6 @@ void process_stepper(U8 motor_num){
}
}
break;
case MOTOR_STOP:
if(Dir[motor_num] == DIR_STOP){
state[motor_num] = MOTOR_RELAX;
}
break;
case MOTOR_ZEROSTOP:
if(Dir[motor_num] == DIR_STOP){
Current_pos[motor_num] = 0;
state[motor_num] = MOTOR_RELAX;
}
break;
default: return; // MOTOR_RELAX
}
//if(irq_flag & (1<<motor_num)) stepper_interrupt(motor_num);
}
}*/

View File

@ -34,7 +34,7 @@
// amount of steps to pull off the switch
#define PULLOFFTHESW_STEPS (100)
// amount of microsteps for acceleration calculation (50 full steps)
#define ACCEL_USTEPS (100)
#define ACCEL_USTEPS (100)
//extern unsigned char irq_flag;
@ -44,6 +44,6 @@ void motor_command(const char *cmd, char **bufptr);
void stepper_interrupt(unsigned char motor_num);
void process_stepper(unsigned char stepno);
//void process_stepper(unsigned char stepno);
#endif // __MOTORS_H__

View File

@ -157,6 +157,8 @@ void process_string(){
rx_idx = 0;
return;
}
if(mcuno == BROADCAST_ADDR) broadcast = 1;
else broadcast = 0;
// rx_idx is length of incoming message; next char is '\0', copy it too
for(ctr = 0; ctr < rx_idx; ++ctr) *iptr++ = *optr++;
rx_idx = 0; uart_rdy = 0; // command read, buffer ready to get more data

View File

@ -326,8 +326,6 @@ UART_SR_TXE
UART_TX_PINÌ65536Ö0
UART_rxÌ16384Ö0ÏU8
UART_rxÌ32768Ö0ÏU8
UART_txÌ16384Ö0ÏU8
UART_txÌ32768Ö0ÏU8
UstepÌ16384Ö0ÏU8
WWDG_CRÌ65536Ö0
WWDG_WRÌ65536Ö0
@ -391,10 +389,81 @@ __ELF__
__EXCEPTIONSÌ65536Ö0
__FINITE_MATH_ONLY__Ì65536Ö0
__FLOAT_WORD_ORDER__Ì65536Ö0
__FLT128_DECIMAL_DIG__Ì65536Ö0
__FLT128_DENORM_MIN__Ì65536Ö0
__FLT128_DIG__Ì65536Ö0
__FLT128_EPSILON__Ì65536Ö0
__FLT128_HAS_DENORM__Ì65536Ö0
__FLT128_HAS_INFINITY__Ì65536Ö0
__FLT128_HAS_QUIET_NAN__Ì65536Ö0
__FLT128_MANT_DIG__Ì65536Ö0
__FLT128_MAX_10_EXP__Ì65536Ö0
__FLT128_MAX_EXP__Ì65536Ö0
__FLT128_MAX__Ì65536Ö0
__FLT128_MIN_10_EXP__Ì65536Ö0
__FLT128_MIN_EXP__Ì65536Ö0
__FLT128_MIN__Ì65536Ö0
__FLT32X_DECIMAL_DIG__Ì65536Ö0
__FLT32X_DENORM_MIN__Ì65536Ö0
__FLT32X_DIG__Ì65536Ö0
__FLT32X_EPSILON__Ì65536Ö0
__FLT32X_HAS_DENORM__Ì65536Ö0
__FLT32X_HAS_INFINITY__Ì65536Ö0
__FLT32X_HAS_QUIET_NAN__Ì65536Ö0
__FLT32X_MANT_DIG__Ì65536Ö0
__FLT32X_MAX_10_EXP__Ì65536Ö0
__FLT32X_MAX_EXP__Ì65536Ö0
__FLT32X_MAX__Ì65536Ö0
__FLT32X_MIN_10_EXP__Ì65536Ö0
__FLT32X_MIN_EXP__Ì65536Ö0
__FLT32X_MIN__Ì65536Ö0
__FLT32_DECIMAL_DIG__Ì65536Ö0
__FLT32_DENORM_MIN__Ì65536Ö0
__FLT32_DIG__Ì65536Ö0
__FLT32_EPSILON__Ì65536Ö0
__FLT32_HAS_DENORM__Ì65536Ö0
__FLT32_HAS_INFINITY__Ì65536Ö0
__FLT32_HAS_QUIET_NAN__Ì65536Ö0
__FLT32_MANT_DIG__Ì65536Ö0
__FLT32_MAX_10_EXP__Ì65536Ö0
__FLT32_MAX_EXP__Ì65536Ö0
__FLT32_MAX__Ì65536Ö0
__FLT32_MIN_10_EXP__Ì65536Ö0
__FLT32_MIN_EXP__Ì65536Ö0
__FLT32_MIN__Ì65536Ö0
__FLT64X_DECIMAL_DIG__Ì65536Ö0
__FLT64X_DENORM_MIN__Ì65536Ö0
__FLT64X_DIG__Ì65536Ö0
__FLT64X_EPSILON__Ì65536Ö0
__FLT64X_HAS_DENORM__Ì65536Ö0
__FLT64X_HAS_INFINITY__Ì65536Ö0
__FLT64X_HAS_QUIET_NAN__Ì65536Ö0
__FLT64X_MANT_DIG__Ì65536Ö0
__FLT64X_MAX_10_EXP__Ì65536Ö0
__FLT64X_MAX_EXP__Ì65536Ö0
__FLT64X_MAX__Ì65536Ö0
__FLT64X_MIN_10_EXP__Ì65536Ö0
__FLT64X_MIN_EXP__Ì65536Ö0
__FLT64X_MIN__Ì65536Ö0
__FLT64_DECIMAL_DIG__Ì65536Ö0
__FLT64_DENORM_MIN__Ì65536Ö0
__FLT64_DIG__Ì65536Ö0
__FLT64_EPSILON__Ì65536Ö0
__FLT64_HAS_DENORM__Ì65536Ö0
__FLT64_HAS_INFINITY__Ì65536Ö0
__FLT64_HAS_QUIET_NAN__Ì65536Ö0
__FLT64_MANT_DIG__Ì65536Ö0
__FLT64_MAX_10_EXP__Ì65536Ö0
__FLT64_MAX_EXP__Ì65536Ö0
__FLT64_MAX__Ì65536Ö0
__FLT64_MIN_10_EXP__Ì65536Ö0
__FLT64_MIN_EXP__Ì65536Ö0
__FLT64_MIN__Ì65536Ö0
__FLT_DECIMAL_DIG__Ì65536Ö0
__FLT_DENORM_MIN__Ì65536Ö0
__FLT_DIG__Ì65536Ö0
__FLT_EPSILON__Ì65536Ö0
__FLT_EVAL_METHOD_TS_18661_3__Ì65536Ö0
__FLT_EVAL_METHOD__Ì65536Ö0
__FLT_HAS_DENORM__Ì65536Ö0
__FLT_HAS_INFINITY__Ì65536Ö0
@ -455,25 +524,37 @@ __INTERRUPTS_H__
__INTMAX_CÌ131072Í(c)Ö0
__INTMAX_MAX__Ì65536Ö0
__INTMAX_TYPE__Ì65536Ö0
__INTMAX_WIDTH__Ì65536Ö0
__INTPTR_MAX__Ì65536Ö0
__INTPTR_TYPE__Ì65536Ö0
__INTPTR_WIDTH__Ì65536Ö0
__INT_FAST16_MAX__Ì65536Ö0
__INT_FAST16_TYPE__Ì65536Ö0
__INT_FAST16_WIDTH__Ì65536Ö0
__INT_FAST32_MAX__Ì65536Ö0
__INT_FAST32_TYPE__Ì65536Ö0
__INT_FAST32_WIDTH__Ì65536Ö0
__INT_FAST64_MAX__Ì65536Ö0
__INT_FAST64_TYPE__Ì65536Ö0
__INT_FAST64_WIDTH__Ì65536Ö0
__INT_FAST8_MAX__Ì65536Ö0
__INT_FAST8_TYPE__Ì65536Ö0
__INT_FAST8_WIDTH__Ì65536Ö0
__INT_LEAST16_MAX__Ì65536Ö0
__INT_LEAST16_TYPE__Ì65536Ö0
__INT_LEAST16_WIDTH__Ì65536Ö0
__INT_LEAST32_MAX__Ì65536Ö0
__INT_LEAST32_TYPE__Ì65536Ö0
__INT_LEAST32_WIDTH__Ì65536Ö0
__INT_LEAST64_MAX__Ì65536Ö0
__INT_LEAST64_TYPE__Ì65536Ö0
__INT_LEAST64_WIDTH__Ì65536Ö0
__INT_LEAST8_MAX__Ì65536Ö0
__INT_LEAST8_TYPE__Ì65536Ö0
__INT_LEAST8_WIDTH__Ì65536Ö0
__INT_MAX__Ì65536Ö0
__INT_WIDTH__Ì65536Ö0
__LDBL_DECIMAL_DIG__Ì65536Ö0
__LDBL_DENORM_MIN__Ì65536Ö0
__LDBL_DIG__Ì65536Ö0
__LDBL_EPSILON__Ì65536Ö0
@ -488,7 +569,9 @@ __LDBL_MIN_10_EXP__
__LDBL_MIN_EXP__Ì65536Ö0
__LDBL_MIN__Ì65536Ö0
__LONG_LONG_MAX__Ì65536Ö0
__LONG_LONG_WIDTH__Ì65536Ö0
__LONG_MAX__Ì65536Ö0
__LONG_WIDTH__Ì65536Ö0
__LP64__Ì65536Ö0
__MMX__Ì65536Ö0
__MOTORS_H__Ì65536Ö0
@ -502,14 +585,18 @@ __PRAGMA_REDEFINE_EXTNAME
__PROTO_H__Ì65536Ö0
__PTRDIFF_MAX__Ì65536Ö0
__PTRDIFF_TYPE__Ì65536Ö0
__PTRDIFF_WIDTH__Ì65536Ö0
__REGISTER_PREFIX__Ì65536Ö0
__SCHAR_MAX__Ì65536Ö0
__SCHAR_WIDTH__Ì65536Ö0
__SEG_FSÌ65536Ö0
__SEG_GSÌ65536Ö0
__SHRT_MAX__Ì65536Ö0
__SHRT_WIDTH__Ì65536Ö0
__SIG_ATOMIC_MAX__Ì65536Ö0
__SIG_ATOMIC_MIN__Ì65536Ö0
__SIG_ATOMIC_TYPE__Ì65536Ö0
__SIG_ATOMIC_WIDTH__Ì65536Ö0
__SIZEOF_DOUBLE__Ì65536Ö0
__SIZEOF_FLOAT128__Ì65536Ö0
__SIZEOF_FLOAT80__Ì65536Ö0
@ -527,6 +614,7 @@ __SIZEOF_WCHAR_T__
__SIZEOF_WINT_T__Ì65536Ö0
__SIZE_MAX__Ì65536Ö0
__SIZE_TYPE__Ì65536Ö0
__SIZE_WIDTH__Ì65536Ö0
__SSE2_MATH__Ì65536Ö0
__SSE2__Ì65536Ö0
__SSE_MATH__Ì65536Ö0
@ -580,9 +668,11 @@ __VERSION__
__WCHAR_MAX__Ì65536Ö0
__WCHAR_MIN__Ì65536Ö0
__WCHAR_TYPE__Ì65536Ö0
__WCHAR_WIDTH__Ì65536Ö0
__WINT_MAX__Ì65536Ö0
__WINT_MIN__Ì65536Ö0
__WINT_TYPE__Ì65536Ö0
__WINT_WIDTH__Ì65536Ö0
__amd64Ì65536Ö0
__amd64__Ì65536Ö0
__code_model_small__Ì65536Ö0
@ -614,6 +704,7 @@ __cpp_rvalue_reference
__cpp_rvalue_referencesÌ65536Ö0
__cpp_sized_deallocationÌ65536Ö0
__cpp_static_assertÌ65536Ö0
__cpp_threadsafe_static_initÌ65536Ö0
__cpp_unicode_charactersÌ65536Ö0
__cpp_unicode_literalsÌ65536Ö0
__cpp_user_defined_literalsÌ65536Ö0
@ -634,6 +725,8 @@ __x86_64
__x86_64__Ì65536Ö0
anon_enum_0Ì2Ö0
anon_enum_1Ì2Ö0
broadcastÌ16384Ö0ÏU8
broadcastÌ32768Ö0ÏU8
check_endswÌ16Í(U8 motor)Ö0ÏU8
disableInterruptsÌ131072Í()Ö0
enableInterruptsÌ131072Í()Ö0
@ -641,7 +734,6 @@ get_motor_state
haltÌ131072Í()Ö0
hw_initÌ16Í()Ö0Ïvoid
hw_initÌ1024Í()Ö0Ïvoid
ibufÌ16384Ö0Ïchar
iretÌ131072Í()Ö0
linuxÌ65536Ö0
long2bufÌ16Í(long Number, char **buf)Ö0Ïvoid
@ -654,15 +746,10 @@ motors_init
motors_initÌ1024Í()Ö0Ïvoid
moveNstepsÌ16Í(U8 motorNum, long nsteps)Ö0Ïint
nopÌ131072Í()Ö0
obufÌ16384Ö0Ïchar
omit_whitespaceÌ1024Í(char *str)Ö0Ïchar *
pop_ccrÌ131072Í()Ö0
printUintÌ16Í(const U8 *val, U8 len)Ö0Ïvoid
printUintÌ1024Í(const U8 *val, U8 len)Ö0Ïvoid
process_commandsÌ16Í(char *cmd)Ö0ÏU8
process_stepperÌ16Í(U8 motor_num)Ö0Ïvoid
process_stepperÌ1024Í(unsigned char stepno)Ö0Ïvoid
process_stringÌ16Í()Ö0Ïvoid
process_stringÌ1024Í()Ö0Ïvoid
pullofftheswitchÌ16Í(U8 motorNum, long nsteps)Ö0Ïint
push_ccrÌ131072Í()Ö0
@ -671,8 +758,6 @@ readLong
rimÌ131072Í()Ö0
rx_idxÌ16384Ö0ÏU8
rx_idxÌ32768Ö0ÏU8
set_PWMÌ16Í(char *cmd, char **buff)Ö0Ïvoid
show_helpÌ16Í()Ö0Ïvoid
show_helpÌ1024Í()Ö0Ïvoid
show_motors_helpÌ16Í()Ö0Ïvoid
show_motors_helpÌ1024Í()Ö0Ïvoid
@ -684,10 +769,6 @@ stop_motor
strtobufÌ16Í(const char *str, char **buff)Ö0Ïvoid
trapÌ131072Í()Ö0
turnontimerÌ16Í(U8 motorNum)Ö0Ïvoid
tx_idxÌ16384Ö0ÏU8
tx_idxÌ32768Ö0ÏU8
tx_lenÌ16384Ö0ÏU8
tx_lenÌ32768Ö0ÏU8
uart_initÌ16Í()Ö0Ïvoid
uart_initÌ1024Í()Ö0Ïvoid
uart_rdyÌ16384Ö0ÏU8

View File

@ -28,11 +28,14 @@ long_line_behaviour=1
long_line_column=100
[files]
current_page=3
FILE_NAME_0=832;Make;0;EUTF-8;1;1;0;%2Fhome%2Feddy%2FDocs%2FSAO%2FELECTRONICS%2FSTM8%2FSCORPIO_steppers%2FMakefile;0;4
FILE_NAME_1=1253;C;0;EUTF-8;0;1;0;%2Fhome%2Feddy%2FDocs%2FSAO%2FELECTRONICS%2FSTM8%2FSCORPIO_steppers%2Fmain.c;0;4
FILE_NAME_2=891;C;0;EUTF-8;0;1;0;%2Fhome%2Feddy%2FDocs%2FSAO%2FELECTRONICS%2FSTM8%2FSCORPIO_steppers%2Fuart.c;0;4
FILE_NAME_3=0;C;0;EUTF-8;0;1;0;%2Fhome%2Feddy%2FDocs%2FSAO%2FELECTRONICS%2FSTM8%2FSCORPIO_steppers%2Fuart.h;0;4
current_page=6
FILE_NAME_0=319;Make;0;EUTF-8;1;1;0;%2Fhome%2Feddy%2FDocs%2FSAO%2FELECTRONICS%2FSTM8%2FSCORPIO_steppers%2FMakefile;0;4
FILE_NAME_1=1296;C;0;EUTF-8;0;1;0;%2Fhome%2Feddy%2FDocs%2FSAO%2FELECTRONICS%2FSTM8%2FSCORPIO_steppers%2Fmain.c;0;4
FILE_NAME_2=1815;C;0;EKOI8-R;0;1;0;%2Fhome%2Feddy%2FDocs%2FSAO%2FELECTRONICS%2FSTM8%2FSCORPIO_steppers%2Fhardware.c;0;4
FILE_NAME_3=1949;C;0;EUTF-8;0;1;0;%2Fhome%2Feddy%2FDocs%2FSAO%2FELECTRONICS%2FSTM8%2FSCORPIO_steppers%2Fhardware.h;0;4
FILE_NAME_4=2535;C;0;EUTF-8;0;1;0;%2Fhome%2Feddy%2FDocs%2FSAO%2FELECTRONICS%2FSTM8%2FSCORPIO_steppers%2Finterrupts.c;0;4
FILE_NAME_5=1553;C;0;EKOI8-R;0;1;0;%2Fhome%2Feddy%2FDocs%2FSAO%2FELECTRONICS%2FSTM8%2FSCORPIO_steppers%2Fuart.c;0;4
FILE_NAME_6=1340;C;0;EKOI8-R;0;1;0;%2Fhome%2Feddy%2FDocs%2FSAO%2FELECTRONICS%2FSTM8%2FSCORPIO_steppers%2Fuart.h;0;4
[VTE]
last_dir=/home/eddy
last_dir=/home/eddy/Docs/SAO/ELECTRONICS/STM8/SCORPIO_steppers

View File

@ -1,199 +1,187 @@
:2080A40072107F60350050C635075345357D53463501534135855340350F5007350F5008A3
:2080C400351E500C351E500D350E500E350F5011350F5012AE5008F6AA10F7AE5008F6AAFE
:2080E40020F7721E5012AE5012F6AA10F7AE500AF6AA10F735CC50E0355550E0350650E1B6
:2081040035FF50E235AA50E0AE500BF6A4E04EA40F44C7006635005260354F52613500524C
:2081040035FF50E235AA50E0AE500BF6A4E04EA40F44C7004635005260354F52613500526C
:208124006235FF526335005265350052663500526735005268350052693500526A35705262
:1A81440058357052593570525A3511525C3501525D35815250721E526D8127
:05979B000000000000C9
:0596180000000000004D
:04808300725F000127
:20815E008080808080808080808080AE5302F6A501270CA4FEAE5302F74B00CD8D37848033
:20817E0080AE5322F6A501270CA4FEAE5322F74B01CD8D37848080805202AE5240F64D2AD1
:20819E0043725D006A260DAE5245F6A47FF7725F00692030C6006AC100692319AE00221FAE
:2081BE0001C6006997725C00694F9572FB01F6AE5241F7200FAE5245F6A47FF7725F006965
:2081DE00725F006A5B02805202AE5240F6A5202603CC8278AE5241F695725D0067267B9EEA
:2081FE00A12027769EA10927719EA10D276C9EA10A27679EA15B260A35010001725F006833
:20821E002058725D000127529EA15D2603A601214F88C60068A11F8426094D2606725F0030
:20823E006820374D271C725F0001725D0068270435010067AE00029FCB006802A900957FBF
:20825E00201890AE00021701C600689097725C00684F909572F9019E90F75B028080AE5382
:20827E0042F644241B90CE006472A90001C60063A90097C60062A9009590CF0064CF006284
:06829E0035005342808010
:2082A400AE5011F6AA20F7AE5012F6A4DFF73568524235035243352C5245815202725D00DA
:2082C4006A270635AA50E020F4AE00221F011E05C6006A9097725C006A4F909572F901F668
:2082E4005C90F7F64D2707C6006AA12025E2AE5245F6AA80F75B028152245F1F031F017B62
:2083040029A1042303CC83D67B29A1032603CC83D60D292603CC83D6961C00061F111E110F
:208324001C000A7F7B29A101270E7B29A10227197B29A104272E20451E27F66B184F5F6BB8
:20834400031F017B186B042034162717131E13FE1F23162317210F200F1F16211703161F74
:20836400170120191627171D1E1DE6036B1CE6026B1BFE1F19161B170316191701A6096B3C
:20838400054B0A5F894B001E07891E0789CD96235B08517B050A055F9772FB11909FAB30A9
:2083A400F74B0A5F894B001E07891E0789CD96BA5B081F0317011E0326041E0127067B050D
:2083C400A1FF2CBD7B054C5F9772FB1189CD82BF5B025B248152130F0F961C00031F121E55
:2083E400121C000B7F0D162A14161890504F1217974F12169517181F16A6016B0FA60B6B96
:20840400024B0A5F894B001E1C891E1C89CD95FE5B089F0A025F417B024172FB12AB30F72B
:208424004B0A5F894B001E1C891E1C89CD96935B081F1817161E1826041E1627040D022679
:20844400C07B020D0227110D0F270D7B024A5F9772FB1288A62DF7846B017B01A10C241D5C
:208464001E1AE6016B11F66B101610905CFF5F7B019772FB12F61E10F70C0120DD5B1381D6
:2084840052120F05A6016B065F1F031F011E15F6A12D2607A6016B055C1F15161517111E6B
:2084A40011F61E115C1F11A12B27F4A1302556A13922520F06881E04891E04894B0A5F8945
:2084C4004B00CD97145B081F10170E84905F90975F905D2A015A72F90F9F190E889E190E26
:2084E400958472A20030A20002A20095511303909F1202909E12012E06A6016B0620061FC4
:20850400031701209A0D0627034F202F0D05271C7B04406B0C4F12036B0B4F12026B0A4F1B
:1E85240012016B01160B17037B0A6B02161717071E071603EF021601FFA6015B128168
:0497A00000000000C5
:20815E008080808080808080808080AE5302F6A501270CA4FEAE5302F74B00CD8C988480D3
:20817E0080AE5322F6A501270CA4FEAE5322F74B01CD8C9884808080805202AE5240F6A5C3
:20819E00202603CC822AAE5241F695725D0048267B9EA12027769EA10927719EA10D276CC1
:2081BE009EA10A27679EA15B260A35010001725F00472058725D000127529EA15D2603A685
:2081DE0001214F88C60047A11F8426094D2606725F004720374D271C725F0001725D0047A8
:2081FE00270435010048AE00029FCB004702A900957F201890AE00021701C6004790977262
:20821E005C00474F909572F9019E90F75B028080AE5342F644241B90CE004472A90001C6FB
:18823E000043A90097C60042A9009590CF0044CF0042350053428080E1
:2082560035685242350352433524524581725D00492625AE5245F6AA08F7160390F64D273F
:2082760010905CAE5241F7AE5240F6A54026ED20F6AE5245F6A4F7F78152245F1F031F010B
:208296007B29A1042303CC83697B29A1032603CC83690D292603CC8369961C00051F231E4A
:2082B600231C000A7F7B29A101270E7B29A10227197B29A104272E20451E27F66B224F5F65
:2082D6006B031F017B226B0420341627171D1E1DFE1F1B161B17190F180F171619170316A9
:2082F6001717012019162717151E15E6036B14E6026B13FE1F111613170316111701A60937
:208316006B104B0A5F894B001E07891E0789CD94A05B08517B100A105F9772FB23909FAB2E
:2083360030F74B0A5F894B001E07891E0789CD95375B081F0317011E0326041E0127067BD4
:2083560010A1FF2CBD7B104C5F9772FB2389CD82635B025B248152130F0E965C1F121E12A4
:208376001C000B7F0D162A14161890504F1217974F12169517181F16A6016B0EA60B6B0D0A
:208396004B0A5F894B001E1C891E1C89CD947B5B089F0A0D5F417B0D4172FB12AB30F74BBF
:2083B6000A5F894B001E1C891E1C89CD95105B081F1817161E1826041E1627040D0D26C0EC
:2083D6007B0D0D0D27110D0E270D7B0D4A5F9772FB1288A62DF7846B0F7B0FA10C241D1E31
:2083F6001AE6016B11F66B101610905CFF5F7B0F9772FB12F61E10F70C0F20DD5B138152F5
:20841600120F01A6016B025F1F051F031E15F6A12D2607A6016B015C1F15161517071E0736
:20843600F61E075C1F07A12B27F4A1302556A13922520F02881E06891E06894B0A5F894B8D
:2084560000CD95915B081F0E170C84905F90975F905D2A015A72F90D9F190C889E190C95D9
:208476008472A20030A20002A20095511305909F1204909E12032E06A6016B0220061F05C0
:208496001703209A0D0227034F202F0D01271C7B06406B124F12056B114F12046B104F1269
:1D84B600036B03161117057B106B04161717091E091605EF021603FFA6015B1281CE
:03961D000000004A
:2080000082008083820000008200815E8200815F8200816082008161820081628200816304
:208020008200816482008165820000008200000082008166820081678200816882008169C3
:208040008200817E8200817F8200819482000000820000008200819582008196820081E569
:208060008200827B8200827C820082A38200000082000000820000008200000082000000D0
:1D808700AE00612707724F00005A26F9AE004F2709D6979AD700615A26F7CC8080B6
:03808000CC85426A
:208542005205965C1F041E04A678F71E045CA60AF71E045C5C7FAE50B3F64D2704351F5035
:20856200B3CD80A4CD85BFCD82A49AAE85A789CD82BF5B02C60066AB301E04F71E0489CD51
:2085820082BF5B02CD91FD35AA50E0725D00672703CD94A54B00CD8F31844B01CD8F3184B2
:1D85A20020E55B05810A0A48656C6C6F21204D7920616464726573732069732000A5
:2085BF003504530C3509530D35C4530E35015301AE5300F6AA84F73504532A3509532B35BF
:2085DF00C4532C35015321AE5320F6AA84F781AE90F389CD82BF5B02AE910A89CD82BF5B72
:2085FF0002AE911989CD82BF5B02AE912F89CD82BF5B02AE914B89CD82BF5B02AE91658901
:20861F00CD82BF5B02AE918089CD82BF5B02AE918E89CD82BF5B02AE91A289CD82BF5B0287
:20863F00AE91B389CD82BF5B02814F90977B03A10027087B03A1012718202BAE5006F6A5A7
:20865F0010260461A60161A520261E72A900022018AE5010F64D2B0461A60161A51026092D
:20867F0072A9000220034F2002909F8152027B05A10027087B05A101270F203CAE5005F629
:20869F00A4F0F772115300200DAE500FF6A4F0F7721153202000AE00731F015F7B0597587A
:2086BF005872FB016F036F026F017FAE006F9F1B0502A90095A602F75B0281520616099063
:2086DF00F64D27201E0B1F031E03FE1F011E015C1F051E037B06E7017B05F790F6905C1E37
:2086FF0001F720DB5B06815209A62B6B017B0CA1012303CC87DDAE006F9F1B0C02A900954C
:20871F00F6A1012604A62D6B01AE00719F1B0C02A90095F695889EA100842717160D1704C2
:20873F00A101271EA102273AA1042745A1052761CC87D0AE91D0160D908989CD86DA5B046D
:20875F00207CAE91D6160D908989CD86DA5B041E04FE1F021E025C160490FF1E027B01F7FF
:20877F00205CAE91DC160D908989CD86DA5B04204DAE91E1160D908989CD86DA5B041E04F2
:20879F00FE1F061E065C160490FF1E067B01F7202DAE91E7160D908989CD86DA5B041E04F1
:2087BF00FE1F081E085C160490FF1E087B01F7200DAE91ED160D908989CD86DA5B045B09A3
:2087DF0081520A7B0DA10027097B0DA101272ECC8870AE5005F6A4F06B06AE90EB1F04AE09
:2087FF00008FF65F9772FB04F61A06AE5005F7354E530D3520530E72105300202BAE500F98
:20881F00F6A4F06B01AE90EB1F02AE0090F65F9772FB02F61A01AE500FF7354E532B3520F5
:20883F00532C72105320200090AE008B5F7B0D97581F0972F909AE006B72FB09FE1F07AEE9
:20885F004E2072F007908990AE00646590855C90FF5B0A815202AE006F9F1B0502A90095AC
:20887F00F6A10227045FCC89167B0588CD86495B010D062A324D27035F207CAE006F9F1B93
:20889F000502A90095A601F7160890504F1207974F12069517081F06AE00719F1B0502A910
:2088BF000095A604F72031A50227035F204944240FAE00719F1B0502A90095A605F7200D15
:2088DF00AE00719F1B0502A90095A604F7AE006F9F1B0502A900957FAE00731F015F7B05FF
:2088FF0097585872FB011608EF021606FF7B0588CD87E084AE00015B02815204AE006F9F1B
:20891F001B0702A90095F6A10227045FCC89BB7B0788CD86495B01974D26101E0A891E0AAE
:20893F00897B0B88CD88735B0520710D082A255424035F2067AE006F9F1B0702A90095A63F
:20895F0001F7160A90504F1209974F120895170A1F08200BAE006F9F1B0702A900957FAE43
:20897F0000731F035F7B079758581F011E0372FB01160AEF021608FFAE008372FB01160A7F
:20899F00EF021608FFAE00719F1B0702A90095A605F77B0788CD87E084AE00015B04815245
:2089BF003F1E42F65C1F42A0306B017B01A1012303CC8D01164417361E36FE1F381E385C6A
:2089DF001F3C1E36163CFF7B01AB301E38F71E3C5C1F3E1E36163EFF1E3CA620F71E42F6AD
:2089FF005C1F42163C72A900021E36FF1E3EF7A145273FA14C2766A14D2603CC8ABBA14EA9
:208A1F002603CC8ADAA14F2603CC8B47A1502603CC8B94A1522603CC8BCDA1532603CC8C6D
:208A3F000BA1582603CC8CE3A15A2603CC8CF2CC8D011E36FE1F061E065C1F081E36160857
:208A5F00FF1E06A620F71E085C163690FF7B0188CD86495B01AB301E08F7CC8D347B018835
:208A7F00CD86495B01442410AE91F31636908989CD86DA5B04CC8D34AE00719F1B0102A9A9
:208A9F000095A601F7AE006F9F1B0102A90095A601F77B0188CD87E084CC8D341E36FE1F14
:208ABF000A1E0A5C163690FF1E0AA620F71E36897B0388CD87065B03CC8D341E36FE1F0EA2
:208ADF001E0E5C163690FF1E0EA620F7965C5C891E4489CD84845B044D2628AE00731F1248
:208AFF005F7B0197585872FB12E6036B17E6026B16FE163690891618908989CD83D95B0625
:208B1F00CC8D341E04891E04897B0588CD88735B055D2603CC8D011E36891E06891E06890C
:208B3F00CD83D95B06CC8D341E36FE1F181E185C163690FF1E18A620F7965C5C891E448954
:208B5F00CD84845B044D2608AE00641F045F1F021E04891E04897B0588CD89195B055D26E2
:208B7F0003CC8D011E36891E06891E0689CD83D95B06CC8D341E36FE1F1A1E1A5C16369030
:208B9F00FF1E1AA620F7AE007B1F1C5F7B0197585872FB1CE6036B2FE6026B2EFE163690D5
:208BBF00891630908989CD83D95B06CC8D347B0188CD86495B01A5022710AE91F816369021
:208BDF008989CD86DA5B04CC8D34AE00719F1B0102A90095A601F7AE006F9F1B0102A90010
:208BFF00957F7B0188CD87E084CC8D341E36FE1F301E305C163690FF1E30A620F7965C5C7A
:208C1F00891E4489CD84845B044D271C1E04A303207B03A2007B02A2002F0DAE4E20130467
:208C3F004F12034F12022E4B0D012619AE530DF690954F0F21AE530EF60F241A2197909EA8
:208C5F001A2495201BAE532BF690954F0F29AE532CF60F261A296B2B909E1A266B2A1E2A9D
:208C7F00905F7B37887B3788899089CD83D95B06CC8D341E36891E06891E0689CD83D95BFE
:208C9F00061604AE006B1F345F7B0197581F3A1E3472FB3AFFAE008B72FB3A6F017F0D0131
:208CBF002611909E0F0CAE530DF74FAE530E909FF72062909E0F10AE532BF74FAE532C908E
:208CDF009FF72051AE00719F1B0102A90095A602F72042AE00719F1B0102A90095A603F799
:208CFF0020331E44E6016B1FF66B1E161E905C17221622FF161EA66590F71622905C1732ED
:208D1F001632FF1622A67290F7162272A90002FF1E32A672F75B3F81523A7B3DA100270933
:208D3F007B3DA1012772CC8F2EAE008B1F2F1E2FFE1F351E352742AE530DF690954F0F34FB
:208D5F00AE530EF60F391A3497909E1A399572F0351F37AE006BFE1F041E371304240916D6
:208D7F000417371E2F6F017F7B370F06AE530DF77B38954F9EAE530EF7AE5005F6A4F06B47
:208D9F0008AE90EB1F09AE008FF65F9772FB09F61A08AE5005F7206FAE008D1F311E31FE43
:208DBF001F0D1E0D2742AE532BF690954F0F12AE532CF60F191A1297909E1A199572F00DAA
:208DDF001F01AE006DFE1F1F1E01131F2409161F17011E316F017F7B010F2DAE532BF77B9E
:208DFF0002954F9EAE532CF7AE500FF6A4F06B03AE90EB1F0BAE0090F65F9772FB0BF61AA2
:208E1F0003AE500FF72000AE008F9F1B3D6B149EA9006B131E13F6442403CC8EFCAE00738B
:208E3F00905F7B3D909790589058171572FB151F171E17E6039097E6029095FE72A200012C
:208E5F009FA2006B229EA2006B211E17EF021621FFAE006F9F1B3D02A90095F6A101262AC1
:208E7F00AE007B72FB15E6039097E6029095E60188F66B268472A20001A2006B2A7B25A203
:208E9F00006B29EF021629FF202CAE007B72FB151F0F1E0FE6039097E6029095FE72A90068
:208EBF0001171D9FA9006B1C9EA9006B1B1E0F161DEF02161BFFAE00719F1B3D02A90095EB
:208EDF00F6A102270FAE00719F1B3D02A90095F6A10326097B3D88CD868B842032AE006F74
:208EFF009F1B3D02A90095F697161390F6889FA1018426104D26071E13A607F720114A1E75
:208F1F0013F7200B4C1E13F7A10723031E137F5B3A8152257B2888CD86495B016B02AE0040
:208F3F006F9F1B2802A90095F6A1012603A601214F6B01AE00719F1B2802A90095F66B0398
:208F5F007B03A1012603CC90537B03A1022603CC90A55F7B289758581F1C7B03A1032603E0
:208F7F00CC90C17B03A1042603CC901E7B03A1052703CC90E8AE00731F041E0472FB1C1F4F
:208F9F001A1E1AE6036B19E6026B18FE1F161E18A300027B17A2007B16A2002E16AE0071B0
:208FBF001F145F7B289772FB141F121E12A602F7CC90E8AE00831F101E1072FB1C1F0E1E9F
:208FDF000EE6036B0DE6026B0CFE1F0A1E0C72F0181F087B0B12176B077B0A1216881E0935
:208FFF00A300647B08A20084A2002E03CC90E8AE00719F1B2802A90095A604F7CC90E8AEB7
:20901F0000731F241E2472FB1C1F221E22E6036B21E6026B20FE1F1E1E20A300027B1FA2ED
:20903F00007B1EA2002E0DAE00719F1B2802A90095A602F70D022603CC90E80D012732AE2A
:20905F0000719F1B2802A90095F6A10126147B02442476AE00719F1B2802A90095A603F750
:20907F002067AE00719F1B2802A90095A602F720587B02A5022752AE00719F1B2802A900A9
:20909F0095A602F72043AE006F9F1B2802A90095F6A1022634AE00719F1B2802A900957F28
:2090BF002027AE006F9F1B2802A90095F6A1022618AE007B72FB1C6F036F026F017FAE0002
:2090DF00719F1B2802A900957F5B2581080A0206040501090945202D2067657420656E64DF
:2090FF002D73776974636865730A00094C202D206D6F7665204343570A00094D202D206706
:20911F006574206D6F746F722073746174650A00094E202D20676F20666F72204E20737445
:20913F002E2F67657420726573740A00094F202D2070756C6C206F66662074686520737743
:20915F00697463680A000950202D206765742063757272656E7420706F736974696F6E0A76
:20917F00000952202D206D6F76652043570A000953202D206765742F73657420737065653C
:20919F00640A000958202D2073746F70206D6F746F720A00095A202D2073746F7020616ECE
:2091BF0064207A65726F20706F736974696F6E0A0052454C415800494E464D560053544FBB
:1E91DF0050004D56535450004F4646535700554E444546002045203100204520320024
:2097A40009C409C40202000000000000000000000000000000000000000000000000000007
:0697C4000000000000009F
:2091FD00AE951689CD82BF5B02AE951989CD82BF5B02AE953A89CD82BF5B02AE955789CD54
:20921D0082BF5B02AE956289CD82BF5B02CD85EEAE958289CD82BF5B02AE959189CD82BF96
:20923D005B02AE95A889CD82BF5B02AE95BC89CD82BF5B02AE95DA89CD82BF5B02815213EB
:20925D000F061E16F65C1F16A0306B017B01A10223131E18894BFF4BFF4BFF4BFFCD83D980
:20927D005B06CC936D161817071E07FE1F121E125C1F101E071610FF7B01AB301E12F71E63
:20929D00105C160790FF1E10A620F7161690F6957B01A1002606A6016B0A20020F0A7B014B
:2092BD00A1012606A6016B0920020F097B01A1022606A6016B0F20020F0F9E4D26260D0A74
:2092DD00260A0D09260E0D0F26122071AE5266F66B062069AE5268F66B062061AE526AF60C
:2092FD006B062059965C5C899089CD84845B044D27110D022B0DAE00FF13044F12034F12EE
:20931D00022E121E07894BFF4BFF4BFF4BFFCD83D95B06203B7B056B060D0A260A0D0926BF
:20933D000E0D0F26122016AE52667B06F7200EAE52687B06F72006AE526A7B06F77B060FF4
:20935D000D5F16079089887B108889CD83D95B065B13815210AE00911F041E041C00041F8C
:20937D000D160D170135AA50E01613170A1E0AF66B031E045C5CC60066AB30F77B03A1307C
:20939D0027067B03A131260E965C891E0C89CD89BE5B04CC948C1E0D7B03F71E0D5C1F012B
:2093BD00A620F71E0D5C5C1F06160617011E0A5C1F131E0D1C00031F0F7B03A147272D7B34
:2093DD0003A14C27357B03A15027717B03A15427787B03A1722703CC9489355550E0350078
:2093FD0050E1350150E235AA50E020FEC60066AB301E06F7160F170120751E13F64D271BE0
:20941D00AE500A88F69584A13026099EAA10AE500AF720079EA4EFAE500AF7160617081691
:20943D000F1701AE500AF6A5102706A6306B0C2004A6316B0C1E087B0CF72033965C891EB9
:20945D001589CD925B5B0420261E067F1E0489CD82BF5B02AE00624B0489CD82FC5B03CEDA
:20947D0095F389CD82BF5B02A60120194F20161E017F1E0489CD82BF5B02CE95F389CD820C
:20949D00BF5B02A6015B1081520DAE00421F0616061703AE00021F0C1E0C5C1F011E0CF6B5
:2094BD00A030725D0067274EC10066270EA132270A725F0067725F0068203B1601170A169A
:2094DD000317080F057B05C1006824141E0AF61E0A5C1F0A1E08F71E085C1F080C0520E5B1
:2094FD00725F0068725F00671E0689CD93705B024D2603CD91FD5B0D810A0A00436F6D6DAA
:20951D00616E642070726F746F636F6C3A205B206164647220636F6D6D616E640020646115
:20953D007461205D0A092062726F61646361737420616464723A20620A00636F6D6D616EDA
:20955D0064733A0A00302F31202D20636F6D6D616E6420666F7220676976656E206D6F74E7
:20957D006F723A0A0072202D207265736574204D43550A0047202D2067657420626F6172E0
:20959D006420616464726573730A004C20302F31202D204C4544206F6E2F6F66660A00503B
:2095BD002063682076616C202D2050574D206F6E206368616E6E656C2063680A0054202D53
:2095DD002074696D6520636F756E7465722076616C75650A0A0095F5205D0A005B2058202A
:0195FD00006D
:2097CA005B205820000000000000000000000000000000000000000000000000000000008C
:2095FE001E0916072A03CD97908990891E0916072A03CD9790899089CD96235B087B032AAE
:20961E0003CD97908152030F030F017B0A484F494D262E160C1E0A905859170C1F0A1E083A
:20963E00130C7B07120B7B06120A240D160C1E0A549056170C1F0A20080C017B016B032071
:20965E00CA7B036B021E0872F00C7B07120B90977B06120A25061F0890951706160C1E0A62
:20967E00549056170C1F0A7B020A024D26D71E0816065B03811E0916072A03CD97908990D4
:20969E00891E0916072A03CD9790899089CD96BA5B087B0318072A03CD97908152065F1F87
:2096BE00051F03A6206B027B09484F496B01160B1E09905859170B1F0916051E0390585912
:2096DE0017051F030D0127067B06AA016B061E0572F00F7B04120E90977B03120D250C1F0F
:2096FE0005909517037B0CAA016B0C0A0226B81E0B16095B06815F89897B0A977B0E421FD4
:20971E00037B09977B0E4272FB021F024FA9006B017B0A977B0D4272FB021F024F19016B04
:20973E00017B0A977B0C4272FB011F017B09977B0D4272FB011F017B08977B0E4272FB01D1
:20975E001F017B07977B0E429F1B016B017B0A977B0B429F1B016B017B09977B0C429F1B17
:1D977E00016B017B08977B0D429F1B016B019085858190535D2703535C81905C8134
:208040008200817E8200817F820081948200000082000000820081958200819682008197B7
:208060008200822D8200822E820082558200000082000000820000008200000082000000BA
:1D808700AE00412707724F00005A26F9AE004E2709D69617D700415A26F7CC80807B
:03808000CC84D3DA
:2084D300AE50B3F64D2704351F50B3CD80A4CD84F8CD82569A35AA50E0725D004827F6CD8A
:0584F300930C20F18153
:2084F8003504530C3509530D35C4530E35015301AE5300F6AA84F73504532A3509532B3587
:20851800C4532C35015321AE5320F6AA84F781AE8F5A89CD82635B02AE8F7189CD82635B26
:2085380002AE8F8089CD82635B02AE8F9689CD82635B02AE8FB289CD82635B02AE8FCC8948
:20855800CD82635B02AE8FE789CD82635B02AE8FF589CD82635B02AE900989CD82635B028F
:20857800AE901A89CD82635B02814F90977B03A10027087B03A1012718202BAE5006F6A565
:2085980010260461A60161A520261E72A900022018AE5010F64D2B0461A60161A5102609F5
:2085B80072A9000220034F2002909F8152047B07A10027087B07A101270F2067AE5005F6C0
:2085D800A4F0F772115300200DAE500FF6A4F0F7721153202000AE00521F035F7B0797585F
:2085F800581F011E0372FB016F036F026F017FAE004E9F1B0702A90095A602F7AE00509F51
:208618001B0702A90095F6A103260DAE005A72FB016F036F026F017FAE00509F1B0702A961
:2086380000957F5B04815206160990F64D27201E0B1F031E03FE1F051E055C1F011E037BD4
:2086580002E7017B01F790F6905C1E05F720DB5B06815209A62B6B017B0CA1012303CC8702
:2086780041AE004E9F1B0C02A90095F6A1012604A62D6B01AE00509F1B0C02A90095F6950F
:20869800889EA100842717160D1708A101271EA102273AA1042745A1052761CC8734AE9008
:2086B80037160D908989CD863E5B04207CAE903D160D908989CD863E5B041E08FE1F041E85
:2086D800045C160890FF1E047B01F7205CAE9043160D908989CD863E5B04204DAE90481625
:2086F8000D908989CD863E5B041E08FE1F021E025C160890FF1E027B01F7202DAE904E16D3
:208718000D908989CD863E5B041E08FE1F061E065C160890FF1E067B01F7200DAE905416C0
:208738000D908989CD863E5B045B0981520A7B0DA10027097B0DA101272ECC87D4AE50053F
:20875800F6A4F06B0AAE8F521F06AE006EF65F9772FB06F61A0AAE5005F7354E530D352087
:20877800530E72105300202BAE500FF6A4F06B01AE8F521F08AE006FF65F9772FB08F61A19
:2087980001AE500FF7354E532B3520532C72105320200090AE006A5F7B0D97581F0472F9C6
:2087B80004AE004A72FB04FE1F02AE4E2072F002908990AE00646590855C90FF5B0A81523D
:2087D80002AE004E9F1B0502A90095F6A10227045FCC887A7B0588CD85825B010D062A32EC
:2087F8004D27035F207CAE004E9F1B0502A90095A601F7160890504F1207974F1206951746
:20881800081F06AE00509F1B0502A90095A604F72031A50227035F204944240FAE00509F77
:208838001B0502A90095A605F7200DAE00509F1B0502A90095A604F7AE004E9F1B0502A9ED
:2088580000957FAE00521F015F7B0597585872FB011608EF021606FF7B0588CD874484AE3C
:2088780000015B02815204AE004E9F1B0702A90095F6A10227045FCC891F7B0788CD858239
:208898005B01974D26101E0A891E0A897B0B88CD87D75B0520710D082A255424035F2067F9
:2088B800AE004E9F1B0702A90095A601F7160A90504F1209974F120895170A1F08200BAEE5
:2088D800004E9F1B0702A900957FAE00521F015F7B079758581F031E0172FB03160AEF02A8
:2088F8001608FFAE006272FB03160AEF021608FFAE00509F1B0702A90095A605F77B0788EA
:20891800CD874484AE00015B0481523F1E42F65C1F42A0306B057B05A1012303CC8C621698
:2089380044173E1E3EFE1F2E1E2E5C1F301E3E1630FF7B05AB301E2EF71E305C1F321E3E52
:208958001632FF1E30A620F71E42F65C1F42163072A900021E3EFF1E32F7A145273FA14C5C
:208978002766A14D2603CC8A1FA14E2603CC8A3EA14F2603CC8AAAA1502603CC8AF6A152A8
:208998002603CC8B2FA1532603CC8B6DA1582603CC8C44A15A2603CC8C53CC8C621E3EFE8E
:2089B8001F341E345C1F361E3E1636FF1E34A620F71E365C163E90FF7B0588CD85825B01C8
:2089D800AB301E36F7CC8C957B0588CD85825B01442410AE905A163E908989CD863E5B043E
:2089F800CC8C95AE00509F1B0502A90095A601F7AE004E9F1B0502A90095A601F77B058836
:208A1800CD874484CC8C951E3EFE1F381E385C163E90FF1E38A620F71E3E897B0788CD869A
:208A38006A5B03CC8C951E3EFE1F3A1E3A5C163E90FF1E3AA620F7965C891E4489CD84153E
:208A58005B044D2628AE00521F3C5F7B0597585872FB3CE6036B19E6026B18FE163E908997
:208A7800161A908989CD836C5B06CC8C951E03891E03897B0988CD87D75B055D2603CC8C39
:208A9800621E3E891E05891E0589CD836C5B06CC8C951E3EFE1F1A1E1A5C163E90FF1E1AD3
:208AB800A620F7965C891E4489CD84155B044D2608AE00641F035F1F011E03891E03897BB9
:208AD8000988CD887D5B055D2603CC8C621E3E891E05891E0589CD836C5B06CC8C951E3ED8
:208AF800FE1F1C1E1C5C163E90FF1E1CA620F7AE005A1F1E5F7B0597585872FB1EE6036B6B
:208B180023E6026B22FE163E90891624908989CD836C5B06CC8C957B0588CD85825B01A577
:208B3800022710AE905F163E908989CD863E5B04CC8C95AE00509F1B0502A90095A601F7D9
:208B5800AE004E9F1B0502A900957F7B0588CD874484CC8C951E3EFE1F241E245C163E9053
:208B7800FF1E24A620F7965C891E4489CD84155B044D271C1E03A303207B02A2007B01A200
:208B9800002F0DAE4E2013034F12024F12012E4B0D052619AE530DF690954F0F27AE530E03
:208BB800F60F281A2797909E1A2895201BAE532BF690954F0F2BAE532CF60F061A2B6B0B95
:208BD800909E1A066B0A1E0A905F7B3F887B3F88899089CD836C5B06CC8C951E3E891E056B
:208BF800891E0589CD836C5B061603AE004A1F0C5F7B0597581F0E1E0C72FB0EFFAE006A18
:208C180072FB0E6F017F0D052611909E0F12AE530DF74FAE530E909FF72062909E0F2CAE18
:208C3800532BF74FAE532C909FF72051AE00509F1B0502A90095A602F72042AE00509F1BDE
:208C58000502A90095A603F720331E44E6016B11F66B101610905C17081608FF1610A6650F
:208C780090F71608905C17141614FF1608A67290F7160872A90002FF1E14A672F75B3F81A4
:208C980052457B4888CD85825B016B02AE00509F1B4802A90095F66B04AE004E9F1B480298
:208CB800A90095F6A1012603A601214F6B017B48A10027097B48A1012776CC8F4FAE006AC2
:208CD8001F191E19FE1F1B1E1B2746AE530DF690954F0F1EAE530EF60F1F1A1E97909E1A40
:208CF8001F9572F01B1F21AE004AFE7B22891102857B218912018524071F211E196F017FE9
:208D18007B210F23AE530DF77B22954F9EAE530EF7AE5005F6A4F06B25AE8F521F26AE00A4
:208D38006EF65F9772FB26F61A25AE5005F72073AE006C1F281E28FE1F2A1E2A2746AE53C8
:208D58002BF690954F0F2DAE532CF60F2E1A2D97909E1A2E9572F02A1F05AE004CFE1F30EA
:208D78001E051330240D16301732163217051E286F017F7B050F38AE532BF77B06954F9E2F
:208D9800AE532CF7AE500FF6A4F06B03AE8F521F3EAE006FF65F9772FB3EF61A03AE500FD2
:208DB800F72000AE006E9F1B486B459EA9006B441E44F6A4015F417B484158581F364D27A6
:208DD80003CC8E84AE005272FB361F341E34E6039097E6029095FE72A200019FA2006B086E
:208DF8009EA2006B071E34EF027B08E7017B07F7905D26081E072604A6026B040D01272AA2
:208E1800AE005A72FB36E6039097E6029095E60188F66B0C8472A20001A2006B107B0BA2B8
:208E3800006B0FEF02160FFF202CAE005A72FB361F131E13E6039097E6029095FE72A900FB
:208E58000117179FA9006B169EA9006B151E131617EF021615FF7B04A10227067B04A10350
:208E7800260A7B4888CD85C484CC8F4F1E44F60D0127104D26071E44A607F720114A1E4421
:208E9800F7200B4C1E44F7A10723031E447F7B04A1012603A601214F4D265B887B05A10468
:208EB8008427537B04A1052703CC8F4FAE006272FB36E6039097E6029095FE1F3AAE00527C
:208ED80072FB36E6036B43E6026B42FE1F4072F2427B3B1241977B3A12409590A300649F36
:208EF800A2009EA2002F50AE00509F1B4802A90095A604F720410D02273D0D0127264D2775
:208F1800147B02442431AE00509F1B4802A90095A603F72022AE00509F1B4802A90095A607
:208F380002F720137B02A502270DAE00509F1B4802A90095A602F75B4581080A0206040572
:208F580001090945202D2067657420656E642D73776974636865730A00094C202D206D6F5E
:208F78007665204343570A00094D202D20676574206D6F746F722073746174650A00094E01
:208F9800202D20676F20666F72204E2073742E2F67657420726573740A00094F202D2070E0
:208FB800756C6C206F666620746865207377697463680A000950202D206765742063757264
:208FD80072656E7420706F736974696F6E0A000952202D206D6F76652043570A0009532062
:208FF8002D206765742F7365742073706565640A000958202D2073746F70206D6F746F7231
:209018000A00095A202D2073746F7020616E64207A65726F20706F736974696F6E0A005274
:20903800454C415800494E464D560053544F50004D56535450004F4646535700554E4445DD
:0C90580046002045203100204520320059
:2096200009C409C4020200000000000000000000000000000000000000000000000000008C
:0696400000000000000024
:20906400AE939389CD82635B02AE939689CD82635B02AE93B789CD82635B02AE93D489CD16
:2090840082635B02AE93DF89CD82635B02CD8527AE93FF89CD82635B02AE940E89CD8263F6
:2090A4005B02AE942589CD82635B02AE943989CD82635B02AE945789CD82635B0281521326
:2090C4000F061E16F65C1F16A0306B017B01A10223131E18894BFF4BFF4BFF4BFFCD836C88
:2090E4005B06CC91D4161817071E07FE1F121E125C1F101E071610FF7B01AB301E12F71E99
:20910400105C160790FF1E10A620F7161690F6957B01A1002606A6016B0A20020F0A7B01E5
:20912400A1012606A6016B0920020F097B01A1022606A6016B0F20020F0F9E4D26260D0A0E
:20914400260A0D09260E0D0F26122071AE5266F66B062069AE5268F66B062061AE526AF6A6
:209164006B062059965C5C899089CD84155B044D27110D022B0DAE00FF13044F12034F12F7
:20918400022E121E07894BFF4BFF4BFF4BFFCD836C5B06203B7B056B060D0A260A0D0926C7
:2091A4000E0D0F26122016AE52667B06F7200EAE52687B06F72006AE526A7B06F77B060F8F
:2091C4000D5F16079089887B108889CD836C5B065B13815210AE00701F0D1E0D1C00041FA3
:2091E4000F160F170135AA50E0161317071E07F66B031E0D5C5CC60046AB30F77B03A13030
:2092040027067B03A131260E965C891E0989CD89225B04CC92F31E0F7B03F71E0F5C1F01FB
:20922400A620F71E0F5C5C1F0B160B17011E075C1F131E0F1C00031F047B03A147272D7BCE
:2092440003A14C27357B03A15027717B03A15427787B03A1722703CC92F0355550E03500AD
:2092640050E1350150E235AA50E020FEC60046AB301E0BF71604170120751E13F64D271BA0
:20928400AE500A88F69584A13026099EAA10AE500AF720079EA4EFAE500AF7160B17091626
:2092A400041701AE500AF6A5102706A6306B062004A6316B061E097B06F72033965C891E70
:2092C4001589CD90C25B0420261E0B7F1E0D89CD82635B02AE00424B0489CD828F5B03CEEB
:2092E400947089CD82635B02A60120194F20161E017F1E0D89CD82635B02CE947089CD825E
:20930400635B02A6015B1081520CAE00221F0B160B1701AE00021F091E095C1F041E09F6CA
:20932400A0306B06725D004827627B06A1322603A601214F887B07C1004684270D4D260A6E
:20934400725F0048725F004720424D2706350100492004725F0049160417071E010F037B5B
:2093640003C100472410160790F61607905C1707F75C0C0320E9725F0047725F00481E0B1B
:2093840089CD91D75B024D2603CD90645B0C810A0A00436F6D6D616E642070726F746F6305
:2093A4006F6C3A205B206164647220636F6D6D616E64002064617461205D0A092062726FB2
:2093C40061646361737420616464723A20620A00636F6D6D616E64733A0A00302F31202D25
:2093E40020636F6D6D616E6420666F7220676976656E206D6F746F723A0A0072202D2072E4
:2094040065736574204D43550A0047202D2067657420626F61726420616464726573730A5C
:20942400004C20302F31202D204C4544206F6E2F6F66660A00502063682076616C202D206E
:2094440050574D206F6E206368616E6E656C2063680A0054202D2074696D6520636F756EE4
:179464007465722076616C75650A0A009472205D0A005B20582000D5
:209646005B2058200000000000000000000000000000000000000000000000000000000011
:20947B001E0916072A03CD960D8990891E0916072A03CD960D899089CD94A05B087B032ABF
:20949B0003CD960D8152030F030F017B0A484F494D262E160C1E0A905859170C1F0A1E0843
:2094BB00130C7B07120B7B06120A240D160C1E0A549056170C1F0A20080C017B016B0320F6
:2094DB00CA7B036B021E0872F00C7B07120B90977B06120A25061F0890951706160C1E0AE7
:2094FB00549056170C1F0A7B020A024D26D71E0816065B03811E0916072A03CD960D8990DD
:20951B00891E0916072A03CD960D899089CD95375B087B0318072A03CD960D8152065F1F97
:20953B00051F03A6206B027B09484F496B01160B1E09905859170B1F0916051E0390585996
:20955B0017051F030D0127067B06AA016B061E0572F00F7B04120E90977B03120D250C1F93
:20957B0005909517037B0CAA016B0C0A0226B81E0B16095B06815F89897B0A977B0E421F58
:20959B00037B09977B0E4272FB021F024FA9006B017B0A977B0D4272FB021F024F19016B89
:2095BB00017B0A977B0C4272FB011F017B09977B0D4272FB011F017B08977B0E4272FB0156
:2095DB001F017B07977B0E429F1B016B017B0A977B0B429F1B016B017B09977B0C429F1B9C
:1D95FB00016B017B08977B0D429F1B016B019085858190535D2703535C81905C81B9
:00000001FF

View File

@ -24,28 +24,34 @@
#include "uart.h"
#include "hardware.h"
U8 uart_rdy = 0;
U8 rx_idx = 0, tx_idx = 0, tx_len = 0;
U8 rx_idx = 0, uart_rdy = 0, broadcast = 0;
U8 UART_rx[UART_BUF_LEN]; // buffers for received/transmitted data
U8 UART_tx[UART_BUF_LEN];
U8 UART_rx[UART_BUF_LEN]; // buffer for received data
void uart_init(){
// PD5 - UART2_TX
PORT(UART_PORT, DDR) |= UART_TX_PIN; // output
PORT(UART_PORT, CR1) &= ~UART_TX_PIN; // open-drain
// UART TX will automatically switch into PuPd mode when UART_CR2_TEN
// 8 bit, no parity, 1 stop (UART_CR1/3 = 0 - reset value)
// 9600 on 16MHz: DIV=0x0693 -> BRR1=0x68, BRR2=0x03
UART2_BRR1 = 0x68; UART2_BRR2 = 0x03;
UART2_CR2 = UART_CR2_TEN | UART_CR2_REN | UART_CR2_RIEN; // Allow TX/RX, generate ints on rx
UART2_CR2 = UART_CR2_REN | UART_CR2_RIEN; // Allow TX/RX, generate ints on rx
}
void uart_write(const char *str){
if(broadcast) return; // don't write anything on broadcast commands
UART2_CR2 |= UART_CR2_TEN; // turn Tx on
while(*str){
UART2_DR = *str++;
while(!(UART2_SR & UART_SR_TC));
}
UART2_CR2 &= ~UART_CR2_TEN; // turn Tx off
/*
while(tx_len) {IWDG_KR = KEY_REFRESH;}
UART2_CR2 |= UART_CR2_TEN;
do{
UART_tx[tx_len++] = *str++;
}while(*str && tx_len < UART_BUF_LEN);
UART2_CR2 |= UART_CR2_TIEN; // enable TXE interrupt
*/
}
void printUint(const U8 *val, U8 len){

View File

@ -28,9 +28,9 @@
#define UART_BUF_LEN 32
extern U8 UART_rx[];
extern U8 UART_tx[];
extern U8 uart_rdy, rx_idx, tx_idx, tx_len;
extern U8 uart_rdy, rx_idx, broadcast;
void uart_init();