mazzi

Начинаем Работать С 51-Ми Контроллерами

Выяснение причин малой популярности на форуме 51-х  

56 пользователей проголосовало

  1. 1. Вы используете 51-е ?

    • А что это такое?
    • Использовал, когда учился в институте.
    • 51-устарели.
    • Использую если нет выхода.
    • Конечно, это супер!
    • Иногда использую.
  2. 2. Что мешает использовать 51-е микроконтроллеры?

    • Нечем запрограммировать.
    • Нет софта для разработки.
    • Нет толковой литературы.
    • Нет потребности и желания.
    • Не устраивает цена на чипы.
  3. 3. Как вы находите материалы в данной теме?

    • Чепуха
    • Средне
    • Интересно
    • Класс! Ещё!


23 сообщения в этой теме

mazzi    3

Начать данную тему сподвигла низкая популярность 51-х контроллеров на форуме. Попытаюсь в несколько приёмов дать толчёк для развития этой ветки.

Просьба не писать комментарии в этой теме, давайте в личку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
mazzi    3

Итак, приступим.

1) Использовать будем микроконтроллеры AT89LP2052. Их выпускает фирма Atmel. Они очень похожи на популярные микросхемы AT89C2051. Даташит здесь.

AT89LP2052_4052.pdf

2) Для разработки будем использовать среду Keil. Зайдя на страничку кликаем по кнопочке с надписью "C51

Evaluation Software", затем заполняем регистрационную форму, что даёт нам право скачать демоверсию продукта. Для наших целей этой версии будет вполне достаточно.

3) Для программирования будем использовать программатор и софт к нему от Atmel. Скачать архив со схемой программатора и управляющей программой можно вот отсюда. Размер архива примерно 7Мб. Программатор подключается к LPT порту. Управляющая программа у меня работала под WinXP и Win98 без всяких проблем.

Важно! Программатор не работает от LPT расположенного на дополнительной плате! Только от родного, расположенного на материнской плате компьютера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mazzi    3

Важные отличия МК AT89LP2052 от прежних 51-х контроллеров:

  • выполнение большинства команд за 1 такт
  • тактовая частота до 20МГц
  • порты могут работать на выход как в старом режиме с открытыми коллекторами, так и в новом PUSH-PULL.
  • ОЗУ 256 байт
  • диапазон рабочих напряжений 2.4В...5.5В
  • SPI
  • сторожевой таймер

Это показывает нам, что этот МК по производительности, наполнению встроенным оборудованием подобен МК AVR подобного класса ( ATtiny2313 ). И превосходит последний по объёму ОЗУ, что очень часто бывает немаловажным. 

Благодаря более коротким командам, в те же 2к памяти флеши  помещаются более длинные программы.(У AVR все команды не короче 2-х байт).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mazzi    3

Первый проект по уже сложившейся традиции - светодиодная мигалка. Схема приведена ниже. Не забудьте подключить к питанию и земле выводы 20 и 10 соответственно. Далее будем писать программу под сие чудо.

blink.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
o_l_e_g    1 622

Программа, для проекта mazzi, поочередного зажигания диодов.

В архиве откомпиленный код.

;  мигаем светодиодами 

LED1 EQU P1.0 ; определяем символьные имена
LED2 EQU P1.1 ; теперь компилятор "знает"  что имени LED1, например, соответствует линия 0 порта Р1
LED3 EQU P1.2 
JMP START ; прыгаем через вектора прерываний на старт.

ORG 0030h ;  явно указываем компилеру с какого адреса разместить программу в памяти программ
; делается, чтобы программа не попала в поле векторов прерывания, об этом позже...

; ну собственно, основной цикл программы, отсюда будем осуществлять вызовы подпрограмм, уход в прерывания и тд. ( в Си соответствует функции Main(void){})
START: ; начинаем главный цикл
CALL BLINK ; вызываем подпрограмму мигания
JMP START ; бесконечно зацикливаем главный цикл

; Создаем подпрограммы
DELAY: ; задержка , содержимое регистров определяет время счета
MOV R3, #5
MOV R2, #0
MOV R1, #0
LOOP: DJNZ R1, LOOP ; "крутим"  каскадный счетчик циклов
DJNZ R2, LOOP
DJNZ R3, LOOP
RET ; выход, возврат по месту вызова

BLINK: ;мигаем, используем подпрограмму DELAY
call DELAY ; пауза
CPL LED1 ;инвертируем Р1,0, зажигаем СИД1
call DELAY ; пауза
CPL LED2 ;инвертируем Р1,1, зажигаем СИД2
call DELAY ; пауза
CPL LED3 ;инвертируем Р1,2, зажигаем СИД3
call DELAY ; пауза
MOV P1, #255 ; записываем в порт все единицы, гасим все
RET ; выход, возврат по месту вызова


END ; конец программы

Преемственность железа у 51 впечатляет, система команд и  адресация внутрикристальных устройств практически у всех сохраняется одинаковая, добавляется только что-то новое!

Тут можно говорить о относительной кроссплатформенности даже на уровне исполняемого кода!

Вышеприведенный пример, кстати, будет работать на любом камне из 51 семейства, без перекомпиляции под другое железо!

Главное тут думаю, понять идеологию данной архитектуры, а она очень продуманная !

1.ZIP

Изменено пользователем mazzi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Zer    522

LOOP: DJNZ R1, LOOP ; "крутим" каскадный счетчик циклов

DJNZ R2, LOOP

DJNZ R3, LOOP

В маленьких циклах с целью не плодить метки удобнее использовать символ $ - адрес текущей команды. Например:

DJNZ R1, $

DJNZ R2, $-2

DJNZ R3, $-4

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mazzi    3

485.gif

Вот ещё одна схема которую можно использовать для реальных проектов. Это четырёхразрядный семисегментный дисплей с динамической индикацией информации. Для связи с другими устройствами присутствует интерфейс RS-485. При работе на скорости 9600 бод модуль можно удалять от других на расстояние до 1200 метров.

Как известно, RS-485 работает в полудуплексе, то есть модуль не может одновременно и принимать и передавать данные. Для переключения направления информации в канале используется вывод микроконтроллера P3.2. Для приёма подаём на него "0", для передачи "1".

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mazzi    3

А для чего нужны R3 и R4?

Для ограничения тока. В принципе их можно не ставить. Я ставлю на всякий случай.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Tesla    45

А может случиться так, что ток через входы ADM485 нужно будет ограничивать? Или резисторы тут из соображений "помогут, не помогут... по крайней мере, точно не навредят"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mazzi    3

Я же говорю, можно не ставить, тем более на входы. Дело в том, что я использую SMD резисторы, а для ручного изготовления прототипа развожу одностороннюю плату, под резисторами можно провести дорожку, поэтому я на них(резисторах) не экономлю. Кроме того, в случае выхода из строя ADM485(что иногда бывает) резисторы могут спасти микроконтроллер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Panda_y2k    6
Насчет цены согласен' date=' но и надежность выше[/quote'] Хотелось бы услышать Ваше обоснование надежности 51х в сравнении с AVR. Что в них такое есть, что они надежнее. У меня на пример и те и другие работают одинаково надежно, не замечал различий, если говорить о штатных режимах.

По теме ветки: обычно намигавшись светодиодами переходят к контроллеру шагового двигателя. Могу предложить схемку, которую делал когда-то для управления одним шаговым и одним двигателем постоянного тока. Сейчас за безнадобностью лежит, но появилась мысль сделать на ней электронный термометр со стрелкой, которая будет управляться шаговым двигателем.

post-78045-0-99379400-1291470842_thumb.jpg

post-78045-0-50861000-1291470940_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
o_l_e_g    1 622

Хотелось бы услышать Ваше обоснование надежности 51х в сравнении с AVR. Что в них такое есть, что они надежнее.

Архитектуре уже скоро 30 лет, техпроцесс отработан, хотя это может быть было актуально для 90-х годов прошлого века. Сейчас технологии уже далеко ушли...Но мнение, может и субъективное осталось..., и не только у меня. Да и статистика, за то говорит: В высокоответственных устройствах, чаще видим адуки и инфенеоны, а ведь отнюдь не дураки разрабатывали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Panda_y2k    6

Все новое, как правило делается на базе старого и как правило получается лучше и это новое разрабатывают все те же недураки. Объективных причин пока не вижу считать более надежными 51е, думаю это привычка, привязанность. Я к ним тоже тепло отношусь, так как начинал с них. Простая, понятная архитектура. То, что проще устроено по идее должно быть и надежней, но это не объективно. По поводу статистики и других доводов я бы с удовольствием почитал. Если есть какая то инфа, буду рад.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mazzi    3

post-78645-0-22369800-1291565383_thumb.jpg

Очередное моё творение - простая схема для контроля ветрогенератора. Для измерения скорости оборотов вала генератора используется автомобильный датчик Холла. Используется стандартная схема включения через разъём XP4. Температура генератора измеряется с помощью датчика температуры DS18B20, который подключается к контроллеру через разъём XP3, по схеме с паразитным питанием.

Связь с хостом(главным управляющим контроллером или компьютером) осуществляется через RS-485, разъём XP2.

Питание и связь передаётся через две витые пары. Питание от 12 до 36 вольт постоянного тока.

Прошивка прилагается. В следующий раз выложу схему хоста.

datchiki.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mazzi    3

Начинаем работать с Keil.  

Запустим программу и выполним последовательность действий показанных на следующей картинке для создания нового проекта.  

post-78645-0-40693300-1291819928_thumb.gif  

Затем в выпавшем диалоге наберём имя проекта( по английски ).

post-78645-0-58882600-1291819944_thumb.gif   

Следующий диалог предложит выбрать микроконтроллер для разработки. Сначала выбираем производителя

post-78645-0-66092400-1291819952_thumb.gif    

затем конкретный тип микроконтроллера.  

post-78645-0-48427800-1291819964_thumb.gif   

Затем следующий диалог предлагает сгенерировать начальный код для обнуления памяти и инициализации стека. Советую согласиться.

post-78645-0-06592800-1291819975_thumb.gif  

Ну вот теперь у нас есть проект. Теперь нужно развернуть дерево проекта кликнув по плюсику.

post-78645-0-76788900-1291819985_thumb.gif  

Полностью развернув дерево проекта мы видим всего один ассемблерный файл STARTUP.A51.

post-78645-0-01634600-1291819997_thumb.gif  

Добавим СИшный файл. Нажимаем CTRL+N и получаем новый файл.

post-78645-0-74123500-1291820006_thumb.gif  

Затем File/Save As и указываем имя файла вместе с расширением! Например proba1.c Добавить файл к проекту можно кликнув по папке Source Group1 правой кнопкой и выбрав из выпадающего меню Add Files to Group

post-78645-0-13444500-1291881393_thumb.gif

После чего в диалоговом окне следует выбрать наш файл proba1.c

post-78645-0-19695100-1291881482_thumb.gif 

наш файл появился в дереве проектов

post-78645-0-09451000-1291881557_thumb.gif

Затем набираем текст программы, как на экране, сохраняем файл и нажав на кнопочку build, компилируем весь проект. На рисунке обведён отчёт о построении проекта без ошибок. 

post-78645-0-05454500-1291881608_thumb.gif

Отдельно показываю эту кнопочку build.

post-78645-0-49527200-1291824357_thumb.gif  

Для изменения опций проекта сделаем следующее.

post-78645-0-72928600-1291831272_thumb.gif

Для правильной симуляции следует выбрать опции проекта, как на следующем рисунке.  Частоту кварца следует поставить такую, какая у вас в схеме.

post-78645-0-08432300-1291831285_thumb.gif

Для того, чтобы во время компиляции создавался HEX-файл(прошивка), выберите опции показанные на следующем рисунке.

post-78645-0-55175100-1291835483_thumb.gif

Полученную прошивку можно с помощью программатора "залить" в микроконтроллер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mazzi    3

Начинаем работать с Keil. Продолжение 1.

В нашем проекте мы указывали целевой микроконтроллер, но это влияет только на симулятор. Поэтому мы должны сами прописать в исходнике, для какого МК мы будем писать. Для этого нужно дописать в начале программы:

#include <at89lp2052.h>

Эта строка приказывает препроцессору включить в текст вашей программы всё содержимое файла at89lp2052.h

Если вдруг окажется, что у вас нет такого файла, то можете воспользоваться моим, я его присоединил к этому посту. В этом случае нужно разместить его в директории Keil , например как у меня

C:\Keil\C51\INC\Atmel\

Приведу полный текст программы для простейшей мигалки которая выкладывалась в одном из первых постов.

/**************************************************
--                                       		-- 
--  пробная программа для переключения лампочек  -- 
--  МК................AT89LP2052         		-- 
--  кварц.............12МГц                  	-- 
--											     --
**************************************************/

#include <at89lp2052.h>

// определяем выводы для управления лампами 
#define  LED1  P1_0
#define  LED2  P1_1
#define  LED3  P1_2

// константа определяющая длительность одного такта 
#define  SEK_1 0xffff

// количество тактов световых эффектов
#define MAX_FAZA  3

// объявляем глобальные переменные
idata unsigned int   t_1s=0; // переменная для выдержки паузы между переключениями
idata unsigned char  faza=0; // переменная определяет текущее состояние лампочек 

//--------------------------------------------
//  основная функция программы
//--------------------------------------------
void main ( void ) {
    while ( 1 ) { // бесконечный основной цикл программы 
      	if ( t_1s ) t_1s--; // уменьшаем переменную, пока она не равна нулю 
  	else {
       	t_1s = SEK_1; // перезагружаем её

	       if ( faza < MAX_FAZA ) faza++;
	       else faza = 0;
  	}
// переключаем лампочки
  	switch ( faza ) {// множественный выбор одного из действий 
  	case 0: LED1 = 1; LED2 = 1; LED3 = 1; break;
  	case 1: LED1 = 0; LED2 = 1; LED3 = 1; break;
  	case 2: LED1 = 1; LED2 = 0; LED3 = 1; break;
  	case 3: LED1 = 1; LED2 = 1; LED3 = 0; break;
  	}
    }
}

А на следующей картинке результат симуляции данной программы с использованием встроенного логического анализатора.

post-78645-0-56369900-1291916713_thumb.gif

Файл проекта во вложении. Так что можете потренироваться сами.

at89lp2052.zip

proba.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
vdim4ik    0

Спасибо за полезный материал!

Раньше немного сталкивался с программированием AVR контролллеров, сейчас есть необходимость освоить 8051.

Посоветуйте пож-та, какую отладочную плату лучше купить для работы с контроллером в корпусе 32 PIN QFN?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mazzi    3

Не могу ничего сказать по этому поводу, поскольку сам не пользуюсь отладочными платами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ugolok    0

мази чтото гдето мне попадалась инфа что 8051 выпускались в СССР по лицензии но немогу нигде наити .если выпускались то под каким названием и чем они отличались

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mazzi    3

Назывались они КМ1816ВЕ31 и КМ1816ВЕ51. Отличие в том, что в 31-й не было памяти программ, а в 51-й было 4 килобайта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
BARS_    531

Решил спросить здесь, чтобы не плодить темы. Итак. Попала в руки демо плата с C8051F020. Поставил Silicon Labs IDE, покурил даташит, подключил светодиод, написал пару строк кода, прошил иии... И ничего, МК не подает признаков жизни. Только светодиод слегка тлеет при подключении между GND и любым выводом любого порта. Код вот такой:

/////////////////////////////////////
//  Generated Initialization File  //
/////////////////////////////////////
#include "compiler_defs.h"
#include "C8051F020_defs.h"
void main(){
   P0MDOUT   = 0xFF;

   P0 = 0xff;
   P1 = 0x00;
   P2 = 0x00;
   P3 = 0x00;
  while(1){
  }
}

По моему пониманию, должны были включиться все вывода порта Р0. На практике же ничего не происходит. В чем я ошибся?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 166

вы бы еще Z80 откопали. Была бы некротема...

на самом деле нонешние 51-е уже далеко не то что было раньше. Они стали быстрее, обзавелись некоторой модной периферией, инкапсулировали флеш и остальную память на кристалл, но при этом сохранили тяжелое наследие прошлого в виде древнего ядра, хоть и слегка подпиленного. Как мне кажется семейство сохранили только для промышленных девайсов, которым необходимо сохранить совместимость только из экономических соображений. Больше пользы в них никакой. Потому как есть куда более продвинутое во всех смыслах, современное и дешовое решение - STM8/32. Копеечный чип, копеечный программатор (и отладчик!), продвинутое ядро и периферия, простой кодинг. Вы все еще хотите потратить время на освоение МК51?

Изменено пользователем mail_robot

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения

    • Многогранный товарищ. Ждём новых книг: "Пчеловодство. 100 кг мёда с одного улья за сезон." "Интимная жизнь без женщины. Советы профессионала." "Звёзды зовут! Строим межпланетную ракету из подручных средств." 
    • А Вас не удивляет, что, как Вы изволили выразиться, "отсутствие знаний" не мешает мне успешно писать код в свои изделия, а изделия затем успешно внедрять в серийное производство? Вы не ответили мне на простой вопрос: каким боком терминология стандарта влияет на написание кода для ДМА? Что такого критически важного содержится в определении выражения как части другого выражения? Зато Ваше стерильное непонимание сути понятия "логического выражения" - это весьма существенно. Вы совершенно формально принимаете соглашения языка, не пытаясь разобраться в сути. И при этом вообще не слышите собеседника, априори полагая, что  собеседником является ничего не знающий "школоло". Именно это гомерически смешно. Также гомерически смешны Ваши сентенции относительно ДМА. ДМА не требует никаких вычислений, кроме простых присвоений значений управляющим регистрам контроллера ДМА, а так же тривиальных действий в обработчике прерываний по ДМА. Все что связано с использованием этого аппаратного инструмента никакого отношения к Си не имеет ВООБЩЕ. Проблема в том, что Вы ни разу не радист. Вы - программист. Именно поэтому активно применяете чужие библиотеки.  А мне это совершенно не требуется.  
    • транзистор Т1 выпаял: проверил, живой плату промыл - сушится обогревателем . Вечером припаяю назад Т1 + припаяю резисторы и сделаю фото
    • Это не хрень. Это - нормальное положение дел. ))  Транзисторы , они ведь не одинаковые. Токи утечки разные (в основном обратный ток коллектора) , разные и коэфициенты усиления по току ( h21э ). По этому без нагрузки , на выходах  и между ними , может быть что угодно.  На это даже заморачиваться особо не стоит. Лучше провести эксперимент. Между выходами  поставить два последовательно соединённых резистора. Скажем по одному килоому каждый. После этого померить напряжение между выходами. Оно должно стать практически нулевым.  Потом к средней точке резисторов подпаять проводок. А другой конец провода подключить к массе. При этом на обоих выходах должно стать примерно нулевое напряжение. Перекинув провод на плюс питания убеждаемся , что на обоих выходах стало практически напряжение питания. Если всё так , то то всё ОК. Но поставить резисторы между базой и эмиттером 4-х силовых  транзисторов всё же надо.   
    • В 90% случаев, такой БП используют для контактной сварки. В Вашем случае намного реальнее перемотать трансформатор от микроволновки. Уж по скорости и надёжности - это самый верный вариант. Для чего планируется использовать схему?