|
Пару вопросов по Си для MCS51, от начинающего... |
|
|
|
Jul 8 2007, 19:51
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 30-03-06
Пользователь №: 15 598

|
Цитата(Lotor @ Jul 8 2007, 18:32)  Доброе время суток. Начал тут изучать C для 51-х и возникли глупые вопросы: 1) Как Вы отсчитываете (формируете) боле-мене точные временные интервалы? Допустим надо сформировать задержку в 1 секунду, стандартной функции у Keil'a нет, надо писать самим. Есть ли стандартные приемы? Или надо написать какую-нить простенькую конструкцию аля for (i=40;i>0;i--), посмотреть какой ассемблеровский код ей соответствует после компиляции и затем прикинуть? Или в программном симуляторе засечь? Но это же так тоскливо... Можно ли решить задачу не методом такого подбора? 2) Как массив помещается в память програм? Keil пихает в драгоценное ОЗУ даже при объявлении со спецификатором const. Буду благодарен за ответы) const и не должен помещать в ОЗУ. Вам нужен code. Пример: unsigned char code password[] = "65535";
Сообщение отредактировал alcosar - Jul 8 2007, 19:51
|
|
|
|
|
Jul 9 2007, 03:46
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(Lotor @ Jul 8 2007, 22:32)  Доброе время суток. Начал тут изучать C для 51-х и возникли глупые вопросы: 1) Как Вы отсчитываете (формируете) боле-мене точные временные интервалы? Временные интервалы лучше формировать встроенными в МК51 таймерами...
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jul 9 2007, 16:18
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(alcosar @ Jul 8 2007, 23:51)  const и не должен помещать в ОЗУ. Вам нужен code. Пример: unsigned char code password[] = "65535"; Спасибо, именно то, что надо. Цитата(SALOME @ Jul 9 2007, 07:46)  Временные интервалы лучше формировать встроенными в МК51 таймерами... Это-то понятно, но есть вагон и маленькая тележка ситуаций, когда таймер занят, например опрос АЦП каждую секунду, а при этом I2C формируется программно и нужны боле-мене точные задержки...
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jul 9 2007, 18:17
|
Местный
  
Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621

|
Цитата Это-то понятно, но есть вагон и маленькая тележка ситуаций, когда таймер занят, например опрос АЦП каждую секунду, а при этом I2C формируется программно и нужны боле-мене точные задержки... Ваяете в перывании одного таймера ядро с циклом, к примеру 1мС и в этом ппрерывании лепите таймеры, от которых тактируете запуск АЦП и меряете секундные интервалы. Точность - 0.1%. Обычно достаточно.
|
|
|
|
|
Jul 9 2007, 19:21
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(oran-be @ Jul 9 2007, 22:17)  Ваяете в перывании одного таймера ядро с циклом, к примеру 1мС и в этом ппрерывании лепите таймеры, от которых тактируете запуск АЦП и меряете секундные интервалы. Точность - 0.1%. Обычно достаточно. Спасибо за идею, стоит попробывать. Еще возник вопрос (навеное от нежелания вчитываться в несамую лучшую документацию) - KEIL побитово к порту не позволяет обращаться? Например ругается на конструкцию "P1.1=1"...
Сообщение отредактировал Lotor - Jul 9 2007, 19:22
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jul 10 2007, 03:51
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 18-03-05
Пользователь №: 3 452

|
Цитата(Lotor @ Jul 9 2007, 22:21)  Еще возник вопрос (навеное от нежелания вчитываться в несамую лучшую документацию) - KEIL побитово к порту не позволяет обращаться? Например ругается на конструкцию "P1.1=1"... удобно это делать вот так: объявить sbit SCL = P3^4; sbit SDA = P3^5; и потом их использовать: SDA = 1; SCL = 1;
|
|
|
|
|
Jul 10 2007, 16:53
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(Sergu @ Jul 10 2007, 07:51)  удобно это делать вот так:
объявить sbit SCL = P3^4; sbit SDA = P3^5;
и потом их использовать: SDA = 1; SCL = 1; Мне привычнее через #define, главное синтаксис P3^4 - спасибо, не знал.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jul 10 2007, 21:25
|
Частый гость
 
Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759

|
Цитата(Lotor @ Jul 9 2007, 19:18)  Это-то понятно, но есть вагон и маленькая тележка ситуаций, когда таймер занят, например опрос АЦП каждую секунду, а при этом I2C формируется программно и нужны боле-мене точные задержки... По простому: пишем asm файл с кодом (нужно знать частоту ядра и время исполнения инструкций): Код см. delay.a51 В файле заголовка: Код см. delay.h Использование: Код SDA = 1; Delay_Nop_us(20); SDA = 0;
Прикрепленные файлы
delay.rar ( 1.12 килобайт )
Кол-во скачиваний: 125
|
|
|
|
|
Aug 10 2007, 14:57
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 27-06-07
Пользователь №: 28 748

|
alcosar: const и не должен помещать в ОЗУ. Вам нужен code. Пример: unsigned char code password[] = "65535"; в иар для авр, использовал flash unsigned char Rn[] = { 0x30,0x31,0x32,0x33,0x34} ; off: такая тема очень актуально для тех кто начинает, её бы прикрепить, а еще лучще оформить как faq. Цитата alcosar
|
|
|
|
|
Sep 7 2007, 10:51
|

Участник

Группа: Свой
Сообщений: 45
Регистрация: 28-10-05
Из: Челябинск
Пользователь №: 10 198

|
Цитата(Lotor @ Jul 9 2007, 19:18)  Это-то понятно, но есть вагон и маленькая тележка ситуаций, когда таймер занят, например опрос АЦП каждую секунду, а при этом I2C формируется программно и нужны боле-мене точные задержки... ну в общем то правильные идеи уже прозвучали. Вы успешно подберете контроллер с количеством таймеров равным количеству необходимых задач (по одной на каждый таймер), если таких задач одна-две. Хорошим тоном в программе средней сложности является организация "службы времени" которая в большинстве случаев базируется на одном из таймеров прерыванию на переполнение. В обработке прерывания анализируется количество переполнений (необходимые Вам периоды времени). В зависимости от свободных ресурсов либо расставляются "флажки" действий, которые можно обработать в основном цикле Main, либо эти действия отрабатываются прямо в прерывании.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|