STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

shads писал(а):Ыыыы.... я вообще то про свою библиотечку рассуждал..... вы ее читали?.....


Вы бы ссылку на свое "творение" убрали бы . :)))
А то придется отмахиваться "- я не спец, пишу как могу " ...
Реклама
Foks
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Re: STM32 новичку в ARM что к чему

Сообщение Foks »

shads писал(а):Ыыыы.... я вообще то про свою библиотечку рассуждал..... вы ее читали?.....

Я бы с радостью прочитал, если бы вы не забыли об этом упомянуть, и не написали сообщение таким образом, что оно недвузначно воспринимается как продолжение обсуждения. Мало того, учитывая, опять же, то как написано сообщение, вряд ли кто-то теперь поверит, что вы случайно забыли об этом упомянуть.

Но код я всё-таки посмотрел. Во-первых, там и сотни строк не наскребется, поэтому написать для STM32 проще будет заново. Во-вторых, я что-то не увидел там вообще чего-либо стоящего, чтобы reuse'ать этот код.

Пока писал сообщение, почитал внимательнее.

Код: Выделить всё

    if (! (BTN_PIN & BTN_LINE_UP))        mask = BTN_SHRT_UP;
    if (! (BTN_PIN & BTN_LINE_DN))        mask = BTN_SHRT_DN;
    if (! (BTN_PIN & BTN_LINE_LEFT))    mask = BTN_SHRT_LEFT;
    if (! (BTN_PIN & BTN_LINE_RIGHT))    mask = BTN_SHRT_RIGHT;

Да это еще похлеще чем тот код, который обсуждался в теме исходно.

Кстати, антидребезг ("защелка доЩитала") нужен только при отпускании клавиши.

P.S. Обнуляция прошла успешно, тумблер на 30 секунд сработал, если вы понимаете о чем я :)))
Giggity giggity goo!
Реклама
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: STM32 новичку в ARM что к чему

Сообщение shads »

Foks писал(а):Пока писал сообщение, почитал внимательнее.

Код: Выделить всё

    if (! (BTN_PIN & BTN_LINE_UP))        mask = BTN_SHRT_UP;
    if (! (BTN_PIN & BTN_LINE_DN))        mask = BTN_SHRT_DN;
    if (! (BTN_PIN & BTN_LINE_LEFT))    mask = BTN_SHRT_LEFT;
    if (! (BTN_PIN & BTN_LINE_RIGHT))    mask = BTN_SHRT_RIGHT;

Да это еще похлеще чем тот код, который обсуждался в теме исходно.
А что не так?.....
Это элементарно - упорядочивание возможно разбросанных по выводам контроллера кнопок в стройную последовательность 0,1,2,3.....
Только догадаться об этом тем кто скор на слова - сложно..... (хотя может это и не про вас.....)

Foks писал(а):Кстати, антидребезг ("защелка доЩитала") нужен только при отпускании клавиши.
А как же это?.....
viewtopic.php?f=61&t=39341&start=160

Foks писал(а):P.S. Обнуляция прошла успешно, тумблер на 30 секунд сработал, если вы понимаете о чем я :)))
Неа не понимаю..... если не затруднит доступнее объясните пожалста.....
Ага... вроде въехал.....
Парню на момент написания было 14 лет... наверное еще и учился плохо....
А я не русский..... и что..... предлагаете пообщатся про то какая нация лучше?..... или заявляете что вы самый умный?.....
Последний раз редактировалось shads Чт июл 04, 2013 10:31:53, всего редактировалось 1 раз.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение urry »

shads, не обижайтесь, но хвастаться решительно нечем.
Первое, что напрягает- это 1 счетчик на 4 кнопки.Вы нажали одну кнопку, зафиксировали нажатие, не отпуская ее, нажали следующую, затем отпустили обе. Зафиксируется длинное нажатие той, которая отпустилась первой.
Выражение

Код: Выделить всё

        if (BtnLongCoun >= (BTN_LONG_TIME/10))                                
            return;                                //возврат, т.к. счетчик длинн нажат досчитал до максимума еще раньше       
        if (++BtnLongCoun >= (BTN_LONG_TIME/10))

ввело меня в ступор секунд на 15, пока не догадался, что BtnLongCoun -1 == BTN_LONG_TIME/10 проходит.
Перечисление сделало бы код нагляднее во многих местах.
В состав библиотеки входит заголовочный файл, которого у Вас нет и он мог бы выглядеть следующим образом

Код: Выделить всё

#ifndef __button_H__
#define __button_H__
typedef enum {B_NULL=0,B_LEFT,B_B_RIGHT,B_UP,B_DOWN}BUTTON_CODE;
extern BUTTON_CODE fnButtRead(void);
extern void fnButtInit(void);
#endif //__button_H__

зы Я тоже не русский - и какая нация лучше, я не знаю :)
Думаю, здесь это не имеет значения.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: STM32 новичку в ARM что к чему

Сообщение shads »

urry писал(а):shadsб не обижайтесь, но хвастаться решительно нечем.
Абсолютно не обижаюсь, особенно если это действительно полезная критика.
И в чем вы усмотрели что я хвастаюсь? По вашему если кто-то привел какой то свой материал, то это однозначно хвастовство?????


urry писал(а):Первое, что напрягает- это 1 счетчик на 4 кнопки.Вы нажали одну кнопку, зафиксировали нажатие, не отпуская ее, нажали следующую, затем отпустили обе. Зафиксируется длинное нажатие той, которая отпустилась первой.
Я абсолютно ни где не упоминал о возможности одновременного нажатия кнопок, это нештатная ситуация, и в своих поделках никогда не применяю одновременных нажатий.....
Обработка этой не штатной ситуации пройдет почти так как вы описали, но с небольшим отличием:
Если кнопки были отпущены раньше чем время BTN_LONG_TIME, то зафиксируется короткое нажатие последней отпущенной кнопки.
Если кнопки были отпущены позже чем время BTN_LONG_TIME, то зафиксируется длинное нажатие той нажатой кнопки, которая была последней в этой цепочке

Код: Выделить всё

    if (! (BTN_PIN & BTN_LINE_UP))        mask = BTN_SHRT_UP;
    if (! (BTN_PIN & BTN_LINE_DN))        mask = BTN_SHRT_DN;
    if (! (BTN_PIN & BTN_LINE_LEFT))    mask = BTN_SHRT_LEFT;
    if (! (BTN_PIN & BTN_LINE_RIGHT))    mask = BTN_SHRT_RIGHT;



urry писал(а):Выражение

Код: Выделить всё

        if (BtnLongCoun >= (BTN_LONG_TIME/10))                                
            return;                                //возврат, т.к. счетчик длинн нажат досчитал до максимума еще раньше       
        if (++BtnLongCoun >= (BTN_LONG_TIME/10))

ввело меня в ступор секунд на 15, пока не догадался, что BtnLongCoun -1 == BTN_LONG_TIME/10 проходит.
Что это за выражение: BtnLongCoun -1 == BTN_LONG_TIME/10 и где оно проходит ?.....


urry писал(а):Перечисление сделало бы код нагляднее во многих местах.
В состав библиотеки входит заголовочный файл, которого у Вас нет и он мог бы выглядеть следующим образом

Код: Выделить всё

#ifndef __button_H__
#define __button_H__
typedef enum {B_NULL=0,B_LEFT,B_B_RIGHT,B_UP,B_DOWN}BUTTON_CODE;
extern BUTTON_CODE fnButtRead(void);
extern void fnButtInit(void);
#endif //__button_H__
Спасибо, покумекаю, просто перечисления еще не привык применять....


urry писал(а):зы Я тоже не русский - и какая нация лучше, я не знаю :)
Думаю, здесь это не имеет значения.
А какой тогда смысл умничать по поводу каждой ошибки?.....
Вижу только 3 варианта: 1-унизить человека... 2-возвысить себя.... 3-и то и другое..... Не я не против, я уже привык к такому поведению на форумах, мне как то все равно на какой высоте человек себя представляет.....
Просто если так рассуждать, то тогда что надо было сделать с этим человеком????? viewtopic.php?f=62&t=88022
Реклама
Foks
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Re: STM32 новичку в ARM что к чему

Сообщение Foks »

shads писал(а):Это элементарно - упорядочивание возможно разбросанных по выводам контроллера кнопок в стройную последовательность 0,1,2,3.....
Это абсолютно бессмысленно. Нету никакого смысла их упорядочивать, нет никакой разницы какой бит соответствует какой кнопке. Достаточно сделать &= с маской, которая отсеет неиспользуемые входы, а биты всё-равно будут обрабатываться в соответствии с константами, прописанными в #define'ах. Процедура которая опрашивает кнопки вообще не должна знать, какая кнопка за что отвечает, она должна просто обработать их все.

Про кнопки в условиях помех - согласиться сложно. Все входы AVR, для которого писался ваш код, оборудованы триггерами Шмитта, что уже значительно увеличивает помехозащиту. Но если уже и там наведется что-то, приводящее к ложному определению нажатия кнопки, то здесь два варианта:
1) Ваша плата разведена неимоверно плохо.
2) Помехи настолько сильны, что нормальное функционирование МК в их условиях невозможно вообще.

Поэтому в принципе использовать счетчик для определения нажатия то можно, но вряд ли он когда-либо реально пригодится. Я и для определения отпускания его обычно не использую (хотя зависит от ситуации), обычно хватает только хранить предыдущее значение и с помощью простейшей логической операции определять событие отпускания.

P.S. Ваша нештатная ситуация с одновременным нажатием кнопок очень даже штатная - они могут быть нажаты одновременно даже случайно. И если вы не реализовываете их обработку, то нужно хотя-бы проследить, чтобы это не приводило к непредсказуемому поведению вашей программы, т.е. например хранить в отдельной переменной номер нажатой кнопки, и не опрашивать остальные вообще, пока не отпустят эту. А у вас же всё не так:

Код: Выделить всё

    if (! (BTN_PIN & BTN_LINE_UP))        mask = BTN_SHRT_UP;
    if (! (BTN_PIN & BTN_LINE_DN))        mask = BTN_SHRT_DN;
    if (! (BTN_PIN & BTN_LINE_LEFT))    mask = BTN_SHRT_LEFT;
    if (! (BTN_PIN & BTN_LINE_RIGHT))    mask = BTN_SHRT_RIGHT;
Кнопки обрабатываются в заранее заведенной последовательности, и если нажать к примеру вторую или третью, а потом вместе с ней нажать первую, то, ололо, можно вызвать и длинное нажатие, и всё что хочешь - одним лишь прикосновением к первой кнопке. Ну, не факт, что именно так и будет - я не анализировал ваш код столь детально, чтобы вылавливать в нем баги, пока просто высказываю предположение.

Тогда уж mask (которая на самом деле и не маска, так как вы работаете с ней через = а не через |=) надо делать статической и не обнулять при повторном вызове, чтобы обработать одну нажатую кнопку до конца, и только потом уже опрашивать остальные. Ну а вообще криво всё это. Одновременные нажатия должны блокироваться на более высоком уровне, в коде интерфейса. А опрос аппаратной части должен быть полноценным, чтобы была возможность адекватно реагировать на такие вот "нештатные", но вполне бытовые ситуации.
Giggity giggity goo!
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение urry »

"Хвастаться нечем" - фигуральное выражение, это не обвинение в хвастовстве, а легкое сожаление о уровне кода, который на мой взгляд, несколько далек от идеала.
Дело не в невозможности нажать 2 клавиши, это не "нештатная ситуация", даже не рассматривается - клиент может нажимать кнопки, как ему заблагорассудится.
Одним счетчиком Вы нивелируете сам принцип программного подавления дребезга - пусть нажата одна кнопка, счетчик досчитал чуть ли не до окончания и готов схватить -тут прошла иголка по другому проводу- помеха присваивает себе значение счетчика и фиксируется ложное нажатие.
Какое отношение к АРМ имеет это все - я не знаю.
Удалить бы как флуд...
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 новичку в ARM что к чему

Сообщение HHIMERA »

shads писал(а):Вижу только 3 варианта: 1-унизить человека... 2-возвысить себя.... 3-и то и другое.....

Есть ещё и 4-ый вариант: вам помогли/подсказали/потратили время, а вы щёки надули и пальцы до колен растопырили... типа... "Вы что, меня совсем за дурака считаете?"...
Вот... в соседней ветке... никто не ответил челу по таймеру... ответили на другом форуме... а здесь отписывает "разобрался"...
Ну разобрался "сам"... и фиг с ним...
Вот почему... начинающим так трудно/тяжело признавать свои ошибки? А?
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: STM32 новичку в ARM что к чему

Сообщение shads »

Вообще да..... можно удалить.
Не думал что получится такая затяжная беседа.
Аватара пользователя
SergeBS
Вымогатель припоя
Сообщения: 683
Зарегистрирован: Пт апр 11, 2008 11:24:53
Откуда: Владимир

Re: STM32 новичку в ARM что к чему

Сообщение SergeBS »

Добавил в "Сундук Кота" The Insider"s Guide to the STM32 ARM Based Miceocontroller-перевод. Читайте.
Человек - это звучит гордо, а обезьяна - объективно...
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: STM32 новичку в ARM что к чему

Сообщение ut1wpr »

SergeBS писал(а):Добавил в "Сундук Кота" The Insider"s Guide to the STM32 ARM Based Miceocontroller-перевод. Читайте.
Читать надо оригинал. И тогда не будет вопросов, "а кто такой мышиный О-контролёр?" :)
С уважением,
Виктор.
Аватара пользователя
SergeBS
Вымогатель припоя
Сообщения: 683
Зарегистрирован: Пт апр 11, 2008 11:24:53
Откуда: Владимир

Re: STM32 новичку в ARM что к чему

Сообщение SergeBS »

А кто сказал, что у меня оригинала нет? :)
Тоже в сундук запихнуть? Так тут оно было.
Ну , очепятки и на английском бывают. У меня.
Человек - это звучит гордо, а обезьяна - объективно...
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: STM32 новичку в ARM что к чему

Сообщение спящий »

Здравствуйте,подскажите что случилось -сделал плату,прошил первый раз - пробный(голая плата) получилась.
Потом понавесил микросхем(припаял) -непрошиваеться,проверяю цешкой между PA13 и землей (SWD)звониться -неучто микроконтроллер накрылся?
Или подскажите как исправить?
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

спящий писал(а):Или подскажите как исправить?


Или сопля или как обычно viewtopic.php?f=59&t=91886
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: STM32 новичку в ARM что к чему

Сообщение drakon »

подключил "stdio.h" и написал такое:

Код: Выделить всё

sprintf(str, "%u", d);

d это uint32_t, выдает у меня KEIL предупреждение:

Код: Выделить всё

main.c(567): warning:  #167-D: argument of type "uint8_t *" is incompatible with parameter of type "char *restrict"

прочитал что квалификатор restrict применяется только к указателям, это получается что аргументом ф-и должен быть указатель на переменную, а не сама переменная? объявил указатель и присоил ей адресс d, записал его в качестве аргумента sprintf, предупреждение остантся. короче помогите РАЗДУПЛИТСЯ.
Последний раз редактировалось drakon Сб июл 13, 2013 22:10:08, всего редактировалось 1 раз.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

У вас буфер str объявлен как uint8_t , поменяйте на char .
Гы... Кстати , а вы часом не переменную подсунули вместо массива ??? :)))


d не причем , Keil лается на str !
Почитал ваше дополнение - похоже вы не понимаете сам процесс .
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: STM32 новичку в ARM что к чему

Сообщение drakon »

dosikus, поменял, и предупреждения с restrict пропали. а чем uint8_t отличается от char?
Последний раз редактировалось drakon Сб июл 13, 2013 22:20:47, всего редактировалось 1 раз.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Что поменял на что ????????

Объявляйте массив на максимальное количество знаков в вашем d, +1
Например :

char str[12];
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

drakon писал(а): а чем uint8_t отличается от char?


Спросите у разработчиков Keil , в справке.
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: STM32 новичку в ARM что к чему

Сообщение drakon »

нашел а одной из библиотек такое: typedef unsigned char uint8_t;
не подходит не unsigned char не signed char, только char. объясните пожалуйста это.
Ответить

Вернуться в «ARM»