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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Пару вопросов по Си для MCS51, от начинающего...
Lotor
сообщение Jul 8 2007, 15:32
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Доброе время суток. Начал тут изучать C для 51-х и возникли глупые вопросы:
1) Как Вы отсчитываете (формируете) боле-мене точные временные интервалы? Допустим надо сформировать задержку в 1 секунду, стандартной функции у Keil'a нет, надо писать самим. Есть ли стандартные приемы? Или надо написать какую-нить простенькую конструкцию аля for (i=40;i>0;i--), посмотреть какой ассемблеровский код ей соответствует после компиляции и затем прикинуть? Или в программном симуляторе засечь? Но это же так тоскливо... Можно ли решить задачу не методом такого подбора?
2) Как массив помещается в память програм? Keil пихает в драгоценное ОЗУ даже при объявлении со спецификатором const.
Буду благодарен за ответы)


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
alcosar
сообщение Jul 8 2007, 19:51
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
SALOME
сообщение Jul 9 2007, 03:46
Сообщение #3


Местный
***

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



Цитата(Lotor @ Jul 8 2007, 22:32) *
Доброе время суток. Начал тут изучать C для 51-х и возникли глупые вопросы:
1) Как Вы отсчитываете (формируете) боле-мене точные временные интервалы?

Временные интервалы лучше формировать встроенными в МК51 таймерами...


--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
Go to the top of the page
 
+Quote Post
Lotor
сообщение Jul 9 2007, 16:18
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 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 формируется программно и нужны боле-мене точные задержки...


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
oran-be
сообщение Jul 9 2007, 18:17
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



Цитата
Это-то понятно, но есть вагон и маленькая тележка ситуаций, когда таймер занят, например опрос АЦП каждую секунду, а при этом I2C формируется программно и нужны боле-мене точные задержки...

Ваяете в перывании одного таймера ядро с циклом, к примеру 1мС и в этом ппрерывании лепите таймеры, от которых тактируете запуск АЦП и меряете секундные интервалы. Точность - 0.1%. Обычно достаточно.
Go to the top of the page
 
+Quote Post
Lotor
сообщение Jul 9 2007, 19:21
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 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


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
Sergu
сообщение Jul 10 2007, 03:51
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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;
Go to the top of the page
 
+Quote Post
Lotor
сообщение Jul 10 2007, 16:53
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 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 - спасибо, не знал.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
msn
сообщение Jul 10 2007, 21:25
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 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
 
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 10 2007, 22:57
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(msn @ Jul 11 2007, 00:25) *
пишем...

Потрудитесь оформить свои чрезмено обширные вcтавки предыдущего поста в виде приложения.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
silc
сообщение Aug 10 2007, 14:57
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Sir Jon
сообщение Sep 7 2007, 10:51
Сообщение #12


Участник
*

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



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


ну в общем то правильные идеи уже прозвучали. Вы успешно подберете контроллер с количеством таймеров равным количеству необходимых задач (по одной на каждый таймер), если таких задач одна-две. Хорошим тоном в программе средней сложности является организация "службы времени" которая в большинстве случаев базируется на одном из таймеров прерыванию на переполнение. В обработке прерывания анализируется количество переполнений (необходимые Вам периоды времени). В зависимости от свободных ресурсов либо расставляются "флажки" действий, которые можно обработать в основном цикле Main, либо эти действия отрабатываются прямо в прерывании.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Sep 7 2007, 11:18
Сообщение #13


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Sir Jon @ Sep 7 2007, 14:51) *
..Хорошим тоном в программе средней сложности является организация "службы времени" которая в большинстве случаев базируется на одном...


+1
Go to the top of the page
 
+Quote Post
Василий_Безкатег...
сообщение Sep 25 2007, 08:45
Сообщение #14


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 15-09-06
Из: г. Смолевичи (Минская область)
Пользователь №: 20 403



Насчет побитового обращения к портам. Я пытаюсь работать с cy7c68013A и там можно к порту обращаться побитово. Реализуется это так. Есть отдельный файл с описанием всех регистров и вот как там например порт А описывается:
sfr IOA = 0x80;
/* IOA */
sbit PA0 = 0x80 + 0;
sbit PA1 = 0x80 + 1;
sbit PA2 = 0x80 + 2;
sbit PA3 = 0x80 + 3;

sbit PA4 = 0x80 + 4;
sbit PA5 = 0x80 + 5;
sbit PA6 = 0x80 + 6;
sbit PA7 = 0x80 + 7;

Далее в тексте программы рпосто обращаешься к битам порта:
OEA=0xff;
PA1=0x00;
PA1=0x01;
Go to the top of the page
 
+Quote Post
AndreyS
сообщение Dec 10 2008, 08:56
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276



Добрый день.

Не стал создавать новую тему.

Вопрос в следующем. Вернее проблемма.
Дано:
компилятор Keil
C Compiler C51.exe v8.06
Assembler A51.exe v8.00c
Linker/Locator BL51.exe v6.05
Librarian LIB51.exe v4.24
Hex Converter OH51.exe v2.6

Суть проблеммы
В рабочем режиме иногда прошивка виснет. Выяснил, что зависает (зацикливается) она по причине того что локальные переменные процедуры кто-то запорол.
Нашел в карте памяти что данные ячейки относятся еще к двум процедурам (причем там эти переменные тоже локальные). Одна из которых вызывается в прерывании.
Как мне теперь заставить Keil убрать из перекрестных ссылок эти переменные (чтобы они лежали в разных адресах DATA)?
Делать их глобальными внутри одного файла желания нет.

Пока я проверил только локальные переменные в области DATA, быть может такая петрушка есть еще с переменными в области XDATA. Почему Keil их так расположил? Ведь при компиляции он знает какие процедуры попадают в прерывание и по идее должен этим процедурам для локальных переменных выдилять свои адреса. Может нужно что-то указать??

Спасибо.


--------------------
Удачи.
Go to the top of the page
 
+Quote Post

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

 


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


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