====== Передача данных между МК и ПК ======
Если подключить к микроконтроллеру драйвер L293D, то возможно управлять мотором, путем создания разных или одинаковых сигналов на двух выводах Input 1/2. В этом примере управляющие каналы драйвера подключены к выводам PC14 и PC15.
{{ :ob:o7:example:l293d.png?600 |}}
С помощью модуля ''MicroSTM32F1TPorts'' возможно принимать пакеты с идентификаторами от ПК через USB-UART преобразователь. Тот же, который [[ob:o7:stm32flash|используется для прошивки]]. Для ПК он определяется как COM-порт (в настоящем примере это ''COM10'').
Код для микроконтроллера:
MODULE Main;
IMPORT SYSTEM,
MCU := MicroSTM32F10xxD,
ARMv7M := MicroARMv7M,
Pins := MicroSTM32F10xPinCfg,
TPs := MicroSTM32F1TPorts,
Sys := MicroSTM32F103x8System;
CONST
motorStartForward = 021X;
motorStartBackward = 022X;
motorStop = 023X;
VAR
p0: TPs.Port;
PROCEDURE Receive (id: CHAR; a: ARRAY OF CHAR; len: INTEGER);
BEGIN
IF id = motorStartForward THEN
SYSTEM.PUT(MCU.GPIOCBSRR, {15, 14+16})
ELSIF id = motorStartBackward THEN
SYSTEM.PUT(MCU.GPIOCBSRR, {15 + 16, 14})
ELSIF id = motorStop THEN
SYSTEM.PUT(MCU.GPIOCBSRR, {15 + 16, 14 + 16})
END
END Receive;
PROCEDURE InitPort;
VAR par: TPs.InitPar2;
BEGIN
par.n := TPs.USART1;
par.RXPinPort := Pins.A; par.RXPinN := 10;
par.TXPinPort := Pins.A; par.TXPinN := 9;
par.UCLK := Sys.PCLK2;
par.baud := 19200;
par.parity := TPs.parityNone;
par.receive := Receive; (* устанавливаем процедуру для вызова при приёме данных *)
TPs.Init(p0, par)
END InitPort;
PROCEDURE Init;
VAR ok: BOOLEAN;
BEGIN
InitPort;
Pins.Configure(Pins.C, 14, Pins.outputPushPull2MHz);
Pins.Configure(Pins.C, 15, Pins.outputPushPull2MHz);
END Init;
PROCEDURE MainLoop;
BEGIN
REPEAT
TPs.Receive(p0); (* принимаем данные по UART *)
ARMv7M.WFI
UNTIL FALSE
END MainLoop;
BEGIN
Init;
MainLoop
END Main.
Программа для ПК на языке Компонентный Паскаль:
MODULE KrisControl1;
IMPORT MicroTPorts;
TYPE MessagesHandler = POINTER TO RECORD (MicroTPorts.MessagesHandler) END;
CONST
motorStartForward = 021X;
motorStartBackward = 022X;
motorStop = 023X;
VAR
p: MicroTPorts.Port;
mh: MessagesHandler;
PROCEDURE (h: MessagesHandler) MessageReceived (id: SHORTCHAR; IN a: ARRAY OF SHORTCHAR; len: INTEGER);
BEGIN
END MessageReceived;
PROCEDURE Open*(port: ARRAY OF CHAR);
BEGIN
IF p = NIL THEN
p := MicroTPorts.NewPort(port, 19200, {}, mh);
IF p # NIL THEN
Log.String("успешно соединенился"); Log.Ln;
END
END
END Open;
PROCEDURE Close*;
BEGIN
MicroTPorts.Close(p);
Log.String("успешно закрыл соединение"); Log.Ln;
END Close;
PROCEDURE Forward*;
VAR a: ARRAY 1 OF SHORTCHAR;
BEGIN
MicroTPorts.SendMessage(p, motorStartForward, a, 1)
END Forward;
PROCEDURE Backward*;
VAR a: ARRAY 1 OF SHORTCHAR;
BEGIN
MicroTPorts.SendMessage(p, motorStartBackward, a, 1)
END Backward;
PROCEDURE Stop*;
VAR a: ARRAY 1 OF SHORTCHAR;
BEGIN
MicroTPorts.SendMessage(p, motorStop, a, 1)
END Stop;
BEGIN
NEW(mh)
CLOSE
Close
END KrisControl1.
Комнады для управления:
"KrisControl1.Open('\\.\COM10')"
KrisControl1.Forward
KrisControl1.Backward
KrisControl1.Stop
KrisControl1.Close
Эти команды возможно привязать к кнопкам, чтобы сделать графический интерфейс управления моторами:
{{ :ob:o7:example:panel.png?600 |}}