Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
25.02.2008, 23:37
|
|
Временная регистрация
Регистрация: 05.06.2005
Сообщений: 84
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Сообщение от urry1
|
cтоп, мухи отдельно, котлеты отдельно... Битовые переменные, которые можно объявить в хайтеке - исключение, а не правило среди "мелких" компиляторов. Поэтому в этом вопросе вообще не фиг на Хайтек ориентироваться.Если хочешь свой код портировать потом на другие платформы. Существуют 2 метода разложения байтов на биты - представить байт в виде структуры из 8 бит или через столь нелюбимое биттест - битклир...Нужно флаг встроенного регистра проверить - открываем н файл камня и смотрим, как он правильно называется... Вот по имени и обращаемся, компилятор поймет. Только свой флаг нужно объявлять, а остальные уже объявлены.
|
надо запомнить, не используйте встроенные функции, если хотите портировать код на другие платформы! Но кстати по этой же причине лучше не испльзовать собственные делейки С18, они тоже ни где больше работать не будут, хотя работают точно!
|
|
|
|
25.02.2008, 23:41
|
|
Временная регистрация
Регистрация: 05.06.2005
Сообщений: 84
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Сообщение от alkl
|
Сообщение от arkbox
|
есть такая опция, присваивания адреса каждому биту.
|
Но сдесь тоже явно адрес указываешь. А мы говорим о динамическом номере бита.
|
нет, я динамически передаю адрес бита в функцию, и она на основе встроенных функций тестирует этот бит.
|
|
|
|
25.02.2008, 23:48
|
|
Временная регистрация
Регистрация: 14.04.2007
Сообщений: 65
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от arkbox
|
нет, я динамически передаю адрес бита в функцию, и она на основе встроенных функций тестирует этот бит.
|
Значит твоя проблема решена ?
|
|
|
|
26.02.2008, 02:20
|
|
Временная регистрация
Регистрация: 05.06.2005
Сообщений: 84
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Сообщение от alkl
|
Сообщение от arkbox
|
нет, я динамически передаю адрес бита в функцию, и она на основе встроенных функций тестирует этот бит.
|
Значит твоя проблема решена ?
|
в рамках компайлера Хайтек и ССц встроенными функциями, а в моем случае не так, а сишными, длинными, но зато стандартными. И не проблема это оказывается а просто отсуцствие опыта, вот как с описанием битов, тоже маразм какой то...
|
|
|
|
26.02.2008, 11:29
|
|
Временная регистрация
Регистрация: 14.04.2007
Сообщений: 65
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
А вот структура :
struct {
unsigned lo : 1;
unsigned dummy : 6;
unsigned hi : 1;
} foo;
Инициализированная структура :
struct {
unsigned lo : 1;
unsigned mid : 6;
unsigned hi : 1;
} foo = {1, 8, 0};
циферка после двоеточия обозначает кол занимаемых бит в байте. Заместо unsigned можно писать любые типы. В данном случае это БИТ.
Обращение :
foo.lo = 0 ;
foo.mid = 0b110011 ;
foo.hi = 1;
или
if (foo.hi)
if (foo.mid == 0b110011)
if (foo.lo)
|
|
|
|
26.02.2008, 12:15
|
|
Временная регистрация
Регистрация: 14.04.2007
Сообщений: 65
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Вот ещё примерчик проверки бита.
unsigned char arr[] = {1,2,4,8,16,32,64,128};
char verbit(char adr ,char numbit )
{
return ( adr & arr[numbit] ) ;
}
Выполняется примерно в два раза быстрей чем BITTST.
|
|
|
|
26.02.2008, 13:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Сообщение от alkl
|
Выполняется примерно в два раза быстрей чем BITTST.
|
Код:
|
71: BITSET(status1_,rl);//устанавливаем срабатывание реле в статусе
02C 1523 BSF 0x23, 0x2
72: if(BITTST1(status1_,rl))
02D 1D23 BTFSS 0x23, 0x2
02E 2833 GOTO 0x33
73: {
74: svet=1;
02F 1606 BSF 0x6, 0x4
75: } |
|
|
|
|
26.02.2008, 14:13
|
|
Временная регистрация
Регистрация: 14.04.2007
Сообщений: 65
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от "urry
|
Код:
|
71: BITSET(status1_,rl);//устанавливаем срабатывание реле в статусе
02C 1523 BSF 0x23, 0x2
72: if(BITTST1(status1_,rl))
02D 1D23 BTFSS 0x23, 0x2
02E 2833 GOTO 0x33
73: {
74: svet=1;
02F 1606 BSF 0x6, 0x4
75: } |
|
У тебя явно укозан номер бита "0x2" , а подразумивается что номер заранее неизвестен.
Читай выше... .
|
|
|
|
26.02.2008, 14:14
|
|
Временная регистрация
Регистрация: 05.06.2005
Сообщений: 84
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Сообщение от urry
|
Сообщение от alkl
|
Выполняется примерно в два раза быстрей чем BITTST.
|
Код:
|
71: BITSET(status1_,rl);//устанавливаем срабатывание реле в статусе
02C 1523 BSF 0x23, 0x2
72: if(BITTST1(status1_,rl))
02D 1D23 BTFSS 0x23, 0x2
02E 2833 GOTO 0x33
73: {
74: svet=1;
02F 1606 BSF 0x6, 0x4
75: } |
|
Этого просто не может быть! ты же сам писал:
#define BITSET(var,bitno) ((var) |= 1 ‹‹(bitno))
как он может вместо двух сдвигов по номеру бита просто вписать порядковый номер в команду BTFSS?
Видимо это умный компайлер умеет так оптимизировать, посмотрел что номер бита постоянный и заменил дефайн на прямую проверку бита. А что если теперь тоже самое попробовать с передачей в функцию номера бита, причем не одного возможного а нескольких?
|
|
|
|
26.02.2008, 14:24
|
|
Временная регистрация
Регистрация: 14.04.2007
Сообщений: 65
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от arkbox
|
А что если теперь тоже самое попробовать с передачей в функцию номера бита, причем не одного возможного а нескольких?
|
Ну и ни чего у тебя не получится.
Как он будет знать какой бит ему вставить в BTFSS, если его номер не известен. Для этого и создаются эти макросы, чтобы определять бит заранее неизвестный.
А если он известен, то и макросов ни каких не надо, сделал лог. И , и все в поряде, один машинный цикл.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:16.
|
|