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

PORTD через #define необявленный

01.11.2019, 22:17. Просмотров 198. Ответов 6

Здравствуйте! У меня проблема... Писал программу в MicroC для EasyAVR5A, но там вышел за ограничение кода по объёму, перенёс код в Atmel Studio
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
#ifndef MAIN_VAR_H_
#define MAIN_VAR_H_
 
//#define F_CPU 8000000UL
 
//#include "LCD.h"
 
#define DDR_MS DDRB
#define PORT_MS PORTB
#define PIN_MS  PINB
 
#define PIN_ENABLE PINB0
#define PORT_ENABLE PORTB0  
#define PIN_RESET PINB4
#define PORT_RESET PORTB4
#define PIN_SLEEP PINB5
#define PORT_SLEEP PORTB5
#define PIN_STEP PINB6
#define PORT_STEP PORTB6
#define PIN_DIR PINB7
#define PORT_DIR PORTB7
 
#define MS_too PORTB |= 0x10
#define MS_four PORTB |= 0x20
#define MS_eight PORTB |= 0x30
#define MS_sixteen PORTB |= 0x70
 
#define DDR_BUTT DDRD
#define PORT_BUTT PORTD
#define PIN_BUTT PIND
 
#define DDR_LCD DDRC
#define PORT_LCD PORTC
#define PIN_LCD PINC
и тут мне выдаются ошибки «PORTD» необъявленная (первое использование в этой функции).

Что я делаю не так? Прилагаю архив с моим проектом, просьба скомпилировать у себя и просмотреть ошибки и по возможности решить их. Спасибо!
0
Вложения
Тип файла: rar A4899.rar (21.4 Кб, 1 просмотров)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2019, 22:17
Ответы с готовыми решениями:

Ассемблерная вставка в С++ через макрос define
Здравствуйте. Попался мне код. Скомпилил, собрал девайс, работает. Не сталкивался раньше с...

Как реализовать директиву #define для создания шаблона отпределения #define ?
Здравствуйте уважаемые. При написании программы появилась необходимость задать шаблон создания...

Скрытие столбцов. Ошибка App-define od obj-define error
Привет) помогите, пожалуйста, ответить на следующие вопросы: 1) выскакивает ошибка: App-define...

6

алексей байдин
1 / 1 / 0
Регистрация: 04.12.2017
Сообщений: 44
07.11.2019, 10:30  [ТС] 2
Просмотрел, у меня подключен файл
C++
1
#include <avr/iom2560.h>
в котором объявляются только фьюзы, а где мне найти файл с описаниями всех регистров, например какой-нибудь ATMega2560.h. Я поиском просмотрел во всех вложенных в Atmel Studio, но что-то нужное не нашёл...
0
COKPOWEHEU
1982 / 1208 / 272
Регистрация: 09.09.2017
Сообщений: 4,908
08.11.2019, 09:48 3
Цитата Сообщение от алексей байдин Посмотреть сообщение
Просмотрел, у меня подключен файл
#include <avr/iom2560.h>
в котором на 38 строчке подключается #include <avr/iomxx0_1.h>, в котором черном по белому (ну или какая у вас там подсветка синтаксиса) написано #define PORTD _SFR_IO8(0x0B)
0
алексей байдин
1 / 1 / 0
Регистрация: 04.12.2017
Сообщений: 44
08.11.2019, 21:09  [ТС] 4
Я вроде как и понимаю и в тоже время нет, для чего объявление -
C
1
#define PORTD   _SFR_IO8(0x0B)
. Признаться этот файл не просмотрел его содержимое. Видел файл 2560.inc, там для меня понятно, что это адрес регистра порта D. Моя проблема решилась для меня вчера, просмотрел свои прошлые программки на Atmega16, там я тоже мучался с инклюдами, так вот когда я по прошлым примерам вставил строку
C
1
#include <avr/io.h>
в хедер файл с описаниями всех моих подключаемых переменных, тогда всё заработало(появились другие ошибки, но это другая история). Так вот у меня следующий вопрос - почему я главном файле A4899.c инклюдю
C
1
#include <avr/io.h>
, потом подключаю к нему
C
1
#include "Main_Var.h"
и в подключаемом файле я снова должен написать строку
C
1
#include <avr/io.h>
? Ведь я io.h уже подключил в главном А4899.с файле
C
1
2
3
4
5
6
7
8
9
10
11
12
Файл А4899.с
 
#define F_CPU 8000000UL
 
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
 
#include "Main_Var.h"
#include "LCD.h"
#include "Init_my_MCU.h"
#include "Work.h"
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef MAIN_VAR_H_
#define MAIN_VAR_H_
 
#include <avr/io.h>
 
#define DDR_MS DDRB
#define PORT_MS PORTB
#define PIN_MS  PINB
 
// здесь настройки пинов для A4899
 
#define PIN_ENABLE PINB0
#define PORT_ENABLE_ON PORTB |= 0x01
#define PORT_ENABLE_OFF PORTB &= 0xFE
0
COKPOWEHEU
1982 / 1208 / 272
Регистрация: 09.09.2017
Сообщений: 4,908
08.11.2019, 23:38 5
Цитата Сообщение от алексей байдин Посмотреть сообщение
Так вот у меня следующий вопрос - почему я главном файле A4899.c инклюдю
Такое ощущение, что вы не понимаете как работает директива препроцессора #include и считаете ее какой-то магией. Отсюда шаманские ритуалы и странные способы решения.
На самом деле #include просто тупо вставляет содержимое заголовочного файла в другой. Как это работает можно посмотреть при помощи ключа -E компилятора gcc (в т.ч. avr-gcc).
А вот файлы исходного кода (*.c / *.cpp / ...) компилируются независимо и знать не знают друг о друге.
Поскольку информации вы предоставили недостаточно, попробуйте самостоятельно разобраться видны ли нужные вам определения в нужных точках файлов исходного кода.
0
i8085
2499 / 1560 / 311
Регистрация: 11.09.2009
Сообщений: 5,741
08.11.2019, 23:56 6
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
#include просто тупо вставляет содержимое заголовочного файла в другой.
Не обязательно заголовочного. Любого текстового.
0
COKPOWEHEU
1982 / 1208 / 272
Регистрация: 09.09.2017
Сообщений: 4,908
09.11.2019, 08:31 7
Естественно. Препроцессор С/С++ - штука текстовая и тупая, про синтаксис языка она знать не знает. Ей сказали #define AAA BBB так она честно будет во всем тексте ниже заменять строчку AAA на BBB и ее не волнует имя ли это переменной, функции, значение, имя файла, даже частью имени быть может, хотя это сложнее. Точно так же #include подставляет содержимое любого файла, даже того же самого. Просто в подавляющем большинстве случаев это используется именно для заголовочных файлов.
0
09.11.2019, 08:31
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2019, 08:31

Включение отладочной информации через #define
Если такая тема гдето есть, скинте мне ссылку плз. Что я бы хотел #define _DEBUGLOGON...

Интересное заполнение массива через директиву #define
Увидел такую штуку: static const unsigned char BitsSetTable256 = { #define B2(n) n, n+1, ...

Как использовать проверку #if c float константами определенными через #define
Для примера, привожу код, который хочу реализовать: #define Ar 5 #define Br 3 #define Cr...


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

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

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