Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Hardware » STC15


STC15

Сообщений 31 страница 60 из 71

31

dosikus написал(а):

Эту хрень бы на английский польностью перевести...

Гуглопереводчик не хочет эти демки переводить, впечатление что они корёжатся как-то, когда вытаскиваются из isp
Вот куча демок, вытащенных прямо с stcmcu - https://yadi.sk/d/naqKh4e03EDEJU/STC15/stc15-demo.zip - эти нормально переводятся

32

Появились новые платки на stc15w204s - https://ru.aliexpress.com/store/product … 75868.html
http://s7.uploads.ru/aXKlk.png
А может они и не новые, просто мне раньше на глаза не попадались )

33

Поскольку софт для x51 на ассемблере, оставшийся в инете, находится в удручающем состоянии, всё приходится переписывать )

Modbus CRC

Код:
namespace eval modbus {
...
proc crc {} {
    set crcl r2
    set crch r3
    return "
[set _ [lib::name]]:
; r0 - cbuf
; return a - 0 if OK
    mov $crcl, #0xFF
    mov $crch, #0xFF
    mov a, @r0
    dec a
    dec a
    mov r4, a
_10$_:
    inc r0
    mov a, $crcl
    xrl a, @r0
    mov $crcl, a
    mov r5, #8
_20$_:
    clr c
    mov a, $crch
    rrc a
    mov $crch, a
    mov a, $crcl
    rrc a
    mov $crcl, a
    jnc _30$_
    xrl a, #1
    mov $crcl, a
    mov a, $crch
    xrl a, #0xA0
    mov $crch, a
_30$_:
    djnz r5, _20$_
    djnz r4, _10$_
    inc r0
    mov a, @r0
    xch a, $crcl
    mov @r0, a
    mov r4, a
    inc r0
    mov a, @r0
    xch a, $crch
    mov @r0, a
    clr c
    subb a, $crch
    jnz _40$_
    mov a, r4
    clr c
    subb a, $crcl
_40$_:
"}
...
}

namespace eval lib {
...
proc name {} {
    return [string map {:: _} [lindex [info level -1] 0]]
}
...
}

34

Смешная картинка )

http://sa.uploads.ru/POEkQ.jpg

35

vt340 написал(а):

Смешная картинка )

А что из изображенного на картинке вызывает смех?
Я вот себе заказал и получил отладочную плату с STC15 MCU, на будущее, только вот заняться пока времени нет. Занят с STM32F407.

36

Pridnya написал(а):

А что из изображенного на картинке вызывает смех?

Перегородили дорогу в светлое будущее )

37

Ещё одна игрушка на stc15 - https://mysku.ru/blog/aliexpress/53312.html
STC15W408AS + DS1302 + NY3P065
http://s5.uploads.ru/cGeri.jpg
http://s1.uploads.ru/yG4Pc.jpg

update
Замена firmware - https://github.com/aFewBits/stc-led-clock
(и пример программирования stc15 на sdcc)

Отредактировано vt340 (2017-07-12 22:18:13)

38

Всем привет!
Достал из коробки давно лежавшую макетку STC15F2K60S2 + CH340G (UART-USB), припаял штыревые вилки PLS, подключил к компьютеру через по USB, в системе обнаружился последовательный порт, поставил драйвер. Светодиоды RX и TX на макетке замигали и я понял, что идет обмен. Запустил программу HiperTerminal, в свойствах указал новый последовательный порт COM4 и скорость 9600, в HiperTerminal-е вижу строки. Нормальное начало.
PS: Тему нужно как-то по-человечески назвать, а не тремя звездочками. :)
http://s5.uploads.ru/t/hwvBe.jpg

http://sa.uploads.ru/t/uWMKf.png

Отредактировано Pridnya (2017-07-12 20:38:35)

39

Pridnya написал(а):

Нормальное начало.
PS: Тему нужно как-то по-человечески назвать, а не тремя звездочками. :)

Я с ними вообще душой отдыхаю, удивительно беспроблемные мк у китайцев получились )
Про звёздочки - хотел выделить раздел x51, но постеснялся, что только сам и буду туда писать, если хотя бы вдвоём будем, то можно наверно и выделить

40

vt340 написал(а):

Pridnya написал(а):

    Нормальное начало.
    PS: Тему нужно как-то по-человечески назвать, а не тремя звездочками. :)

Я с ними вообще душой отдыхаю, удивительно беспроблемные мк у китайцев получились )
Про звёздочки - хотел выделить раздел x51, но постеснялся, что только сам и буду туда писать, если хотя бы вдвоём будем, то можно наверно и выделить

Выделить раздел для STC15 нужно обязательно. Я этот микроконтроллер планирую освоить, вроде как он годится даже для промышленных приложений, диапазон температур у него хороший, низкая цена и софт есть, в общем смысл есть. :) Пока знакомлюсь с существующим материалом (софт, железо, статьи).

41

ОК
Выделил раздел и перенёс тему
Может по силабсам ещё что будет, тоже x51

42

vt340 написал(а):

Я с ними вообще душой отдыхаю, удивительно беспроблемные мк у китайцев получились )
Про звёздочки - хотел выделить раздел x51, но постеснялся, что только сам и буду туда писать, если хотя бы вдвоём будем, то можно наверно и выделить

Действительно интересный микроконтроллер, особенно в сравнении с классическим 8051, китаец многократно производительнее, его 35МГц эквивалентны 300-400МГц для классического.
Вчера вечером снял с макетки схему, ничего сложного нет: CH340G и STC15F2K60S2, на линиях UART_RX UART_TX светодиоды для индикации состояния, сначала смутил последовательно включенный диод на линии UART_RX STC15F2K60S2, но из DataSheet узнал, что это для защиты от попадания напряжения с CH340G на STC15F2K60S2 , и картинка такая есть с этим диодом. Только я так и не понял, зачем он мне, если на макетке STC15 и CH340G питаются от 5 вольт, диод включен в прямом направлении со  стороны микроконтроллера, вот с микроконтроллера 5 вольт может попасть на CH340G, а обратно уже нет. На картинке еще есть резистор 300 Ом в линии UART_TX, у меня его нет. У меня есть еще тактовая кнопка, она замыкает цепь база-эмиттер транзистора через который идет питание +5В, т.е. нажатие на кнопку эквивалентно сбросу питания.

Еще запустил последнюю версию STC ISP 6.86D, долго искал, как считать прошивку, которая прошита производителем и выдает строки в UART, так и не нашел, как её считать, потом нашел информацию, что прошивать можно, а читать - нельзя. Пока у меня нет никакого HEX-а, чтобы в случае затирания демо-прошивки снова что-то записать. Странно, что нельзя читать, если прошивка не защищена.

И еще я не понял такой момент: если микроконтроллер выдает на UART_TX строки, а линия UART_RX мигает, похоже, что микроконтроллер её просто переключает, то как тогда прошивается микроконтроллер через этот же UART? Как его ввести в режим аппаратного загрузчика. У тех же STM32 для этого есть линии BOOT0 и BOOT1 и три варианта переходов аппаратный загрузчик, RAM, PROGRAM FLASH, а здесь как? Нужно как-то сделать, чтобы МК был включен и "слушал" UART_RX, по которому придет команда от STC ISP?

Владимир, если не сложно - проясните. :) Может, прошивку (HEX) какой сбросите, чтобы порты клокали, например, с частотой 2-3 Гц. Вроде как прошивка должна подойти от другого МК из этой серии.
http://sh.uploads.ru/t/j8YsB.png

Отредактировано Pridnya (2017-07-14 08:51:52)

43

Тэкс, по пунктам )
Диод они ставят, чтоб программатор не подпитывал мк.
На tx у программатора без передачи торчит +5, а у мк внутренняя подтяжка ног к питанию, и через эту подтяжку даже с одной ноги ему может хватить, чтоб быть постоянно запитанным.
А ему это не надо, потому что в режим программирования он переходит от подачи питания, ждёт меандра от программатора в течение каких-то долей секунды, и если не дожидается, то переходит в нормальный режим выполнения программы из флеша.
Резистор в схеме нарисован - это они наверно страхуются от перегрузки по выходу tx мк, но точно не знаю.
Прошивка у него не считывается вообще в принципе, т.е. он всегда как бы в защищённом режиме и другого у него нет.
Тестовую программку вместе с готовым хексом и ассемблером выложил туда же, где всё про stc15 - https://yadi.sk/d/naqKh4e03EDEJU/STC15/test.zip

Код:
0000: 02 01 00         ljmp reset
000B:              .org 0xB
000B: 02 01 0B         ljmp systick
0100:              .org 0x100
                   
                   reset:
0100: 75 81 3F         mov sp, #0x3F
0103: D2 8C            setb tr0
0105: D2 A9            setb et0
0107: D2 AF            setb ea
0109: 80 FE            sjmp *
                   
                   systick:
010B: B2 92            cpl p1.2
010D: 32               reti

Таймер T0 работает systick-ом, при частоте мк 11059200 systick 14 Гц
P1.2 моргает 7 Гц, ну и можно любой другой пин поставить или несколько

Отредактировано vt340 (2017-07-14 20:45:13)

44

vt340 написал(а):

А ему это не надо, потому что в режим программирования он переходит от подачи питания, ждёт меандра от программатора в течение каких-то долей секунды, и если не дожидается, то переходит в нормальный режим выполнения программы из флеша.
Резистор в схеме нарисован - это они наверно страхуются от перегрузки по выходу tx мк, но точно не знаю.

Таймер T0 работает systick-ом, при частоте мк 11059200 systick 14 Гц
P1.2 моргает 7 Гц, ну и можно любой другой пин поставить или несколько

Владимир, спасибо! По схемотехнике всё понятно, а вот загнать микроконтроллер в режим программирования удалось только к ночи. Оказывается, нужно запустить SCT ISP, выбрать HEX-файл, нажать на кнопку CheckMCU, после чего программа STC ISP начинает постоянно слать 7F вперемешку с еще какими-то байтами, а затем нужно нажать на макетке кнопку "Сброс питания микроконтроллера", и программа переводит микроконтроллер в режим аппаратного загрузчика. Я про 7F понял, только когда программный сниффер включил, постоянно молотит.

Теперь на P1.2 что-то клокает. Т.е. еще один шаг вперед.
http://se.uploads.ru/t/Ve0QY.png   http://s1.uploads.ru/t/2Chs4.png

Отредактировано Pridnya (2017-07-15 01:26:33)

45

Да, "меандром" я небрежно обозвал 0x7F, каюсь )
Там довольно витиеватый пакетный протокол, причём разный для разных чипов
Для stc15f10x я его расписывал на easyelectronics - http://forum.easyelectronics.ru/viewtop … 70#p451770

46

Владимир, а не могли бы вы пояснить мне, как человеку не знакомому с x51 такой вопрос:
если просто переключать вывод порта P0_0, то один этот вывод и переключается, а если добавить небольшую задержку (вроде бы обычный синтаксис), то вижу пачки импульсов с некой периодичностью на всех линиях порта P0 (P0_0...P0_7) и примерно аналогичная картина на P1, пачки импульсов на P1_0...P1_5 и P1_7. Странно как-то.
Вот сишный код из примеров к Reads51 v4.52, пример blink (это я чуть подправил пример).

Код:
#include <sfr51.h>
main(){
int n;

 while(1)
  {
   for(n=0; n<5; n++) {;} // waste some cycles 
   P0_0^=1;
   for(n=0; n<5; n++) {;} // waste some cycles 
   P0_0^=1;  
   }
}

47

У x51 двойной доступ к некоторым адресам - байтовый и битовый, наподобие bit banding у кортексов
Наверно этот компилятор считает ^=1 байтовым

48

Высокая скорость синхронизации и эффективная система реализации команд - это ещё не всё. Бросается в глаза отсталая организация шин. В архитектуре Cortex на это обращено сильное внимание. Шина может быть узким местом, бутылочным горлышком.

49

Ну, кортексу кортексово, а экс пятьдесят первому экс пятьдесят первое )

50

vt340 написал(а):

У x51 двойной доступ к некоторым адресам - байтовый и битовый, наподобие bit banding у кортексов
Наверно этот компилятор считает ^=1 байтовым

С операцией "Исключающее ИЛИ" (^=1) всё в порядке, вопрос появляется при добавлении строк кода задержки (for), импульсы похожи на обмен по UART или SPI, см. скриншот на P0_6 и P0_7 (откуда там эти импульсы, я же к ним нигде не обращаюсь). И что-то многовато кода генерит - целых 2 килобайта HEX. Наверное, что-то с компилятором IDE Reads51 v4.52. А без строк задержки частота на P1_0 около 1 МГц, если дважды написать P1_0=0; P1_0=0;..., то частота уменьшается в два раза, т.е. это этот самый код в HEXe.

Код:
int n;
while(TRUE)
{
P1_0=0; // LED on
for(n=0; n<10000; n++); // waste some cycles
P1_0=1; // LED off
for(n=0; n<10000; n++); // waste some cycles
}


http://s9.uploads.ru/t/Lhf56.png

Вопрос решен. По умолчанию IDE Reads51 v4.52 генерит код для внешней памяти, а нужно переключить на внутреннюю. У меня же на макетке только STC15F2K60S2 (и CH340 USB-UART). Я про это не знал. Теперь строки с задержкой не вносят ничего странного, работает правильно.

PS: Вот UART бы еще включить.
http://s2.uploads.ru/t/sjDb1.png

Отредактировано Pridnya (2017-07-18 10:47:25)

51

Тогда возможно мк пытается к внешней ram обращаться
stc15f2k60 - это же не игрушка stc15w20x, а reads51 не 15К-байтный as31 - там и таргеты и модели памяти вроде надо настраивать

Пока писал это, уже опоздал с ответом )
Про UART - готовый пример на 574 странице даташита

Отредактировано vt340 (2017-07-18 10:53:46)

52

vt340 написал(а):

Тогда возможно мк пытается к внешней ram обращаться
stc15f2k60 - это же не игрушка stc15w20x, а reads51 не 15К-байтный as31 - там и таргеты и модели памяти вроде надо настраивать

Пока писал это, уже опоздал с ответом )
Про UART - готовый пример на 574 странице даташита

Отредактировано vt340 (Сегодня 10:53:46)

Про обращение к внешней памяти я догадался, но все равно спасибо.

Пример из DataSheet заработал, ide k3.6. Ещё один шаг вперед.

Я вообще пишу для PIC и STM32, и там и там есть регистры управления приемопередатчиком и биты состояний "буфер пуст", здесь искал что-то аналогичное, а его нет. Очень непривычно, но разобраться можно.

Вот пока не понял, как функцию printf() переопределить для вывода в Uart1. Буду пробовать.

PS: Странный DataSheet, текст выделяется, поиск работает, а копировать текст невозможно - приходится код руками печатать. Китайцы намудрили.
http://sa.uploads.ru/t/JfwVY.png

Отредактировано Pridnya (2017-07-18 23:28:44)

53

Дим, разблокировщиков пдф в сети как грязи...

54

dosikus написал(а):

Дим, разблокировщиков пдф в сети как грязи...

Спасибо, но заблокированный PDF я сначала скачал из архива Владимира на Яндекс-диске, а затем эту же PDF-ку с официального сайта, а, оказывается на неофициальномсайте  (а там, кто его знает, какое он имеет отношение к официальному) есть немного отличающаяся разблокированная версия DataSheet http://www.stcmicro.com/datasheet/STC15F2K60S2-en.pdf . Я её теперь и использую.

Микроконтроллер хороший, код на Си получается компактный. Только не привычно после PIC-ов и STM-ов, т.к. архитектура старовата (нет столько битов управления тем же UART-ом..., система тактирования простая...). Но пользоваться можно и нужно. Нужно знать и уметь, не всё же всегда делать на STM32. :)

Отредактировано Pridnya (2017-07-21 08:31:37)

55

Си к x51 притянут за уши.
За пределы 256 байт памяти могут выходить только две инструкции для ram

Код:
movx  @dptr, a
movx  a, @dptr

и две для rom

Код:
movc  a, @a+dptr
movc  a, @a+pc

Зато в пределах 256 байт настоящий cisc, а не risc как avr и pic.
По сути это такой микро-плк, а не микропроцессор общего назначения

56

vt340 написал(а):

Си к x51 притянут за уши.
За пределы 256 байт памяти могут выходить только две инструкции для ram
Код:

movx  @dptr, a
movx  a, @dptr

и две для rom
Код:

movc  a, @a+dptr
movc  a, @a+pc

Зато в пределах 256 байт настоящий cisc, а не risc как avr и pic.
По сути это такой микро-плк, а не микропроцессор общего назначения

Если я правильно понял, то доступ к  RAM в пределах 65536 байт возможен через указатель, доступ к ROM возможен через указатель и программный счетчик (для работы с таблицами, массивами констант).

Т.е. не смотря на достаточно большой объем RAM (у STC15F2K60S2 это 2 килобайта) сишный код будет компилироваться в не очень эффективный ассемблерный из-за ограничений (две инструкции для RAM и ROM)?  Интересно, а с каким  микроконтроллером вы сравниваете? И пишители вы на Си для x51? Может, писали когда-то, но отказались по причине неэффективности?

57

Нет, до STC15 я ничего не писал для x51, и вообще для восьмибитников, кроме тестиков и ТЗ.
Простые МК - простые программы, потому и говорю, что отдыхаю )

58

Тред на дваче про 8051 и stc - https://2ch.hk/ra/res/258237.html - люблю такое )
http://s7.uploads.ru/t/IuLx5.png
http://s0.uploads.ru/t/0mCX6.png
http://s1.uploads.ru/t/ehPQU.png

59

vt340 написал(а):

Тред на дваче

Эко их колбасит.
Тем временем мы не одиноки,  microsin разродился циклом статей - http://microsin.net/programming/msc51/index.html

60

Отрыл на офсайте примеры , от них во всю воняет SPL ...По убивал бы ...
Дань моде? Копипаст с стм? Или прородители сплни?

Код:
u8	GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx)
{
	if(GPIO > GPIO_P5)        return 1;	//空操作
	if(GPIOx->Mode > GPIO_OUT_PP)	return 2;	//错误
	if(GPIO == GPIO_P0)
	{
    if(GPIOx->Mode == GPIO_PullUp)    P0M1 &= ~GPIOx->Pin,	P0M0 &= ~GPIOx->Pin;	 //上拉准双向口
    if(GPIOx->Mode == GPIO_HighZ)    P0M1 |=  GPIOx->Pin,	P0M0 &= ~GPIOx->Pin;	 //浮空输入
    if(GPIOx->Mode == GPIO_OUT_OD)    P0M1 |=  GPIOx->Pin,	P0M0 |=  GPIOx->Pin;	 //开漏输出
    if(GPIOx->Mode == GPIO_OUT_PP)    P0M1 &= ~GPIOx->Pin,	P0M0 |=  GPIOx->Pin;	 //推挽输出
	}
	if(GPIO == GPIO_P1)
	{
    if(GPIOx->Mode == GPIO_PullUp)    P1M1 &= ~GPIOx->Pin,	P1M0 &= ~GPIOx->Pin;	 //上拉准双向口
    if(GPIOx->Mode == GPIO_HighZ)    P1M1 |=  GPIOx->Pin,	P1M0 &= ~GPIOx->Pin;	 //浮空输入
    if(GPIOx->Mode == GPIO_OUT_OD)    P1M1 |=  GPIOx->Pin,	P1M0 |=  GPIOx->Pin;	 //开漏输出
    if(GPIOx->Mode == GPIO_OUT_PP)    P1M1 &= ~GPIOx->Pin,	P1M0 |=  GPIOx->Pin;	 //推挽输出
	}
	if(GPIO == GPIO_P2)
	{
    if(GPIOx->Mode == GPIO_PullUp)    P2M1 &= ~GPIOx->Pin,	P2M0 &= ~GPIOx->Pin;	 //上拉准双向口
    if(GPIOx->Mode == GPIO_HighZ)    P2M1 |=  GPIOx->Pin,	P2M0 &= ~GPIOx->Pin;	 //浮空输入
    if(GPIOx->Mode == GPIO_OUT_OD)    P2M1 |=  GPIOx->Pin,	P2M0 |=  GPIOx->Pin;	 //开漏输出
    if(GPIOx->Mode == GPIO_OUT_PP)    P2M1 &= ~GPIOx->Pin,	P2M0 |=  GPIOx->Pin;	 //推
Код:
#define	GPIO_Pin_0    0x01	//IO引脚 Px.0
#define	GPIO_Pin_1    0x02	//IO引脚 Px.1
#define	GPIO_Pin_2    0x04	//IO引脚 Px.2
#define	GPIO_Pin_3    0x08	//IO引脚 Px.3
#define	GPIO_Pin_4    0x10	//IO引脚 Px.4
#define	GPIO_Pin_5    0x20	//IO引脚 Px.5
#define	GPIO_Pin_6    0x40	//IO引脚 Px.6
#define	GPIO_Pin_7    0x80	//IO引脚 Px.7
#define	GPIO_Pin_All	0xFF	//IO所有引脚
	
#define	GPIO_P0    	0    //
#define	GPIO_P1    	1
#define	GPIO_P2    	2
#define	GPIO_P3    	3
#define	GPIO_P4    	4
#define	GPIO_P5    	5


typedef struct
{
	u8	Mode;    //IO模式,      GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	u8	Pin;    //要设置的端口	
} GPIO_InitTypeDef;

u8	GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx);

#endif

Вы здесь » Микроконтроллеры » Hardware » STC15