Страница 16 из 25
Re: Вопросы по MPLAB X.
Добавлено: Вт сен 27, 2016 21:15:14
Аlex
А что нам гадать, давайте посмотрим. Дел то на 10 минут
Код :
Спойлер
Код: Выделить всё
#include <xc.h>
void func1(unsigned int a){
*(unsigned int *)&EEADR = a;
}
void func2(unsigned int a){
EEADR = (a & 0xFF);
EEADRH = (a >> 8);
}
void main(void){
func1(1000);
func2(1000);
while(1){
}
}
Результат :
Спойлер
Код: Выделить всё
!void func1(unsigned int a){
! *(unsigned int *)&EEADR = a;
0xFFD2: MOVFF __pcstackCOMRAM, EEADR
0xFFD4: NOP
0xFFD6: MOVFF 0x2, EEADRH
0xFFD8: NOP
!}
0xFFDA: RETURN 0
Спойлер
- 1.png
- (172.43 КБ) 605 скачиваний
Спойлер
Код: Выделить всё
!void func2(unsigned int a){
! EEADR = (a & 0xFF);
0xFFDC: MOVFF __pcstackCOMRAM, EEADR
0xFFDE: NOP
! EEADRH = (a >> 8);
0xFFE0: MOVF 0x2, W, ACCESS
0xFFE2: MOVWF EEADRH, ACCESS
!}
0xFFE4: RETURN 0
Спойлер
- 2.png
- (174.06 КБ) 586 скачиваний
Компилятор : XC8 v1.35
Re: Вопросы по MPLAB X.
Добавлено: Вт сен 27, 2016 21:52:39
Zhuk72
Спасибо!
В итоге мой вариант в лоб в разложенном виде оказался длиннее.
Очевидно именно это Майкрочип и называет "оптимизирован под Си".
Re: Вопросы по MPLAB X.
Добавлено: Чт сен 29, 2016 20:56:43
Igor_Naum
Никак не могу разобраться...

В инструкции к компилятору чет не могу найти ответа...
Может ткнете, где описано как правильно создавать пользовательские внешние функции в отдельном файле...
сейчас застрял на этапе (на примере все той же EEPROM)
main.c ( #include "EE_polzovatel.h") >> EE_polzovatel.h (пустые void Eeprom_Write ();unsigned char Eeprom_Read();) >> EE_polzovatel.с (расписаны функции Eeprom_Write и Eeprom_Read).
В предыдущих проектах все функции описывал в одном файле, перед void main.
Но жутко неудобно во всем этом разбираться, хочется систематизации...

Re: Вопросы по MPLAB X.
Добавлено: Чт сен 29, 2016 21:08:55
Igor_Naum
Попробовал запихнуть функции EEPROM прямо в заголовочный файл, а C-файл изъял из проекта.
Работает и проект компилится...
Почему так делать не рекомендуется?
Re: Вопросы по MPLAB X.
Добавлено: Чт сен 29, 2016 22:23:17
Siarzhuk
Igor_Naum писал(а):Почему так делать не рекомендуется?
Препроцессор вставит тела функций во все модули (С-файлы) в которые этот хидер включён. Компилятор сгенерирует код функций в каждом модуле. И когда линкер будет собирать объектные файлы (полуфабрикаты) в исполняемый файл программы - ему не понравятся объекты с одинаковыми названиями - поскольку непонятно какую из Х одноименных функций разработчик хотел вызывать.
H-файл - интерфейс модуля. C-файл - модуль. В модуле пишем реализацию - тела функций, в интерфейсе объявляем публичные ресурсы модуля - прототипы функций и extern определения глобальных переменных модуля. Всё что не должно быть видно за пределами модуля закрываем static-ом - чтобы даже возможности не было обратиться. Чем меньше торчит из модуля наружу - тем крепче и спокойнее наш сон - т.е. сводим публично доступные ресурсы до абсолютного необходимого минимума.
PS: Интерфейс (H-файл) "огораживается", чтобы препроцессор не дублировал уже включённые объявления:
Код: Выделить всё
[начало файла]
#ifndef __MY_COOL_MODULE_H
#define __MY_COOL_MODULE_H
[Определения общедоступных ресурсов модуля]
#endif /* __MY_COOL_MODULE_H */
[конец файла]
Re: Вопросы по MPLAB X.
Добавлено: Пн ноя 14, 2016 09:44:08
Ярослав555
Здравствуйте. Помогите новичку в MPLAB X. Установил среду, добавил компиляторы, создал проект на с++, пытаюсь скомпилировать пустышку. В ответ получаю
Спойлер
make[2]: *** No rule to make target 'build/default/production/main.o', needed by 'dist/default/production/18f23k22.X.production.hex'. Stop.
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
пробовал другой камень с другим компилятором (HI-TECH) сообщение тоже самое.
P.S. Clean проекта делал, проект вообще чистый изначально.
Re: Вопросы по MPLAB X.
Добавлено: Пн ноя 14, 2016 11:58:40
Zhuk72
В таких случаях в некоторых структурах принято светить в лицо лампой и кричать "выкладывай все!"
А проект точно С++?

Re: Вопросы по MPLAB X.
Добавлено: Пн ноя 14, 2016 12:11:24
Аlex
У микрочипа С++ поддерживает только один единственный компилятор, это - XC32, под 32-ые PIC'и.
Re: Вопросы по MPLAB X.
Добавлено: Пн ноя 14, 2016 13:06:45
Ярослав555
Аlex писал(а):У микрочипа С++ поддерживает только один единственный компилятор, это - XC32, под 32-ые PIC'и.
Тогда всё сходится. Экспериментировал с разными камнями, и как раз 32й компилятор мне собрал проект.
Только что изменил С++ на С, и всё собралось в 18м компиляторе. Вот задница! А я люблю с классами играться. Ну ок, С так С.

Re: Вопросы по MPLAB X.
Добавлено: Пн ноя 14, 2016 18:51:43
alex_
В микроконтроллерах память не велика, например 18f23k22, на классы явно не хватит.
Re: Вопросы по MPLAB X.
Добавлено: Пн ноя 14, 2016 22:13:09
Ярослав555
alex_ писал(а):В микроконтроллерах память не велика, например 18f23k22, на классы явно не хватит.
мне меги16 хватало, stm32 тем более.
Re: Вопросы по MPLAB X.
Добавлено: Пн ноя 14, 2016 22:36:00
Аlex
alex_ писал(а):на классы явно не хватит.
Прикольное заявление
Можно пример ? И в цифрах, пожалуйста ?

Re: Вопросы по MPLAB X.
Добавлено: Вт ноя 15, 2016 06:58:45
alex_
Сам я классы не пытался впихнуть, но где то на данном форуме утверждали что классы не целесообразно использовать из-за того что памяти не много, целесообразнее использовать функции

Re: Вопросы по MPLAB X.
Добавлено: Вт ноя 15, 2016 07:30:14
Аlex
Скажем так. Класс в С++, ничем не отличается от обычной Сишной структуры и его экземпляр занимает памяти ровно столько, сколько в ней объявлено переменных. А метод у класса - та же функция, только ещё неявно передаётся указатель на экземпляр класса.
Так что, на счёт целесообразности, можно ещё поспорить... Одно лишнее маш. слово в памяти под указатель, против удобства использования.
Re: Кто нибудь шарит в MPLAB?
Добавлено: Вт дек 06, 2016 14:07:05
kseniadovgopolaya
Добрый день! Также нужно помощь в MPLAB. Впервые пишу программу и при проверке выдает несколько проблем.
Программа ниже:
list p=16f877a;
#include <p16877a.inc>;
tempal EQU h'020';
tempah EQU h'021';
tempbl EQU h'022';
tempbh EQU h'023';
tempch EQU h'024';
tempcl EQUh'025';
tempd EQU h'026';
org 0x00;
goto begin
org 0x100;
begin
clrf tempal;
clrf tempah;
clrf tempbl;
clrf tempbh;
clrf tempcl;
clrf tempch;
clrf tempd;
movlw h'BF';
movwf tempal,1;
movlw h'1A';
movwf tempah;
movlw h'A3';
movwf tempbl;
movlw h'21';
movwf tempbh;
movwf tempbl;
addwf tempal,0;
movwf tempcl;
btfsc STATUS,c;
incf tempch,1;
movwf tempah,0;
addwf tempah,0;
addwf tempah,1;
btfsc STATUS,c;
incf tempd,1;
end.
И список проблем:
Debug build of project `D:\q\ksenia.asm.mcp' started.
Language tool versions: MPASMWIN.exe v5.30.01, mplink.exe v4.30.01
Preprocessor symbol `__DEBUG' is defined.
Tue Dec 06 14:12:00 2016
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Program Files\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F877A "ksenia.asm" /l"ksenia.lst" /e"ksenia.err" /o"ksenia.o" /d__DEBUG=1
Warning[205] D:\Q\KSENIA.ASM 1 : Found directive in column 1. (list)
Warning[205] D:\Q\KSENIA.ASM 6 : Found directive in column 1. (org)
Warning[203] D:\Q\KSENIA.ASM 7 : Found opcode in column 1. (goto)
Warning[205] D:\Q\KSENIA.ASM 8 : Found directive in column 1. (org)
Warning[203] D:\Q\KSENIA.ASM 10 : Found opcode in column 1. (clrf)
Warning[203] D:\Q\KSENIA.ASM 11 : Found opcode in column 1. (clrf)
Warning[203] D:\Q\KSENIA.ASM 12 : Found opcode in column 1. (clrf)
Warning[203] D:\Q\KSENIA.ASM 13 : Found opcode in column 1. (movlw)
Warning[203] D:\Q\KSENIA.ASM 14 : Found opcode in column 1. (movwf)
Warning[203] D:\Q\KSENIA.ASM 15 : Found opcode in column 1. (movlw)
Warning[203] D:\Q\KSENIA.ASM 16 : Found opcode in column 1. (movwf)
Warning[203] D:\Q\KSENIA.ASM 17 : Found opcode in column 1. (addwf)
Warning[203] D:\Q\KSENIA.ASM 18 : Found opcode in column 1. (movwf)
Error[129] D:\Q\KSENIA.ASM 20 : Expected (END)
Halting build on first failure as requested.
----------------------------------------------------------------------
Debug build of project `D:\q\ksenia.asm.mcp' failed.
Language tool versions: MPASMWIN.exe v5.30.01, mplink.exe v4.30.01
Preprocessor symbol `__DEBUG' is defined.
Tue Dec 06 14:12:02 2016
----------------------------------------------------------------------
BUILD FAILED
Re: MPLAB в вопросах и ответах
Добавлено: Вт дек 06, 2016 15:15:47
Zhuk72
Это не ошибки, а предупреждения о некорректном форматировании исходника.
Команды и директивы пишите, отступая на один таб от края. Метки оставьте вплотную к краю.
Ошибка только одна, в конце end должна быть БЕЗ точки.
Добавлено after 5 minutes 50 seconds:
P.S. Разве в асм ставится ; после команды? Вроде нет.
Re: MPLAB в вопросах и ответах
Добавлено: Вт дек 06, 2016 17:08:26
КРАМ
Точка с запятой означает начала комментария в строке, поэтому не мешают. Но и не нужны.
Re: MPLAB в вопросах и ответах
Добавлено: Вт дек 06, 2016 17:17:22
Zhuk72
А ведь верно, совсем из головы вылетело. И вижу, что ошибку не вызывает, а причину понять не могу.
Re: MPLAB в вопросах и ответах
Добавлено: Вт янв 17, 2017 19:47:14
Пока_без_кота
Доброго времени суток. MPLAB 8.92. После создания проекта, при создании нового асм-файла, предлагает на выбор 2 вида кодировки, ANSI и Unicode. По умолчанию выбрана ANSI, всегда не думая ее оставлял. В каких случаях может понадобится Unicode ?
Re: MPLAB в вопросах и ответах
Добавлено: Вт янв 31, 2017 23:34:11
Пока_без_кота
Доброго времени суток. Пишу простую менюшку на ассемблере. Хочу для красоты и автоматизации завернуть все в макросы. Есть следующая последовательность констант:
Спойлер
Код: Выделить всё
#define NUM_OF_SUBMENU_1_PUNKTS .3
#define NUM_OF_SUBMENU_2_PUNKTS .3
#define NUM_OF_SUBMENU_3_PUNKTS .3
#define NUM_OF_SUBMENU_4_PUNKTS .3
#define NUM_OF_SUBMENU_5_PUNKTS .3
#define NUM_OF_SUBMENU_6_PUNKTS .3
#define NUM_OF_SUBMENU_7_PUNKTS .3
#define NUM_OF_SUBMENU_8_PUNKTS .3
Ну суть важно, что они все одинаковые, это просто набросок количества подпунктов в каждом пункте меню. Они могут быть произвольно изменены перед компиляцией.
Необходимо создать таблицу возврата этих значений. Соорудил я значит следующий макрос:
Спойлер
Код: Выделить всё
retlw_num_of_submenu_punkts macro ; Макрос, автоматически создаст таблицу возвратов количества пунктов в нужном подменю
local a=1
while a<NUM_OF_MAIN_MENU_PUNKTS+1
retlw NUM_OF_SUBMENU_#v(a)_PUNKTS
a+=1
endw
endm
Смотрю дизасм:
Спойлер
Код: Выделить всё
154 3401 RETLW 0x1 36: retlw_num_of_submenu_punkts
155 3401 RETLW 0x1
156 3401 RETLW 0x1
157 3401 RETLW 0x1
158 3401 RETLW 0x1
159 3401 RETLW 0x1
15A 3401 RETLW 0x1
15B 3401 RETLW 0x1
Че за...
Переставляю индекс в конец, чтобы последовательность приняла вид:
Спойлер
Код: Выделить всё
#define NUM_OF_SUBMENU_PUNKTS_1 .3
#define NUM_OF_SUBMENU_PUNKTS_2 .3
#define NUM_OF_SUBMENU_PUNKTS_3 .3
#define NUM_OF_SUBMENU_PUNKTS_4 .3
#define NUM_OF_SUBMENU_PUNKTS_5 .3
#define NUM_OF_SUBMENU_PUNKTS_6 .3
#define NUM_OF_SUBMENU_PUNKTS_7 .3
#define NUM_OF_SUBMENU_PUNKTS_8 .3
В макросе делаю аналогично:
Спойлер
Код: Выделить всё
retlw_num_of_submenu_punkts macro ; Макрос, автоматически создаст таблицу возвратов количества пунктов в нужном подменю
local a=1
while a<NUM_OF_MAIN_MENU_PUNKTS+1
retlw NUM_OF_SUBMENU_PUNKTS_#v(a)
a+=1
endw
endm
Смотрю дизасм:
Спойлер
Код: Выделить всё
154 3403 RETLW 0x3 36: retlw_num_of_submenu_punkts
155 3403 RETLW 0x3
156 3403 RETLW 0x3
157 3403 RETLW 0x3
158 3403 RETLW 0x3
159 3403 RETLW 0x3
15A 3403 RETLW 0x3
15B 3403 RETLW 0x3
Все ок... Блин, че за...

Я бы и так оставил, только вот по смыслу немного не так константы получаются обозваны
