29.08.2013, 19:41
|
|
Временная регистрация
Регистрация: 18.04.2011
Сообщений: 84
Сказал спасибо: 23
Сказали Спасибо 6 раз(а) в 4 сообщении(ях)
|
Re: FAQ по STM8
И снова здравствуйте
Опять наткнулся на проблему. Контролер зависает на команде
До этого работало нормально поменял немного кода, не касающегося прерываний, перестало работать. убрал этот кусок проблема не ушла. Отладка показала что контролер зависает на вышеупомянутой команде. Что это случилось с ним??
P.S.
Убираешь команду все работает (кроме прерываний конечно).
Зацикливается на :
Код:
|
_interrupt_1:
_interrupt_10:
_interrupt_11:
_interrupt_12:
_interrupt_13... +24 symbols not displayed:
00AD41 CCAD4A JP __iar_unhandled_exception
__low_level_init:
00AD44 5F CLRW X
00AD45 5C INCW X
00AD46 81 RET
exit:
00AD47 CCAD32 JP _exit
__iar_unhandled_exception:
00AD4A 9D NOP
00AD4B 20FD JRA __iar_unhandled_exception
?‹Constant "1"›:
00AD4D 31 DC8 49 ; '1'
00AD4E 00 DC8 0 ; '.'
?‹Constant "."›:
00AD4F 2E00 JRSGE __DebugBreak
__DebugBreak:
00AD51 81 RET
00AD52 41 DC8 0x41
00AD53 A0 DC8 0xA0 |
Получается он не может определить вектора прерываний? Поэтому и уходит в ступор?
Из прерываний с 13 по 24 не одно не работает. Что случилось с контролером помогите пожалуйста.
Последний раз редактировалось Uvavan; 30.08.2013 в 12:34.
|
|
|
|
03.09.2013, 11:42
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: FAQ по STM8
Во какая у меня получилась функция для перевода числа в строку:
Код:
|
void ValueToStr (u32 Value, u8 * String)
{
u8 zero=0;
u8 tmp=0;
u32 cnt=1000000000;
while (cnt!=1)
{
while (Value›=cnt)
{
Value-=cnt;
tmp++;
}
if (tmp) zero=1;
if (zero) * String++ = tmp+48;
tmp=0;
cnt/=10;
}
* String = Value+48;
} |
Последний раз редактировалось Easyrider83; 04.09.2013 в 09:48.
|
|
|
|
03.09.2013, 23:29
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: FAQ по STM8
А в чём изюминка? Так не быстрее будет?
Код:
|
void ValueToStr (u32 Value, u8 *buffer)
{
buffer += 11;
*--buffer = 0;
do {
*--buffer = value % 10 + '0';
value = value /10;
} while (value != 0);
} |
|
|
|
|
04.09.2013, 01:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от nahimovv
|
А в чём изюминка?
|
Я так понимаю, функция EasyRider'а предназначена для вызова конструктором форматного вывода - она заполняет строку слева-направо. Хотя, конечно, отсутствие универсальности делает её немного неудобной. Если форматный вывод не нужен, то, действительно, удобнее заполнять справа-налево. И минимизировать количество вариантов за счет небольшого усложнения. Скажем, если не нужны отрицательные числа, м.б. бы сделать так:
Код:
|
#define WBUFSIZE 16
static char xtal[] = "0123456789ABCDEF";
static char buf [WBUFSIZE+1];
char *_int2str(uint val, uchar radix, uchar width)
{
char *s = &(buf[WBUFSIZE]);
uchar len = 0;
do {
*--s = xtal[val % radix];
++len;
} while (val /= radix);
while ( len++ ‹ width )
*--s = xtal[0];
return(s);
}
#define atoi(val) _int2str(val, 10, 0)
#define atox(val) _int2str(val, 0x10, 0)
#define ato...(val) _int2str(val, ...) |
________________
__________________
There's always more than one way to skin a cat.
Последний раз редактировалось tempora; 04.09.2013 в 02:00.
|
|
|
|
04.09.2013, 10:03
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от nahimovv
|
А в чём изюминка? Так не быстрее будет?
Код:
|
void ValueToStr (u32 Value, u8 *buffer)
{
buffer += 11;
*--buffer = 0;
do {
*--buffer = value % 10 + '0';
value = value /10;
} while (value != 0);
} |
|
Вот это мне не понравилось. Почему именно 11? У меня пустые элементы остаются, если число короткое.
А по оптимизации - да, ваша на 20 инструкций короче.
|
|
|
|
04.09.2013, 12:04
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: FAQ по STM8
А вот еще полезная фишка. Генерирует уникальный для каждого камушка байт, собранный из серийника.
Код:
|
u8 GenerateUniqueID8 (u16 UID_Address)
{
u8 ID[12];
STM8S_EEPROM_Read_String(ID, UID_Address, 12);
return Crc8(12, ID);
} |
Код:
|
void STM8S_EEPROM_Read_String (u8 * String, u16 Address, u8 Len)
{
while (Len--) * String++ = FLASH_ReadByte (Address++);
} |
Код:
|
unsigned char Crc8(unsigned int len, unsigned char *pcBlock)
{
unsigned char crc = 0xFF;
unsigned int i;
while (len--)
{
crc ^= *pcBlock++;
for (i = 0; i ‹ 8; i++)
crc = crc & 0x80 ? (crc ‹‹ 1) ^ 0x31 : crc ‹‹ 1;
}
return crc;
} |
Для STM8S103F2P6 ´
UID_Address=0x4865
|
|
|
|
04.09.2013, 15:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от Easyrider83
|
Вот это мне не понравилось. Почему именно 11?
|
Потому, что в коде жёстко задана десятичная система счисления, а в ней, для u32 Value, максимальное число - 4'294'967'295, то есть, десять символов. Плюс trailing zero.
__________________
There's always more than one way to skin a cat.
|
|
|
|
04.09.2013, 15:19
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: FAQ по STM8
Это все очень понятно. Не понятно, зачем нужен массив, в котором интересующие нас элементы стоят в конце. Придется потом просеивать нули.
|
|
|
|
04.09.2013, 17:50
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: FAQ по STM8
"Мопед не мой!"(С) Стянул с ИзыйдиЭлектроникс. Просто хотелось уточнить по поводу очередного изобретения велосипеда, но если с tempora никто не стал спорить - примем за истину. ))
|
|
|
|
04.09.2013, 18:16
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: FAQ по STM8
Зачем с ним спорить? Я его метод тоже использую. Еще пока не решил, который лучше. В идеале надо вообще от деления избавиться.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:12.
|
|