Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
04.09.2011, 12:33
|
|
Вид на жительство
Регистрация: 29.04.2007
Адрес: Иркутск
Сообщений: 311
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Синтаксис ССS
Всем привет!
Код:
|
void CheckPin(int pinX, n)
{
if( INPUT(pinX) != predstatus[n] ) // если состояние входа изменилось
.................................. // выполним некоторые операции
}
void main(void)
{
............. // инициализация
CheckPin(PIN_A0, 0);
CheckPin(PIN_B1, 9);
CheckPin(PIN_C3, 17);
CheckPin(PIN_D1, 23);
CheckPin(PIN_E0, 28);
..................
} |
При компиляции получаю ошибку в первой строке функции CheckPin
Error27: Expression must evaluate to a constant::
Если использовать требуемые константы:
Код:
|
if( INPUT(PIN_A0) != predstatus[0]) |
то всё компилится нормально, но это ж ведь не правильно с точки зрения оптимизации и объёма получаемого в итоге кода
|
|
|
|
04.09.2011, 13:20
|
|
Временная регистрация
Регистрация: 04.06.2010
Сообщений: 52
Сказал спасибо: 43
Сказали Спасибо 13 раз(а) в 7 сообщении(ях)
|
Re: синтаксис ССS
Причем здесь "правильно-неправильно", читем help:
value = input (pin)
Pin to read. Pins are defined in the devices .h file. The actual value is a bit address. For example, port a (byte 5 ) bit 3 would have a value of 5*8+3 or 43 . This is defined as follows: #define PIN_A3 43 .
Т.Е. компилятор требует, чтобы в INPUT была указана константа из .h файла используемого МК.
Если же хочется переменную, то она должна принимать значение, равное этой константе:
The PIN could also be a variable. The variable must have a value equal to one of the constants (like PIN_A1) to work properly. The tristate register is updated unless the FAST_I0 mode is set on port A.
Т.Е. в функции нужно завести переменную и ей присваивать константу-номер ноги.
И касаясь оптимизации:
note that doing I/0 with a variable instead of a constant will take much longer time.
И, надо учитывать, какая требуется оптимизация: если по времени исполнения, то, с учетом расходов на вызов функции, получится ухудшение временных параметров выполнения кода.
Последний раз редактировалось bolek4321; 04.09.2011 в 13:27.
|
|
|
|
04.09.2011, 14:08
|
|
Вид на жительство
Регистрация: 29.04.2007
Адрес: Иркутск
Сообщений: 311
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: синтаксис ССS
Пробовал я уже вместо константы её номер подставлять, но толку нет.
Да и с чего он будет, когда 43 #define PIN_A3
Сообщение от bolek4321
|
Т.Е. в функции нужно завести переменную и ей присваивать константу-номер ноги.
|
А это вообще не пойму. Разве есть разница: это переменная в теле функции или только что в неё поступившая.
Написали б тогда уж код, раз так уверены в этом.
А пока я придумал сделать так:
Код:
|
m=INPUT(PIN_A0);
CheckPin(m, 0);
m=INPUT(PIN_B1);
CheckPin(m, 9);
m=INPUT(PIN_C3);
CheckPin(m, 17); |
|
|
|
|
04.09.2011, 14:43
|
|
Временная регистрация
Регистрация: 04.06.2010
Сообщений: 52
Сказал спасибо: 43
Сказали Спасибо 13 раз(а) в 7 сообщении(ях)
|
Re: синтаксис ССS
Бред какой-то:
input возращает
- 0 (or FALSE) if the pin is low,
- 1 (or TRUE) if the pin is high
Какие там могут быть сравнения с 9 или 17?
|
|
|
|
04.09.2011, 20:04
|
|
Вид на жительство
Регистрация: 29.04.2007
Адрес: Иркутск
Сообщений: 311
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: Синтаксис ССS
предыдущее значение входа PIN_A0 находится в девятом бите, а PIN_C3 - в семнадцатом
|
|
|
|
04.09.2011, 20:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.06.2008
Сообщений: 1,530
Сказал спасибо: 78
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: Синтаксис ССS
Сообщение от yellow87
|
предыдущее значение входа PIN_A0 находится в девятом бите,
|
А вход PIN_A0 (или друго, без разницы) и есть девятый (или какой-то другой) бит, неужели так сложно прочитать help.
Сообщение от bolek4321
|
Pin to read. Pins are defined in the devices .h file. The actual value is a bit address. For example, port a (byte 5 ) bit 3 would have a value of 5*8+3 or 43 . This is defined as follows: #define PIN_A3 43
|
|
|
|
|
04.09.2011, 20:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2003
Адрес: Москва
Сообщений: 2,531
Сказал спасибо: 737
Сказали Спасибо 1,927 раз(а) в 799 сообщении(ях)
|
Re: Синтаксис ССS
Сообщение от yellow87
|
пока я придумал сделать так
|
кроме первой строки не будет работать. Состояние ноги может быть только "0", т.е. FALSE или не 0, т.е. TRUE. Что и возвращает макрос.
И непонятно, что делает CheckPin()?
__________________
Опыт - это школа, в которой человек узнает, каким дураком он был раньше.
|
|
|
|
04.09.2011, 20:51
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Синтаксис ССS
Алгоритм изначально неправильный .
Я уж молчу о дребезге , но сравнивать значение бита с его номером - это что то новенькое.
С помощью Input() вы получаете значение пина , Заносите это значение в переменную ( флаги) . В следующей итерации снова проверяете пины и xor'те с предыдущем значением флагов.
Не нравятся встроенные функции используйте это :
Код:
|
#byte PortA=0x05
#bit Key1= PortA.0
......
if(Key1) ......... |
__________________
Осторожно , злой кот
|
|
|
|
04.09.2011, 20:53
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Синтаксис ССS
Сообщение от DK
|
И непонятно, что делает CheckPin()?
|
Сравнивает значение бита с его дефайном(порядковым номером)....
__________________
Осторожно , злой кот
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
RS485 и ССS Compiler
|
Boris_Britva |
Микроконтроллеры, АЦП, память и т.д |
8 |
09.05.2010 12:29 |
Часовой пояс GMT +4, время: 10:34.
|
|