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

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение А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 КБ) 586 скачиваний



Спойлер

Код: Выделить всё

!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 КБ) 569 скачиваний



Компилятор : XC8 v1.35
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

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

Сообщение Zhuk72 »

:beer:
Спасибо!

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

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
Igor_Naum
Открыл глаза
Сообщения: 46
Зарегистрирован: Сб янв 26, 2013 21:28:58
Откуда: Москва

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

Сообщение Igor_Naum »

Никак не могу разобраться... :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.
Но жутко неудобно во всем этом разбираться, хочется систематизации... :))
Чтобы избавиться от всяких котов, лучше всего обзавестись своим собственным...
Аватара пользователя
Igor_Naum
Открыл глаза
Сообщения: 46
Зарегистрирован: Сб янв 26, 2013 21:28:58
Откуда: Москва

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

Сообщение Igor_Naum »

Попробовал запихнуть функции EEPROM прямо в заголовочный файл, а C-файл изъял из проекта.
Работает и проект компилится...
Почему так делать не рекомендуется?
Чтобы избавиться от всяких котов, лучше всего обзавестись своим собственным...
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

Igor_Naum писал(а):Почему так делать не рекомендуется?

Препроцессор вставит тела функций во все модули (С-файлы) в которые этот хидер включён. Компилятор сгенерирует код функций в каждом модуле. И когда линкер будет собирать объектные файлы (полуфабрикаты) в исполняемый файл программы - ему не понравятся объекты с одинаковыми названиями - поскольку непонятно какую из Х одноименных функций разработчик хотел вызывать.

H-файл - интерфейс модуля. C-файл - модуль. В модуле пишем реализацию - тела функций, в интерфейсе объявляем публичные ресурсы модуля - прототипы функций и extern определения глобальных переменных модуля. Всё что не должно быть видно за пределами модуля закрываем static-ом - чтобы даже возможности не было обратиться. Чем меньше торчит из модуля наружу - тем крепче и спокойнее наш сон - т.е. сводим публично доступные ресурсы до абсолютного необходимого минимума.

PS: Интерфейс (H-файл) "огораживается", чтобы препроцессор не дублировал уже включённые объявления:

Код: Выделить всё

[начало файла]
#ifndef __MY_COOL_MODULE_H
#define __MY_COOL_MODULE_H

[Определения общедоступных ресурсов модуля]

#endif /* __MY_COOL_MODULE_H */
[конец файла]
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

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

Сообщение Ярослав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 проекта делал, проект вообще чистый изначально.
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

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

Сообщение Zhuk72 »

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

А проект точно С++?
:?
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

У микрочипа С++ поддерживает только один единственный компилятор, это - XC32, под 32-ые PIC'и.
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

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

Сообщение Ярослав555 »

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

Тогда всё сходится. Экспериментировал с разными камнями, и как раз 32й компилятор мне собрал проект.
Только что изменил С++ на С, и всё собралось в 18м компиляторе. Вот задница! А я люблю с классами играться. Ну ок, С так С. :)))
Аватара пользователя
alex_
Опытный кот
Сообщения: 781
Зарегистрирован: Сб июн 01, 2013 22:24:21
Откуда: ПФО

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

Сообщение alex_ »

В микроконтроллерах память не велика, например 18f23k22, на классы явно не хватит.
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

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

Сообщение Ярослав555 »

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

мне меги16 хватало, stm32 тем более.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

alex_ писал(а):на классы явно не хватит.
Прикольное заявление :)
Можно пример ? И в цифрах, пожалуйста ? :)
Аватара пользователя
alex_
Опытный кот
Сообщения: 781
Зарегистрирован: Сб июн 01, 2013 22:24:21
Откуда: ПФО

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

Сообщение alex_ »

Сам я классы не пытался впихнуть, но где то на данном форуме утверждали что классы не целесообразно использовать из-за того что памяти не много, целесообразнее использовать функции :dont_know:
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Скажем так. Класс в С++, ничем не отличается от обычной Сишной структуры и его экземпляр занимает памяти ровно столько, сколько в ней объявлено переменных. А метод у класса - та же функция, только ещё неявно передаётся указатель на экземпляр класса.
Так что, на счёт целесообразности, можно ещё поспорить... Одно лишнее маш. слово в памяти под указатель, против удобства использования.
kseniadovgopolaya
Родился
Сообщения: 1
Зарегистрирован: Вт дек 06, 2016 12:13:20

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

Сообщение 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
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

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

Сообщение Zhuk72 »

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

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

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

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25121
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

Точка с запятой означает начала комментария в строке, поэтому не мешают. Но и не нужны.
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

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

Сообщение Zhuk72 »

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

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

Сообщение Пока_без_кота »

Доброго времени суток. MPLAB 8.92. После создания проекта, при создании нового асм-файла, предлагает на выбор 2 вида кодировки, ANSI и Unicode. По умолчанию выбрана ANSI, всегда не думая ее оставлял. В каких случаях может понадобится Unicode ?
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

Сообщение Пока_без_кота »

Доброго времени суток. Пишу простую менюшку на ассемблере. Хочу для красоты и автоматизации завернуть все в макросы. Есть следующая последовательность констант:
Спойлер

Код: Выделить всё

#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:
Я бы и так оставил, только вот по смыслу немного не так константы получаются обозваны :)))
Ответить

Вернуться в «PIC»