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

 
 
> Программирование МК на Си, Вопроосы по коду
Mackeda
сообщение Dec 27 2011, 13:53
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 26-12-11
Пользователь №: 69 092



Здравствуйте.

Возникло пару вопросов начального уровня по программированию МК на Си.

1) Подскажите как расчитать время задержки, если частота на микроконтроллере 9 МГц. Пример кода ниже.
Я считаю так: для первого Delay, каждые 111 нс (9МГц) от числа 82 (загруженного из Delay1) будет отниматься 1, когда дойдет до нуля цикл завершится. Получим задержку 111 нс * 82 = 9.102 мкс.


2) Почему переменная j инициализируется числом 1000.

Код
void Delay1(unsigned int j)    
    {
    while(j--)
        Delay(82);
    }            

void Delay(unsigned int i)  
    {    
    while(i--);
    }


3) В uVision есть окно прерываний (рисунок).

EA - общий запрет/разрешение прерываний.
EX0 - разрешение внешнего прерывания INT0.
Не до конца понял назначение IT0 и не понял IE0.

4) Поясните код
Код
void INTRPT0(void) interrupt 0 using 1
, ето что специальная функция на СИ, которая срабатывает когда на ноге INT0 появляется "0".

5) Что возвратит строка
Код
return !INT0;
, если sbit INT0 = 0xB2 и на порту INT0 лог. "0". Будет возвращена "1".

6)

#define ADDR 0x02
#define ERROR PBYTE[ADDR]

Если я напишу ERROR (0xFF), во внешнюю память запишется данные 0xFF? Просто данные без адреса?

Заранее благодарю за ответы.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Mackeda
сообщение Jan 3 2012, 11:32
Сообщение #2





Группа: Участник
Сообщений: 13
Регистрация: 26-12-11
Пользователь №: 69 092



Цитата
2. Не понятно: о чём идёт речь?


Изначально переменная j инициализируется нулем, но после первого инкремента while(j--) в ней появляется число 03Е7h = 999b. Почему так ?


Цитата
4. В МК есть такое понятие - "прерывание". При определенных условиях происходит прерывание "естественной" последовательности команд, и переход на процедуру обработки прерывания. Стандарт языка Си не предусматривает прерываний. Приведенная Вами конструкция - заголовок процедуры прерывания.


То есть процедура будет выполнена когда на INT0 появится "0".

Цитата
5. В общем случае - возвратит "не ноль".


Можно подробней?


Еще вопрос:

Есть цепочка вызовов функций на Си, не понятен результат в IS_ER.
Код
#define IS_ER (!(GetERROR()&0x10))



while(1)
{
....................................          

if(!IS_ER)
                              return;
}



       GetERROR(void)    
     {
    return (ERROR|0x8F);
      }



Понимаю так, когда программа доходит до if(!IS_ER), она проверяет что в переменной IS_ER, там функция GetERROR, смотрит ее, там еще одна функция ERROR(определение функции ERROR в первом посте). С внешней памяти с ячейки под адресом 0x02 считывает данные (8 разрядный код), далее над ними выполнится по битная операция ИЛИ и числом 0x8F. Результат будет так же иметь 8 бит. Далее, результат подставится в место вызова, а это GetERROR(), тут над результатом функции и числом 0х10 выполняется логическое И результат инвертируется и передается в IS_ER. Если так размышлять то в IS_ER попадет 8 битное число, чего быть не может, ведь там IF. Где я ошибаюсь?

Сообщение отредактировал Mackeda - Jan 3 2012, 11:33
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 3 2012, 18:34
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Mackeda @ Jan 3 2012, 15:32) *
Изначально переменная j инициализируется нулем, но после первого инкремента while(j--) в ней появляется число 03Е7h = 999b. Почему так ?
Что значит "переменная j инициализируется нулем" ? В данном случае: j - параметр функции Delay1; вероятно, в программе есть вызов функции Delay1(1000); при этом переменная j (та самая, которая - параметр функции Delay1, возможно, есть ещё одна переменная j, которая "инициализируется нулём" - это совсем другая переменная) примет значение 1000, а после дикремента - значение 999.

Цитата(Mackeda @ Jan 3 2012, 15:32) *
То есть процедура будет выполнена когда на INT0 появится "0".
Если быть формалистом, то процедура будет выполнена, если установлен флаг IE0 в регистре TCON, при этом установлены EX0 и EA в регистре IE. Для "классики" этого достаточно (в других МК могут быть ещё условия). Неважно - каким образом оказался установленным бит IE0 (выполнилось условие, установленное битом IT0 регистра TCON, или, например, некоторой командой).

Цитата(Mackeda @ Jan 3 2012, 15:32) *
Можно подробней?
Результат логической операции - ноль (ложь), или "не ноль" (любое значение, отличное от нуля).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Mackeda   Программирование МК на Си   Dec 27 2011, 13:53
- - Палыч   Хорошо бы задавая вопрос указывать конкретный тип ...   Dec 27 2011, 14:45
|- - toweroff   Цитата(Mackeda @ Jan 3 2012, 15:32) но по...   Jan 3 2012, 12:00
- - Mackeda   Цитатанет, после декремента Сори за опечатку, да ...   Jan 3 2012, 12:32
|- - toweroff   Цитата(Mackeda @ Jan 3 2012, 16:32) Сори ...   Jan 3 2012, 12:44
- - Mackeda   Подскажите еще момент. Кодwhile(1) {...   Jan 10 2012, 10:04
- - MALLOY2   А как надо ? какая-то ахинея. Пишите что бы было в...   Jan 10 2012, 10:32
- - Mackeda   Уточняю. КодВыполнение программы: Шаг 1 ......   Jan 10 2012, 11:18
|- - Палыч   Цитата(Mackeda @ Jan 10 2012, 15:18) Прав...   Jan 10 2012, 12:04
|- - XVR   Цитата(Mackeda @ Jan 10 2012, 15:18) Прав...   Jan 11 2012, 09:12
|- - _Pasha   Цитата(Mackeda @ Jan 10 2012, 15:18) Уточ...   Jan 13 2012, 11:05
- - редактор   Проверять значение вызываемой функции надо так Код...   Jan 13 2012, 08:32
|- - Палыч   Цитата(редактор @ Jan 13 2012, 12:32) Про...   Jan 13 2012, 11:04
- - Mackeda   ЦитатаЕсли быть формалистом, то процедура (прерыва...   Jan 18 2012, 13:20
|- - Палыч   Цитата(Mackeda @ Jan 18 2012, 17:20) А мо...   Jan 18 2012, 15:33
- - Vladimir_Sn   Здравствуйте! Сейчас пишу первый проект на мик...   Jan 21 2012, 06:02
|- - Палыч   Цитата(Vladimir_Sn @ Jan 21 2012, 10:02) ...   Jan 21 2012, 06:28
- - Cosmojam   А ещё умножение float на int и присваивание резуль...   Jan 21 2012, 06:39
- - Vladimir_Sn   Теперь начинаю понимать..., спасибо большое!   Jan 21 2012, 07:18


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

 


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


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