Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

Re: Вопросы по MPLAB X.

Вт сен 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

Re: Вопросы по MPLAB X.

Вт сен 27, 2016 21:52:39

:beer:
Спасибо!

В итоге мой вариант в лоб в разложенном виде оказался длиннее.
Очевидно именно это Майкрочип и называет "оптимизирован под Си".

Re: Вопросы по MPLAB X.

Чт сен 29, 2016 20:56:43

Никак не могу разобраться... :dont_know:
В инструкции к компилятору чет не могу найти ответа...
Может ткнете, где описано как правильно создавать пользовательские внешние функции в отдельном файле...

сейчас застрял на этапе (на примере все той же 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

Попробовал запихнуть функции EEPROM прямо в заголовочный файл, а C-файл изъял из проекта.
Работает и проект компилится...
Почему так делать не рекомендуется?

Re: Вопросы по MPLAB X.

Чт сен 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 */
[конец файла]

Re: Вопросы по MPLAB X.

Пн ноя 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 проекта делал, проект вообще чистый изначально.

Re: Вопросы по MPLAB X.

Пн ноя 14, 2016 11:58:40

В таких случаях в некоторых структурах принято светить в лицо лампой и кричать "выкладывай все!" :kill:

А проект точно С++?
:?

Re: Вопросы по MPLAB X.

Пн ноя 14, 2016 12:11:24

У микрочипа С++ поддерживает только один единственный компилятор, это - XC32, под 32-ые PIC'и.

Re: Вопросы по MPLAB X.

Пн ноя 14, 2016 13:06:45

Аlex писал(а):У микрочипа С++ поддерживает только один единственный компилятор, это - XC32, под 32-ые PIC'и.

Тогда всё сходится. Экспериментировал с разными камнями, и как раз 32й компилятор мне собрал проект.
Только что изменил С++ на С, и всё собралось в 18м компиляторе. Вот задница! А я люблю с классами играться. Ну ок, С так С. :)))

Re: Вопросы по MPLAB X.

Пн ноя 14, 2016 18:51:43

В микроконтроллерах память не велика, например 18f23k22, на классы явно не хватит.

Re: Вопросы по MPLAB X.

Пн ноя 14, 2016 22:13:09

alex_ писал(а):В микроконтроллерах память не велика, например 18f23k22, на классы явно не хватит.

мне меги16 хватало, stm32 тем более.

Re: Вопросы по MPLAB X.

Пн ноя 14, 2016 22:36:00

alex_ писал(а):на классы явно не хватит.
Прикольное заявление :)
Можно пример ? И в цифрах, пожалуйста ? :)

Re: Вопросы по MPLAB X.

Вт ноя 15, 2016 06:58:45

Сам я классы не пытался впихнуть, но где то на данном форуме утверждали что классы не целесообразно использовать из-за того что памяти не много, целесообразнее использовать функции :dont_know:

Re: Вопросы по MPLAB X.

Вт ноя 15, 2016 07:30:14

Скажем так. Класс в С++, ничем не отличается от обычной Сишной структуры и его экземпляр занимает памяти ровно столько, сколько в ней объявлено переменных. А метод у класса - та же функция, только ещё неявно передаётся указатель на экземпляр класса.
Так что, на счёт целесообразности, можно ещё поспорить... Одно лишнее маш. слово в памяти под указатель, против удобства использования.

Re: Кто нибудь шарит в MPLAB?

Вт дек 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

Re: MPLAB в вопросах и ответах

Вт дек 06, 2016 15:15:47

Это не ошибки, а предупреждения о некорректном форматировании исходника.
Команды и директивы пишите, отступая на один таб от края. Метки оставьте вплотную к краю.

Ошибка только одна, в конце end должна быть БЕЗ точки.

Добавлено after 5 minutes 50 seconds:
P.S. Разве в асм ставится ; после команды? Вроде нет.

Re: MPLAB в вопросах и ответах

Вт дек 06, 2016 17:08:26

Точка с запятой означает начала комментария в строке, поэтому не мешают. Но и не нужны.

Re: MPLAB в вопросах и ответах

Вт дек 06, 2016 17:17:22

А ведь верно, совсем из головы вылетело. И вижу, что ошибку не вызывает, а причину понять не могу.

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

Че за... :shock:

Переставляю индекс в конец, чтобы последовательность приняла вид:
Спойлер
Код:
#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

Все ок... Блин, че за... :dont_know:
Я бы и так оставил, только вот по смыслу немного не так константы получаются обозваны :)))
Ответить