|
|
  |
MCS-51, Первые шаги |
|
|
|
Aug 18 2011, 10:57
|
Знающий
   
Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664

|
Цитата Современные МК в большинстве случаев имеют вполне достаточный объём памяти для Си, и в этих случаях зацикливание на ассемблере - это самоистязание. ADuC812 - это тот самый современный МК с достаточным объемом памяти?
|
|
|
|
|
Aug 18 2011, 11:04
|

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

|
QUOTE (one_eight_seven @ Aug 18 2011, 12:57)  ADuC812 - это тот самый современный МК с достаточным объемом памяти? Ну, как-бы при навешивании внешней объемы памяти у него немалые становятся  . Хотя проблем с системой команд и заброшенностью компиляторов для этой платформы, это не снимает. На ASM писать нужно на уровне сотен байт максимум - остальное на 'C'. Хотя, насколько я себе представляю "программистов под Windows", результат на 'C' может быть на первых порах ну очень удручающим  . При этом попытки писательства на ASM, тем более программ хотя-бы в несколько килобайт, не говоря уже о десятке-другом, не менее часто приводят к не менее удручающим результатам
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 18 2011, 11:43
|
Знающий
   
Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664

|
Цитата Хотя проблем с системой команд и заброшенностью компиляторов для этой платформы, это не снимает. Использую Silabs F930 - особо не жалуюсь на Keil. Искренне считаю, что конкурентов по совокупности размеров/потребления/скорости не так уж много. Но это в приложении, где этот МК на своём месте. И это уровень ну никак не НИИ: по-моему, НИИ должны заниматься чем-то посерьезнее, повозвышеннее (может быть моё мировоззрение в плане Научно-Исследовательских Институтов как в том мультике: "А в моём мире живут только розовые пони, они кушают радугу и какают бабочками).
|
|
|
|
|
Aug 18 2011, 12:46
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 15-08-11
Пользователь №: 66 729

|
Цитата А вот это зависит от НИИ . О существовании правильного НИИ они и не узнают. Если руководство НИИ задумалось о легальности, то НИИ, полагаю, совсем даже не "правильный" . Хотя, слово легальность Автором не произносилось - только бесплатность . Была поставлена задача найти компилятор Сишный, а какой он должен быть мне не сказали, вот я и решил искать и среди бесплатных, и среди платных, которые можно сделать бесплатными и полноценными, как-то так))) PS НИИ занимается разработкой радиоизмерительных приборов, всяких ватметров и т.д. Теперь по делу, вот модернизированный код с первой страницы, так лучше? Все ли правильно? Цитата #include <ADUC812.H> #include <stdio.h>
void blink( unsigned int ); sbit BLINK = P1^0; void main() { unsigned int counter = 28; // диод мигает раз в 2 секунды P1 = 0x0FE; TH0 = 0x0; // установка старшего и младшего битов в 0 TL0 = 0x0; TMOD |= 0x1; // утанавливает все биты регистра режимов в 1 TR0 = 1; // включает таймер/счетчик Т/С0
while( 1 ) { blink( counter ); } }
void blink( unsigned int count ) { if (TF0 == 1) // флаг преполнения { TF0 = 0; // если Т/С переполнился вернуть флаг в 0 --count; if (count == 0) { count = 28; BLINK = ~BLINK; } } } Пока не понимаю вот это: 1) P1 = 0x0FE; для чего присваивать порту значение 254, если правильно перевел? 2) TMOD |= 0x1; Эта строка присваивает всем битам регистра значение 1 так? Если да, то сто происходит с битами в первом случае? 3) По идее светодиод должен мигать раз в 2 секунды если верить вот этому: Цитата В этом случае таймер 0 инкрементируется 11059000 / 12 = 921583 раз в секунду. При этом интервал между тиками составляет 65536 / 921583 = 0,071 с (берем 3 знака после запя$ той). Следовательно, по прошествии 2 с таймер должен перегрузиться 2 / 0,071 = 28 Пока с вопросами все.
Сообщение отредактировал bragol - Aug 18 2011, 12:49
|
|
|
|
|
Aug 18 2011, 12:55
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(bragol @ Aug 18 2011, 16:46)  1) P1 = 0x0FE; для чего присваивать порту значение 254, если правильно перевел? Почитайте про структуру порта вывода 51-го МК. 254 означает: P1.0 - низкий уровень, P1.1...P1.7 - высокий уровень. Цитата(bragol @ Aug 18 2011, 16:46)  2) TMOD |= 0x1; Эта строка присваивает всем битам регистра значение 1 так? Если да, то сто происходит с битами в первом случае? Эта строка устанавливает младший бит. Это известно каждому, кто хоть что-то знает про язык Си. Неприлично такие вопросы задавать.
|
|
|
|
|
Aug 18 2011, 13:35
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 15-08-11
Пользователь №: 66 729

|
Цитата(scifi @ Aug 18 2011, 16:55)  Почитайте про структуру порта вывода 51-го МК. 254 означает: P1.0 - низкий уровень, P1.1...P1.7 - высокий уровень.
Эта строка устанавливает младший бит. Это известно каждому, кто хоть что-то знает про язык Си. Неприлично такие вопросы задавать. Ага спасибо за пояснения Неприлично вопросы не задавать, по крайней мере я так думаю, а в плюсах, на которых я писал, с этим если честно не сталкивался
|
|
|
|
|
Aug 19 2011, 04:57
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 15-08-11
Пользователь №: 66 729

|
Цитата(zltigo @ Aug 18 2011, 19:31)  Конечно не сталкивался - нажимал кнопки в визарде для генерации окошек и рющек. Несколько переменных сгенеренных тем-же визардом были все из себя интовые. Посмотрите внимательнее на его комментарии в "исходнике"- он-же биты от байтов не отличает  . Все это ерунда, кроме разве того, что он считает что умеет программировать  . Вот это действительно проблема. А вот пытаться "щемить" меня совершенно не нужно, тем более на форуме... На плюсах я писал год и никаких окошек и рюшек, как Вы выразились я в визарде не генерировал, только консоль. Это мой первый опыт работ программистом, многие начинали с подобных "глупых" вопросов, набравшись опыту и знаний многие и не сознаются в этом... В советах, типа бросай НИИ (была бы возможность работать в другом месте программистом, меня бы тут не было) и в комментариях подобным Вашим, я не нуждаюсь, поберегите пальцы и не засоряйте тему.
|
|
|
|
|
Aug 19 2011, 05:47
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(bragol @ Aug 18 2011, 18:46)  Теперь по делу, вот модернизированный код с первой страницы, так лучше? Все ли правильно? Код void main() { unsigned int counter = 28; // диод мигает раз в 2 секунды .. while( 1 ) { blink( counter ); } }
void blink( unsigned int count ) { .. --count; if (count == 0) { count = 28; Неправильно. В функции blink() вы пытаетесь изменять параметр count, и надеетесь, что он изменится в вызывающей функци (main). А это не так, параметр здесь передаётся по значению. То есть, при каждом вызове функции blink() значение параметра count будет 28. Чтобы изменять значение параметра, надо передать указатель на него.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 19 2011, 07:44
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 15-08-11
Пользователь №: 66 729

|
Цитата(AHTOXA @ Aug 19 2011, 09:47)  Неправильно. В функции blink() вы пытаетесь изменять параметр count, и надеетесь, что он изменится в вызывающей функци (main). А это не так, параметр здесь передаётся по значению. То есть, при каждом вызове функции blink() значение параметра count будет 28. Чтобы изменять значение параметра, надо передать указатель на него. Вы правы, спасибо за комментарий по делу Я кстати ошибся с МК, тут у меня используют 814... Цитата #include <stdio.h> #include <ADUC814.H>
void blink( unsigned int * ); sbit BLINK = P1^0; //int cik = 0; void main() { unsigned int counter = 28; unsigned int *ptr = &counter; P1 = 0x0FE; TH0 = 0x0; TL0 = 0x0; TMOD |= 0x1; TR0 = 1;
while( 1 ) { blink( ptr ); } }
void blink( unsigned int *count ) { if (TF0 == 1) { TF0 = 0; --(*count); if (*count == 0) { *count = 28; BLINK = ~BLINK; } } }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|