Как передать данные по uart keil c51
Перейти к содержимому

Как передать данные по uart keil c51

  • автор:

Как передать данные по uart keil c51

Здравствуйте.
В основном я работаю с микроконтроллерами 8051, конкретно с AT89S52.
Сам я давно пытаюсь освоить Си для микроконтроллеров 8051. И наверное добился в этом хороших успехов.
Но так как напрямую работа не связана с программированием на Си, а использую его только в домашних хобийных проектах (типа охранной сигнализации, или автоматического полива цветов и тому подобное), то между перерывами на придумывание следующего проекта (да и просто другими делами) навыки работы в Си теряются. И приходится что то вспоминать, над чем то биться.
Не много поразмыслив, пришёл к выводу, что наверное было бы неплохо программировать на графическом языке. Ближе всего из таковых для меня это Ladder (релейные диаграммы).
Нашёл в интернете программу LDmicro и даже для микроконтроллеров 8051 версию (файл попробую приложить. ), и честно Вам скажу, что мне очень понравилось. Простенькие програмки писать просто чудо. Но упёрся в то, что никак не могу передать данные через UART(для вывода каких либо надписей на LCD). Списался с разработчиком, но то ли я плохо описал проблему, то ли просто чем то ему не понравился, но вроде как он сказал что ничем помочь не может.
Потом нашёл на AliExpress ссылки на ПЛК на микроконтроллерах. Очень стало интересно. Как я понял там происходит трансляция файлов созданных под оболочкой для ПЛК Mitsubishi в HEX. И нашёл ссылку на тему форума где обсуждается что-то подобное : viewtopic.php?f=62&t=83796&start=20
Я нашёл программу PMW-HEX-v2.8 и думал вот наконец то, сейчас пойдёт дело. но почему то не могу её запустить. всё на иероглифах, что делать. куда жать. вообще такое чувство что под русскоязычной системой не пойдёт. скачал вот здесь http://pan.baidu.com/share/link?shareid . . вторая кнопка слева в верхней строке. (долго мучался пока понял как скачать).
Может кто подскажет как её запустить

Ну и вообще, может кто уже программирует в чём то подобном, может поделитесь опытом, мнением.
Хотелось бы иметь от такой программы возможность управлять входами выходами, функции таймеров, передавать данные по UART, I2C . может отображение на LCD и семисегментных индикаторах.

Вложения:
Комментарий к файлу: Ladder для микроконтроллеров 8051
ldmicro.zip [195.67 KiB]
Скачиваний: 245

Заголовок сообщения: Re: Язык графического програмирования для 8051
Добавлено: Пн янв 25, 2016 11:36:10

Встал на лапы

Из простого графического программирования на ум приходит Scratch от MIT, но он к сожалению не умеет МК.

Представление программы лесенкой — интересная реализация. Сама программа в части компиляции не сильно сложно устроена, из лестницы генерится некая программа на общих инструкциях, для каждой общей инструкции есть трансляция в команды ассемблера конкретного процессора. Вот только в исходниках ldmicro-rel2.3.zip не вижу такого транслятора в 8051, только avr и pic. Чем генерится код для 8051, есть исходник этого генератора? Это какая-то китайская доработка ldmicro? Ну судя по C51.с:

Компилятор Keil Cx51: типы данных и порядок байт

Компилятор Cx51 входит в состав средств разработки Keil С51.

Тип данных Количество
бит
Количество
байт
Диапазон значений
bit 1 0, 1
signed char 8 1 -128…+127
unsigned char 8 1 0…255
enum 8 или 16 1 или 2 -128…+127 или -32768…+32767
signed short 16 2 -32768…+32767
unsigned short 16 2 0…65535
signed int 16 2 -32768…+32767
unsigned int 16 2 0…65535
signed long 32 4 -2147483648…2147483647
unsigned long 32 4 0…4294967295
float 32 4 ±1.175494E-38…±3.402823E+38
data *, idata *, pdata * 8 1 0x00. 0xFF
code *, xdata * 16 2 0x0000. 0xFFFF
generic pointer 24 3 Memory type (1 байт); Offset (2 байта) 0. 0xFFFF

Многобайтовые переменные располагаются в памяти определенным образом, который называется big-endian (от старшего к младшему). То есть самый старший байт хранится в памяти раньше остальных, самый младший сохраняется самым последним. Например число 0x1234 типа int храниться в памяти следующим образом:

Адрес +0 +1
Содержимое 0x12 0x34

Вывести сообщение в терминал на компьютер, подключенный к мк C8051F060 по UART

Author24 — интернет-сервис помощи студентам

Задание:
Дана IDE Silicon labs схема от них же с семейством 8051, МК 060. Необходимо написать программу на асемблере, которая выведет сообщение в терминал на компьютер подключенный к мк по UART. Если кратко обычный Hello world.
Я профан в этом деле, прочитав документацию я понял что нужно выбрать банк регистров, выбрать режим для uart и правильные частоты, но как это сделать в коде я не понимаю.

Большое спасибо, что дочитали.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

UART терминал +игра avRacer
Соорудил UART терминал, основой стал дисплей ACM2004D-FL-YBH-02 на чипе ks0066, имеет 4 строки по.

UART терминал из старого КПК
Добрый день. Не уверен, что в эту ветку, но вроде как инструмент 🙂 Валяется у меня стренький.

Терминал ничего не выводит. UART GSM
Пишу заготовку под работу с GSM модулем. МК PIC24FJ128GA010 Пытаюсь отправить "AT" пока что в.

Передача данных c МК51 по UART и вывод в терминал
Нужно передать 2-х байтовое число через UART по каналу RS-485 на терминал.

Как формировать столбцы символов в системе терминал(ПК) — UART (МК Atmega128)
У меня возник вот такой вопрос. Компьютер через HyperTerminal и Usart связан с Atmega128. Задача.

1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607

. это ж обычный 8051. Поищите примеры на подобные МК на ассемблере. Переименуйте регистры на те, которые используются в этом МК и будет вам счастье. Допустим, вот один из первых попавшихся в поиске вариантов. Есть большая вероятность, что F060 имеет несколько продвинутый UART, или сложнее систему клоков. Но это не такая проблема. Сам принцип на ладони.

947 / 501 / 275
Регистрация: 10.11.2019
Сообщений: 1,054
Допустим, вот один из первых

Типично неработающий пример. В serial_send надо сначала записать байт в SBUF и только потом
опрашивать флаг TI. Эта ошибка идёт из ранней документации Intel и попала во множество исходников и
переводов. Насколько я понял, требуется исходник на Keil C51. Вот такой пример:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
#define uns unsigned char putchar (char c) { if (c==10) {SBUF=13;while (TI==0);TI = 0;} SBUF=c;while (TI==0);TI = 0; return c; } // Установка скорости последовательного порта // Программа предполагает 11.059 MHz кварц // Измените значения SMOD и TH1 при другой частоте кварца void comspeed(uns int spd) = 0x80; //SMOD=1 SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD 

Обратите внимание на функцию putchar — эту функцию вызывают printf и scanf при работе

Файл основной тестовой программы

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
#pragma code #pragma optimize(11,size) #include #include #include #include "serial.c" #define uns unsigned #define uchar unsigned char #define uint unsigned int #define ulong unsigned long /*Ввод строки через последовательный порт*/ uchar *mygets (uchar xdata *string,uchar len) {uchar cnt,letter; while (1) { // ожидать символ с последовательного порта letter=_getkey(); // это символ backspace ? Вывести коды 8,32,8 (backspace,space,backspace) if ((letter==8) && (cnt != 0)) {cnt--;string[cnt]=0;putchar(8);putchar(32);putchar(8);} // это символ CR - Enter ? Вывести '\n' и выйти else if (letter==13) {string[cnt]=0;putchar('\n');return string;} // это печатаемый символ ? Вывести эхо else if ((letter>=32) && (cnt  len)) {string[cnt++]=letter;putchar(letter);} else /*ничего не делать*/; } } // буфер на 16 символов + '\0' в конце строки xdata uchar textbuf[16+1]; void main() {comspeed(9600); printf("Hello !\n>"); /* Введите строку. Используется программа терминала или при отладке в Keil клавиатура компьютера */ mygets(textbuf,16); printf("Вы ввели *%s*\n",textbuf); while (1); }

Можно проверить сначала на эмуляторе в среде Keil, открыв окно последовательного порта.
Запустите программу в Debug Session и проверьте, что строка вводится с клавиатуры,
затем можно проверить на реальном процессоре

1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607

qbfan, познавательно, поблагодарил. Но.. это ведь не очень-то ассемблер, о котором говорил ТС, верно?

947 / 501 / 275
Регистрация: 10.11.2019
Сообщений: 1,054
Поиск в Google «8051 jnb TI» выводит на несколько книг Google Books с примерами на ассемблере
пофигист широкого профиля
4721 / 3156 / 858
Регистрация: 15.07.2013
Сообщений: 18,186

ЦитатаСообщение от qbfan Посмотреть сообщение

надо сначала записать байт в SBUF и только потом
опрашивать флаг TI
И зачем его постоянно опрашивать при наличии системы аппаратных прерываний?
947 / 501 / 275
Регистрация: 10.11.2019
Сообщений: 1,054

Оказывается есть проблема с установкой скорости порта у данного контроллера
Вот интересное обсуждение

947 / 501 / 275
Регистрация: 10.11.2019
Сообщений: 1,054

Возможно Вас заинтересует моя (довольно длинная) статья

Вывод байта через последовательный порт, или проклятые 3 команды.
Как ПРАВИЛЬНО работать с последовательным портом и как НЕ надо с ним работать.

1)
Неработающий вариант:

1 2 3 4 5 6 7 8
C_OUT1: ; Console character output routine. ; Outputs character received in accumulator to console output device. ; JNB TI,$ ;Wait until transmission completed. CLR TI ;Clear interrupt flag. MOV SBUF,A ;Write out character. RET

Так сказать, «живой» (мёртвый) пример из ранней документации Intel.
На самом деле, флаг TI означает не «буфер передачи пустой»,
а «закончена передача байта из буфера» и соответственно надо сначала записать в SBUF байт, а уж потом
дожидаться установки TI. Обходной вариант устранения ошибки: установить TI принудительно (setb TI) «где-то
в начале программы» в подпрограмме инициализации порта, чтобы добиться передачи первого байта.
А дальше «всё пойдет нормально». Весьма неудачный подход, в результате которого в работающей
программе порт «самым загадочным образом» отключается намертво. Эта ошибка как оказалось,
была допущена в ранних руководствах самой Intel (причем логика работы последовательного порта
была описана правильно). Потом Intel спохватились и «исправили» (?) ошибку, но было уже поздно —
ошибку растиражировали перепечатками и переводами. Я думаю, что это реально главная проблема
начинающих программистов на 51 контроллере, которые берут «описание» с таким советом.

2)
Вариант 2, «усовершенствован Intel», но работает не всегда.
Код работает правильно, только если прерывание UART запрещено, либо
прерывание UART разрешено, но имеет самый низкий приоритет из разрешенных (как в 8051 по умолчанию):

1 2 3 4 5
C_OUT2: MOV SBUF,A JNB TI,$ CLR TI RET

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

1 2 3 4 5 6 7 8
serial_int: jnb RI, si0 clr RI push . . ; код приёма байта pop . si0: reti

Т е кода сброса бита TI здесь нет. И действительно, как же тогда будет работать наша «передача без прерываний» ?
Предположим теперь, что у нас есть прерывание с более _низким_ приоритетом, чем прерывание последовательного
порта, причем оно разрешено. Например, в 8052 процессорах прерывание Таймера 2 имеет более низкий приоритет.
Или приоритет последовательного порта принудительно установлен в высокий.
Возникает такая ситуация. Мы обращаемся к C_OUT2, в результате чего контроллер довольно долго стоит в
цикле ожидания

JNB TI,$

Например, если скорость обмена 9600 Бод, то это будет около 1 миллисекунды.
В это время «совершенно случайно» приходит прерывание от таймера 2:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
timer2_int:push psw push acc push b push dpl push dph . . ; * pop dph pop dpl pop b pop acc pop psw reti

* — . и где-то здесь «совершенно случайно» UART заканчивает передачу байта и устанавливает TI.
Поскольку прерывание UART разрешено, то оно тут же выполняется. Но т к оно не сбрасывает TI, то происходит
такая вещь. Как только идет reti из подпрограммы прерывания UART в подпрограмму timer2_int, то выполняется ровно 1
команда из подпрограммы timer2_int, после чего опять возникает serial_int и т д. Т е в результате процесс
выполнения timer2_int затягивается в десятки раз, потому что каждая команда timer2_int (начиная со
случайного адреса) будет сопровождаться вызовом и возвратом serial_int До того,
как проклятый код наконец не достигнет

JNB TI,$ CLR TI

после чего всё придёт в норму. Самое интересное, что никаких ошибок в математике тут не возникает,
но если прерывание Таймера 2 управляет аппаратурой, то «что-то начинает дёргаться». Причем и последовательный
порт вполне естественно «сбоит».

3) Вариант 3, неплохой (?)

Работает правильно, только если прерывание UART разрешено:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
C_OUT3: MOV SBUF,A JNB myTI,$ CLR myTI RET serial_int: jnb RI, si0 clr RI push . . ; код приёма байта pop . si0: JNB TI, si1 ; в предположении, что байт передаётся как в C_OUT3 clr TI ; сбросить TI, чтобы он не вызвал повторного обращения к прерыванию setb myTI ; установить собственный флаг myTI, чтобы получить информацию о конце передачи байта si1: reti

То есть мы сбрасываем флаг прерывания TI и одновременно устанавливаем наш собственный «самый обычный»
флаг.

Мораль: оказывается, работа UART по прерываниям и без — это принципиально разные режимы.
Программа обработки прерываний должна _всегда_ явно сбрасывать биты RI и TI, если они установлены.
Т е если Вы вдруг задумали перевести чтение байт из UART «с опроса бита состояния на работу по прерываниям»,
или наоборот, то нужно соответственно поменять и программу записи байт в порт.

пофигист широкого профиля
4721 / 3156 / 858
Регистрация: 15.07.2013
Сообщений: 18,186

ЦитатаСообщение от qbfan Посмотреть сообщение

одновременно устанавливаем наш собственный «самый обычный»
флаг.

А зачем он нам нужен? Зачем нам торчать в процедуре C_OUT3 ожидая когда передача байта закончится? Нам что больше делать нечего?

947 / 501 / 275
Регистрация: 10.11.2019
Сообщений: 1,054
Зачем нам торчать в процедуре C_OUT3 ?

Потому что контроллер должен не просто слать байты с максимальной скоростью.
Информацию надо сначала получить (например от датчиков или с клавиатуры),
обработать, сохранить в буфере передачи, добавить (возможно) контрольную
сумму, только затем передать на ПК и (возможно) получить подтверждение. Всё это требует времени,
поэтому используя к примеру скорость передачи 19200 Бод вместо 9600 мы автоматически
не увеличиваем быстродействие устройства в 2 раза. Установка скорости в 115200 Бод
также не даёт обмена в 10 килобайт в секунду, т к контроллер просто не успевает
создавать и передавать (или принимать и сохранять) данные с такой скоростью.
Вот интересный пример, найденный по поиску в Google «8051 interrupt driven serial output»

Скажу сразу, что это в оригинальном виде нерабочий пример, т к автор разместил
tx_buf по адресу data 0x20, что соответствует области битовых переменных, это
для полноценной программы нереально. Но в целом пример довольно хорошо поясняет
ситуацию — мы создаём два кольцевых буфера (для передачи и для приёма) и
с помощью указателей производим обмен между основной программой и функцией
прерывания. Но при этом приходится каждый буфер постоянно проверять на переполнение
и опустошение, в результате мы имеем такой длинный исходный код.
Он будет ещё длиннее и запутанней, если буферы поместить в PDATA (movx A,@R0)
или XDATA (movx A,@DPTR) Так что если есть такая необходимость, проще
всё-таки писать обмен по прерываниям на Си, а не на ассемблере.

пофигист широкого профиля
4721 / 3156 / 858
Регистрация: 15.07.2013
Сообщений: 18,186

ЦитатаСообщение от qbfan Посмотреть сообщение

Потому что контроллер должен не просто слать байты с максимальной скоростью.
Информацию надо сначала получить (например от датчиков или с клавиатуры),
обработать, сохранить в буфере передачи, добавить (возможно) контрольную
сумму, только затем передать на ПК и (возможно) получить подтверждение.

Но вместо всех этих дел мы висим на

JNB myTI,$

Где логика?
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607

ЦитатаСообщение от northener Посмотреть сообщение

Где логика?

. возможно, я скажу сейчас немного отстраненно от контекста, но поллинг часто работает быстрее прерываний, когда задача не переключается на другие. В поллинге реакция на ожидаемое (одно) событие будет быстрее чем с прерываниями. Поэтому, ожидание в цикле не редко оправдано.

947 / 501 / 275
Регистрация: 10.11.2019
Сообщений: 1,054

Вот пример той же программы на Си с выводом в порт по прерываниям. Здесь используется та же
идея кольцевого буфера (заодно исправлены некоторые ошибки моего первого примера). Как следует
из результатов отладки, вывод строки «Hello !» занимает примерно 1 миллисекунду (а не 10, если идёт
вывод по поллингу). И это конечно замечательно, пока буфер не заполнится. Хорошо, когда много памяти
и есть место для буфера или когда объём принимаемых и передаваемых данных незначителен.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
// Пример вывода в порт по прерываниям #define uns unsigned #define TXSIZE 32 // Кольцевой буфер вывода xdata char txbuf[TXSIZE]; // txlen - длина очереди, txrd,txwrt - хвост и голова очереди unsigned char txrd,txwrt,txlen; //txempty - флаг "очередь пуста (нет прерываний)" bit txempty,myRI; //функция прерывания последовательного порта void serialint() interrupt 4 {char c; if (TI) {TI=0;if (txlen) {txempty=0;c=txbuf[txrd++];if (txrd==TXSIZE) txrd=0;txlen--;SBUF=c;} else txempty=1;} //Ввод в порт оставлен небуферизованным if (RI) {RI=0;myRI=1;} } //Запись байта в очередь на передачу void putbyte(char c) {//Если буфер заполнен, ждать когда появится свободный байт while(txlen==TXSIZE) /*wait */; ES=0; txbuf[txwrt++]=c;if (txwrt==TXSIZE) txwrt=0; txlen++; // Если очередь была пуста, то возобновить прерывания if (txempty) {TI=1;txempty=0;} ES=1; } //Используется функциями printf и scanf char putchar (char c) { if (c==10) putbyte(13); putbyte(c); return c; } //Ввод символа - RI изменен на myRI char _getkey () { char c; while (!myRI); c = SBUF; myRI = 0; return (c); } // Установка скорости последовательного порта // Программа предполагает 11.059 MHz кварц // Измените значения SMOD и TH1 при другой частоте кварца void comspeed(uns int spd)  PCON 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
#pragma code #pragma optimize(11,size) #include #include #include #include "seriali.c" #define uns unsigned #define uchar unsigned char #define uint unsigned int #define ulong unsigned long /*Ввод строки через последовательный порт Здесь исправлено несколько неточностей*/ uchar *mygets (uchar xdata *string,uchar len) {uchar cnt,letter; cnt=0; while (1) { // ожидать символ с последовательного порта letter=_getkey(); // это символ backspace ? Вывести коды 8,32,8 (backspace,space,backspace) if (letter==8) {if (cnt != 0) {cnt--;string[cnt]=0;putchar(8);putchar(32);putchar(8);}} // это символ CR - Enter ? Вывести '\n' и выйти else if (letter==13) {string[cnt]=0;putchar('\n');return string;} // это печатаемый символ ? Вывести эхо else if (letter>=32) {if (cnt  len) {string[cnt++]=letter;putchar(letter);}} else /*ничего не делать*/; } } // буфер на 16 символов + '\0' в конце строки xdata uchar textbuf[16+1]; void main() comspeed(9600); TMOD 

Учебный лабораторный стенд на микроконтроллере ADuC842 — LESO1

Микропроцессорный стенд LESO1 – готовый учебный лабораторный стенд, предназначенный для изучения микроконтроллеров. Опытные преподаватели технического ВУЗа разработали стенд для освоения студентами архитектуры микроконтроллеров семейства MCS-51, а также методов разработки микропроцессорных систем различного назначения.

Лабораторный стенд на микроконтроллере успешно применяется в технических ВУЗах для обучения студентов, поскольку является готовым портативным и доступным в понимании устройством на микроконтроллере для начинающих их осваивать. Стенд может быть использован студентами как основа для дипломного проектирования или для научно-исследовательской работы в бакалавриате или магистратуре.

На базе стенда на микропроцессоре возможна разработка промышленных автоматизированных систем.

Особенности микропроцессорного стенда LESO1

Учебный лабораторный стенд LESO1 построен на базе микроконтроллера ADuC842 фирмы Analog Devices. Микроконтроллер содержит 12-разрядные прецизионные АЦП и ЦАП, встроенный высокоскоростной МК с FLASH-ЭРПЗУ на 62КБ.

Цена: 10150 руб.

  1. Программирование осуществляется через порт USB
  2. Не требуется дополнительно источника питания
  3. Простота реализации и программирования (все периферийные устройства подключены непосредственно к микроконтроллеру)
  4. Взаимодействие лабораторного стенда с персональным компьютером осуществляется в программной среде LabVIEW

Структура и работа учебного стенда на микроконтроллере

Структура учебного стенда оптимизирована для поэтапного, от простого к сложному, освоения микроконтроллерных систем. Стенд содержит следующую периферию:

  • жидкокристаллический символьный индикатор 8х2
  • матричную клавиатуру 4х3
  • часы реального времени PCF8583
  • излучатель звука
  • датчик температуры DS18B20
  • инфракрасный фотоприемник TSOP1736
  • четыре красных светодиода
  • микросхему преобразования интерфейсов фирмы FTDI

Стенд LESO1. Структурная схема.

Лабораторные работы для микропроцессорного стенда

Методические указания включают работы:

  • Знакомство с интегрированной средой программирования keil-C
  • Ввод и вывод информации через параллельные порты
  • Работа с клавиатурой матричного типа
  • Изучение таймеров микроконтроллера
  • Изучение последовательного порта UART
  • Работа с символьным жидкокристаллическим индикатором

С использованием этого учебного стенда в учебных заведениях могут проводиться лабораторные работы по следующим дисциплинам:

  • цифровая и вычислительная техника
  • микропроцессоры в устройствах и системах
  • цифровые устройства и микропроцессоры
  • интерфейсы периферийных устройств
  • организация ЭВМ и вычислительных систем
  • операционные системы реального времени
  • аппаратные средства вычислительной техники

Программное обеспечение (Windows)

Для загрузки исполняемого кода во внутреннюю память микропроцессора и взаимодействия лабораторного стенда с ПК разработана программа nwFlash. Программа nwFlash позволяет:

  • производить поиск подключенных к компьютеру по USB интерфейсу лабораторных стендов;
  • активировать соединение с одним из найденных стендов;
  • выполнять сброс микроконтроллера (Reset);
  • загружать во flash — память микроконтроллера пользовательскую программу;
  • принимать и отправлять данные в текстовом и шестнадцатеричном виде по интерфейсу UART (режим терминала).

Интерфейс nwFlash состоит из трех элементов:

  • главное меню;
  • окно терминала;
  • окно состояния.

Программа загрузчик

Главное меню позволяет производить операции со стендом, а также настраивать параметры терминала. Окно терминала служит для отображения данных, посылаемых микроконтроллером по интерфейсу UART, а также для отправки пользовательских данных (от компьютера микроконтроллеру) по этому же интерфейсу. В окне состояния отображаются результаты всех проведённых операций для контроля.

Для работы с программой nwFlash следует запустить программу.

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

После выбора стенда из меню «Подключение». В окне состояния должна появиться надпись «Подключено к «имя_стенда». После этого становится доступным пункт меню «Операции», где можно:

  • выполнить сброс МК. На стенде начнёт выполняться программа,
  • записанная в микроконтроллер в последний раз;
  • стереть flash-память микропроцессора;
  • прошить МК.

В появившемся окне необходимо указать путь к hex–файлу (подразумевается, что вы уже написали и скомпилировали программу в какой-либо среде, например, Keil C51).

Программа загрузчик. Меню Операции

Если вам необходимо интерактивно взаимодействовать с микроконтроллером (например, пересылать на компьютер результат дискретизации сигнала с АЦП), вам поможет функция терминала, реализованного в программе nwFlash. Опции терминала главного меню позволяют:

  • выбрать режим отображения/посылки данных: текстовый или шестнадцатеричный;
  • выбрать кодировку ANSI или ASCII — в случае, если вы пытаетесь выводить через UART русские символы;
  • включать/выключать режим автоматической прокрутки текста (автоскроллинг);
  • сохранять принятую от МК информацию в файл:
    • в том виде, как она пришла — пункт меню «Сохранить»;
    • в том виде, как она отображается в терминале — пункт меню «Сохранить как текст».

    Программа загрузчик. Опции терминала

    После выполнения работы со стендом, выберите пункт «Отключиться» в меню «Подключение», затем закройте программу.

    Программное обеспечение (Linux)

    Линукс

    Для загрузки hex-фала в память микроконтроллера используется программа leso1prog. Программа распространяется свободно в виде открытых исходных кодов под лицензией BSD 2-ух пунктов. Программа имеет консольный интерфейс. Исходные коды можно либо скачать в виде архива (скачать) , либо получить с git-репозитория.

    Установка из архива:

    tar -xvzf leso1prog-v0.1.tar.gz cd leso1prog-v0.1/ make

    Установка из git-репозитория:

    git clone git@github.com:Shamrel/leso1prog.git cd leso1prog-v0.1/ make

    В результате должен появиться исполняемый файл leso1prog

    Примеры использования программы:

    1. Загрузить hex-файл в память микроконтроллера. Через параметр -s указываем путь к файлу устройства, через которое подключен стенд,
    например /dev/ttyUSB0 ; через параметр -x указываем путь к hex-файлу.

    /leso1prog -s /dev/ttyUSB0 -x main.hex

    2. Только стереть память микроконтроллера и выйти. Указываем путь к устройству и параметр -e (от английского erase – стирать):

    ./leso1prog -s /dev/ttyUSB0 -e

    3. Только проверить hex-файл. Указываем путь к файлу и параметр -с (от английского check – проверять.):

    ./leso1prog -x main.hex -c

    4. Только сбросить микроконтроллер. Указываем путь к устройству и параметр -r (от reset):

    ./leso1prog -s /dev/ttyUSB0 -r

    5. Вывести версию leso1prog и выйти ( -V – от Version):

    ./leso1prog -V

    6. Напечатать справку и выйти ( -h – от help):

    ./leso1prog -h

    При загрузке hex-файла программой автоматически осуществляется проверка файла, а также стирание памяти, поэтому указывать дополнительно параметры -c -e не нужно. В некоторых случаях для доступа к последовательному устройству /dev/ttyUSB могут понадобится права суперпользователя.

    Прикрепленные файлы:

    Вложение Дата Размер
    PDF iconПринципиальная схема LESO1 13/06/2015 174.77 КБ
    PDF iconПринципиальная схема LESO1.2 29/06/2015 164.33 КБ
    Package iconПолная документация на лабораторный стенд, описание элементов и протоколов перефирийных устройств, примеры программ. 30/06/2015 4.67 МБ
    Package iconДемонстрационная версия Keil v812 01/07/2015 23.08 МБ
    Binary DataЗагрузчик hex-файла для Линукс v0.1 01/07/2015 8.39 КБ
    Package iconЗагрузчик hex-файла nwFlash2.0 (Windows) 02/09/2015 1.42 МБ
    • leso1
    • учебный стенд
    • микропроцессор
    • микроконтроллер
    • программирование

    Комментарии:

    вс, 06/28/2015 — 01:45

    Halif
    вс, 06/28/2015 — 01:45
    Постоянная ссылка (Permalink)

    Здравствуйте, можно узнать, есть ли у вас человек кто занимается разработкой ПО под стенд ЛЭСО1? В этом и дело недавно на кафедру Муромского института ВлГУ поступили новые стенды ЛЭСО1 с интерфейсом USB. Необходимо разработать ПО на LabVIEW для визуализации и измерения параметров синусоидального сигнала (амплитуда, среднеквадр. значение, период и частоту). Вот тут у нас возникли проблемы. С помощью Visa (на кафедре установлена LabView_11) создали для стенда драйвер и теперь стенд опознаётся как устройство Visa (это сделать нам получилось). Стенд распознается, но данные как в него, так и из него не поступают(с форматом передачи RS-232, понятно, но на новом стенде интерфейс USB и вот тут возникла проблема.

    вс, 06/28/2015 — 09:34

    shamrel
    вс, 06/28/2015 — 09:34
    Постоянная ссылка (Permalink)

    В целом, вопрос по адресу. Visa в топку. Следует использовать непосредственно модули для работы с dll: у нас все приборы на FTDI так сделаны. На сайте FTDI можно найти модули и примеры. Немного старые, но для начала сойдет. Мы под свои задачи модули модифицировали сами. Под конкретные прикладные задачи.

    вс, 06/28/2015 — 09:44

    shamrel
    вс, 06/28/2015 — 09:44
    Постоянная ссылка (Permalink)

    Статьи в тему: Учебный стенд LESO6 и LabVIEW и Учебный стенд LESO6 и LabVIEW. Часть 2. Статьи о том, как наши стенды с LabVIEW дружить, только на примере LESO6. Модули совместимы, примеры исходных кодов для микроконтроллера, конечно под AVR. Думаю, особой сложности переделать для MСS51 не будет. Если что не понятно, пишите в комментарии к соответствующим статьям.

    сб, 01/23/2016 — 05:07

    Аватар пользователя rotor77

    rotor77
    сб, 01/23/2016 — 05:07
    Постоянная ссылка (Permalink)

    Здравствуйте, скажите, програмирование только на С? На ассемблере не получится?

    ср, 01/27/2016 — 11:43

    shamrel
    ср, 01/27/2016 — 11:43
    Постоянная ссылка (Permalink)

    Конечно получится. Стенду принципиальной разницы нет. Когда я сам вел лабораторные работы с этими стендами, то студентам давал возможность выбирать, на чем писать. Некоторые писали на асемблере. В Keil с этим проблем нет.

    XXX (не проверено)

    пт, 01/05/2018 — 14:23

    Аватар пользователя XXX

    XXX (не проверено)
    пт, 01/05/2018 — 14:23
    Постоянная ссылка (Permalink)

    Есть ли схема стенда LESO 1 для proteus?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *