реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> HI-TECH C
Евгений Германов...
сообщение Oct 25 2008, 11:56
Сообщение #31


Профессионал
*****

Группа: Свой
Сообщений: 1 079
Регистрация: 24-06-07
Из: г.Екатеринбург
Пользователь №: 28 654



Цитата(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
Go to the top of the page
 
+Quote Post
xemul
сообщение Oct 25 2008, 12:26
Сообщение #32



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Евгений Германович @ 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

Запостите, плз, предупреждение сюда - даже интересно стало.
Go to the top of the page
 
+Quote Post
Евгений Германов...
сообщение Oct 25 2008, 13:22
Сообщение #33


Профессионал
*****

Группа: Свой
Сообщений: 1 079
Регистрация: 24-06-07
Из: г.Екатеринбург
Пользователь №: 28 654



#warning Preprocessor symbol XTAL_FREQ has been deprecated. Now used _XTAL_FREQ
Вот этот текст без варнинга и выскакивает.
Вы заговорили об ассемблерной оптимизации,чем приблизили следующие вопросы 1111493779.gif
У меня при написании асемблерной вставки ХТ жутко ругается на команды использующие адресацию через индексный регистр.Ежли я задаю принудительно адрес с помощью @ то все нормально,а если нет то ...........Оптимизацию я вроде откючил,попытка воткнуть слова bankX воспринимается благосклонно но пользы от восприятия не какой.Не будете ли так любезны прояснить.У меня std9.51
Go to the top of the page
 
+Quote Post
DL36
сообщение Oct 25 2008, 15:14
Сообщение #34


Местный
***

Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006



Цитата(Евгений Германович @ 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 как регистры временного хранения, И может Вы ему чем то помешали. Кстати о страничной организации памяти надо помнить и это теперь Ваша забота.
Go to the top of the page
 
+Quote Post
xemul
сообщение Oct 25 2008, 15:49
Сообщение #35



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Евгений Германович @ 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

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

ЗЫЖ ассемблерная оптимизация и ассемблерные вставки никак друг с другом не соотносятся. Но первое - вещь велми полезная, а второе - ... не необходимая.
Go to the top of the page
 
+Quote Post
Евгений Германов...
сообщение Oct 25 2008, 15:59
Сообщение #36


Профессионал
*****

Группа: Свой
Сообщений: 1 079
Регистрация: 24-06-07
Из: г.Екатеринбург
Пользователь №: 28 654



про варнинг,сегодня проверял вот текст
#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 что с чертой спереди что без -все тихо и спокойно.
Про ассемблерную беду -наверное только в понедельник,нет текста под рукой.Меня до неприличия заинтересовал вопро о принудительном определении места в памяти переменных,но как бы я не изголялся с банком -никакого эффекта.
Go to the top of the page
 
+Quote Post
xemul
сообщение Oct 25 2008, 19:17
Сообщение #37



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Евгений Германович @ 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.
Go to the top of the page
 
+Quote Post
DL36
сообщение Oct 25 2008, 20:44
Сообщение #38


Местный
***

Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006



Цитата(xemul @ Oct 25 2008, 18:49) *
Есть такая непоследовательность в хидерах - INDF определен не для всех контроллеров.
Если обращение к INDF происходит в ассемблерных вставках, то необходимо также добавить
Это тот случай когда _ помогает. Попробуйте так обратиться _INDF.
Go to the top of the page
 
+Quote Post
Евгений Германов...
сообщение Oct 26 2008, 04:01
Сообщение #39


Профессионал
*****

Группа: Свой
Сообщений: 1 079
Регистрация: 24-06-07
Из: г.Екатеринбург
Пользователь №: 28 654



Я решил проверить все delay до которых смог дотянуться. smile.gif Результат не радует.
Воистину, в огороде бузина... Как соотносятся __delay_ms() и DelayMs Воистину, в огороде бузина... неплохо,разница только в том,что DelayMs безбожно врет(По другому сказать правила форума не позволяют,а зря)
Оно Вам точно надо?
На прямо поставленный вопрос ответ будет подобным-НЕ ЗНАЮ.
Но меня огорчила дискриминация со стороны какого то хайтека.Как можно доверить столь интимную вещь,как распределение памяти,какомуто хайтеку,Что он может знать о моих планах на отдаленное будущее.
int Abc @ 0x192
Так и я могу.А вы попробуйте просто определить Abc в банк 1 без конкретизации адреса.
А как массив в определённый банк записать??
У меня ничего не вышло,этот хт грузит массив в последний банк и нагло плюет на мои просьбы засунуть его в другое место.
3.4.2 Absolute Variables
Эта конструкция предназначена в первую очередь для согласования адресов Сишных переменных с регистрами специального назначения микропроцессора, но может быть использована и для размещения переменных пользователя по абсолютным адресам. Компилятор и линкер не производят никаких проверок на перекрытие абсолютных переменных друг с другом.
Определение абсолютных переменных может фрагментировать память и сделать невозможным для линкера р
У вас,что есть перевод хайтека,если есть не поделитесь?
Да бог c INDF.
Почему невинная операция incf с использованием банка вызывает такую реакцию ХТ какое его собачье дело,что я собрался делать?Банк естественно был задан перед использованием.
Go to the top of the page
 
+Quote Post
DL36
сообщение Oct 26 2008, 07:26
Сообщение #40


Местный
***

Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006



Цитата(Евгений Германович @ 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 с использованием банка вызывает такую реакцию ХТ какое его собачье дело,что я собрался делать?Банк естественно был задан перед использованием.

Не настолько она невинна как кажется, после оптимизации компилятор надеется на то, что в регистрах лежат определённые данные а Вы можете это нарушить. Я показал как можно использовать индексную адресацию не влезая без необходимости в область влияния компилятора. Если хорошо подумать в Си очень многое доступно и без ассемблера. Научившись писать в Си найдете возможность подружить компилятор с ассемблером.
Go to the top of the page
 
+Quote Post
Евгений Германов...
сообщение Oct 26 2008, 08:53
Сообщение #41


Профессионал
*****

Группа: Свой
Сообщений: 1 079
Регистрация: 24-06-07
Из: г.Екатеринбург
Пользователь №: 28 654



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

Это можно, но надо ли. Компилятору надо указать, что эти адреса заняты и он туда не полезет.
Как????
Go to the top of the page
 
+Quote Post
xemul
сообщение Oct 26 2008, 13:32
Сообщение #42



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Евгений Германович @ 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
Поэтому мне проще все хидеры привести к единому виду.
Go to the top of the page
 
+Quote Post
DL36
сообщение Oct 26 2008, 14:06
Сообщение #43


Местный
***

Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006



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

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

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

Первый проект потерян, и поэтому помочь не могу.
Go to the top of the page
 
+Quote Post
xemul
сообщение Oct 26 2008, 14:58
Сообщение #44



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



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

Угу. Но я говорил про ассемблерные файлы, а не про ассемблерные вставки.
Повторюсь: мне проще все хидеры привести к единому виду.
Go to the top of the page
 
+Quote Post
DL36
сообщение Oct 26 2008, 17:11
Сообщение #45


Местный
***

Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006



Цитата(xemul @ Oct 26 2008, 18:58) *
Угу. Но я говорил про ассемблерные файлы, а не про ассемблерные вставки.
Повторюсь: мне проще все хидеры привести к единому виду.
Так и я про ассемблерные.
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 00:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01539 секунд с 7
ELECTRONIX ©2004-2016