|
Начал разбираться с IAR AVR, появились и будут появляться вопросы |
|
|
|
Sep 9 2005, 08:36
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(eXeC001er @ Sep 9 2005, 11:30) if ((PINB &= 0xFE) == 1) правильно ли я проверяю 1 в нулевом бите PINB ================================== command |= (PINB &= 0xFE); правильно переношу PINB.0 в нулевой бит command =================================== можно делать так: OCR1 = ICR1 + Bit_75; или лучше вот так: tempor = ICR1 + Bit_75; OCR1 = tempor; 1. Не правильно надо так if (PINB & 1) а вот так можно OCR1 = ICR1 + Bit_75;
|
|
|
|
|
Sep 9 2005, 08:58
|
Группа: Новичок
Сообщений: 9
Регистрация: 28-01-05
Пользователь №: 2 265

|
command |= (PINB &= 0xFE); правильно переношу PINB.0 в нулевой бит command
Это тоже не совсем правильно, надо или очищать предварительно 0 бит в command, а то первая же 1 там навсегда и останется или например так делать
if(PINB & 1) command |= (0<<1); else command &= ~(0<<1);
И лучше сразу вместо 0 писАть символьное имя для улучшения читабельности.
|
|
|
|
|
Sep 9 2005, 09:08
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(eXeC001er @ Sep 9 2005, 12:01) to PaulS у меня там вот такая конструкция command |= (PINB & 1); command = command << 1; после принятия всех битов и обработки, command обнуляется command будет равнв 0 если 0 бит порта 0 или будет равна 2 в симуляторе IAR будет 0 (потому что PINB 0)? если туда конечно не записать другое значение
|
|
|
|
|
Sep 9 2005, 09:11
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(eXeC001er @ Sep 9 2005, 11:59) Другой вопрос именно по IAR у него в *.h файлах написаны объявления типа #define ICR1 1 но они не работают при использовании этих имен из С конструкций, а в файле написано что это объявления для Ассемблера, пришлось их скопировать в свой h файл, шоб работало, почему так, что мне в каждом новом проекте такие операции проводить?! вообще для С у IAR используются не #define а специальные макросы типа SFR_B(PINB, 0x16) /* Input Pins, Port B */ таким образом и обявляется порт макрос преобразуется в определение переменной volatile по определенному адресу
|
|
|
|
|
Sep 9 2005, 10:44
|
Группа: Новичок
Сообщений: 9
Регистрация: 28-01-05
Пользователь №: 2 265

|
Цитата(eXeC001er @ Sep 9 2005, 12:17) да я это обнаружил но это савсем не удобно! только номера битов и все а имен нет! TIMSK |= (1<<5); работает а TIMSK_bit5 = 1; не работает Так пиши не номера, а имена и все понятно будет TIMSK |= (1<<TICIE1); А битам внешних регистров сам присвой имена в зависимости от назначения Цитата(eXeC001er @ Sep 9 2005, 12:01) у меня там вот такая конструкция command |= (PINB & 1); command = command << 1; после принятия всех битов и обработки, command обнуляется А ну тогда все ОК, вдвигаться всегда будет 0
|
|
|
|
|
Sep 9 2005, 11:18
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(eXeC001er @ Sep 9 2005, 14:57) скажите битовые переменные можно объявлять через встроенный макрос, как это сделано для регистров контроллера, а потом обращатся к ним например вот так SFR_B(FLAG, Addr) но вот вопрос какое значение записывать в Addr?! Или это как то по другому делается?! Объявите сначала Ваши переменные, а потом через #define переобозначтесь.
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Sep 9 2005, 12:14
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата(eXeC001er @ Sep 9 2005, 15:01) я про то как мне организовать собственные битовые переменные?! я где то здесь на форуме встречал как это делается, но вот забыл где?! Из исходника: //TCP заголовок struct { unsigned int rport; //От какого порта unsigned int lport; //В какой unsigned long SEQ; unsigned long ACK; char hlen; union { char CTL; //Флаги struct { char FIN:1, SYN:1, RST:1, PSH:1, _ACK:1, F5:1, F6:1, F7:1; }; }; unsigned int wsize; } TCP_HDR; FIN, SYN, RST и т.д. - ото оно, CTL - доступ сразу ко всему байту.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Sep 9 2005, 13:21
|
Группа: Новичок
Сообщений: 9
Регистрация: 28-01-05
Пользователь №: 2 265

|
Цитата(eXeC001er @ Sep 9 2005, 15:01) я про то как мне организовать собственные битовые переменные?! я где то здесь на форуме встречал как это делается, но вот забыл где?! ИМХО лучше всего так, например: typedef union isd_status { unsigned int word; struct { unsigned char powerUP_delay : 1; unsigned char record_start : 1; unsigned char play_start : 1; unsigned char record_process : 1; unsigned char play_process : 1; unsigned char pause_stop : 1; }; } isd_status; Если будет больше chara, смело пиши word или long. В программе: обьява: isd_status ISD_status = {0}; Модификация бита: ISD_status.pause_stop = SET; Модификация всей структуры: ISD_status.word = CLR; Проверка бита: if (ISD_status.pause_stop); Так же и байта. Передача параметром в функцию: number_operation = GetNumberBit(ISD_status.word); Ну и т.д. Так 6-й час, домой пора. Успехов.
|
|
|
|
|
Sep 9 2005, 16:59
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 23-07-05
Пользователь №: 7 043

|
Цитата(BVU @ Sep 9 2005, 13:51) Цитата(eXeC001er @ Sep 9 2005, 15:25) Это стандарт языка С. Почитайте любую книжку (учебник) по С, и посмотрите, как можно организовать макрос. Я Вам дам лучше другое ценное замечание: что бы избежать ошибок параметры макроолределения всегда необходимо заключать в скобки: #define xxx (xxx/xxx * ... + ... - xxx) я б даже сказал вот так #define ...(xxx) ((xxx)/(xxx) * ... + ... - (xxx)), если речь шла о параметрах
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|