Forum: PC Hard- und Software DOS Programm in C und Mikrocontroller steuern ?


von Adrian E. (ahsd)


Lesenswert?

Hi Leute,
ich habe eine Frage bezüglich älterer Computersysteme. Ich interessiere 
mich gerade sehr dafür, mal die rudimentäreren Rechnersysteme 
kennenzulernen und alles auf das wesentliche runterzubrechen. (Macht 
auch einfach Spaß, in diesen Retrothemen zu wühlen)

Nun meine Frage: Ich möchte elektronische Schaltungen mit einem 
einfachen Computersystem steuern. Ich dachte an DOS. Da ich gerade C 
lerne und erstmal bei einer Sprache bleiben wollte, habe ich diesen C 
Compiler für DOS gefunden: "Turbo C" 
http://edn.embarcadero.com/article/20841 Kann ich mit dieser kombination 
relativ einfach irgendwie über seriellen, oder Druckerport mit einem 
Mikrocontroller kommunizieren? Damit ihr versteht was ich will: Ich 
möchte einfach ein super einfaches Computersystem, auf dem ich so 
einfach wie möglich mit einer Software einen Mikrocontroller steuern 
kann.

Gut Strom!
Oder wie auch immer man andere Bastler grüßt ^^ haha
Ich war hier übrigens früher schon, hab aber mein Account vergessen..

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Adrian L. schrieb:
> Kann ich mit dieser kombination
> relativ einfach irgendwie über seriellen, oder Druckerport mit einem
> Mikrocontroller kommunizieren?

Im Prinzip ja. Allerdings ist die Unterstützung für die Ansteuerung der 
seriellen Schnittstelle unter DOS sehr rudimentär, der Compiler selbst 
kennt so etwas gar nicht, und Du bist entweder auf die Nutzung der 
BIOS-Routinen angewiesen, die aufgrund ihrer primitiven Struktur nicht 
viel Freiraum lassen, oder aber Du musst einen "Treiber" selbst bauen 
bzw. einen irgendwo finden.

Insofern ist ein DOS-Rechner kein "super-einfaches" System.

von Adrian E. (ahsd)


Lesenswert?

Okay, ich bin im Moment für alle Systeme offen, was könnte man denn als 
alternative empfehlen? (Um das ganze nicht zusehr einzuschränken müsste 
es auch nicht unbedingt C sein.. Basic wäre natürlich auch schön, weil 
es schnell zu erlernen ist)

von STK500-Besitzer (Gast)


Lesenswert?

Adrian L. schrieb:
> Okay, ich bin im Moment für alle Systeme offen, was könnte man denn als
> alternative empfehlen? (Um das ganze nicht zusehr einzuschränken müsste
> es auch nicht unbedingt C sein.. Basic wäre natürlich auch schön, weil
> es schnell zu erlernen ist)

Linux...
Vom Elektor-Verlag gibt es u.a. ein Englisches Buch, in dem über ein DSL 
(damn small linux) eine Hausautomation o.dergl. realisiert wird.
Unter Linux darf man auch direkt auf die Ports zugreifen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

STK500-Besitzer schrieb:
> Unter Linux darf man auch direkt auf die Ports zugreifen.

Was, wenn es um die serielle Schnittstelle geht, absolut nicht zu 
empfehlen und im übrigen auch sinnlos ist.

von Reinhard R. (reinhardr)


Lesenswert?

Hi Adrian,

meiner Meinung nach brauchst du dich nicht mit einem antiken Compiler 
unter einem antiken OS herumplagen, es sei denn du willst genau wissen 
was der PC da treibt.

Du kannst mit einem modernen Compiler (z.B. die freie Visual Studio 
Express Edition) ganz einfach Konsolenprogramme (laufen im 
"DOS-Fenster") schreiben und über die die serielle Schnittstelle 
ansteuern. Von der parallelen Schnittstelle würde ich die Finger lassen.

Fürs Erste brauchst du zum Testen des Programms auch keinen 
Mikrocontroller. Du kannst z.B. am PC zwei serielle Ports über ein 
Nullmodemkabel verbinden und mit dir selber sprechen (z.B. dein Programm 
auf COM1 und ein Terminal auf COM2). Das geht auch rein virtuell mit 
com0com, was bei Rechnern mit weniger als 2 COM Ports ganz praktisch 
ist.

Wenn das funktioniert, kann man das dann einfach auf echte HW umstellen.

Gruß,
Reinhard

von Adrian E. (ahsd)


Lesenswert?

Ok, das klingt interessant. Wo finde ich jetzt Resourcen zum Ansprechen 
von COM Ports unter C ?

von Reinhard R. (reinhardr)


Lesenswert?

Mit Google. ;-)

Das ist ein Standardproblem. Das Web geht förmlich über mit 
Informationen zu dem Thema.

https://www.google.com/search?q=visual+c%2B%2B+serial+port

Edit:
Ignoriere aber am besten alle Ergebnisse in denen .NET vorkommt. Das ist 
dann kein reines C/C++ mehr. Besser wäre:

https://www.google.com/search?q=visual+c%2B%2B+Win32+serial+port

von Adrian E. (ahsd)


Lesenswert?

OK danke :)
Ich werde mich trotzdem paralel ein bisschen mit DOS beschäftigen, 
einfach aus Interesse, weil ich die alten Computer toll finde. Kannst du 
mir vielleicht etwas genauer erläutern, was unter DOS so rudimentär, 
bzw. eingeschränkt hinsichtlich der Seriellen Schnitstelle ist?

von Reinhard R. (reinhardr)


Lesenswert?

Rufus hat das oben schon angedeutet. Man muss unter DOS die Hardware 
mehr oder weniger "direkt" ansteuern. Das setzt dann auch voraus dass 
man weiß welche Art von Schnittstelle verbaut ist, meistens eine die zu 
einem bestimmten Standard kompatibel ist, z.B. zum 8250 oder 16550. Bei 
einer exotischen Schnittstelle muss man aber sein Programm entsprechend 
anpassen.

Unter Windows ist das nicht mehr möglich. Das Betriebssystem erlaubt 
einem Programm gar nicht mehr den direkten Zugriff auf die Hardware. 
Dafür gibt es Funktionen die den Zugriff erlauben. Hinter diesen 
Funktionen verstecken sich dann die ganzen hardwarespezifischen Details, 
Zugriffskontrolle etc.


Wenn du direkt unter DOS arbeiten willst ist das sicher lehrreich und 
interessant. In dem Fall spricht auch gar nichts dagegen den 
"steinigeren" Weg zu wählen.

von Adrian E. (ahsd)


Lesenswert?

OK, danke für die Erklärung. Da ich Programmier Anfänger bin sollte ich 
mich damit vielleicht nicht gleich übernehmen, auch wenn es tatsächlich 
sehr interessant klingt.

von skua (Gast)


Lesenswert?

Serielle unter DOS kennt nur Hardware Handshake daher must du die 
Hardware selbst ansprechen.
Druckerportfunktionen kennen mehr oder weniger nur Drucker.

Das schöne an DOS ist das man einfach die gesamte Hardware ansprechen 
kann ohne irgendwelche Verenkungen.

von Rolf M. (rmagnus)


Lesenswert?

skua schrieb:
> Das schöne an DOS ist das man einfach die gesamte Hardware ansprechen
> kann ohne irgendwelche Verenkungen.

Und das unschöne ist, daß es keine Treiber gibt, die das für einen 
erledigen.

von Peter II (Gast)


Lesenswert?

Etweder habe ich ein schlechtest Gedächtniss oder ihr?

Klar kann man die Hardware direkt ansprechen oder das braucht man im 
normal fall nicht.

Es gibt BIOS-routinen für den Zugriff auf den COM-Port. Dos konnte ja 
auch schon mit "type autoexec.bat > COM1" umgehen.

http://www.i8086.de/dos-bios-interrupts/dos-bios-interrupts.html

von Sebastian (Gast)


Lesenswert?

An dieser Stelle möchte ich doch noch einmal ein schon etwas älteres 
Buch empfehlen: PC-Schnittstellen angewandt von Burkhard Kainka. Leicht 
verständlich und praxisorientiert, richtet es sich vor allem an 
Einsteiger, aber die kompakte Darstellung aller wichtigen Grundlagen an 
Beispielen war mir persönlich sogar in der Firma eine Hilfe, wenn auch 
vor etlichen Jahren.
Ist allerdings Pascal / Basic - orientiert. Man kann entsprechende 
Portzugriffe unter DOS allerdings auch in C ausführen.

von NurEinGast (Gast)


Lesenswert?

Schau mal hier rein.

http://www.beyondlogic.org/serial/serial1.htm

Howrdwarebeschreibung, Register, ein DOS C-Programm .....

von NurEinGast (Gast)


Lesenswert?

Oh weh ->

  "Howrdwarebeschreibung"

ich meinte natürlich

  "Hardwarebeschreibung"

sorry.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

skua schrieb:
> Serielle unter DOS kennt nur Hardware Handshake daher must du die
> Hardware selbst ansprechen.

Wenn Du damit die BIOS-Routinen meinst, ja. Mit ein paar Lötbrücken im 
Stecker ist das aber kein Problem, anders als die anderen 
Einschränkungen.

Peter II schrieb:
> Es gibt BIOS-routinen für den Zugriff auf den COM-Port.

Das habe ich auch nicht abgestritten. Nur können die nicht viel, da sie 
die Schnittstelle nicht interruptgesteuert ansprechen. Und so ist zwar 
das Senden mit hohen Baudraten möglich, das Empfangen aber geht "dank" 
Polling recht bald schief.

Dazu kommt, daß die BIOS-Routinen nur mit Schnittstellen nutzbar sind, 
die an den Standard-I/O-Adressen liegen, womit PCI(e)-Karten und 
natürlich USB-Adapter gleich völlig ausfallen.

Aus all diesen Gründen ist es deutlich ratsamer, serielle Schnittstellen 
mit einem Betriebssytem anzusprechen, das mit Devicetreibern 
arbeitet, ob das nun ein ernstgemeintes Windows oder Linux ist, ist 
dafür ziemlich egal.

von Adrian E. (ahsd)


Lesenswert?

Um als Threadersteller nochmal auf die Einfachheit der eigentlichen 
Frage zurückzukommen, sprich: Meine Ansprüche isnd wirklich niedrig. Ich 
möchte zwar mehr als nur And und Aus schalten über den COM Port, aber es 
reicht mir, wenn ich mehrere Werte an einen Mikrocontroller ausgeben 
könnte...

zB LED 1 leuchtet Hell, LED 2 leuchtet mittel, LED 3 leuchtet schwach. 
In der nächsten Sekunde ist es wieder anders... Klar muss ich jetzt die 
ganzen Links erstmal durchwühlen, trotzdem wäre ich für anfängergerechte 
Tips offen, wenn sich jemand die Mühe machen will, mich auf den 
richtigen Pfad zu bringen ;)

von Peter II (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Das habe ich auch nicht abgestritten. Nur können die nicht viel, da sie
> die Schnittstelle nicht interruptgesteuert ansprechen. Und so ist zwar
> das Senden mit hohen Baudraten möglich, das Empfangen aber geht "dank"
> Polling recht bald schief.

das liegt dann aber fast nur am Programmierer, bei DOS ist ja gerade der 
Vorteil das einen niemand in die Quere kommt. Wenn das Pogramm also 
nicht gerade extrem komplizierte quardratische gleichungen lösen muss, 
dann sollte da nichts schief gehen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter II schrieb:
> das liegt dann aber fast nur am Programmierer,

Nicht bei Benutzung der BIOS-Routinen. Die sind, wie sie sind, und das 
Konzept ist lausig.

von Peter II (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Nicht bei Benutzung der BIOS-Routinen. Die sind, wie sie sind, und das
> Konzept ist lausig.

ein guter Programmier kommt auch mit den lausig umgebungen zurecht. Es 
gabt genug software die ohne Probleme per COM-Port daten übertragen 
konnten. Ich glaube z.b. nicht das der NortonCommander eigene "treiber" 
für die hardware dabei hatte.

von xXx (Gast)


Lesenswert?

Adrian L. schrieb:

> Ich werde mich trotzdem paralel ein bisschen mit DOS beschäftigen,
> einfach aus Interesse, weil ich die alten Computer toll finde.

Es gibt tolle alte Computer, aber auf keinem davon laeuft (MS-)DOS. Das 
ist so als wuerde man alte Autos toll finden und sich deswegen einen 
Audi 80 zulegen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter II schrieb:
> Ich glaube z.b. nicht das der NortonCommander eigene "treiber"
> für die hardware dabei hatte.

Aber sicher hatte der das, wie jedes andere erntgemeinte Programm auch, 
das unter DOS mit seriellen Schnittstellen herummachte. Der "Treiber" 
war kein separater Programmbestandteil, sondern bestand aus einer ISR, 
die die betreffenden Hardware-Interrupts bediente, sowie einer Handvoll 
von Routinen, die direkt auf die I/O-Adressen der 8250/16550 zugriffen.

Mit reiner Nutzung der BIOS-Routinen war ein Empfang mit Datenraten 
jenseits der 9600 Baud praktisch ausgeschlossen, mit 
interruptgesteuerter und nicht zu ungeschickter Programmierung war auch 
auf lahmen Kisten das Maximum (115200 Baud) möglich.

Das Problem bei diesem Konzept ist halt, daß jedes Programm die 
verwendeten I/O-Adressen und Hardwareinterrupts kennen muss, bei den 
ersten beiden Schnittstellen waren die auch noch klar definiert, aber 
bei weiteren dauerte es geraume Zeit, bis sich ein sinnvoller Standard 
etablierte. Bis dahin hatten die Programme ein paar vordefinierte Werte, 
die dem jeweiligen Programmierer halt am besten gefielen; wenn man als 
Anwender Glück hatte, entsprach einer dieser Werte der eingesetzten 
Hardware.

von Adrian E. (ahsd)


Lesenswert?

@ xXx

Was sind denn so die alten Compiter deiner Wahl? Die es Spaß macht zu 
programmieren..

Ich fand zB dass ein Apple II  (Mit dem DOS von Apple) sehr schön 
aussieht.

von 16550 (Gast)


Lesenswert?

Peter II schrieb:
> Es gibt BIOS-routinen für den Zugriff auf den COM-Port. Dos konnte ja
> auch schon mit "type autoexec.bat > COM1" umgehen.

Nur ist das Empfangen nicht per Interrupt gepuffert. Und wie willst du 
beim Senden einen Timeout Implementieren wenn der Empfänger per 
Handshake busy signalisiert ?

von 16550 (Gast)


Lesenswert?

Peter II schrieb:
> das liegt dann aber fast nur am Programmierer, bei DOS ist ja gerade der
> Vorteil das einen niemand in die Quere kommt. Wenn das Pogramm also
> nicht gerade extrem komplizierte quardratische gleichungen lösen muss,
> dann sollte da nichts schief gehen

Was ist mit schreiben auf Diskette oder Platte ? In der Zeit gehen im 
Zweifelsfall Zeichen verloren.

von Smörre (Gast)


Lesenswert?

> Was sind denn so die alten Compiter deiner Wahl? Die es Spaß macht zu
> programmieren..
>
> Ich fand zB dass ein Apple II  (Mit dem DOS von Apple) sehr schön
> aussieht.
da Du Dich ja für Retrocomputer und serielle Ansteuerung interessiert - 
hier ist ein nettes Bastelprojekt für Atari XL (Lauflichtsteuerung, 
"juego de luces" unter Projekte), fand ich irgendwie ganz nett :)
http://www.atariware.cl/

von Jens M. (Gast)


Lesenswert?

Adrian L. schrieb:
> Um als Threadersteller nochmal auf die Einfachheit der eigentlichen
> Frage zurückzukommen, sprich: Meine Ansprüche isnd wirklich niedrig. Ich
> möchte zwar mehr als nur And und Aus schalten über den COM Port, aber es
> reicht mir, wenn ich mehrere Werte an einen Mikrocontroller ausgeben
> könnte...

soweit so einfach, nimm einen Com Port, beschäftige dich mit den 
Registern und dem verwendeten Baustein (16550) und leg los.

Du mußt die Adresse wissen wo der Baustein steckt und welche Register 
welche Leitungen unter welchen Bedingungen schalten.
>
> zB LED 1 leuchtet Hell, LED 2 leuchtet mittel, LED 3 leuchtet schwach.

Das ist dann aber kein einfaches digitales schalten mehr. Belass es bei 
ein/aus, sonst brauchst du zusätzliche externe Hardware zur 
Helligkeitssteuerung.

> In der nächsten Sekunde ist es wieder anders... Klar muss ich jetzt die
> ganzen Links erstmal durchwühlen, trotzdem wäre ich für anfängergerechte
> Tips offen, wenn sich jemand die Mühe machen will, mich auf den
> richtigen Pfad zu bringen ;)

Hoffe das ist verständlich. Es gibt einen Baustein (ein Chip), der hat 
Softwareregister, dort setzt du einzelne bits per Software (C z.B.), 
diese bits steuern "Verstärker", Die Spannung kannst du dann an den 
Steckern messen.

von Adrian E. (ahsd)


Lesenswert?

Danke!
Ich hatte auch mittlerweile das hier gefunden:

http://www.franksteinberg.de/progss.htm
http://www.o-bizz.de/qbtuts/com-port/index.htm

Ist zwar ein bisschen kompliziert für Anfänger, aber man kapierts nach 
einer Weile.

von Werner (Gast)


Lesenswert?

Wenns nur ums Ein- und Ausschalten geht, dann nimm doch die parallele 
Schnittstelle.
Die liegt standardmäßig auf 0x378.

Dann kannst Du mit

portoutb(word port, byte data);

also portoutb(0x378, 0x{was du willst}) die Datenleitungen schalten und 
dort dranhängen, was du willst.
Ein bisschen zurücklesen müsste auch gehen mit portinb().

Das ist ein Dreizeiler. Recht einfach.

Ich habe mal eine serielle schnittstelle (ISA-Karte) selbst gebaut (auch 
für DOS Zwecke). Da hat man einfach auch mit portout ein Byte 
hingeschickt und das kam dann seriell dort heraus mit 115kbaud. Ums 
timing hat sich ein Mega auf der ISA-Karte gekümmert. Zurücklesen hatte 
ich damals nicht implementriert, da es nur um debug-ausgaben ging.

Werner

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.