AS7ti6K

Расчет Оборотов. "глюки?" В Протеусе.

65 сообщений в этой теме

AS7ti6K    2

Ну по поводу указателя, я имел в виду что структура лежит по тому же адресу что и переменная TurnsTime

volatile struct vremia
{
unsigned int tamerL;
unsigned int tamerH;
} TurnsTimes @0x041;
volatile unsigned long int TurnsTime @0x041;

Т.е. получается как бы TurnsTime это указатель на структуру TurnsTimes

PS: Кстати, убрав этот вычет MksTurns +=65536-TMR1. На самом деле изменилось. Стало вроде даже как-то стабильнее(не с таким размахом прыгает значение TurnsTime)... Просто я столько раз все меняю, оптимизирую, что в один момент "это" становится (псевдо)лекарством, а потом превращается в опухоль. Хорошо что хоть удаляются без проблем такие опухли :)

Изменено пользователем AS7ti6K

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546
структура лежит по тому же адресу что и переменная TurnsTime
А, ну да, не обратил внимание.

Но с явными адресами нужно поосторожнее, даже, я бы сказал, не стоит их вообще применять, т.к. компилятор не гарантирует использование этих адресов под свои нужды.

Тогда уж лучше сделать так:

volatile struct vremia
{
unsigned int tamerL;
unsigned int tamerH;
} TurnsTimes;
unsigned long *p_TurnsTime = (unsigned long *) &TurnsTimes;

Или вообще через union.

Изменено пользователем Alex

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
AS7ti6K    2

У меня используются для подсчета мкс две переменные long типа.

в одной подсчитываются мкс, потом эти мкс копируются в другую с "небольшим" добавлением.

а если использовать сдвиг, то можно съекономить 2 байта, верно?

т.е. использовать одну long и одну int (Обе беззнака)....

и в int считать не мкс, а переполнения.... По сути целое кол-во 65536 микросекунд.

Затем это каким-то чудесным сдвигом сдвигается в long переменную с додвигом оставшегося времени.

Я вот только никак не могу уловить логику как кол-во 65536мкс сдвигами становятся в нормально кол-во мкс....

Извиняюсь, а без структуры это разве не тоже самое, в данном конкретном случае?

Имею в виду использование long переменной без структуры...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546

Да тоже самое, только со структурой переменные гарантировано идут "друг за другом" по адресам. По этому можно смело создавать указатель на long с адресом этой структуры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
AS7ti6K    2

я так понимаю, что

long a;

int b;

a = 00000000 00000000 00000000 00000000;

b = 11111111 11111111;

a = b;

a = a<<16;

в а 11111111 11111111 0000000 00000000

как-то так или нет?

Изменено пользователем AS7ti6K

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546

long a;
int b;
int c;
a = (long)b << 16L;
a + = c;

В переменной a будут 2 переменные b и c. Точнее их значения.

Это обычные операции с переменными. Но можно создать одну переменную long и в неё сразу же укладывать значения - инкрементировать старшие байты, переносить значение из таймера в младшие байты, ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 329

Можно несколько вопросов по Вашему коду?

volatile struct vremia
{
unsigned int tamerL;
unsigned int tamerH;
} TurnsTimes @0x041;
volatile unsigned long int TurnsTime @0x041;

Это отличается от volatile unsigned long TurnsTime;

? Т.е. вместо структуры использовать long переменную

отличается тем, что для обращение к TurnsTime:

TurnsTime=0xAAAABBBB

а к TurnsTimes

TurnsTimes.tamerL=0xBBBB

TurnsTimes.tamerH=0xAAAA

переменная TurnsTimes со структурой vremia наложил специально на TurnsTime совместив их явным указанием адреса

, чтобы показать изменение последней...

Алекс прав указание явного адреса ОЧЕНЬ опасный ход, компилятор к примеру первые адреса регистров общих для всех банков

помешает темповские переменные сохранения контента, и использование таких адресов приводит к непредсказуемым последствиям....

Тогда уж лучше сделать так:

volatile struct vremia
{
unsigned int tamerL;
unsigned int tamerH;
} TurnsTimes;
unsigned long *p_TurnsTime = (unsigned long *) &TurnsTimes;

Или вообще через union.

а вот с этого места по подробней....

что значит эта запись

unsigned long *p_TurnsTime = (unsigned long *) &TurnsTimes;

как это работает в смысле как обращатся....

и как выглядит через union.

если чесно читал Карнеги но так и не понял....

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546
а вот с этого места по подробней....
Если взять за основу твой пример, то так :
*p_TurnsTime |= *p_TurnsTime<<16;
*p_TurnsTime = *p_TurnsTime + (TMR1H<<8)+ TMR1L; //Собираем микросекунды

И по указателю, значения будут укладываться в структуру.

и как выглядит через union.
union{
struct
{
 unsigned int tamerL;
 unsigned int tamerH;
};
unsigned long lTime;
}TurnsTimes;

TurnsTimes.lTime = TurnsTimes.lTime<<16;
TurnsTimes.lTime = TurnsTimes.lTime + (TMR1H<<8)+ TMR1L; //Собираем микросекунды

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 329

магия какая-то :wall: :wall: :wall:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546

Никакой магии :)

/**************************************************************************/
struct{
int a;
int b;
}mStruct;
long* const pStruct= (long*)&mStruct;
/**************************************************************************/



/**************************************************************************/
void main(void){

mStruct.a = mStruct.b = 0;
*pStruct = 0x12345678;
// Теперь в a=0x5678, b=0x1234

while(1);
}
/**************************************************************************/

18:			    mStruct.a = mStruct.b = 0;
  3F1    01A2	 CLRF 0x22
  3F2    01A3	 CLRF 0x23
  3F3    01A0	 CLRF mStruct
  3F4    01A1	 CLRF 0x21
19:			    *pStruct = 0x12345678;
  3F5    00A3	 MOVWF 0x23
  3F6    3034	 MOVLW 0x34
  3F7    00A2	 MOVWF 0x22
  3F8    3056	 MOVLW 0x56
  3F9    00A1	 MOVWF 0x21
  3FA    3078	 MOVLW 0x78
  3FB    00A0	 MOVWF mStruct

C union:

/**************************************************************************/
union{
   struct{
    int a;
    int b;
   };
   long    c;
}mUnion;
/**************************************************************************/

/**************************************************************************/
void main(void){
mUnion.a = mUnion.b = 0;
mUnion.c = 0x12345678;
// Теперь  mUnion.a=0x5678, mUnion.b=0x1234
while(1);
}
/**************************************************************************/

20:			    mUnion.a = mUnion.b = 0;
  3F1    01A2	 CLRF 0x22
  3F2    01A3	 CLRF 0x23
  3F3    01A0	 CLRF mUnion
  3F4    01A1	 CLRF 0x21
21:			    mUnion.c = 0x12345678;
  3F5    00A3	 MOVWF 0x23
  3F6    3034	 MOVLW 0x34
  3F7    00A2	 MOVWF 0x22
  3F8    3056	 MOVLW 0x56
  3F9    00A1	 MOVWF 0x21
  3FA    3078	 MOVLW 0x78
  3FB    00A0	 MOVWF mUnion

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 329

если

union{
struct
{
unsigned char tamerL;
unsigned char tamerH;
unsigned int tamerHH;
};
unsigned long lTime;
}TurnsTimes;

тогда

if (TMR1IF) { // Таймер переполнился
TurnsTimes.tamerHH++; // Считаем микросекунды
TMR1IF = 0; // Сбрасываем флаг таймера

и сборка:

TurnsTimes.tamerH = TMR1H;
TurnsTimes.tamerL = TMR1L;

чтение как :

tmpTT=TurnsTime.lTime;

правильно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546

чтение как :

tmpTT=TurnsTime.lTime;

правильно?

Ага.

Я пример с union чуть выше привёл, он простенький и по нему понятно что происходит.

union - это объединение нескольких объектов в одну область памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546

Кстати, в union имя структуры необязательно. Если задавать структуре имя, то к её полям придётся обращаться через это имя

/**************************************************************************/
union{
   struct{
    int a;
    int b;
   }mStruct;
   long    c;
}mUnion;
/**************************************************************************/

/**************************************************************************/
void main(void){
mUnion.mStruct.a = mUnion.mStruct.b = 0;
mUnion.c = 0x12345678;
// Теперь  mUnion.mStruct.a=0x5678, mUnion.mStruct.b=0x1234
while(1);
}
/**************************************************************************/

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 329

/**************************************************************************/
union{
struct{
int a;
int b;
}mStruct;
long c;
}mUnion;
/**************************************************************************/

/**************************************************************************/
void main(void){
mUnion.mStruct.a = mUnion.mStruct.b = 0;
mUnion.c = 0x12345678;
// Теперь mUnion..mStructa=0x5678, mUnion..mStructb=0x1234
while(1);
}
/**************************************************************************/

взрыв моска.... :shok:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546

Я там с точками в комменте напутал, исправил :)

Грубо говоря, union - та же структура, только все её поля находятся по одному адресу. А памяти выделяется столько, сколько занимает максимальное поле.

Всё просто :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения

    • А ты посчитай, а не спрашивай. Дано: Мост 2Ом. По факту имеем два отдельных усилителя на 1Ом. Если одна пара 4227, ток (с запасом если брать) не более 40А взять можно. На 1Ом напряжение питания не должно превышать 40 вольт. Мощность 402\2=800Вт с канала. (1600Вт в мосте). Поиском почему не пользуешься? Ответы были, например, тут. И Тут.
    • А я все голову ломал, чего в интерсколовской зарядке для шурика трансформатор на холостом ходу так сильно греется
    • да легко, только в моих условиях осцилл. тонет в помехах: сплошные импульсные БП вокруг и заземления нет. замер на выходном кондёре БП, 25V на выходе, 1.3А нагрузка а это на фильтрующем кондёре после моста 4700,0х50v - нагрузка та же: на вторичке трансформатора какие-то непонятки, такое впечтление, что диоды 1N5408 (я на них мост собрал) тупят при закрытии просто не по децки:  
    • Вот уж не поверю. Вам нужен опытный радиолюбитель. @Александр2 конечно правильно вам объясняет про земли-экраны, но что бы его понять, нужно иметь какие-то познания в этом вопросе.
    • Хорошие проф мультиметры имеют превосходную защиту входов от "дурака"
    • Это как "после"? R5,R6 в этой дурацкой схеме выполняют роль шунта для регулировки тока.
    • А я скажу за другое: что охлаждающая подставка для ноутбука - это утопия, хоть покупная, хоть самодельная. Просто по воле судьбы постоянно общаюсь с дворниками, которые эти самые "охлажадющие подставки" находят в помойке чуть ли не каждый день. А это в свою очередь говорит о том, что народ "ведётся" на рекламу, и покупает подставки, которые либо неудобны в использовании, либо не выполняют своих функций из рекламы, либо и то и другое, из-за чего потом и выбрасывает (да чего там говорить: сам однажды подарил девушке подобную подставку, чтобы можно было лёжа кино посмотреть в кровати - раз или два всего попользовались, а потом так и валялась по углам без своего места). Но с другой стороны мой личный опыт показывает, что выход из строя термотрубки в ноутбуках довольно таки нередкая вещь! Поэтому моё личное мнение такое: если с охлаждением в ноутбуке всё прекрасно - то ни в какой подставке он не нуждается (производитель тоже не дурак выпускать технику, которая через 3-5 минут после включения отключится из-за перегрева); но если система охлаждения повреждена - то хоть что с ней делай, разве что жидкий азот только и поможет остудить ноутбук! Сейчас некоторые скажут, что ноутбук перегревается, если работать на нём в постели, или на коленке, когда вентилляционные отверстия закрыты одеялом, коленкой, подушкой и т.д... Ну так изначально ноутбук и не предназначен для таких условий использования - это раз; а для обеспечения нормальной вентилляции ноутбука (читай - охлаждения, конечно при исправной системе охлаждения) достаточно любой доски, куска пластика, да хоть обрезка ленолеума на худой конец, вместо всяких "охлаждающих" подставок - это два. Но так как ноутбук - это всё же "носимая" вещь, то вполне естественно, что в нём изначально "урезаны" и съэкономлены до минимума все запасы по мощности, производительности, ну и охлаждению. Посмотришь какой-нибудь чужой компьютер (а-ля тормозит, тупит, не тянет, греется), а там вся оперативка забита всякими скайпами, яндексами, майлами, аськами, вконтактами, торрентами, барами, хелперами, помогалками, драйверообновлялками, геймцентрами и пр.,  - только диву даёшься, как компьютер вообще умудряется загрузить ОС! Так что первопричина перегрева любого компьютера - это как говорят автомобилисты: плохая прокладка между рулём и сиденьем! И с этого нужно начинать разбираться с охлаждением ноутбука, а не колхозить не пойми что!