11.02.2014, 18:50
|
#1111
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: FAQ по STM8
Та я не про то. Переписывать каждый раз хедер под другой камень и под другую задачу - "Это не серьёзно!"(С).
|
|
|
|
11.02.2014, 19:15
|
#1112
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от nahimovv
|
Переписывать каждый раз хедер под другой камень и под другую задачу - "Это не серьёзно!"
|
Пока что все одинаково (и в STM8S003, и в STM8S105), просто некоторых вещей нет в одном, некоторых - в другом. Если появится у меня третий камень, где что-то будет по-другому, то буду уже #ifdef'ы впихивать.
А пока - у меня файлик потихоньку деталями обрастает (сразу все из даташита туда писать смысла не вижу - я всем этим вряд ли пользоваться буду).
Сейчас вот с другим столкнулись: коллеге надо для ЧПУшки самопальной сделать тестовый блок управления, а там все четыре оси независимы, да и скорости разные (а шпиндель, кажись, вообще не шаговиком управляется). Лишней макетки с STM32 у меня пока нет, зато эту дешевую 105-ю можно использовать. Правда, боюсь, придется уже тупым "ногодрыгством" заниматься: у этого МК всего лишь 3 таймера выведено наружу, если четвертый движок будет тоже шаговиком, с ним придется попыхтеть.
Сделал заметку в ЖЖ по поводу ШД.
__________________
Союз Советских Социалистических Округов Северной Америки
Последний раз редактировалось eddy; 12.02.2014 в 23:16.
Причина: upd
|
|
|
|
12.02.2014, 18:31
|
#1113
|
Частый гость
Регистрация: 30.12.2008
Сообщений: 36
Сказал спасибо: 7
Сказали Спасибо 28 раз(а) в 13 сообщении(ях)
|
Re: FAQ по STM8
Люди добрые, помогите. Уже 3 дня не могу разобраться, может кто сталкивался.
Среда - STM8S-DISCOVERY (STM8S105C6T6) + IAR
Предыстория.
Считаю CRC16. Натыкаюсь на странность - сумма не сходится! Т.е. та, что вычислена компилятором (IAR) и та, что в программе - разные.
Грешил на кривые руки сначала. Начал отлаживать. Оказалось определенные куски считает функция на кристалле правильно. Но после определенного момента - не сходится.
Дальнейший дебаг показал странность:
Загрузка байта в переменную по адресу дает не тот результат, что ожидается. Должен грузиться в байт 0x81, а оказывается 0x8B.
Причем это бывает в одном и том же месте, хотя если меняется код, то адрес ошибки со считыванием может меняться, но это всегда ошибка на 81 и возвращается всегда 8B, но в другом месте может считать 81 нормально. Вообще считывание идет нормально везде, кроме этого места. Т.е. соседние байты при изменении указателя считываются нормально.
Если вручную в этом ОДНОМ месте поменять в отладчике считанное значение на правильное (81), то сумма посчитается правильно.
Что бы не подумали, что у меня глюки, приведу куски кода и как меняются регистры-память.
Интересует адрес 0x8FD8, содержимое в памяти 00 81 ff ff ff ff ff ff
Код -
unsigned char *p = 0x8FD8
unsigned char byte = *(p)
Первое считывание byte = 00 (правильно)
Увеличиваем p++
Считываем - byte = 8B (должно быть 81)
Увеличиваем p++
Считываем byte = FF (правильно)
В окне с памятью вижу нужное значение - 81, считывается - 8B
Смотрю дизасм, код такой:
// unsigned char byte = *(p);
92C606 LD A, [?b6.w]
B709 LD ?b9, A
К моменту загрузки [?b6.w] имеет правильное значение 0x8FD9.
Операция LD A, [?b6.w] грузит по непонятной причине в A значение 8B, что видно после ее выполнения в регистрах.
Вопрос - в чем проблема? Дохлый кристалл или совершенно кривые руки?
|
|
|
|
13.02.2014, 03:21
|
#1114
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: FAQ по STM8
Надо бы привести фрагмент реального кода, а не его описание.
А то получается, что при объявлении переменной byte в неё кладётся значение, на которое указывает в данный момент пойнтер p. Потом пойнтер увеличивается, и Вы ожидаете, что и переменная byte тоже изменится? То есть byte как бы отслеживает, на что указывает пойнтер по ходу программы?
Судя по описанию, связь byte и p была только при объявлении byte, а после этого их дорожки разошлись. Пойнтер пошёл скакать по памяти, а byte как сидел с 00, так и должен сидеть дальше. Непонятно, как вообще получается разные значения считывать из него ...
Вобщем, нужен реальный код.
|
|
|
|
13.02.2014, 16:17
|
#1115
|
Частый гость
Регистрация: 30.12.2008
Сообщений: 36
Сказал спасибо: 7
Сказали Спасибо 28 раз(а) в 13 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от Yurkin2014
|
Вобщем, нужен реальный код.
|
Код из библиотеки IAR. С его примерами.
Привожу тут:
Код:
|
unsigned short slow_crc16(unsigned short sum, unsigned char *p, unsigned short len)
{
while (len--)
{
int i;
unsigned char byte = *(p);
for (i = 0; i ‹ 8; ++i)
{
unsigned long osum = sum;
sum ‹‹= 1;
if (byte & 0x80)
sum |= 1;
if (osum & 0x8000)
sum ^= 0x1021;
byte ‹‹= 1;
}
p++;
}
return sum;
} |
Додумался запустить на симуляторе - считает правильно.
Последний раз редактировалось boydyzy; 13.02.2014 в 16:26.
|
|
|
|
13.02.2014, 17:22
|
#1116
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: FAQ по STM8
Ну, к примеру из библиотеки IAR вопросов нет. В цикле каждый раз после изменения пойнтера p++ переменной byte присваивается новое значение unsigned char byte = *(p).
Поглядите внимательно на место объявления переменных в Вашем коде. Может статься, что рядом с адресом 0x8FD8 в памяти находится другая переменная ххх, объявленная как char, например. А в программе её используют как int. Вот и портится 0x81 на 0x8B при записи в ххх.
|
|
|
|
14.02.2014, 01:45
|
#1117
|
Частый гость
Регистрация: 30.12.2008
Сообщений: 36
Сказал спасибо: 7
Сказали Спасибо 28 раз(а) в 13 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от Yurkin2014
|
Ну, к примеру из библиотеки IAR вопросов нет. В цикле каждый раз после изменения пойнтера p++ переменной byte присваивается новое значение unsigned char byte = *(p).
Поглядите внимательно на место объявления переменных в Вашем коде. Может статься, что рядом с адресом 0x8FD8 в памяти находится другая переменная ххх, объявленная как char, например. А в программе её используют как int. Вот и портится 0x81 на 0x8B при записи в ххх.
|
Проблема в том, что вот этот код и выполняется. Передается указатель на 0x8FD8, счетчик на 4.
При первом считываении по адресу 0x8FD8 читается правильно - 00.
Второй проход - читается фигня (8B вместо 81).
Третий - опять нормально - ff.
В окне инспектора памяти видно правильные значения по этому адресу - 00 81 ff ff ff ff ff ff
А читается другое.
Еще раз - смотрел именно процесс считывания в регистр из памяти.
Выполняется команда LD A, [?b6.w], значение ?b6.w = 0x8FD9
Читается в регистра А значение 8B
Причем только на кристалле читается неправильно, а в симуляторе - правильно.
Если что - это область памяти программ. Это код. Я проверяю его контрольную сумму, что бы убедиться в бутлоадере, что главная программа в порядке и обновление не требуется.
Проверка контрольки другими средствами дает правильные значения, если бы считалось 81, как и положено. Т.е. читается явно фигня.
С чем связано - понять не могу.
Последний раз редактировалось boydyzy; 14.02.2014 в 01:50.
|
|
|
|
14.02.2014, 10:05
|
#1118
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: FAQ по STM8
boydyzy, а у вас там, часом, никакой счетчик не завалялся по этому адресу? Что там у вас в .rst-файле по этому адресу лежит?
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
14.02.2014, 12:41
|
#1119
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: FAQ по STM8
Проще всего проверить код на лругой плате. А так, если есть подозрения на "мерцание", то добавьте простой код типа
Код:
|
volatile uint8_t tmp = 0;
while(1)
{
tmp = (*(__IO uint8_t *)(0x8FD8));
if(tmp != 0x81) break;
// Delay_mS(5);
}
nop(); |
и посмотрите. Можно задержку добавить/поиграться.
Но мне кажется, что там что-то связанное с volatile, точнее с его отсутствием.
|
|
|
|
22.02.2014, 11:34
|
#1120
|
Прохожий
Регистрация: 22.02.2014
Сообщений: 2
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: FAQ по STM8
добрые люди помогите тупому
не разу с прошивками не связывался
пытаюсь собрать схему на STM8S105C6T6
имею STM8Discovery пошивку stm.s19 ST Visual Develop ST Visual Programmer
хочу прошить и отломить МК
подскажите какую программку установить куда загрузить прошивку
и какую кнопочку нажать чтобы прошить или дайте ссылку где все
разжевано
лазил по форумам голова пухнет не чего не понял там слова заморские
непонятные
заранее спасибо
Последний раз редактировалось vehfdtqxbrc; 22.02.2014 в 11:37.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:49.
|
|