Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Peter29
0 / 0 / 0
Регистрация: 09.12.2015
Сообщений: 40
1

Программирование микроконтроллеров

02.06.2016, 10:15. Просмотров 610. Ответов 15
Метки нет (Все метки)

Работаю в ImageCraft IDE for AVR. Хочу написать программу, которая бы считала функцию, не понимаю в чем ошибка.
Y=X1X3X4 V X1X2X3 V X2X3X4 V X1X2X4 V !X2!X3!X4 V !X1!X2!X4 V !X1!X2!X3
! - не(отрицание)
И ещё я не знаю как записывать свой функцию в if.
P.S. Контроллер Atmega 8535
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
//ICC-AVR application builder : 31.05.2016 17:47:08
// Target : M8535
// Crystal: 8.0000Mhz
 
#include <iom8535v.h>
#include <macros.h>
 
void port_init(void)
{
 PORTA = 0xFF;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0xFF;
 
}
 
//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 
 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}
void main(void) 
{
unsigned int x1=PORTA;
 unsigned int x2=(PORTA>>1);
 unsigned int x3=(PORTA>>2);
 unsigned int x4=(PORTA>>3);
 unsigned int y=PORTB; 
      
init_devices();       
while (1)
{
    if (~x2&~x3&~x4|x2&~x3&x4|~x1&x2&x3|x1&~x3|x1&~x2)
    PORTB=0x01;
    else
    PORTB=0x00;
    }
    }
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2016, 10:15
Ответы с готовыми решениями:

Программирование микроконтроллеров AVR, STM под ОС Linux?
Существует ли IDE для программирования микроконтроллеров под ОС Linux?

Визуальное программирование микроконтроллеров
Создаю визуальную среду для построения алгоритмов работы будущих устройств. Данная среда использует...

С чего начать? программирование микроконтроллеров
Здрасьте. Хочу начать заниматься программированием микроконтроллеров. Хотел бы купить все...

Программирование PIC микроконтроллеров в среде MPLAB IDE
нужна помощь в выполнении одного задания,кто может помочь,откликнитесь!

Программист микроконтроллеров
Такой вопрос возник у меня, хороша ли работа &quot;программиста микроконтроллеров&quot;, изучаю Ассемблер для...

15
Mirmik
techpriest
631 / 210 / 57
Регистрация: 27.02.2014
Сообщений: 1,158
03.06.2016, 00:16 2
описание ошибки в студию.
0
pyzhman
1158 / 513 / 76
Регистрация: 15.05.2012
Сообщений: 2,932
03.06.2016, 07:03 3
C
1
x4|x2
Такую бяку надо разделять.
0
Витальич
1276 / 1183 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
03.06.2016, 09:14 4
Цитата Сообщение от Peter29 Посмотреть сообщение
if (~x2&~x3&~x4|x2&~x3&x4|~x1&x2&x3|x1&~x3|x1&~x2)
ИМХО такое нельзя писать
0
03.06.2016, 09:14
ValeryS
Модератор
7918 / 5893 / 776
Регистрация: 14.02.2011
Сообщений: 20,272
Завершенные тесты: 1
03.06.2016, 09:54 5
Peter29, этот вопрос нужно в ветку Си
есть логическая "ИЛИ" || есть бинаная |
равно и "И" &&, &
есть поразрядное отрицание ~ есть логическая !
вопрос : что нужно сделать?
Цитата Сообщение от Peter29 Посмотреть сообщение
unsigned int x1=PORTA;
вот это не получение бита, это получение байта
для бита нужно сделать вот так
C
1
unsigned char x1=PORTA&0x01;
int не стоит использовать, без необходимости, для АВРок, это не родная для неё разрядность
0
Voland_
1725 / 1064 / 104
Регистрация: 04.01.2010
Сообщений: 3,641
03.06.2016, 12:25 6
...но я не совсем понял задачу. Что сие означает?
Цитата Сообщение от Peter29 Посмотреть сообщение
Y=X1X3X4 V X1X2X3 V X2X3X4 V X1X2X4 V !X2!X3!X4 V !X1!X2!X4 V !X1!X2!X3
в частности что означает "X1X3X4" и "!X1!X2!X4"? какие математические операции стоят за этими выражениями и что такое вообще, эти X1, X2 и т.д.?

ЗЫ: сама задача напоминает какие-то матричные операции, или их эквивалент. Посему, есть желание разобраться с первоистоком прежде, чем использовать Си-шный код.
0
Peter29
0 / 0 / 0
Регистрация: 09.12.2015
Сообщений: 40
03.06.2016, 17:47  [ТС] 7
X1, X2, X3, X4 - это переменные.
выражение такое
Y=X1*X3*X4 V X1*X2*X3 V X2*X3*X4 V X1*X2*X4 V !X2*!X3*!X4 V !X1*!X2*!X4 V !X1*!X2*!X3
Знак восклицания(!) - это отрицание, логическое "не"!
получил его с помощью карт карно.
мне нужно написать программу, которая считает эту функцию. пишу в ImageCraft IDE for AVR.
0
Peter29
0 / 0 / 0
Регистрация: 09.12.2015
Сообщений: 40
03.06.2016, 18:09  [ТС] 8
С чего все началось.
Программирование микроконтроллеров
0
ValeryS
Модератор
7918 / 5893 / 776
Регистрация: 14.02.2011
Сообщений: 20,272
Завершенные тесты: 1
03.06.2016, 19:06 9
Цитата Сообщение от Peter29 Посмотреть сообщение
С чего все началось.
в данном случае, по моему мнению, проще массив(таблицу) на 16 элементов забить
но если так хочется именно с логическими операциями попробовать
то вот тебе кусок кода
Цитата Сообщение от Peter29 Посмотреть сообщение
!X1*!X2*!X4 V !X1*!X2*!X3
C
1
y=(!x1 & !x2 & !x4) | (!x1 & !x2 & !x3);
теперь попробуй записать все выражение
0
Peter29
0 / 0 / 0
Регистрация: 09.12.2015
Сообщений: 40
03.06.2016, 19:32  [ТС] 10
y=(x1 & x2 & x4) | (x1 & x2 & x3) | (x2 & x3 & x4) | (x1 & x2 & x4) | (!x2 & !x3 & !x4) | (!x1 & !x2 & !x4) | (!x1 & !x2 & !x3);

Добавлено через 2 минуты
А код менять так?
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
//ICC-AVR application builder : 31.05.2016 17:47:08
// Target : M8535
// Crystal: 8.0000Mhz
 
#include <iom8535v.h>
#include <macros.h>
 
void port_init(void)
{
 PORTA = 0xFF;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0xFF;
 
}
 
//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 
 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}
void main(void) 
{
unsigned char x1=PORTA;
unsigned char x2=(PORTA>>1);
unsigned char x3=(PORTA>>2);
unsigned char x4=(PORTA>>3);
unsigned char y=PORTB; 
      
init_devices();       
while (1)
{
    if ((x1 & x2 & x4) | (x1 & x2 & x3) | (x2 & x3 & x4) | (x1 & x2 & x4) | (!x2 & !x3 & !x4) | (!x1 & !x2 & !x4) | (!x1 & !x2 & !x3))
    PORTB=0x01;
    else
    PORTB=0x00;
    }
    }
0
pyzhman
1158 / 513 / 76
Регистрация: 15.05.2012
Сообщений: 2,932
04.06.2016, 07:46 11
Смотреть результаты отладки в отладчике.
0
ValeryS
Модератор
7918 / 5893 / 776
Регистрация: 14.02.2011
Сообщений: 20,272
Завершенные тесты: 1
04.06.2016, 08:27 12
Цитата Сообщение от Peter29 Посмотреть сообщение
y=(x1 & x2 & x4) | (x1 & x2 & x3) | (x2 & x3 & x4) | (x1 & x2 & x4) | (!x2 & !x3 & !x4) | (!x1 & !x2 & !x4) | (!x1 & !x2 & !x3);
на первый взгляд правильно,молодец
Цитата Сообщение от Peter29 Посмотреть сообщение
А код менять так?
нет, не так
не надо торопится
Цитата Сообщение от Peter29 Посмотреть сообщение
C
1
2
3
4
unsigned char x1=PORTA;
unsigned char x2=(PORTA>>1);
unsigned char x3=(PORTA>>2);
unsigned char x4=(PORTA>>3);
вот этот участок кода что делает?
что будет в переменных
если на порту будет значение 0? 16 ? 4? 5?
попробуй разобраться
и кстати, для считывания данных с порта используют не PORT а PIN, то бишь, в данном случае, PINA
0
Peter29
0 / 0 / 0
Регистрация: 09.12.2015
Сообщений: 40
05.06.2016, 00:08  [ТС] 13
Присваивает портам значение в диапазоне от 0 до 255?
C
1
2
3
4
unsigned char x1=PINA;
unsigned char x2=(PINA>>1);
unsigned char x3=(PINA>>2);
unsigned char x4=(PINA>>3);
0
ValeryS
Модератор
7918 / 5893 / 776
Регистрация: 14.02.2011
Сообщений: 20,272
Завершенные тесты: 1
05.06.2016, 00:17 14
Цитата Сообщение от Peter29 Посмотреть сообщение
Присваивает портам значение в диапазоне от 0 до 255?
ага только не портам а переменным
причем в x1 одно значение в x2 оно же деленное на 2, в x3 деленное на 4, ну и так далее
а нужно переменная из двух значений 0 и 1
подозреваю что нужно выцепить определенные биты, как сделать я показал в 5 посте
0
Peter29
0 / 0 / 0
Регистрация: 09.12.2015
Сообщений: 40
05.06.2016, 18:58  [ТС] 15
C
1
2
3
4
unsigned char x1=PINA&0x01;
unsigned char x2=(PINA&0x01>>1);
unsigned char x3=(PINA&0x01>>2);
unsigned char x4=(PINA&0x01>>3);
так?
0
ValeryS
Модератор
7918 / 5893 / 776
Регистрация: 14.02.2011
Сообщений: 20,272
Завершенные тесты: 1
05.06.2016, 20:00 16
первая строчка правильно, остальные нет
во первых не учтен приоритет операций
во вторых будет не то что нужно
смотри выделили первый(нулевой) бит т.е получилось число 0000 000х, сдвинули его вправо, и получили 0000 0000
подумай как правильно сделать
0
05.06.2016, 20:00
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2016, 20:00

С для микроконтроллеров
Добрый день, хотел бы занятся программированием микроконтроллеров. Учусь в киевском политехническом...

Применение микроконтроллеров
Занимаюсь программированием микроконтроллеров и всегда хотелось сделать что-то полезное, нужное....

Отладка микроконтроллеров AVR
Здравствуйте. Я осваиваю программирование МК серии AVR. Последние пару дней осваивал...


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

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

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