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
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.
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).
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
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.
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
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
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/index.html) 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
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.
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?
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..
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.