|
сделать задержку при включении |
|
|
|
Oct 3 2012, 20:06
|
Местный
  
Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923

|
добрый вечер! в МК я совсем новичок. есть MSP430F169, он выдает на ногу P4.1 c помощью Таймера В сгенерированный сигнал. требуется задержать появление этого сигнала при включении питания, допустим, На 5 сек. таймер работает от частоты 32768 гц. хочу сделать это с помощью того же таймера. плз просьба оценить мой код инициализации таймера: void TimerB_Init (void) {unsigned int Freq, Phase; TBCCTL1= OUTMOD_4;//режим-переключение TBCTL = TBSSEL_2 + MC_1;//SMCLK + Up mode while !(TBR = 32768); //ждем 5 секунд TBCTL |= 0x0004; // Очищаем таймер TBCTL = TBSSEL_2 + MC_1;//SMCLK + Up mode P4DIR |= 0x0002; P4SEL |= 0x0002; //подключаем ногу TBCCTL1= OUTMOD_6; // режим переключение/установка TBCCR0= Freq; TBCCR1= (Freq*Phaze)/ 100;//параметры выходного сигнала} cильно не ругайте
|
|
|
|
|
 |
Ответов
|
Oct 9 2012, 18:29
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(shide_3 @ Oct 5 2012, 15:21)  Во-первых, что означает первая строка? Это объявление неинициализированной переменной NV_Data типа tNV_Data в сегменте INFO. Причем это Тип tNV_Data это скорее всего структура или массив, нужно смотреть его определение. Причем это константная структура, т.к. декларируется в области Flash (сегмент INFO). Цитата(shide_3 @ Oct 5 2012, 15:21)  Потом, по смыслу вроде как d = & NV_data; но в явном виде этого не написано. Вовсе нет. Адрес буфера TempBuf типа unsigned char "насильно" приводится к адресу внешней переменной типа tNV_Data и этот адрес присваивается указателю d. Цитата(shide_3 @ Oct 5 2012, 15:21)  И для чего нужен TempBuf, Спросите у разработчика  Скорее всего это какой-нибудь временный буфер для хранения копии структуры NV_Data, которая где-то дальше будет записана (полностью или частично) в NV_Data. Цитата(shide_3 @ Oct 5 2012, 15:21)  каким образом он потом переходит в NV_Data? В приведенном вами фрагменте кода указатель d вовсе не указывает на NV_Data. d->Vref это ссылка на элемент Vref, расположенный по адресу в массиве TempBuf. А вот NV_Data.Vref - да, это уже явно адресованный элемент Vref из переменной (или структуры) NV_Data.
|
|
|
|
|
Oct 10 2012, 07:25
|
Местный
  
Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923

|
Цитата(rezident @ Oct 9 2012, 21:29)  Спросите у разработчика  Скорее всего это какой-нибудь временный буфер для хранения копии структуры NV_Data, которая где-то дальше будет записана (полностью или частично) в NV_Data. В том то и дело, что TempBuf дальше нигде не записывается в NV_Data Цитата(rezident @ Oct 9 2012, 21:29)  Вовсе нет. Адрес буфера TempBuf типа unsigned char "насильно" приводится к адресу внешней переменной типа tNV_Data и этот адрес присваивается указателю d. (tNV_Data *)TempBuf - я бы понял так, что TempBuf- это указатель на tNV_Data, значит, не адрес буфера, а сам буфер приводится к адресу переменной типа tNV_Data? поправьте пожалуйста если я заблуждаюсь
|
|
|
|
|
Oct 10 2012, 11:11
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(shide_3 @ Oct 10 2012, 12:25)  В том то и дело, что TempBuf дальше нигде не записывается в NV_Data Ну может быть и наоборот - TempBuf является модифицируемой копией NV_Data. Цитата(shide_3 @ Oct 10 2012, 12:25)  (tNV_Data *)TempBuf - я бы понял так, что TempBuf- это указатель на tNV_Data, значит, не адрес буфера, а сам буфер приводится к адресу переменной типа tNV_Data? поправьте пожалуйста если я заблуждаюсь Адрес он и есть адрес, а указатель содержит его значение (адреса). TempBuf это адрес начала массива. Приведение типа указателя это формальное требование языка Си. Чтобы компилятор мог далее правильно адресовать все элементы структуры, которые могут иметь разные типы и соответственно разные размерности. В данном случае TempBuf возможно выполняет роль этакой "кучи" (Heap). Вот только тут может приключиться засада из-за неправильного выравнивания элементов структуры. Или точнее из-за отсутствия выравнивания. Байтовый массив вполне может быть расположен линкером по нечетному адресу и тогда обращение к элементу структуры как к 16-и битной переменной будет давать неверный результат.
|
|
|
|
|
Oct 10 2012, 12:03
|
Местный
  
Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923

|
Цитата(rezident @ Oct 10 2012, 14:11)  Адрес буфера TempBuf типа unsigned char "насильно" приводится к адресу внешней переменной типа tNV_Data но то же самое можно сказать и про переменную d , поскольку static tNV_Data *d
|
|
|
|
|
Oct 15 2012, 10:15
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(shide_3 @ Oct 15 2012, 11:18)  спасибо Вам за поучительные ответы. но запись d= (tNV_Data *)TempBuf; для меня не понятна, грамотнее наверное было бы написать &TempBuf = &NV_Data; d = &TempBuf; а то какой то бред получается.. или просто d = &NV_Data Вы неправильно считаете. NV_Data находится во Flash. а TempBuf находится в SRAM. Поэтому адреса у NV_Data и TempBuf разные. Инициализировать указатель адресом NV_Data при обращении к TempBuf или наоборот - нельзя. Кстати, при использовании массивов правильная запись будет d=TempBuf; или d=&TempBuf[0]; Но поскольку в данном случае d при декларации объявлен как указатель на тип tNV_Data, то компилятор обязан выдать предупреждение при попытке присвоить ему значение адреса переменной другого типа (unsigned char). Я об этом уже писал ранее.
|
|
|
|
|
Oct 15 2012, 11:15
|
Местный
  
Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923

|
Цитата(rezident @ Oct 15 2012, 13:15)  Вы неправильно считаете. NV_Data находится во Flash. а TempBuf находится в SRAM. Поэтому адреса у NV_Data и TempBuf разные. Инициализировать указатель адресом NV_Data при обращении к TempBuf или наоборот - нельзя. Кстати, при использовании массивов правильная запись будет d=TempBuf; или d=&TempBuf[0]; Но поскольку в данном случае d при декларации объявлен как указатель на тип tNV_Data, то компилятор обязан выдать предупреждение при попытке присвоить ему значение адреса переменной другого типа (unsigned char). Я об этом уже писал ранее. ну а если так - d = &NV_Data ?
|
|
|
|
|
Oct 15 2012, 16:20
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(shide_3 @ Oct 15 2012, 16:15)  ну а если так - d = &NV_Data ? Так - без проблем. Но ведь в вашей программе написано Код d= (tNV_Data *)TempBuf; То бишь указатель инициализируется адресом TempBuf, а вовсе не NV_Data  Вы бы для разнообразия привели определение типа tNV_Data, чтобы чуток прояснить ситуацию.
|
|
|
|
Сообщений в этой теме
shide_3 сделать задержку при включении Oct 3 2012, 20:06 d7d1cd Не сильно зная микроконтроллер и его периферию, но... Oct 4 2012, 02:54 chernenko Цитата(shide_3 @ Oct 4 2012, 00:06) while... Oct 4 2012, 04:26 shide_3 Цитата(chernenko @ Oct 4 2012, 07:26) А в... Oct 4 2012, 05:29 E.V.G. P4OUT &= ~BIT1; P4DIR |= BIT1; P4SEL |= BIT... Oct 4 2012, 05:45 shide_3 Цитата(E.V.G. @ Oct 4 2012, 08:45) P4OUT ... Oct 4 2012, 06:12 E.V.G. Вывод сигнала на ногу сделан только для того, чтоб... Oct 5 2012, 04:18          shide_3 Цитата(rezident @ Oct 15 2012, 19:20) Вы ... Oct 16 2012, 11:26           rezident Цитата(shide_3 @ Oct 16 2012, 16:26) это ... Oct 16 2012, 15:33
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|