Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: HI-TECH C
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Евгений Германович
Есть желание завести HI-TECH C.Откуда то качнул,он не заводится,не будет ли кто нибудь так любезен дать ссылочку?
evc
/upload/MCs/PIC/Иваныч
AlHakim
Цитата(evc @ Oct 8 2008, 21:08) *
/upload/MCs/PIC/Иваныч

Если доступа нет читай внимательно
http://electronix.ru/forum/index.php?showt...=17862&st=0

пост 65 от LordN
Евгений Германович
Цитата(evc @ Oct 8 2008, 18:08) *
/upload/MCs/PIC/Иваныч

Если не затруднит-там несколько,что присоветуете?
Иваныч
Цитата(Евгений Германович @ Oct 9 2008, 15:15) *
Если не затруднит-там несколько,что присоветуете?
Берите последние STD, т.к. PRO ещё сырой.
Евгений Германович
Цитата(Иваныч @ Oct 9 2008, 16:34) *
Берите последние STD, т.к. PRO ещё сырой.

Поздно.Установил про 9.60.
Но есть проблемы в мплабе я согласно рекомендации
В MPLABе выбрать HI-TECH Universal toolsuite и указать ему на C:\Program Files\HI-TECH Software\PICC\std\9.60\bin\picc.exe
это проделал,а именно в окошке project--> set language...-->ht-->exequtables указал на C:\Program Files\HI-TECH Software\PICC\std\9.60\bin\picc.exe а дальше что?
Я не могу найти этот си при создании пректа или я чего то не понял?
Если не трудно помогите.А стд я потом переставлю.
xemul
Цитата(Евгений Германович @ Oct 9 2008, 18:46) *
Поздно.Установил про 9.60.
Но есть проблемы в мплабе я согласно рекомендации
В MPLABе выбрать HI-TECH Universal toolsuite и указать ему на C:\Program Files\HI-TECH Software\PICC\std\9.60\bin\picc.exe
это проделал,а именно в окошке project--> set language...-->ht-->exequtables указал на C:\Program Files\HI-TECH Software\PICC\std\9.60\bin\picc.exe а дальше что?
Я не могу найти этот си при создании пректа или я чего то не понял?
Если не трудно помогите.А стд я потом переставлю.

Проверьте пути.
В архиве Pro путь по умолчанию C:\Program Files\HI-TECH Software\PICC\pro\..., а не ...\std\...
Если разархивировали в более другое место, то поправьте путь в .reg файле.
Обновите реестр этим .reg и выполните еще раз активацию в HI-TECH Universal Toolsuite.
В МПЛабе вся необходимая инфа после этого уже должна появиться.
Далее в свойствах проекта (Project->Select Language Toolsuite) выбираете HI-TECH Universal Toolsuite.

Std спокойно уживается с pro (разархивировать в каталог, отличный от pro, поправить по необходимости .reg, импортировать его, выполнить активацию). В Project->Build Options->Project->Driver выбираете требуемый драйвер (pro/std желаемой версии) и все. (вперед на грабли совместимости pro и std smile.gif ).

С установленным picc lite, идущим в комплекте МПЛаба (один раз установил для общего развития) мне не удалось заставить работать ни std, ни pro. Пришлось снести МПЛаб и установить без picc lite.
Евгений Германович
Цитата(xemul @ Oct 9 2008, 19:27) *
Проверьте пути.
В архиве Pro путь по умолчанию C:\Program Files\HI-TECH Software\PICC\pro\..., а не ...\std\...
Если разархивировали в более другое место, то поправьте путь в .reg файле.
Обновите реестр этим .reg и выполните еще раз активацию в HI-TECH Universal Toolsuite.
В МПЛабе вся необходимая инфа после этого уже должна появиться.
Далее в свойствах проекта (Project->Select Language Toolsuite) выбираете HI-TECH Universal Toolsuite.

Std спокойно уживается с pro (разархивировать в каталог, отличный от pro, поправить по необходимости .reg, импортировать его, выполнить активацию). В Project->Build Options->Project->Driver выбираете требуемый драйвер (pro/std желаемой версии) и все. (вперед на грабли совместимости pro и std smile.gif ).

С установленным picc lite, идущим в комплекте МПЛаба (один раз установил для общего развития) мне не удалось заставить работать ни std, ни pro. Пришлось снести МПЛаб и установить без picc lite.

Я перепутал,установлен std.У меня тоже стоял lite завтра уберу.
У меня в project wisard нет хайтека.
А почему в C:\Program Files\HI-TECH Software нет оболочки hi-tech её надо отдельно грузить.
xemul
Цитата(Евгений Германович @ Oct 9 2008, 20:37) *
Я перепутал,установлен std.У меня тоже стоял lite завтра уберу.
А почему в C:\Program Files\HI-TECH Software нет оболочки hi-tech её надо отдельно грузить.

Вы о ht-ide? Сейчас это отдельный продукт.
Лет 7-8 тому, когда picc еще шел с ide в одном флаконе, я немного с ним (ide) поигрался, но никаких прелестей не ощутил (помню только ужас от встроенного редактора). Возможно, сейчас он стал поразумнее.

Сейчас проверил - в project wisard есть HI-TECH Universal Toolsuite. (я еще ни одного проекта не создавал с использованием визарда, поэтому и не знал, что там живетsmile.gif)
Евгений Германович
Разобрался.
Однако есть вопрос
Error [939] ; . no file arguments

Чего не хватает?
xemul
Цитата(Евгений Германович @ Oct 12 2008, 15:11) *
Error [939] ; . no file arguments

Чего не хватает?

Цитата
(939) no file arguments (Driver)
The driver has been invoked with no input files listed on its command line. If you are getting this
message while building through a third party IDE, perhaps the IDE could not verify the source files
to compile or object files to link and withheld them from the command line.

Поставьте для разбора полетов в Project->Build Options->Compiler галку в чекбоксе Verbose.
Как вариант, куда-нибудь в пути/имена файлов проекта затесалась кириллица.
Евгений Германович
Цитата(xemul @ Oct 14 2008, 19:53) *
Поставьте для разбора полетов в Project->Build Options->Compiler галку в чекбоксе Verbose.
Как вариант, куда-нибудь в пути/имена файлов проекта затесалась кириллица.

Спасибо за ответ,я и с этим разобрался.Как говорится дело было не в бобине .... и тд.
Я просто забыл вкл файл в проект smile.gif
Однако у меня есть ещё вопрос -это использование delay из папки samples не могу вызвать.

На эту запись транслятор однозначно отзывается матерками.
picc -DXTAL_FREQ=4MHZ

Если не трудно окажите помощь.
xemul
Цитата(Евгений Германович @ Oct 16 2008, 17:09) *
Однако у меня есть ещё вопрос -это использование delay из папки samples не могу вызвать.

На эту запись транслятор однозначно отзывается матерками.
picc -DXTAL_FREQ=4MHZ

Если не трудно окажите помощь.

Вы можете задать XTAL_FREQ обычным
#define XTAL_FREQ 4MHZ
перед
#include "path_to/delay.h"
Можете задать XTAL_FREQ=4MHZ в Project->Options->Compiler->Define macros
Файлы delay.* стОит скопировать в более удобное место (в какой-нибудь ./common/ для устоявшихся и обычно используемых сорцов, или хотя бы в папку проекта).
Кста, в delay.h присутствуют строки
Код
#ifndef    XTAL_FREQ
#define    XTAL_FREQ    4MHZ        /* Crystal frequency in MHz */
#endif


Я этими функциями не пользуюсь и сказать что-то более разумное о них не могу.

Еще одно кста из delay.h:
Цитата
* MAKE SURE this code is compiled with full optimization!!!


UPD: я хотел сказать, что для delay.c нужно задать оптимизацию по скорости независимо от типа оптимизации всего проекта.
Евгений Германович
Цитата(xemul @ Oct 16 2008, 19:19) *
Вы можете задать XTAL_FREQ обычным
#define XTAL_FREQ 4MHZ
перед
#include "path_to/delay.h"
Можете задать XTAL_FREQ=4MHZ в Project->Options->Compiler->Define macros
Файлы delay.* стОит скопировать в более удобное место (в какой-нибудь ./common/ для устоявшихся и обычно используемых сорцов, или хотя бы в папку проекта).
Кста, в delay.h присутствуют строки
Код
#ifndef    XTAL_FREQ
#define    XTAL_FREQ    4MHZ        /* Crystal frequency in MHz */
#endif


Я этими функциями не пользуюсь и сказать что-то более разумное о них не могу.

Еще одно кста из delay.h:

Попробую,спасибо.
Евгений Германович
Цитата(DL36 @ Oct 18 2008, 11:25) *
Если уж пользоваться программными задержками то лучше использовать этот вариант delay.h

Вы немного неправильно указали адрес,но я туда все равно попал smile.gif
Проблема не в программе задержки,я её сам написал.
Проблема в том,что я не смог вызвать вышеозначенную функцию,и это меня сильно огорчает.
Также я не смог указать частоту посредством XTAL_FREQ .
Вот в чем основная проблема.
DL36
Цитата(Евгений Германович @ Oct 19 2008, 13:50) *
Вы немного неправильно указали адрес,но я туда все равно попал smile.gif
Проблема не в программе задержки,я её сам написал.
Проблема в том,что я не смог вызвать вышеозначенную функцию,и это меня сильно огорчает.
Также я не смог указать частоту посредством XTAL_FREQ .
Вот в чем основная проблема.

Ссылку поправил delay.h. Хотя странно это вроде проверял.

Приведите функцию и участок программы с локализацией проблемы, короткий.
Евгений Германович
Цитата(DL36 @ Oct 20 2008, 07:43) *
Ссылку поправил delay.h. Хотя странно это вроде проверял.

Приведите функцию и участок программы с локализацией проблемы, короткий.


#include <pic.h>

#include "C:\Program Files\HI-TECH Software\PICC\std\9.60\samples\delay\delay.h";
near char reload = 0;
_XTAL_FREQ=4MHZ;

extern void DelayMs(unsigned char);
main()
{

__CONFIG(HS & WDTDIS & PWRTEN & BORDIS & LVPDIS);


TRISA=0X00;
TRISB=0XFF;
TRISD=0X0F;



while(1)
{PORTA=0X00;
DelayMs(3);
PORTA=0xff;


}

}

С вызовом я разобрался при написании вам ответа,до этого момента не мог добиться победы.
Однако _XTAL_FREQ=4MHZ; в любых вариантах вызывает бурную реакцию хайтека.
И пользуясь случаем что такое и для чего near.И у меня еще есть кучка вопросов.Ответите???
DL36
Цитата(Евгений Германович @ Oct 20 2008, 16:16) *
#include <pic.h>

#include "C:\Program Files\HI-TECH Software\PICC\std\9.60\samples\delay\delay.h";
near char reload = 0;
_XTAL_FREQ=4MHZ;

С вызовом я разобрался при написании вам ответа,до этого момента не мог добиться победы.
Однако _XTAL_FREQ=4MHZ; в любых вариантах вызывает бурную реакцию хайтека.
И пользуясь случаем что такое и для чего near.И у меня еще есть кучка вопросов.Ответите???

Так и должно быть в delay.h макрос описан.
Код
#ifndef XTAL_FREQ
#define XTAL_FREQ   4MHZ        /* Crystal frequency in MHz */
#endif

#define MHZ *1000L              /* number of kHz in a MHz */
#define KHZ *1                  /* number of kHz in a kHz */

#define DelayUs(x)  { unsigned char _dcnt;   \
_dcnt = (((long)(x))*(long)(XTAL_FREQ))/(long)(12MHZ);  \
        while(--_dcnt != 0) \
        continue; }

и указать компилятору значение можно только так #define XTAL_FREQ 4MHZ /* Crystal frequency in MHz */

Поменяй этот
#include "C:\Program Files\HI-TECH Software\PICC\std\9.60\samples\delay\delay.h";
на тот, что я указал.
Да еще лучьше просто копировать в папку проекта.
Евгений Германович
Цитата(DL36 @ Oct 21 2008, 22:18) *
Так и должно быть в delay.h макрос описан.
Код
#ifndef XTAL_FREQ
#define XTAL_FREQ   4MHZ        /* Crystal frequency in MHz */
#endif

#define MHZ *1000L              /* number of kHz in a MHz */
#define KHZ *1                  /* number of kHz in a kHz */

#define DelayUs(x)  { unsigned char _dcnt;   \
_dcnt = (((long)(x))*(long)(XTAL_FREQ))/(long)(12MHZ);  \
        while(--_dcnt != 0) \
        continue; }

и указать компилятору значение можно только так #define XTAL_FREQ 4MHZ /* Crystal frequency in MHz */

Поменяй этот
#include "C:\Program Files\HI-TECH Software\PICC\std\9.60\samples\delay\delay.h";
на тот, что я указал.
Да еще лучьше просто копировать в папку проекта.

Я так и сделал.Но вылезла куча ошибок.Как мог убрал,но задержка генерируется фиксированная ,что бы не менял.При использовании #define XTAL_FREQ ХХХ MHZ с любой частотой ничего не меняется.
Это я про пример из samples я попробовал _delay_ms() из описания на хайтек таже фигня,но я не успокоился и нашел #define uS_CNT 163 и все стало хорошо 163 это период моего кварца.
Я так и не прорубил про XTAL_FREQ это что явное надувательство?Кстати или нет но в 18 пике мой текст,верхний,не пошел.
DL36
Цитата(Евгений Германович @ Oct 22 2008, 18:31) *
Я так и сделал.Но вылезла куча ошибок.Как мог убрал,но задержка генерируется фиксированная ,что бы не менял.При использовании #define XTAL_FREQ ХХХ MHZ с любой частотой ничего не меняется.
Это я про пример из samples я попробовал _delay_ms() из описания на хайтек таже фигня,но я не успокоился и нашел #define uS_CNT 163 и все стало хорошо 163 это период моего кварца.
Я так и не прорубил про XTAL_FREQ это что явное надувательство?Кстати или нет но в 18 пике мой текст,верхний,не пошел.

Все работает, приложите к сообщению короткий запакованный проект, поправлю. У Вас нет понимания процесса.
xemul
Цитата(Евгений Германович @ Oct 20 2008, 17:16) *
Код
#include "C:\Program Files\HI-TECH Software\PICC\std\9.60\samples\delay\delay.h";

_XTAL_FREQ=4MHZ;

extern void DelayMs(unsigned char);
...

Однако _XTAL_FREQ=4MHZ; в любых вариантах вызывает бурную реакцию хайтека.

Кто такой _XTAL_FREQ, я не знаю, как, похоже, и компилятор.
Может быть так пройдет?
Код
#define XTAL_FREQ 4MHZ
#include "C:\Program Files\HI-TECH Software\PICC\std\9.60\samples\delay\delay.h"

// а это уже есть в delay.h
//extern void DelayMs(unsigned char);
...

Интересно, для кого я писал:
Цитата
Вы можете задать XTAL_FREQ обычным
#define XTAL_FREQ 4MHZ
перед
#include "path_to/delay.h"
Евгений Германович
xemul считаю своим долгом извиниться перед вами-виноват недоглядел smile.gif
Однако :#include <pic18.h>

//#define XTAL_FREQ=5MHZ


#include "C:\Program Files\HI-TECH Software\PICC-18\STD\9.51\samples\delay\delay.h";
#define XTAL_FREQ=9MHZ
//#define XTAL_FREQ=1MHZ

main()
{
__CONFIG(1,HS & OSCSDIS);
__CONFIG(2,BOREN & BORV42 & PWRTEN & WDTPS128 & WDTDIS);
__CONFIG(4,DEBUGEN & LVPDIS & STVREN);

TRISA=0X00;
TRISB=0XFF;

TRISD=0X00;
LATD=0x0f;



while(1)
{
PORTA=0X00;
// DelayMs(10);
DelayUs(10);

PORTA=0xff;
//DelayMs(40);
DelayUs(40);
}
}

Если поставить #define перед #include то транслятор начинает возмущаться.
Должен отметить,что если заменить DelayUs(10); на DelayMs(10); то появляется сообщение об ошибке 07.gif Естественно что изменение цифр в #define XTAL_FREQ=5MHZ ни к чему не приводит.

Для DL36 запрошенные вами файлы прилагаются.
xemul
Вы таки невнимательны.
Код
#define a b  // OK
#define a=b  // препроцессор Вас не поймет


ЗЫЖ попробуйте использовать в сообщении теги code и /code для текстов программ (теги заключаются в [])
Евгений Германович
smile.gif да.
про code можно подробнее.Я готов их использовать только объясните где smile.gif и зачем

В железе не проверял,но после
#define XTAL_FREQ 5MHZ или сколь надо,в list файле отмечена положительная реакция на смену цифры.
Однако транслятор выкинул предупреждение о нежелательности задания частоты подобным образом.
Вы правы.
не подскажете как облагородить list такого кол-ва ненужных букв я ещё нигде не видел.
xemul
Цитата(Евгений Германович @ Oct 23 2008, 19:21) *
про code можно подробнее.Я готов их использовать только объясните где smile.gif и зачем

Без тегов:
main()
{
while(1)
{
}
}

С тегами:
Код
main()
{
   while(1)
   {
      сохраняется форматирование кода, и не приходится ломать глаза и голову
   }
}

В окне редактирования сообщения в панели инструментов есть кнопка с буквой #. Вот она и вставляет теги code и /code.
Еще одна полезная кнопка там же - красная буква Хе (а может быть и крестsmile.gif) поверх буквы T - "Закрыть все теги".
Цитата
В железе не проверял,но после
#define XTAL_FREQ 5MHZ или сколь надо,в list файле отмечена положительная реакция на смену цифры.
Однако транслятор выкинул предупреждение о нежелательности задания частоты подобным образом.

Вот ведь гад... Не знаю, у меня он на XTAL_FREQ, заданный любым допустимым образом, не ругается.
Цитата
не подскажете как облагородить list такого кол-ва ненужных букв я ещё нигде не видел.

Вы имеете в виду файлы листингов *.lst? Опять же не знаю - мне там все буквы нравятся и кажутся весьма полезными.smile.gif
DL36
Все до безобразия просто

результат:
Цитата
Memory Summary:
Program space used 24h ( 36) of 4000h bytes ( 0.2%)
Data space used 0h ( 0) of 300h bytes ( 0.0%)
EEPROM space used 0h ( 0) of 100h bytes ( 0.0%)
External data memory None available
ID Location space used 0h ( 0) of 8h nibbles ( 0.0%)
Configuration bits used 4h ( 4) of 7h words ( 57.1%)

Loaded C:\#Work\tmp\Tst\Tst.cof.

********** Build successful! **********

С правками
Код
#include    <pic18.h>

#define XTAL_FREQ   4MHZ
#include "dl36.h";  //Этот файл надо всключить в проект

main()
{
    __CONFIG(1,HS & XT);
    __CONFIG(2,BOREN & BORV42 & PWRTEN & WDTPS128 & WDTDIS);
    __CONFIG(4,DEBUGEN & LVPDIS & STVREN);

TRISA=0X00;
TRISB=0XFF;

TRISD=0X00;
LATD=0x0f;

а это править нииииизя, пока понимание не прийдет
Код
#ifndef    XTAL_FREQ
#define    XTAL_FREQ    4MHZ        /* Crystal frequency in MHz */
#endif

#define    MHZ    *1000L                /* number of kHz in a MHz */
#define    KHZ    *1                    /* number of kHz in a kHz */

#define DelayUs(x)  { unsigned char _dcnt;   \
_dcnt = (((long)(x))*(long)(XTAL_FREQ))/(long)(12MHZ);  \
        while(--_dcnt != 0) \
        continue; }
/*
#define    DelayUs(x)
{
    unsigned char _dcnt;
    _dcnt = (unsigned char)((x)*((XTAL_FREQ*1.0)/(12MHZ)));
    while(--_dcnt != 0) continue;
}
*/
extern void DelayMs(unsigned char);
Евгений Германович
Ответ увидел поздно но обязательно проверю и сообщу.
Однако сегодня ,предварительно,грязно отматерив весь хайтек,воткнул запись
#define _XTAL_FREQ 4MHZ
этот гад её спокойно заглотил,без единого возражения.
DL36 ваше отношение к функции я теперь разделяю,200% это ещё мягко сказано.функция явное барахло.
DL36
Цитата(Евгений Германович @ Oct 24 2008, 15:36) *
Ответ увидел поздно но обязательно проверю и сообщу.
Однако сегодня ,предварительно,грязно отматерив весь хайтек,воткнул запись
#define _XTAL_FREQ 4MHZ
этот гад её спокойно заглотил,без единого возражения.
DL36 ваше отношение к функции я теперь разделяю,200% это ещё мягко сказано.функция явное барахло.

Эту строку я повторял несколько раз smile.gif
Евгений Германович
Цитата(DL36 @ Oct 24 2008, 16:15) *
Эту строку я повторял несколько раз smile.gif

Простите,но мой _XTAL_FREQ 4MHZ длиннее вашего на одно подчеркивание smile.gif
Или я опять чтото проглядел?
DL36
Цитата(Евгений Германович @ Oct 24 2008, 17:53) *
Простите,но мой _XTAL_FREQ 4MHZ длиннее вашего на одно подчеркивание smile.gif
Или я опять чтото проглядел?

Должно быть одинаково если #define _XTAL_FREQ 4MHZ то и
Код
#define DelayUs(x)  { unsigned char _dcnt;   \
_dcnt = (((long)(x))*(long)(_XTAL_FREQ))/(long)(12MHZ);  \
        while(--_dcnt != 0) \
        continue; }

Вам же символ _ ни к чему. В хайтеке _используется если надо из асма обратиться к сишной переменной.
Евгений Германович
Цитата(DL36 @ Oct 25 2008, 09:01) *
Должно быть одинаково если #define _XTAL_FREQ 4MHZ то и
Код
#define DelayUs(x)  { unsigned char _dcnt;   \
_dcnt = (((long)(x))*(long)(_XTAL_FREQ))/(long)(12MHZ);  \
        while(--_dcnt != 0) \
        continue; }

Вам же символ _ ни к чему. В хайтеке _используется если надо из асма обратиться к сишной переменной.

Я пробовал без подчеркивая,хайтек ответил предупреждением,но всё работало.Я подчеркнул,хайтек заткнулся и всё работало. smile.gif
Кстати вольный перевод предупреждения-сейчас не модно пользоваться XTAL_FREQ надо _ XTAL_FREQ
beer.gif
xemul
Цитата(Евгений Германович @ Oct 25 2008, 15:56) *
Я пробовал без подчеркивая,хайтек ответил предупреждением,но всё работало.Я подчеркнул,хайтек заткнулся и всё работало. smile.gif

Гм...
#define XTAL_FREQ не встречается ни в одном стандартном хидере версии std. Этот дефайн поминается только в delay.h в ./samples/...
В pro в pic.h есть следующее:
Код
#pragma inline(_delay)
#ifdef __PICCPRO__
extern void _delay(unsigned long);
// NOTE: To use the macros below, YOU must have previously defined _XTAL_FREQ
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000UL)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000UL)))
#endif

Могу предположить, что Вы пытаетесь использовать picc std с хидерами от picc pro.
Кста, pro корректно раскручивает короткие задержки в nop'ы и goto $+1.
Для стд мне приходится держать отдельный delay.c с функциями задержек до 10 тактов (бОльшие задержки считаю идеологически вреднымиsmile.gif), для которого в проектах выключается ассемблерная оптимизация, т.к. оптимизатор asm("nop") оптимизирует напрочь, а от asm("goto $+1") у него крыша съезжает вплоть до следующей }. А конструкция типа volatile asm("...") писсом не поддерживается.sad.gif
Цитата
Кстати вольный перевод предупреждения-сейчас не модно пользоваться XTAL_FREQ надо _ XTAL_FREQ

Запостите, плз, предупреждение сюда - даже интересно стало.
Евгений Германович
#warning Preprocessor symbol XTAL_FREQ has been deprecated. Now used _XTAL_FREQ
Вот этот текст без варнинга и выскакивает.
Вы заговорили об ассемблерной оптимизации,чем приблизили следующие вопросы 1111493779.gif
У меня при написании асемблерной вставки ХТ жутко ругается на команды использующие адресацию через индексный регистр.Ежли я задаю принудительно адрес с помощью @ то все нормально,а если нет то ...........Оптимизацию я вроде откючил,попытка воткнуть слова bankX воспринимается благосклонно но пользы от восприятия не какой.Не будете ли так любезны прояснить.У меня std9.51
DL36
Цитата(Евгений Германович @ Oct 25 2008, 16:22) *
#warning Preprocessor symbol XTAL_FREQ has been deprecated. Now used _XTAL_FREQ
Вот этот текст без варнинга и выскакивает.

Странно почему у меня ничего не выскакивает, предупреждения на максимуме компилятор PICC18 std9.51
Цитата
Вы заговорили об ассемблерной оптимизации,чем приблизили следующие вопросы 1111493779.gif
У меня при написании асемблерной вставки ХТ жутко ругается на команды использующие адресацию через индексный регистр.Ежли я задаю принудительно адрес с помощью @ то все нормально,а если нет то ...........Оптимизацию я вроде откючил,попытка воткнуть слова bankX воспринимается благосклонно но пользы от восприятия не какой.Не будете ли так любезны прояснить.У меня std9.51

Использование Индексных регистров в асмовких вставках дело тонкое, его надо поделить с компилятором. Но, вот такой текст дает вполне приличный код.
Код
    FSR0L = *( unsigned char *)(&pTable);   //  
    FSR0H = *((unsigned char *)(&pTable) +1);
    WREG = tableOffset0;                        //
    tmpMult = PLUSW0;

Хайтек очень часто использует FSRx как регистры временного хранения, И может Вы ему чем то помешали. Кстати о страничной организации памяти надо помнить и это теперь Ваша забота.
xemul
Цитата(Евгений Германович @ Oct 25 2008, 17:22) *
#warning Preprocessor symbol XTAL_FREQ has been deprecated. Now used _XTAL_FREQ
Вот этот текст без варнинга и выскакивает.

В picc std 9.60 такого не замечал.
Цитата
Вы заговорили об ассемблерной оптимизации,чем приблизили следующие вопросы 1111493779.gif
У меня при написании асемблерной вставки ХТ жутко ругается на команды использующие адресацию через индексный регистр.Ежли я задаю принудительно адрес с помощью @ то все нормально,а если нет то ...........

Есть такая непоследовательность в хидерах - INDF определен не для всех контроллеров.
Если обращение к INDF происходит в ассемблерных вставках, то необходимо также добавить
Код
#asm
INDF        equ    000h
#endasm

Я, чтобы не париться с этим безобразием, добавил
Код
static volatile unsigned char INDF    @ 0x00; // в ./include/pic*.h
и
INDF        equ    000h; в ./include/as*.h

Цитата
Оптимизацию я вроде откючил,попытка воткнуть слова bankX воспринимается благосклонно но пользы от восприятия не какой.Не будете ли так любезны прояснить.У меня std9.51

Ничего не понял. Вы бы приводили проблемные куски кода с описанием беды для облегчения процесса.

ЗЫЖ ассемблерная оптимизация и ассемблерные вставки никак друг с другом не соотносятся. Но первое - вещь велми полезная, а второе - ... не необходимая.
Евгений Германович
про варнинг,сегодня проверял вот текст
#include <pic18.h>

#define XTAL_FREQ 13MHZ


#include "C:\Program Files\HI-TECH Software\PICC-18\STD\9.51\samples\delay\delay.h";
//#define XTAL_FREQ=9MHZ
//#define XTAL_FREQ=1MHZ

main()
{
__CONFIG(1,HS & OSCSDIS);
__CONFIG(2,BOREN & BORV42 & PWRTEN & WDTPS128 & WDTDIS);
__CONFIG(4,DEBUGEN & LVPDIS & STVREN);

TRISA=0X00;
TRISB=0XFF;

TRISD=0X00;
LATD=0x0f;



while(1)
{
PORTA=0X00;
// DelayMs(10);
// DelayUs(10);
__delay_ms(10);

PORTA=0xff;
//DelayMs(40);
DelayUs(40);
}
}
Ругань идет при использовании __delay,Если эту штуку не применять то XTAL_FREQ 13MHZ что с чертой спереди что без -все тихо и спокойно.
Про ассемблерную беду -наверное только в понедельник,нет текста под рукой.Меня до неприличия заинтересовал вопро о принудительном определении места в памяти переменных,но как бы я не изголялся с банком -никакого эффекта.
xemul
Цитата(Евгений Германович @ Oct 25 2008, 19:59) *
про варнинг,сегодня проверял вот текст
Код
#include "C:\Program Files\HI-TECH Software\PICC-18\STD\9.51\samples\delay\delay.h";
...
__delay_ms(10);

//DelayMs(40);

Ругань идет при использовании __delay,Если эту штуку не применять то XTAL_FREQ 13MHZ что с чертой спереди что без -все тихо и спокойно.

Воистину, в огороде бузина... Как соотносятся __delay_ms() и DelayMs()?
Если Вы пытаетесь использовать DelayMs() из C:\Program Files\HI-TECH Software\PICC-18\STD\9.51\samples\delay\delay.h, то там черным по-Сишному:
Код
void DelayMs(unsigned char);

Если Вы написали свою __delay_ms(), то я, увы, не смог телепнуть ни ее текст, ни ругань по ее поводу.
Цитата
Меня до неприличия заинтересовал вопро о принудительном определении места в памяти переменных,но как бы я не изголялся с банком -никакого эффекта.

Оно Вам точно надо?
Код
int Abc @ 0x192; // и никаких чудес
                 // если память контроллера нарезана банками по 256 байт,
                 // то Abc попадет в bank1 по смещению 0x92
Abc = 1234;

manual.pdf
Цитата
3.4.2 Absolute Variables
Эта конструкция предназначена в первую очередь для согласования адресов Сишных переменных с регистрами специального назначения микропроцессора, но может быть использована и для размещения переменных пользователя по абсолютным адресам. Компилятор и линкер не производят никаких проверок на перекрытие абсолютных переменных друг с другом.
Определение абсолютных переменных может фрагментировать память и сделать невозможным для линкера размещение других объектов. По возможности избегайте использования абсолютных переменных. Если абсолютные переменные все же должны быть определены, старайтесь размещать их в одном конце памяти одним куском. (в оригинале "try to place them at one end of a memory bank or space", но под вечер беда с более точным переводом)

Посмотрите любой из хидеров в C:\Program Files\HI-TECH Software\PICC-18\STD\9.51\include - там таким образом описаны все SFR.
DL36
Цитата(xemul @ Oct 25 2008, 18:49) *
Есть такая непоследовательность в хидерах - INDF определен не для всех контроллеров.
Если обращение к INDF происходит в ассемблерных вставках, то необходимо также добавить
Это тот случай когда _ помогает. Попробуйте так обратиться _INDF.
Евгений Германович
Я решил проверить все delay до которых смог дотянуться. smile.gif Результат не радует.
Воистину, в огороде бузина... Как соотносятся __delay_ms() и DelayMs Воистину, в огороде бузина... неплохо,разница только в том,что DelayMs безбожно врет(По другому сказать правила форума не позволяют,а зря)
Оно Вам точно надо?
На прямо поставленный вопрос ответ будет подобным-НЕ ЗНАЮ.
Но меня огорчила дискриминация со стороны какого то хайтека.Как можно доверить столь интимную вещь,как распределение памяти,какомуто хайтеку,Что он может знать о моих планах на отдаленное будущее.
int Abc @ 0x192
Так и я могу.А вы попробуйте просто определить Abc в банк 1 без конкретизации адреса.
А как массив в определённый банк записать??
У меня ничего не вышло,этот хт грузит массив в последний банк и нагло плюет на мои просьбы засунуть его в другое место.
3.4.2 Absolute Variables
Эта конструкция предназначена в первую очередь для согласования адресов Сишных переменных с регистрами специального назначения микропроцессора, но может быть использована и для размещения переменных пользователя по абсолютным адресам. Компилятор и линкер не производят никаких проверок на перекрытие абсолютных переменных друг с другом.
Определение абсолютных переменных может фрагментировать память и сделать невозможным для линкера р
У вас,что есть перевод хайтека,если есть не поделитесь?
Да бог c INDF.
Почему невинная операция incf с использованием банка вызывает такую реакцию ХТ какое его собачье дело,что я собрался делать?Банк естественно был задан перед использованием.
DL36
Цитата(Евгений Германович @ Oct 26 2008, 08:01) *
Я решил проверить все delay до которых смог дотянуться. smile.gif Результат не радует.
Воистину, в огороде бузина... Как соотносятся __delay_ms() и DelayMs Воистину, в огороде бузина... неплохо,разница только в том,что DelayMs безбожно врет(По другому сказать правила форума не позволяют,а зря)
Оно Вам точно надо?
Я не использую программных задержек более 50us для более длинных существуют таймеры. Учитесь использовать RTOS и вопросы задержек отпадут.
Цитата
На прямо поставленный вопрос ответ будет подобным-НЕ ЗНАЮ.
Но меня огорчила дискриминация со стороны какого то хайтека.Как можно доверить столь интимную вещь,как распределение памяти,какомуто хайтеку,Что он может знать о моих планах на отдаленное будущее.
int Abc @ 0x192
Так и я могу.А вы попробуйте просто определить Abc в банк 1 без конкретизации адреса.
А как массив в определённый банк записать??
У меня ничего не вышло,этот хт грузит массив в последний банк и нагло плюет на мои просьбы засунуть его в другое место.
Если честно, то мне по барабану где переменные лежат, это забота компилятора.
Цитата
3.4.2 Absolute Variables
Эта конструкция предназначена в первую очередь для согласования адресов Сишных переменных с регистрами специального назначения микропроцессора, но может быть использована и для размещения переменных пользователя по абсолютным адресам. Компилятор и линкер не производят никаких проверок на перекрытие абсолютных переменных друг с другом.
Определение абсолютных переменных может фрагментировать память и сделать невозможным для линкера р
Это можно, но надо ли. Компилятору надо указать, что эти адреса заняты и он туда не полезет.
Цитата
У вас,что есть перевод хайтека,если есть не поделитесь?
Нет, я использую оригинал, что и Вам советую.
Цитата
Да бог c INDF.
Почему невинная операция incf с использованием банка вызывает такую реакцию ХТ какое его собачье дело,что я собрался делать?Банк естественно был задан перед использованием.

Не настолько она невинна как кажется, после оптимизации компилятор надеется на то, что в регистрах лежат определённые данные а Вы можете это нарушить. Я показал как можно использовать индексную адресацию не влезая без необходимости в область влияния компилятора. Если хорошо подумать в Си очень многое доступно и без ассемблера. Научившись писать в Си найдете возможность подружить компилятор с ассемблером.
Евгений Германович
Нет, я использую оригинал, что и Вам советую.
Увы не дано.
Я не использую программных задержек более 50us для более длинных существуют таймеры. Учитесь использовать RTOS и вопросы задержек отпадут.
Не уверен,мне надо было остановиться на 1.28 мСек -требовал ЖКИ.Кстати в форуме микрочип вы подняли весьма актуальную тему.Я про перекодировку.
Писать без использования асемблера у меня ещё ни разу не получилось.
Кстати или нет но чем так хайтек знаменит и в чем его преимущество перед другими С.Знакомство с ним мне явно не понравилось.

Это можно, но надо ли. Компилятору надо указать, что эти адреса заняты и он туда не полезет.
Как????
xemul
Цитата(Евгений Германович @ Oct 26 2008, 08:01) *
Я решил проверить все delay до которых смог дотянуться. smile.gif Результат не радует.
Цитата

Воистину, в огороде бузина... Как соотносятся __delay_ms() и DelayMs?

неплохо,разница только в том,что DelayMs безбожно врет(По другому сказать правила форума не позволяют,а зря)

Уфф.. Я не знаю, до какой степени безбожно у Вас врет DelayMs(). Мой вопрос был:
Цитата
Если Вы написали свою __delay_ms(), то я, увы, не смог телепнуть ни ее текст, ни ругань по ее поводу.

Точность DelayMs() и DelayUs() я проверял лет 10 тому. С того времени и сами функции в picc std, и их точность ни разу не изменились (а я ими ни разу не воспользовался). DelayUs() на задержках в несколько десятков мкс подвирает больше, чем на сотнях мкс, и это совершенно естественно. Точность DelayMs() примерно соответствует точности внутреннего RC-генератора контроллера. Если у Вас получаются другие результаты, проверьте чистоту эксперимента .
Цитата
На прямо поставленный вопрос ответ будет подобным-НЕ ЗНАЮ.
Но меня огорчила дискриминация со стороны какого то хайтека.Как можно доверить столь интимную вещь,как распределение памяти,какомуто хайтеку,Что он может знать о моих планах на отдаленное будущее.

имхо, в большинстве случаев он справится с этой вещью лучше, независимо от Ваших планов.
Цитата
int Abc @ 0x192
Так и я могу.А вы попробуйте просто определить Abc в банк 1 без конкретизации адреса.
А как массив в определённый банк записать??
У меня ничего не вышло,этот хт грузит массив в последний банк и нагло плюет на мои просьбы засунуть его в другое место.

Мануалы - рулеззз. Вы только сначала определитесь, какая у Вас версия - pro или std? В любом случае смотрите раздел "Special Type Qualifiers".
Вкратце: версии pro (и picc, и picc18) чихают на пожелания программера о рукопашном распределении переменных по банкам, но на квалификаторы bankN не ругаются для совместимости с версиями std (которые удовлетворяют такие пожелания).
Цитата
У вас,что есть перевод хайтека,если есть не поделитесь?

Нет. Я просто перевел кусок для Вас.

Про программирование на С без ассемблера: одно и то же можно написать очень по-разному. Попробуйте разные варианты и проанализируйте листинги на предмет разумности и оптимальности этих вариантов.
Про знаменитость ht picc: под мелкие пики компиляторов С лет дцать назад было чуть да ничего. Оптимизатор ht picc давал более-менее приличный код по сравнению с другими. У меня просто с тех пор осталась привычка к ht.

ЗЫЖ Евгений Германович, неужели, отвечая кому-нибудь в конфе, Вы не замечали парные конструкции, типа quote .. /quote, code .. /code, color .. /color, ..., заключаемые в []? Такие конструкции называются тэгами и придуманы для облегчения и изложения, и восприятия.
Ваш способ изложения облегчению восприятия совсем не способствует.

Цитата(DL36 @ Oct 26 2008, 00:44) *
Это тот случай когда _ помогает. Попробуйте так обратиться _INDF.

Мне иногда не лень нарисовать какой-нить .as
Поэтому мне проще все хидеры привести к единому виду.
DL36
Цитата(xemul @ Oct 26 2008, 17:32) *
Мне иногда не лень нарисовать какой-нить .as
Поэтому мне проще все хидеры привести к единому виду.

Применение _ не приводит ни к какому криминалу. Вариант обращения _INDF в духе и применяется при необходимости обращения к глобальным переменным из асма.

Цитата(Евгений Германович @ Oct 26 2008, 12:53) *
Это можно, но надо ли. Компилятору надо указать, что эти адреса заняты и он туда не полезет.
Как????
Ищите, читайте мануал. Помогает исследование заголовочных файлов Хайтека.
В начале применения Си, я также искал и нашёл подобный вариант, но затем отказался от подобной практики, поскольку это связано с проблемами переносимости даже в пределах одного семейства.

Первый проект потерян, и поэтому помочь не могу.
xemul
Цитата(DL36 @ Oct 26 2008, 18:06) *
Применение _ не приводит ни к какому криминалу. Вариант обращения _INDF в духе и применяется при необходимости обращения к глобальным переменным из асма.

Угу. Но я говорил про ассемблерные файлы, а не про ассемблерные вставки.
Повторюсь: мне проще все хидеры привести к единому виду.
DL36
Цитата(xemul @ Oct 26 2008, 18:58) *
Угу. Но я говорил про ассемблерные файлы, а не про ассемблерные вставки.
Повторюсь: мне проще все хидеры привести к единому виду.
Так и я про ассемблерные.
Евгений Германович
xemul я ничего сам не писал.Функция __delay_ms описана в мануале на хайтек,я её просто применил.


Мануалы - рулеззз. Вы только сначала определитесь, какая у Вас версия - pro или std? В любом случае смотрите раздел "Special Type Qualifiers".
Вкратце: версии pro (и picc, и picc18) чихают на пожелания программера о рукопашном распределении переменных по банкам, но на квалификаторы bankN не ругаются для совместимости с версиями std (которые удовлетворяют такие пожелания).


Определился std.Моя версия std видимо очень наглая smile.gif и не удовлетворяет. maniac.gif
имхо, в большинстве случаев он справится с этой вещью лучше, независимо от Ваших планов.
Щасс.

ЫЖ Евгений Германович, неужели, отвечая кому-нибудь в конфе, Вы не замечали парные конструкции, типа quote .. /quote, code .. /code, color .. /color, ..., заключаемые в []? Такие конструкции называются тэгами и придуманы для облегчения и изложения, и восприятия.
Ваш способ изложения облегчению восприятия совсем не способствует.

Не замечал,каюсь
Stas
Появилось несколько вопросов:
1. А как синтаксически правильно выразить "в бит порта (к примеру RC0) вывести битовую переменную (bit my_bit)"? Столкнулся с тем что в switch значение бита порта не равно переменной, при записи RC0 = my_bit.

2. Можно ли на PIC16 организовать вложеные прерывания? Т.е. в системе 3 прерывания - таймер и 2 приоритетных внешних. Необходимо чтоб внешние прерывания могло вызываться при обработке прерывания таймера. Если при возникновении прерывания таймера очищать бит прерывания таймера и устанавливать бит глобального прерывания вручную (а не командой retfie)- будет ли это работать ?
За детские вопросы прошу не бить, с HiT и PIC16 - первый раз.
evc
1. #define my_bit PORTC0 (или RC0, не помню в HI-TECH как было, можно посмотреть в include файле)
2. Работать будет, но надо еще позаботиться о сохранении контекста. Если у вас процедура обработки прерываний такая длинная, это уже само по себе неправильно. В прерываниях нужно поднимать только флаги, а основную обработку совершать вне прерывании. По моему скромному мнению, прерывать прерывание в 16-й серии оправдано только в случае если приходится мониторить о пропаже питания.

добавил: По 2. нужно очень внимательно позаботиться, что бы при повторное прерывание, не попасть в тот же самый обработчик прерываний, который был прерван, получиться reentrance, со всеми вытекающими... Вообще в 16-й серии лучше такое не делать! (хотя у меня было один раз, но по второму прерыванию, сохранял данные и дальше просто усыпал процессор, который из слипа, выходил только по reset)
xemul
Цитата(Stas @ Jun 19 2009, 22:51) *
Появилось несколько вопросов:
1. А как синтаксически правильно выразить "в бит порта (к примеру RC0) вывести битовую переменную (bit my_bit)"? Столкнулся с тем что в switch значение бита порта не равно переменной, при записи RC0 = my_bit.

RC0 = my_bit; - для picc совершенно правильная синтаксическая конструкция, которая раскручивается (т.к. RC0 объявлен volatile bit) во что-нить вроде
btfss 0x.., my_bit_pos
goto $+3
bsf RC0
goto $+2
bcf RC0
Посмотрите внимательно ассемблерный листинг.
Неплохо бы указывать версию компилятора и приводить фрагмент, в котором наблюдаются/предполагаются проблемы, и необходимые объявления.
Цитата
2. Можно ли на PIC16 организовать вложеные прерывания? Т.е. в системе 3 прерывания - таймер и 2 приоритетных внешних. Необходимо чтоб внешние прерывания могло вызываться при обработке прерывания таймера.

Можно, но вряд ли оно требуется.
Определитесь, какое прерывание является самым приоритетным для Вашей программы, поставьте его обработчик первым, все остальные обработчики сделайте максимально короткими.
Какие временнЫе параметры у сигналов на "2 приоритетных внешних" прерываниях и чем занимается таймер?
Цитата
Если при возникновении прерывания таймера очищать бит прерывания таймера и устанавливать бит глобального прерывания вручную (а не командой retfie)- будет ли это работать ?
За детские вопросы прошу не бить, с HiT и PIC16 - первый раз.

Будет, но Вам придется написать своё сохранение/восстановление регистров и отвести под это соответствующий кусок ОЗУ (с учетом предполагаемой вложенности прерываний). Но сама идея идеологически вредная, учитывая систему прерываний мелких пиков, и самонадеянная, учитывая первый раз.
Stas
С прерыванием разобрался - рутиное прерывание (динамическая индикация и скан клавиатуры) и 2 вложенных - прием RC5 и измерение периода сигнала после датчика температуры TMP04 сделал, правда всё прерывание перебил на ассемблере, на С похоже вложенность не сделать из - за авто - кода в заголовке прерывания. Требуется отведение отдельных переменных (удобно в разных банках) под w, status, PCLATH для каждого из 3 прерываний, те по сути маленький диспетчер по org 0x4.

Попутно сделал вывод что PIC16 не айс - сильно устарел, больше в их сторону смотреть не буду.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.