Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/23: Рейтинг темы: голосов - 23, средняя оценка - 4.91
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
1

Макросы, определения пинов МК, ввода-вывода

06.05.2015, 16:22. Просмотров 4158. Ответов 9
Метки нет (Все метки)

Хочется удобного и покрасивше макросы, определения пинов МК, ввода-вывода. Накидайте примеров, плиз.
На данный момент пока делаю, так сказать, стандартно. Но в таких случаях очень легко ошибиться при большом кол-ве ввода-вывода.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//========================================================================
#define LED_DDR DDRD
#define LED_PORT PORTD
 
//#define OPEM_DROYM 0
 
//#define LED_METHOD OPEM_DROYM
 
#define LED_METHOD LED_DDR
 
#define LED_1 0
#define LED_2 1
#define LED_3 2
#define LED_4 3
#define LED_5 4
#define LED_6 5
#define LED_7 6
#define LED_8 7
//========================================================================
 
//========================================================================
#pragma inline
void tid_1_on (void)
{
//   LED_PORT |= (1<<LED_1);
set_bit (LED_METHOD, LED_1);
}
//------------------------------------------------------------------------
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2015, 16:22
Ответы с готовыми решениями:

ATtiny2313: порты ввода-вывода
Всем привет! Помогите, пожалуйста, с таким заданием. К порту D...

Программирование портов ввода/вывода
Ребята, помогите спрограммировать работу в AtmelStudio на языке C или C++...

AVR Порты ввода/вывода
Кнопка1: Мигание диодов 4/4. Кнопка2: Гаснут все диоды. Кнопка3: Бег в одну...

Работа с портами ввода-вывода AVR
Всем доброго времени суток. Я написал статью про работу с портами ввода-выдода...

чтение порта ввода-вывода Atmega8
Добрый день. Была поставлена задача: есть датчик движения, в спокойном...

9
friiom
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 363
06.05.2015, 16:23 2
Цитата Сообщение от dymyurk1978
Хочется удобного и покрасивше макросы, определения ввода-вывода. Накидайте примеров, плиз.
AtmelCube ?
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
06.05.2015, 16:44 3
Цитата Сообщение от friiom
AtmelCube
А?
0
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
06.05.2015, 19:33 4
1. контроллер какой? (нужно помнить про "доставабельность" портов)
2. Студия какая? (у них однако проблема с препроцессором)
0
kobzor
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 178
06.05.2015, 21:19 5
Вы чо вапсче? Вы как раз создавая макросы в конкретном данном случае перливаете из пустого в порожнее...
Я понимаю такой вопрос на стмках еще но в аврке...
жесть
0
S_Otix
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 537
06.05.2015, 21:32 6
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#define PinOut(Port,PiN,ALvl) (*(volatile u08 *)(_SFR_ADDR(Port)-1)) |=  (1<<PiN)
#define PinIn(Port,PiN,ALvl) (*(volatile u08 *)(_SFR_ADDR(Port)-1)) &= ~(1<<PiN)
#define PinSet(Port,PiN,ALvl) (*(volatile u08 *)(_SFR_ADDR(Port)))   |=  (1<<PiN)
#define PinClr(Port,PiN,ALvl) (*(volatile u08 *)(_SFR_ADDR(Port)))   &= ~(1<<PiN)
#define PinCpl(Port,PiN,ALvl) (*(volatile u08 *)(_SFR_ADDR(Port)))   ^=  (1<<PiN)
 
#define PinOn(Port,PiN,ALvl)\
do{\
u08 tmp;\
tmp = (*(volatile u08 *)(_SFR_ADDR(Port)));\
if(ALvl) tmp |=  (1<<PiN);\
else     tmp &= ~(1<<PiN);\
(*(volatile u08 *)(_SFR_ADDR(Port))) = tmp;\
}while(0);
 
#define PinOff(Port,PiN,ALvl)\
do{\
u08 tmp;\
tmp = (*(volatile u08 *)(_SFR_ADDR(Port)));\
if(ALvl) tmp &= ~(1<<PiN);\
else     tmp |=  (1<<PiN);\
(*(volatile u08 *)(_SFR_ADDR(Port))) = tmp;\
}while(0);
 
#define PinIs(Port,PiN,ALvl) ((*(volatile u08 *)(_SFR_ADDR(Port)-2))&(1<<PiN))
 
#define PinIsAct_(Port,PiN,ALvl) ((*(volatile u08 *)(_SFR_ADDR(Port)-2)^(0xff+ALvl))&(1<<PiN))
 
#define PinIsAct(Port,PiN,ALvl) PinIsAct##ALvl(Port,PiN)
 
#define PinIsAct0(Port,PiN) (!((*(volatile u08 *)(_SFR_ADDR(Port)-2))&(1<<PiN)))
#define PinIsAct1(Port,PiN)   ((*(volatile u08 *)(_SFR_ADDR(Port)-2))&(1<<PiN))
 
#define PinByt(Port,PiN,ALvl) PiN
 
#define PinDDR(Port,PiN,ALvl) (*(volatile u08 *)(_SFR_ADDR(Port)-1))
#define PinPIN(Port,PiN,ALvl) (*(volatile u08 *)(_SFR_ADDR(Port)-2))
 
#define mPinOut(Pin) PinOut(Pin)
#define mPinIn(Pin)  PinIn(Pin)
#define mPinSet(Pin) PinSet(Pin)
#define mPinClr(Pin) PinClr(Pin)
#define mPinCpl(Pin) PinCpl(Pin)
#define mPinIs(Pin)  PinIs(Pin)
#define mPinByt(Pin) PinByt(Pin)
 
#define mPinOn(Pin) PinOn(Pin)
#define mPinOff(Pin) PinOff(Pin)
#define mPinIsAct(Pin)  PinIsAct(Pin)
#define mPinIsNoAct(Pin)  (!PinIsAct(Pin))
 
#define mPinDDR(Pin) PinDDR(Pin)
#define mPinPIN(Pin) PinPIN(Pin)
Задаем пины:
C
1
2
3
#define DS1302CLK PORTB,0,1
#define DS1302IO  PORTB,1,1
#define DS1302CE  PORTC,7,1
Примеры использования:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
u08 fDS1302_rdb(void)
{
u08 data = 0;
OTOMIC_BLOCK(OTOMIC_RESTORESTATE) {
u08 i;
 
for (i = 8; i; i--) {
mPinClr(DS1302CLK);
data >>= 1;
mDelay_us(1);
 
if (mPinIs(DS1302IO)) {
data |= 0x80;
}
 
mPinSet(DS1302CLK);
mDelay_us(1);
}
}
return data;
}
 
u08 fDS1302_rd(u08 addr)
{
u08 data = 0;
u08 tmp;
mPinClr(DS1302CLK);
mPinClr(DS1302CE);
mDelay_us(DS1302_TCC);
mPinSet(DS1302CE);
mDelay_us(DS1302_TCC);
fDS1302_wrb(((addr & 0x3f) << 1) | CMD_READ);
tmp = mPinDDR(DS1302IO);
mPinIn(DS1302IO);
mPinClr(DS1302IO);
data = fDS1302_rdb();
mPinClr(DS1302CE);
mPinDDR(DS1302IO) = tmp;
return (data);
}
 
u08 fDS3102_init(void)
{
mPinOut(DS1302CE);
mPinOut(DS1302CLK);
mPinOut(DS1302IO);
mPinClr(DS1302CE);
mPinClr(DS1302CLK);
fDS1302_wr(ADDR_CTRL, WRITE_ENABLE);
u08 sec = fDS1302_rd(ADDR_SEC);
fDS1302_wr(ADDR_SEC, (0 << CLOCKHALT) | (sec & 0x7f));
fDS1302_wr(ADDR_TCR, 0x99);
fDS1302_wr(ADDR_CTRL, WRITE_DISABLE);
return (0x99 == fDS1302_rd(ADDR_TCR));
}
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
06.05.2015, 21:50 7
Цитата Сообщение от THI BIOST
...
8 битные AVR.
IAR.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
06.05.2015, 21:53 8
Цитата Сообщение от kobzor
...
Не скажи, определяя классически, можно наделать ошибок. Особенно в тех случаях, когда куски кода одинаковы, похожи и копипаст с последующей правкой.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
06.05.2015, 22:03 9
Вроде нашел то что нужно. Ключевые слова для поиска: avr GPIO macros
Вот та статья, которую я занес в закладки, но система полетела, а по каким ключевым словам искать я забыл.
0
kobzor
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 178
07.05.2015, 00:26 10
Цитата Сообщение от dymyurk1978
Цитата Сообщение от kobzor
...
Не скажи, определяя классически, можно наделать ошибок. Особенно в тех случаях, когда куски кода одинаковы, похожи и копипаст с последующей правкой.

Некоторые до сих пор на асме пишут. А это поема война и мир из 25-и существительных...
И ничо....

Но дело конечно ваше - если так удобнее то ради бога
0
07.05.2015, 00:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2015, 00:26

Программирование портов ввода-вывода (Atmega48, Си)
Добрый вечер. Помогите с заданием. Необходимо составить программу. 1)...

Переопределение стандартных функций ввода/вывода
Доброго времени суток жители данного форума и гости ! Имеется задача...

Управление блоками ввода-вывода от ПЛК AVR
Управление блоками расширения ввода-вывода от ПЛК AVR. Например, MITSUBISHI,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru