Schemainteraktion in Proteus mit der Außenwelt

Einführung


Ich denke, viele von denen, die irgendwie mit der Entwicklung elektronischer Geräte verbunden sind, haben mindestens einmal von dem Proteus- Softwarepaket von Labcenter Electronics gehört. Unabhängig von der umfangreichen Bibliothek der für die Modellierung verfügbaren Komponenten ist die „Lebensdauer“ der Schaltung mit seltenen Ausnahmen auf die Grenzen des Emulatorfensters beschränkt. Es gibt bereits mehrere Modelle, die beispielsweise Daten in eine Datei schreiben oder dem System sogar als USB-Geräte präsentiert werden können. Bisher können sie jedoch eine kleine Klasse von Problemen lösen.

Herausforderung


Bei der Arbeit an einem Kursprojekt, in dessen Rahmen ein Funksteuerungssystem für Flugzeuge entwickelt werden muss, wurde es erforderlich, das Modell mit einem PC zu verbinden. Da eine der einfachsten Schnittstellen für die Kommunikation mit einem PC RS-232 ist , wurde sie ausgewählt (USB-Uart-Adapter wurde verwendet).

Wie können Sie dieses System in der Anfangsphase debuggen, wenn noch keine groben Fehler gefunden wurden, die zum Ausfall elektronischer Komponenten führen können, und sich nicht mit den Mikrocontrollern mit häufiger Firmware herumschlagen müssen?

Eine ziemlich bequeme Lösung ist Proteus. Aber hier tritt ein neues Problem auf - die Kommunikation mit dem PC.
Die Komponentenbibliothek enthält das COMPIM-Modell, mit dem Sie die Schaltung an den PC-COM-Port anschließen können. Auf diese Weise können Sie Anforderungen von Geräten verarbeiten, die an diesen COM-Port angeschlossen sind, als wären sie mit einem emulierten Gerät verbunden. Sie können natürlich über einen anderen COM-Anschluss eine Verbindung zu dem herstellen, der an die Schaltung angeschlossen ist. Dies erfordert jedoch zwei COM-Anschlüsse und ein externes Nullmodemkabel.

Die Idee der virtuellen COM-Ports fällt mir sofort ein. Zum Beispiel com0com , das zwei virtuelle COM-Ports erstellt, deren Ein- und Ausgabe zueinander umgeleitet werden. Und für diejenigen, die aus irgendeinem Grund an virtuellen Maschinen arbeiten, kann die Möglichkeit hilfreich sein, COM-Ports mithilfe von VM-Tools umzuleiten.

Aber wir sind nicht auf der Suche nach einfachen Möglichkeiten. zufällig bin ich auf einen Artikel gestoßenüber das Erstellen eigener digitaler Modelle für Proteus. Hier erfahren Sie, wie Sie die gesamte Logik des Modells in eine dynamische Bibliothek übertragen. Dann dachte ich, dass dies zumindest mein Problem lösen und die Fähigkeiten des Emulators maximal erweitern würde, indem ich meine eigenen Geräte hinzufüge. Welche Schnittstellen uart, i2c, spi usw. (von der Seite der Schaltung) und fast jede für die Kommunikation mit der Außenwelt haben können (mindestens 3D-GUI)

Schritte zum Erstellen eines Modells


Erstellen eines grafischen Bildes des Modells

Fügen Sie ein Rechteck, ein anderes Rechteck, einen Text und Schlussfolgerungen hinzu (mithilfe von Gerätestiften), die wir erhalten:
Bild
Es wird in diesem Artikel oder hier ausführlich beschrieben

Programmentwicklung

Um mit dem Modell zu interagieren, habe ich mich für Named Pipes des Windows-Betriebssystems entschieden. Vielleicht erscheint die Lösung seltsam, aber die Idee ist, die Schnittstelle so ähnlich wie möglich zur Schnittstelle eines realen Geräts bereitzustellen. Die Wahl fiel auf Named Pipes, da die Arbeit mit ihnen und COM-Ports fast identisch mit der Arbeit mit normalen Dateien ist.

Aber selbst wenn wir einen Kommunikationskanal mit der "Außenwelt" haben, wie kann man dann den Austausch über die uart-Schnittstelle implementieren?
Es ist notwendig, sein Rahmenformat abzurufen:

Die Logik zum Erzeugen / Parsen eines Signals dieser Art wird in einer separaten Klasse zugeordnet.
Das Hauptmodell für das Proteus-Modell sind zwei Methoden:
Durchführen der Ersteinrichtung:
VOID PIPEUARTMODEL::setup (IINSTANCE *instance, IDSIMCKT *dsimckt)
{
	uart = new Uart();
	logger = new Logger(instance);
	pipe = new Pipe("\\\\.\\pipe\\uart", logger);
	//сохраняем ссылку на dsimckt
	ckt = dsimckt;
	//связываем пины по имени
	txd = instance->getdsimpin("TXD", true);
	rxd = instance->getdsimpin("RXD", true);
	//устанавливаем начальное состояние txd
	txd->setstate(SHI);
	//добавляем 2 события
	ckt->setcallback(1, this, rxd_event);
	ckt->setcallback(2, this, txd_event);
}

und das, was einen Rückruf ruckelt
VOID PIPEUARTMODEL::callback(ABSTIME time, EVENTID eventid) {
	switch (eventid) {
	case rxd_event:
		uart->rxBit(ishigh(rxd_pin_state));	//обрабатываем сигналы со схемы
		if (uart->rxC) {
			pipe->rxd_queue.push(uart->rxD); //отправляем в pipe
			uart->rxC = 0;
		}
		//устанавливаем время следующего вызова в пикосекундах
		ckt->setcallback(time + 1000000000000 / uart_baudrate, this, rxd_event);
		break;
	case txd_event:
		if ((uart->txC) && (!pipe->txd_queue.empty())) {
			uart->txD = pipe->txd_queue.front(); //отправляем в uart
			pipe->txd_queue.pop();
		}
		txd->setstate(time, 1, uart->txBit() ? SHI : SLO); //устанавливает значение выхода
		ckt->setcallback(time + 1000000000000 / uart_baudrate, this, txd_event);
		break;
	}
}


Testen

Ein Beispiel für mein Modell, das mit Virtual Terminal arbeitet:

Es muss noch geprüft werden, wie praktisch diese Lösung sein wird, aber auf den ersten Blick passt sie mir vollkommen.

Ich hoffe, dass die vorgestellten Rezepte helfen werden, viele Ihrer Probleme zu lösen.

Liste der Quellen

  1. Ziemlich gute Proteus-Systembeschreibung und Modellbauanleitung
  2. easyelectronics.ru/tag/rs232
  3. Seite bei Google, auf der Sie alle Quellen abrufen können
  4. Kompilierte DLL und Bibliothek für Proteus

Jetzt auch beliebt: