Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
SergeyKagen
0 / 0 / 0
Регистрация: 02.04.2018
Сообщений: 74
1

Опрос PORT до объявления программы int main (void)

02.01.2019, 20:27. Просмотров 835. Ответов 8
Метки нет (Все метки)

Как опросить порт до объявления основной программы? что бы присвоить значение порта переменной?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#define F_CPU 16000000UL
 
#include <avr/io.h>
#include <util/delay.h>
 
DDRC = 0; //порт ввода С
unsigned int Start = PINC;
 
int main(void)
{
while(1) { }
 
}
При таком раскладе, компилятор выкидывает ошибку.

1. Error 2 expected ')' before '(' token - Line 6
2. Error 1 expected identifier or '(' before 'volatile' - Line 6
3. Error 3 initializer element is not constant - Line 7
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2019, 20:27
Ответы с готовыми решениями:

В чем разница между int main(){} и int main(void){}?
Только недавно начал изучать язык, и появилось несколько вопросов: 1) в чем разница между int...

Какая разница между int main и void main?
какая разница между (int main) i (void main)?

Какой новые синтаксис: int main() VS. void main()
Долго не занимался программированием , но тут жена решила поучится , да и сам повторить ,так вот...

Чем отличается int main от void main?
Мне нравится int main можно её всегда использовать а про void main забыть?

int main() или int main(void)?
чем отличается : не сообщаю о наличии аргументов функция не принимает никаких аргументов.......

8
Rius
Эксперт .NET
5250 / 3444 / 837
Регистрация: 25.05.2015
Сообщений: 10,510
Записей в блоге: 11
Завершенные тесты: 4
02.01.2019, 21:20 2
Цитата Сообщение от SergeyKagen Посмотреть сообщение
Как опросить порт до объявления основной программы? что бы присвоить значение порта переменной?
Зачем? Почему нельзя присвоить это значение в начале main?
0
pyzhman
785 / 480 / 65
Регистрация: 15.05.2012
Сообщений: 2,718
03.01.2019, 18:16 3
Цитата Сообщение от SergeyKagen Посмотреть сообщение
до объявления
Ничто не мешает сделать это в самом начале.
0
SergeyKagen
0 / 0 / 0
Регистрация: 02.04.2018
Сообщений: 74
03.01.2019, 23:02  [ТС] 4
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
#include <avr/io.h>
 
unsigned int Current_number = 0;
 
int main(void)
{
        DDRB = 0xff;
        
        DDRC &= ~(1<<PC0);
        DDRC &= ~(1<<PC1);
        DDRC &= ~(1<<PC2);
        DDRC &= ~(1<<PC3);
        DDRC &= ~(1<<PC4);
        DDRC &= ~(1<<PC5);
        DDRD &= ~(1<<PD5);
        DDRD &= ~(1<<PD6);
        DDRD &= ~(1<<PD7);
        DDRD &= ~(1<<PD4);
        
        if((PINC & (1<<PC0)) == 1) { Current_number = Current_number + 1; }
        if((PINC & (1<<PC1)) == 1) { Current_number = Current_number + 2; }
        if((PINC & (1<<PC2)) == 1) { Current_number = Current_number + 4; }
        if((PINC & (1<<PC3)) == 1) { Current_number = Current_number + 8; }
        if((PINC & (1<<PC4)) == 1) { Current_number = Current_number + 16; }
        if((PINC & (1<<PC5)) == 1) { Current_number = Current_number + 32; }
        if((PIND & (1<<PD5)) == 1) { Current_number = Current_number + 64; }
        if((PIND & (1<<PD6)) == 1) { Current_number = Current_number + 128; }
        if((PIND & (1<<PD7)) == 1) { Current_number = Current_number + 256; }
        if((PIND & (1<<PD4)) == 1) { Current_number = Current_number + 512; }
    
    while(1)
    {
           PORTB = Current_number;
    }
}
Никак не могу взять в толк. По сути у меня есть DIP переключатель, при включении, он только раз опрашивает его и забивает этот параментр в Current_number. Код то простой. Инициируем каждую ножку мк как ВВОД, дальше опрашиваем через if каждую ножку порта, если на ней присутствует 1, то приплюсовываем значение в десятичном числе. И Вроде бы код детский но не работает. Работает только первый бит PC0 он приплюсовывает значение бита в десятичной системе. Но почему работает только первое условие, почему не работает бит PC1, что за глюк... Ведь должно всё работать по логике... Помогите(((
0
ValeryS
Модератор
7401 / 5599 / 710
Регистрация: 14.02.2011
Сообщений: 19,049
Завершенные тесты: 1
04.01.2019, 06:09 5
Цитата Сообщение от SergeyKagen Посмотреть сообщение
DDRC
в начале чему равно?

Добавлено через 6 минут
Цитата Сообщение от SergeyKagen Посмотреть сообщение
if((PINC & (1<<PC1)) == 1)
а ты уверен что это условие когда нибудь выполнится ?
PC1 имеет значение 1 следовательно 1<<PC1= 2
операция "И" даст или 0 или 2 в зависимости от состояния ножки, и какое из них равно 1
пишут обычно так
C
1
if((PINC & (1<<PC1)) ==(1<<PC1))
или так
C
1
if((PINC & (1<<PC1)) !=0)
0
COKPOWEHEU
1158 / 820 / 193
Регистрация: 09.09.2017
Сообщений: 3,530
04.01.2019, 07:46 6
Лучший ответ Сообщение было отмечено SergeyKagen как решение

Решение

Цитата Сообщение от ValeryS Посмотреть сообщение
пишут обычно так
if((PINC & (1<<PC1)) ==(1<<PC1))
Как раз так обычно не пишут - велик шанс ошибиться при копипасте. Пишут так:
C
1
2
if( PINC & (1<<1) ){...}
if( !(PINC & (1<<1)) ){...}
либо со сравнениями, но это реже
C
1
2
if( (PINC & (1<<1))!=0){...}
if( (PINC & (1<<1))==0){...}
1
pyzhman
785 / 480 / 65
Регистрация: 15.05.2012
Сообщений: 2,718
04.01.2019, 07:54 7
Не по теме:
C
1
2
3
4
5
6
7
8
9
10
     DDRC &= ~(1<<PC0);
        DDRC &= ~(1<<PC1);
        DDRC &= ~(1<<PC2);
        DDRC &= ~(1<<PC3);
        DDRC &= ~(1<<PC4);
        DDRC &= ~(1<<PC5);
        DDRD &= ~(1<<PD5);
        DDRD &= ~(1<<PD6);
        DDRD &= ~(1<<PD7);
        DDRD &= ~(1<<PD4);
Великий смысл в чём? Строчкой ранее вы же пишете
C
1
DDRB = 0xff;
Так что мешает написать
C
1
2
DDRC= 0xС0;
DDRD= 0x0F;
?
0
SergeyKagen
0 / 0 / 0
Регистрация: 02.04.2018
Сообщений: 74
04.01.2019, 10:00  [ТС] 8
Цитата Сообщение от pyzhman Посмотреть сообщение
Великий смысл в чём?
Это часть кода, там кода очень много и другие ножки забиты под другое дело.
0
sharpey
352 / 145 / 34
Регистрация: 21.09.2008
Сообщений: 495
06.01.2019, 17:12 9
SergeyKagen, Вы используете AVR GCC? Если да, то здесь описаны способы выполнения кода из определённых инициализирующих секций памяти до main.
0
06.01.2019, 17:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2019, 17:12

Почему в одних случаях пишут void main(), а в других случаях int main() {return 1;}
Препод мне доказывает, что void в main`е писать неправильно, а объяснить не может почему. Кто...

int main() VS void main()
Вот товарищ Герберт Шилдт считает, что функция main() должна вид int main() { return 0; }...

От void main() к int main()
Ребят, недавно начал обучаться программированию на cpp на Windows. Перешёл на Mac ( Да, знаю, что...


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

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

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