Поклонники продукции Microchip Technology Inc тусуются тут.
Вт сен 27, 2016 21:15:14
А что нам гадать, давайте посмотрим. Дел то на 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 KiB) Скачиваний: 505
Спойлер
- Код:
!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 KiB) Скачиваний: 480
Компилятор : XC8 v1.35
Вт сен 27, 2016 21:52:39
Спасибо!
В итоге мой вариант в лоб в разложенном виде оказался длиннее.
Очевидно именно это Майкрочип и называет "оптимизирован под Си".
Чт сен 29, 2016 20:56:43
Никак не могу разобраться...
В инструкции к компилятору чет не могу найти ответа...
Может ткнете, где описано как правильно создавать пользовательские внешние функции в отдельном файле...
сейчас застрял на этапе (на примере все той же 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.
Но жутко неудобно во всем этом разбираться, хочется систематизации...
Чт сен 29, 2016 21:08:55
Попробовал запихнуть функции EEPROM прямо в заголовочный файл, а C-файл изъял из проекта.
Работает и проект компилится...
Почему так делать не рекомендуется?
Чт сен 29, 2016 22:23:17
Igor_Naum писал(а):Почему так делать не рекомендуется?
Препроцессор вставит тела функций во все модули (С-файлы) в которые этот хидер включён. Компилятор сгенерирует код функций в каждом модуле. И когда линкер будет собирать объектные файлы (полуфабрикаты) в исполняемый файл программы - ему не понравятся объекты с одинаковыми названиями - поскольку непонятно какую из Х одноименных функций разработчик хотел вызывать.
H-файл - интерфейс модуля. C-файл - модуль. В модуле пишем реализацию - тела функций, в интерфейсе объявляем публичные ресурсы модуля - прототипы функций и extern определения глобальных переменных модуля. Всё что не должно быть видно за пределами модуля закрываем static-ом - чтобы даже возможности не было обратиться. Чем меньше торчит из модуля наружу - тем крепче и спокойнее наш сон - т.е. сводим публично доступные ресурсы до абсолютного необходимого минимума.
PS: Интерфейс (H-файл) "огораживается", чтобы препроцессор не дублировал уже включённые объявления:
- Код:
[начало файла]
#ifndef __MY_COOL_MODULE_H
#define __MY_COOL_MODULE_H
[Определения общедоступных ресурсов модуля]
#endif /* __MY_COOL_MODULE_H */
[конец файла]
Пн ноя 14, 2016 09:44:08
Здравствуйте. Помогите новичку в 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 проекта делал, проект вообще чистый изначально.
Пн ноя 14, 2016 11:58:40
В таких случаях в некоторых структурах принято светить в лицо лампой и кричать "выкладывай все!"
А проект точно С++?
Пн ноя 14, 2016 12:11:24
У микрочипа С++ поддерживает только один единственный компилятор, это - XC32, под 32-ые PIC'и.
Пн ноя 14, 2016 13:06:45
Аlex писал(а):У микрочипа С++ поддерживает только один единственный компилятор, это - XC32, под 32-ые PIC'и.
Тогда всё сходится. Экспериментировал с разными камнями, и как раз 32й компилятор мне собрал проект.
Только что изменил С++ на С, и всё собралось в 18м компиляторе. Вот задница! А я люблю с классами играться. Ну ок, С так С.
Пн ноя 14, 2016 18:51:43
В микроконтроллерах память не велика, например 18f23k22, на классы явно не хватит.
Пн ноя 14, 2016 22:13:09
alex_ писал(а):В микроконтроллерах память не велика, например 18f23k22, на классы явно не хватит.
мне меги16 хватало, stm32 тем более.
Пн ноя 14, 2016 22:36:00
alex_ писал(а):на классы явно не хватит.
Прикольное заявление
Можно пример ? И в цифрах, пожалуйста ?
Вт ноя 15, 2016 06:58:45
Сам я классы не пытался впихнуть, но где то на данном форуме утверждали что классы не целесообразно использовать из-за того что памяти не много, целесообразнее использовать функции
Вт ноя 15, 2016 07:30:14
Скажем так. Класс в С++, ничем не отличается от обычной Сишной структуры и его экземпляр занимает памяти ровно столько, сколько в ней объявлено переменных. А метод у класса - та же функция, только ещё неявно передаётся указатель на экземпляр класса.
Так что, на счёт целесообразности, можно ещё поспорить... Одно лишнее маш. слово в памяти под указатель, против удобства использования.
Вт дек 06, 2016 14:07:05
Добрый день! Также нужно помощь в 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
Вт дек 06, 2016 15:15:47
Это не ошибки, а предупреждения о некорректном форматировании исходника.
Команды и директивы пишите, отступая на один таб от края. Метки оставьте вплотную к краю.
Ошибка только одна, в конце end должна быть БЕЗ точки.
Добавлено after 5 minutes 50 seconds:
P.S. Разве в асм ставится ; после команды? Вроде нет.
Вт дек 06, 2016 17:08:26
Точка с запятой означает начала комментария в строке, поэтому не мешают. Но и не нужны.
Вт дек 06, 2016 17:17:22
А ведь верно, совсем из головы вылетело. И вижу, что ошибку не вызывает, а причину понять не могу.
Вт янв 17, 2017 19:47:14
Доброго времени суток. MPLAB 8.92. После создания проекта, при создании нового асм-файла, предлагает на выбор 2 вида кодировки, ANSI и Unicode. По умолчанию выбрана ANSI, всегда не думая ее оставлял. В каких случаях может понадобится Unicode ?
Вт янв 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
Все ок... Блин, че за...
Я бы и так оставил, только вот по смыслу немного не так константы получаются обозваны
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.