|
Не могу получить бит PORTX.Y |
|
|
|
May 27 2008, 08:16
|
Группа: Новичок
Сообщений: 11
Регистрация: 27-05-08
Пользователь №: 37 836

|
Следующий код: Код #include <avr/io.h>
int main (void) { DDRA = 0x00; // Настройка порта A для ввода
32: if(PORTA.1 == 1){ DDRA = 0xFF; // Настройка порта A для вывода PORTA = 0; 35: PORTA.2 = 1; } } выдаёт ошибку Код SOS.c: In function 'main': SOS.c:32: error: expected ')' before numeric constant SOS.c:35: error: expected ';' before numeric constant
|
|
|
|
|
May 27 2008, 08:28
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
А где такая форма записи доступа к биту описана? Хидеры то подключены соответствующие? Может тогда лучше записать более переносимо? Например так: Код if ((PORTA & 0x01) == 0x01) Судя по #include <avr/io.h> это ВинАВР или АВРГЦЦ.
--------------------
|
|
|
|
|
May 27 2008, 08:48
|
Группа: Новичок
Сообщений: 11
Регистрация: 27-05-08
Пользователь №: 37 836

|
Такая форма записи доступа к биту описана в книге: Шпак Ю.А. Программирование на языке С для AVR и PIC микроконтроллеров. МК-Пресс, Киев, 2006.djvu
среди операторов языка С.
Компилирую WinAVR.
Данный способ мне кажется более ясным для восприятия, пусть и не переносимым.
Не подскажете какие хеадеры нужно подключать и где?
|
|
|
|
|
May 27 2008, 08:54
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(Артем Бум @ May 27 2008, 12:48)  Такая форма записи доступа к биту описана в книге: Шпак Ю.А. Программирование на языке С для AVR и PIC микроконтроллеров. МК-Пресс, Киев, 2006.djvu
среди операторов языка С.
Компилирую WinAVR.
Данный способ мне кажется более ясным для восприятия, пусть и не переносимым.
Не подскажете какие хеадеры нужно подключать и где? Это у вас видимо привычка с MCS51 осталась, но в AVR нет прямой битовой адресации, поэтому рекомендации использовать макросы, которые Вы в состоянии написать сами, будет более правильно и не менее понятным для восприятия.
|
|
|
|
|
May 27 2008, 08:57
|

Гуру
     
Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606

|
Хидер можно оставить тот же самый. А вот тут я действительно напутал Код if(PINA && 0x01) {} Это условие будет всегда выполняться, надо писать так Код if(PINA & 0x01) {} Это эквивалентно вашему в какой то мере Код if(PORTA.1 == 1) В io.h инклудятся другие хидеры, например посмотрим iom128.h это для мега128 /* Data Register, Port A */ #define PORTA _SFR_IO8(0x1B) т.е. это для выдачи данных в порт /* Input Pins, Port A */ #define PINA _SFR_IO8(0x19) а это для чтения данных с порта
|
|
|
|
|
May 27 2008, 09:02
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(Артем Бум @ May 27 2008, 11:48)  Компилирую WinAVR. тогда лучше придерживаться стандартов Цитата Данный способ мне кажется более ясным для восприятия, пусть и не переносимым. А мне вот почему-то более ясным для восприятия кажется другая форма: Код #define BIT0 0 #define BIT1 1 ... #define BIT7 0x80 #define SETBIT(reg,bit) reg|=bit #define CLRBIT(reg,bit) reg&=~bit
void main() { ... SETBIT(PORTA,BIT3); ... CLRBIT(PORTA,(BIT1|BIT3|BIT5)); ... }
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
May 27 2008, 09:46
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 17-04-08
Пользователь №: 36 850

|
Цитата(MrYuran @ May 27 2008, 12:02)  А мне вот почему-то более ясным для восприятия кажется другая форма: Код #define SETBIT(reg,bit) reg|=bit #define CLRBIT(reg,bit) reg&=~bit А мне больше такая: Код #define PORTX.Y(x) PORTX = (PORTX & ~(1 << Y)) | (x << Y) Это для конкретного порта и пина. x должен быть или 0 или 1. Использовал в CodeVision - в нем на атмеге128 нельзя обратится к PORTG.x потому как он лежит за пределами памяти адресуемой in/out-ами( если я конечно правильно понял)...
|
|
|
|
|
May 27 2008, 11:04
|
Группа: Новичок
Сообщений: 11
Регистрация: 27-05-08
Пользователь №: 37 836

|
Код #include <avr/io.h> #define PINA.1 (PINA & 0x01)
int main (void) { if(PINA.1 == 1) {
} } выдаёт ошибку Код SOS.c: In function 'main': SOS.c:8: error: 'PINA' undeclared (first use in this function) SOS.c:8: error: (Each undeclared identifier is reported only once SOS.c:8: error: for each function it appears in.) SOS.c:8: error: called object '1.00000001490116119384765625e-1' is not a function SOS.c:8: error: expected ')' before numeric constant make.exe: *** [SOS.o] Error 1
|
|
|
|
|
May 27 2008, 16:06
|
Участник

Группа: Новичок
Сообщений: 19
Регистрация: 2-01-07
Пользователь №: 24 037

|
Может лучше не PORTA.1, а PINA.1, я так понимаю надо вход проверять.
|
|
|
|
|
May 28 2008, 06:06
|
Группа: Новичок
Сообщений: 11
Регистрация: 27-05-08
Пользователь №: 37 836

|
это работает Код #include <avr/io.h>
int c1 = 0;
int main (void) { DDRA = 0x00;
while([b]c1!=1[/b]) { if(PINA & 0x01) { c1 = 1; } } } а здесь c1 всё время в нуле Код #include <avr/io.h>
int c1 = 0;
int main (void) { DDRA = 0x00;
while([b]1[/b]) { if(PINA & 0x01) { c1 = 1; } } } Дебажу код по F11 (Step Into). На ходу меняю значение PINA в окне IO VIEW (AVR Studio)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|