mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Verbindung (Senden und empfangen) zwischen µC(8051F330) und PC(tastatur) über RS232


Autor: Danijel Odzaklic (danijel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo :D..hab im forum nachgeschaut aber nicht wirklich was passendes 
gefunden..:(

Also, meine Frage: Ich möchte mit meinen µC C8051F330 und dem 
PC(Tastatur)über eine RS232 Schnittstelle eine Verbindung herstellen. 
Und zwar soll, wenn ich z.B. die Taste "5" auf der Tastatur betätige, 
diese Nachricht über die Schnittstelle auf meinem µC sichtbar sein. z.B. 
ein Lämpchen soll 5x blinken oder sonst was..es soll einfach vom µC 
etwas geschickt und empfangen werden und dann auch sichtbar sein.

So, ich kann jetzt mit dieser Angabe nicht wirklich was angangen..ich 
brauche mal eine Grundidee, wie ich da vorgehen soll, da ich mit 
Schnittstellen nicht wirklich viel gearbeitet habe. Wenn mir mal jemand 
weiterhelfen könnte, dann würd ich mir etwas leichter tun.

Mir ist einmal klar das ich in Assembler (mit Silabs vom µC) ein 
Programm schreiben muss mit allen Konfigurationen für die 
RS232-Schnittstelle usw., und dass Porgramm übertrage ich dann über die 
USB Verbindung vom PC zum µC)
Aber ich weiß nicht wie das jetzt funktioeren soll mit der 
Tastatureingabe. Brauch ich da irgendein Terminal Programm für die 
Schnittstelle (damit ich z.B irgendetwas senden kann nach einem 
Tastendruck auf der Tastatur???) oder muss ich das alles im µCProgramm 
programmieren.

Bitte ich brauch nur einmal ein grundkonzept wie eine Verbindung 
zwischen dem µC und PC über RS232 aufgebaut wird. welche register muss 
ich da verwenden? brauch ich sonst noch welche programme? wie erkennt 
mein µC ein Tastendruck auf der Tastatur?

Es wäre echt super, wenn mir jemand helfen könnte, soweit er kann :D

Danke im Voraus

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst Dir wahrscheinlich erstmal Basiswissen zur PC-Programmierung 
und vorallem zu der 8051 µC-Familie aneignen. Da gibt es jede Menge 
Bücher und Infos im Netz. Die UART zu programmieren gehört schon fast zu 
den Grundlagen.

Im 2. Schritt solltest Du die die Spezifik des C8051F330 ansehen. Im 
Grunde hat der alle 8051 Basisfunktionen und noch einige spezielle 
Zusätze, die man kennen muss. Dann schreib erstmal ein paar kleine 
Programme, z.B. eine LED an einen Port-Pin blinken lassen.

Auf PC Seite brauchst Du natürlich auch eine Software, welche die 
Information von der Tastatur abfragt und in geeigneter Form über die 
COMx zum µC sendet, im einfachste Fall ein Terminalprogramm.

Ein 8051-Profi schreibt so ein Programm auf µC-Seite in 5 Minuten, 
praktisch aus dem Gedächtnis.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest sowas wie einen Keylogger bauen.

Den 8051F330 kenne ich nicht, aber so ein Keylogger mit einem 8051-µC 
für eine PC-Tastatur mit PS/2-Anschluss ist hier beschrieben: 
http://www.keelog.com/diy.html

Vorausgesetzt der RS/2-Anschluss passt (Bei einer PC-Tastatur mit USB 
(modern)- oder XT (uralt)-Anschluss ist eine andere Lösung notwendig.), 
könntest du

statt dem AT89CXX51 deinen 8051F330 benutzen und die Ausgabe an den 
freien Pins machen.

oder

den Keylogger wie oben mit dem AT89CXX51 aufbauen und irgendeinen freien 
IO-Pin benutzen, um eine Anzeige-LED zu betreiben.

oder

den Keylogger wie oben mit dem AT89CXX51 aufbauen und an den freien 
TXD-Pin benutzen, um mit dem 8051F330 zu quatschen. Ggf. auch über ein 
RS232-Funkmodul.

ADD:

Die Speicherung der Daten in dem EEPROM (AT24C512) kannst du ggf. in der 
Software weglassen und so die Schaltung vereinfachen.

Bitte achte darauf, wo du das Teil verwendest. Bei einer eigenen 
Hardware ist es OK, bei fremder Hardware (Büro etc.) wird das schnell 
illegal (Ausspähen von Daten).

Autor: Danijel Odzaklic (danijel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke einmal für die Hilfe! :D

Sagen wir mal so..ich hab jetzt ein µCProgramm geschrieben, dass auf ein 
Interrupt wartet (also auf einen Tastendruck auf der Tastatur). BAUD 
Rate sollte auch die selbe am µC und im Terminal Programm eingestellt 
sein?
Welche Baudrate wird bevorzugt für so eine Art Kommunikation? Kenn mich 
da wenig aus!:(

Nur weiß ich jetzt nicht, wie (mit welchen befehlen) und was ich sonst 
noch alles einstellen muss, um ganz einfach nur ein "1" (ASCIICode=031h) 
über die RS232 zum µC wegzuschicken . (muss ich da mit irgendeinem 
Befehl die Quelle, also den µC angeben oder!?, mit welchen Befehl schick 
ich was weg und wie erkennt das Programm einen Tastendruck?)

Soweit ich es verstanden habe, wird, sobald am µC-Kit am Port RX etwas 
empfangen wird, so wird halt das Datenbyte (ich glaub in dem Fall der 
ASCII Code für die "1") in den SBUF Register geladen. Kann das stimmen?

Wie gesagt, das größte Problem liegt bei mir, dass ich mit dem Terminal 
programm nicht umgehen kann und da eine kleine Hilfe brauche, was die 
Einstellungen und Befehle für meine Aufgabe angeht :D

Ich danke nochmals in Voraus und hoffe auf Eure Hilfe :D
lg

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danijel Odzaklic wrote:
> Danke einmal für die Hilfe! :D

Vorab: Deine Tastatur ist vielleicht defekt. Statt dem üblichen 
Satzendezeichen . kommen bei dir :D und :( Zeichenfolgen!

> Sagen wir mal so..ich hab jetzt ein µCProgramm geschrieben, dass auf ein
> Interrupt wartet (also auf einen Tastendruck auf der Tastatur).

Die serielle Kommunikation über Interrupts ist schon kein Anfängerthema 
mehr. Üblicherweise löst man das als Anfänger zunächst im 
Pollingverfahren, d.h. explizites Abfragen des seriellen Ports.

> BAUD
> Rate sollte auch die selbe am µC und im Terminal Programm eingestellt
> sein?

Ja. Bei ungleicher Baudrate funktioniert die Übertragung im allgemeinen 
nicht. Daneben sollten auch Bitanzahl, Parität und Anzahl Stoppbits 
gleich definiert sein.

> Welche Baudrate wird bevorzugt für so eine Art Kommunikation? Kenn mich
> da wenig aus!:(

Oftmals sind die nutzbaren Baudraten durch den Takt des µC bereits 
vorgegeben, da der Baudratentakt meistens aus aus der Haupttaktrate 
durch ganzzahlige Division abgeleitet wird. Näheres im Datenblatt des 
µCs. Gängige Taktraten sind 2400, 4800, 9600 Baud...

> Nur weiß ich jetzt nicht, wie (mit welchen befehlen) und was ich sonst
> noch alles einstellen muss, um ganz einfach nur ein "1" (ASCIICode=031h)
> über die RS232 zum µC wegzuschicken . (muss ich da mit irgendeinem
> Befehl die Quelle, also den µC angeben oder!?, mit welchen Befehl schick
> ich was weg und wie erkennt das Programm einen Tastendruck?)

Das Wegschicken vom PC aus kannst du mit einem Tastendruck in einem 
Terminalprogramm machen. Eine Liste von Terminalprogrammen befindet sich 
in der Artikelsammlung hier. Die Zuordnung Quelle = µC verstehe ich 
nicht.

Bei der Einstellung des Terminalprogramms ist anzugeben, welche 
Schnittstelle am PC benutzt werden soll (COM1, COM2,...) und welche 
Kommunikationsparameter benutzt werden sollen - Baudrate, Anzahl Bits, 
Parität und Anzahl Stoppbits. Üblich ist z.B. 9600,8,N,1. Auf einen 
Handshake sollte man bei ersten Versuchen verzichten.

> Soweit ich es verstanden habe, wird, sobald am µC-Kit am Port RX etwas
> empfangen wird, so wird halt das Datenbyte (ich glaub in dem Fall der
> ASCII Code für die "1") in den SBUF Register geladen. Kann das stimmen?

Hört sich plausibel an, aber ich habe ehrlich gesagt keine Ahnung davon, 
denn ich habe kein Datenblatt des µCs 8051F330.

Üblicherweise befindet sich zwischen µC und seriellem Kabel vom PC noch 
ein RS232-Pegelwandler (z.B. MAX232), da die Signalpegel nicht direkt 
kompatibel sind und zuerst gewandelt werden müssen. Schau im Datenblatt 
des µC-Kits nach, ob das so eingerichtet ist.

> Wie gesagt, das größte Problem liegt bei mir, dass ich mit dem Terminal
> programm nicht umgehen kann und da eine kleine Hilfe brauche, was die
> Einstellungen und Befehle für meine Aufgabe angeht :D

Den Umgang mit dem Terminalprogramm auf dem PC kannst du ohne µC-Kit 
üben. Du baust dir ein sog. Loopback-Gerät, d.h. einen Stecker mit 
Verbindung RXD auf TXD. Alles was du im Terminalprogramm sendest, sollte 
dann als Echo auf den PC-Bildschirm zurückkommen.

Autor: Manuel S. (drno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Schaltung:
Um den 8051F330 mit der seriellen Schnittstelle des PC's verbinden zu 
können musst du erstmal eine Pegelwandlung vornehmen, denn PC und µC 
verwenden unterschiedliche Spannungspegel. Der PC verwendet für eine 
logische 1 einen Spannungspegel zwischen -15V und -3V und für eine 
logische 0 +3V bis +15V. Beim µC hingegen heißt logisch 1 = +5V ( 
eigentlich Vcc ) und logisch 0 = 0V.
Am einfachsten geht das mit einem Pegelwandler wie z.B: dem MAX232. Du 
kannst natürlich zwei einfache Transistor-Inverter verwenden welche auf 
die entsprechenden Spannungen schalten. Die Pinbelegung der RS232 
PC-Seitig findest du hier: http://de.wikipedia.org/wiki/Rs232
Du musst also Rx vom PC über einen Pegelwandler mit Tx vom µC verbinden, 
und Tx vom PC über einen Pegelwandler mit Rx vom µC. Außerdem musst du 
die beiden GND miteinander verbinden. Alle anderen kannst du frei 
lassen. Sollte das jedoch Probleme machen, dann verbinde PC-seitig die 
Leitungen RTS mit CTS und DTR mit DSR und DCD.

2. Software
PC-Seitig:
Am einfachsten ist du verwendest ein Terminalprogramm wie zB. den 
Hyperterminal. Dort musst du eine neue Verbindung erstellen wo du 
folgende Einstellungen machen musst:
Schnittstelle: den entsprechenden COM-Port wo der µC dranhängt
Baudrate: nimm keine zu große wegen der Störanfälligkeit, du musst auf 
jeden fall die selbe Baudrate wie beim µC einstellen ( ich würde <= 9600 
nehmen )
Parity: für den Anfang lass mal Parity weg -> also "keine" einstellen
Flusssteuerung: "keine"
Anzahl der Stopbits: 1
Wenn du das alles richtig eingestellt hast dann wird alles was du in den 
Hyperterminal hineinschreibst zum µC gesendet, und alles was der µC zum 
PC sendet erscheint im Hyperterminal. Du kannst natürlich auch selber 
ein Programm schreiben dass die Serielle Schnittstelle anspricht ( 
stichwort CreateFile(), ReadFile(), WriteFile() ), das ist für den 
Anfang aber zu kompliziert.

µC Seitig:
So jetzt geh ich mal was essen und dann schreib ich weiter

Autor: Manuel S. (drno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
to be continued .........

µC-Seitig:
Der 8051F330 stellt zur verwendung des UART zwei Register zur verfügung:
SCON0 und SBUF0
In SCON werden die Einstellungen vorgenommen, und SBUF ist das 
Sende/Empfangsregister ( um genau zu sein sind es 2 getrennte Register, 
jedoch wählt der µC automatisch beim schreiben auf SBUF0 das 
Senderegister und beim lesen von SBUF0 das Empfangsregister )

SCON0 ( Adresse 0x98 - kann daher bitweise angesprochen werden ):
S0MODE ( Bit7 ): legt den Modus fest ( 0 - ohne parity, 1 - mit 
"Parity", eigentlich nicht mit parity sondern mit 9tem bit, aber das ist 
für den Anfang egal, nimm einfach 0 für S0MODE )
Bit 6: unbenutzt - egal
MCE0 ( Bit5 ): Multiprocessorcommunicationenable - auf 0 setzen
REN0 ( Bit4 ): Receive enable - aktiviert/deaktiviert das Empfangen dh. 
wenn REN0 = 0 ist, kannst der µC nichts empfangen, oder besser gesagt 
wird kein Interrupt ausgelöst.
TB80 und RB80 ( Bit 3 und 2 ): wäre das 9. Empfangs/Sende Bit ( im Fall 
von S0MODE = 1 ), also erstmal egal
TI0 und RI0 ( Bit 1 und 0 ): Interrupt-Bits, TI0 wird vom µC dann 
gesetzt wenn das was in SBUF geschrieben wurde fertig gesendet ist. RI0 
wird dann vom µC gesetzt wenn etwas empfangen wurde. TI0 und RI0 lösen 
beide den gleichen ( seriellen ) Interrupt aus. Dh. du must im seriellen 
Interrupt fragen ob TI0 oder RI0 den Interrupt ausgelöst hat. Außerdem 
musst du das jeweilige bit im Interrupt wieder auf 0 setzten, da dies 
nicht automatisch geschieht, und wenn du es nicht löscht würdest du 
gleich wieder in den Interrupt spirngen.
Konfiguration der Baudrate:
Die Baudrate wird über Timer1 generiert. Dazu musst du Timer 1 im Mode 2
( 8Bit auto-reload ) verwenden. TH1 und TL1 werden mit dem gleichen Wert 
initialisiert welchen du dir ausrechnen musst:
TH1/0 = 256 - T1clk / (2 x Baudrate)
wobei T1clk jene Frequenz ist mit der der Timer 1 betrieben wird.
( Auf die Timer geh ich jetzt nicht weiter ein, weil wenn du die noch 
nicht beherrscht dann hast du bei der seriellen SChnittstelle sowieso 
noch nichts verloren )
Achtung: Den Timer Interrupt nicht freigeben. Außerdem nicht vergessen 
den Timer zu starten ( Timerrun-Bit TR1 glaub ich heißt das setzen )
zu guter letzt musst du noch den Seriellen Interrupt ( ich glaub ES ) 
erlauben, und auch Interrupts generell erlauben ( ich glaub EA )

Dann ist alles fertig:
Senden:
Einfach das zu sendende Zeichen in SBUF schreiben und warten bis fertig 
gesendet wurde ( Interrupt wird automatisch ausgelöst in dem du TI0 
wieder auf 0 setzen musst )

Empfangen ( REN0 muss 1 sein ):
Wenn etwas empfangen wurde wird der serielle Interrupt ausgelöst. Im 
Interrupt fragst du ob TI0 oder RI0 den Interrupt ausgelöst hat. Wenn 
RI0 den Interrupt ausgelöst hat dann brauchst du nur das empfangene 
Zeichen aus SBUF auslesen ( RI0 wieder auf 0 setzten nicht vergessen ).

So jetzt hab ich dir aber genug verraten

PS: Ein Blick ins Datenblatt könnte mal nicht schaden

Autor: Danijel Odzaklic (danijel)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Vielen vielen Dank für die Hilfe!

Hat mir echt weitergeholfen..Das einzige was mir noch unklar ist, ist 
der Pegelwandler mit den zwei Transistor-Invertern. (ich will den MAX232 
nicht verwenden) Hab im Internet eine Schaltung gefunden.(--> siehe 
Dateianhang oder 
http://www.qsl.net/pa3ckr/bascom%20and%20avr/rs232...)

Könnte es mit so einer Schaltung funktionieren?
Irgendwie verstehe ich die Schaltung aber auch nicht ganz..was für 
Transistoren muss ich verwenden? (also welchen Typ? und welchen genau?)

Welche Spannungspegel brauche ich überhaupt?

Also der µC hat für logisch "1" den Pegel +5V und für logisch "0" 0V, 
oder?
Soweit ich weiß, ist bei der ser. Schnittstelle der Pegel 12V, kann mich 
aber auch irren.

Welche Spannungspegel brauche ich jetzt auf der anderen Seite, damit ich 
vom µC zum PC etwas schicken darf?(und umgekehrt!) Wie dimensioniere ich 
dann die Wiederstände?

nochmals Danke!!
mfg

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kann funktionieren, muss aber nicht.

Insbesondere bei den knappen 5V/0V Pegeln beim Senden µC in Richtung PC 
kann es Probleme geben. Die RS232-Schnittstelle ist ja offiziell mit 
12V/-12V Pegeln spezifiziert... Näheres in der Artikelsammlung oder bei 
Wikipedia (Link s. oben).

Warum willst du dir das Leben noch schwerer machen, als es jetzt für 
dich als Einsteiger schon ist? Ein MAX232 mit seinen Ladekondensatoren 
ist ein paar-Cent-Teil und erledigt seine Aufgabe zuverlässig. Wie der 
angeschlossen wird, steht eindeutig in seinem Datenblatt.

Autor: Manuel S. (drno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei der Schaltung kommt es drauf an ob du eine symmetrische 
versorgungsspannung zur verfügung hast ( zB +10, -10 ) oder nur +10 und 
Masse

Also welche versorgungsspannungen hast du zur verfügung?

Autor: Danijel Odzaklic (danijel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, der Pegelwandler ist ein Teil meines Projekts. Wenns dann doch 
nicht klappt, entscheide ich mich für den MAX232.

Was für eine Spannungsversorgung meinst du den? Muss ich die Schaltung 
noch zusätzlich versorgen?

Hab mir dass so vorgestellt, das z.B ein High Pegel vom µC(TxD) (weiß 
jetzt eben nicht wie groß der High Pegel beim µC ist, warscheinlich eh 
5V) über den einen Transistor-Inverter zum RxD Pin vom PC gesendet wird, 
und das eben durch den T-Inverter der Pegel für den Empfang am PC erhöht 
wird oder so in der Art. Und umgekehrt auch so..

Autor: Manuel S. (drno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja mit +5B und Masse wirst du nicht weit kommen, weil die serielle 
schnittstelle wie schon gesagt pc-seitig spannungen von -3 bis -15 und 
von +3 bis +15V benötigt. Wenn du allerdings die 5V eh aus einem 
Spannungsstabilisierungs-IC erzeugst, und den mit 10V versorgst, dann 
könnte man ein wenig trixen, und Masse auf +5V legen. Somit hättest du 
nach oben und unten 5V Spiel, und hättest somit -5V bis +5V zur 
verfügung, und damit kann man was anfangen. Noch besser wäre natürlich 
wenn du sowieso eine symmetrische versorgungsspannung hast. Wenn du 
allerdings nur +5V und 0V zur Verfügung hast, dann musst du dir eine 
Schaltung mit Kondensator-Umladung überlegen, so wie es der MAX232 zB. 
macht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.