mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8051 serielle schnittstelle


Autor: killerkakerlake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vermutlich gibt es hier soetwas schon einmal, aber ic nicht viel zeit 
hab, versuch ich es so.

folgendes Problem:
der adc des 8051 soll die spannung einer schaltung ~60-200 mV messen und 
über die serielle schnittsttelle an den Computer schicken.
der Computer soll diesen wert daraufhin mit einem anderen vergleichen 
und wenn die messung zu hohe werte ausgibt, soll vom computer aus über 
die serielle schnittstelle etwas zurückgeschickt werden, damit die 
messung beendet wird.
das C-Programm mit dem Computer bekomm ich hin, aber bei Serieller 
schnittstellenprogrammierung via 8051 steh ich komplett an.

Frage: Hat jemand vllt ein paar referenzfiles oder so etwas ähnliches 
sogar schon geschrieben und wil mir seine erfahrungswerte von euch zu 
gute kommen lassen, ist ziemlich dringend??

mfg killerkakerlake

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da wir wissen, welchen 8051 du verwendest, wird dir sicherlich 
irgendwann jemand seinen Code geben...
Für unwahrscheinlichen Fall, dass doch niemand weiss, welche MCU du 
verwendest, sind folgende Schritte für einen Standard-8051 nötig:

- Timer 1 einstellen, 8-Bit mit Autoreload, passende Reloadwerte 
berechnen, Timer starten (-> vorzugsweise Baudratenquarz verwenden)
- UART konfigurieren (8/9-Bit Übertragung, etc.)
- Bei Interrupt-Betrieb ES setzen (und IE nicht vergessen)

Natürlich die entsprechenden Routinen für Senden/Empfangen bzw. falls 
gewünscht Ringbuffer, etc. nicht vergessen...

Hoffe, ich hab nix vergessen...

Ralf

Autor: killerkakerlake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
infineon SAF-C517A-LN

mfg

Autor: killerkakerlake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist ein Atmega8 xD

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der C517A hat einen Baudratengenerator.
Beachte das BD-Bit, das musst du setzen um den verwenden zu können.
Mit dem Standard-12 MHz Quarz war der Baudraten-Wert 9Dh, wenn ich mich 
recht erinnere (jedenfalls  etwas mit 9 und D), damit kommst du auf 9600 
Baud.
Aktiviere den Baudratengenerator, setze die Baudrate, und schon kannst 
du senden & empfangen.
Senden ist denkbar einfach mit

clr ti0
mov S0BUF,#irgend ein datenbyte
jnb ti0,$

und empfangen kannst du mit

clr ri0
jnb ri0,$
mov a,S0BUF

schau mal im Handbuch nach, der BRG ist da sehr gut erklärt.



PS: deine Shift-Taste klemmt.

Autor: faustian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Welchen 8051"

Wuerde man bei der Angabe "des 8051" nicht ausgehen von P8051, P80C51, 
P8751 oder einer anderen damit pin- und ausstattungskompatiblen 
Variante?

Autor: killerkakerlake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es ist ein Infineon SAF-C517A-LN ATmega 8 eingebettet in einem 8 Bit 
mikrocomtroller-Board, entwicklungsumgebung ist Keil µ-Vision 2 und am 
liebsten wäre mir ein C-Code

danke im vorraus

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
killerkakerlake schrieb:
> es ist ein Infineon SAF-C517A-LN ATmega 8 eingebettet in einem 8 Bit
> mikrocomtroller-Board, entwicklungsumgebung ist Keil µ-Vision 2 und am
> liebsten wäre mir ein C-Code

Also ist es nun ein C517A oder ein Atmega8 ?
Das sind zwei völlig verschiedene Controller. ;)
Aber da du Keil benutzt, wird es wohl der C517A sein, da Keil AVR nicht 
unterstützt.

Hier ein paar C-Code Schnipsel für Polling Betrieb mit dem C517A:

  // Initialisierung der seriellen Schnittstelle
  S0CON = 80;         // Ser0: Mode=1 REN0=1
  PCON = PCON | 128;  // SMOD = 1
  S0RELL = 0xD9;      // 9615Bps bei 12MHz
  S0RELH = 0x03;
  BD = 1;             // Baudratengenerator benutzen


  // Byte senden per RS232
  S0BUF = 0xFF;       // 0xFF per RS232 senden
  while (!TI0);       // warten bis Byte gesendet
  TI0 = 0;            // TX Flag löschen


  // Warten auf ein Byte per RS232
  while (!RI0);       // Warten bis ein Byte empfangen wurde
  temp = S0BUF;       // Empfangenes Byte auslesen
  RI0 = 0;            // RX-Flag löschen

Schöner geht das Ganze natürlich noch im IRQ Betrieb, aber du solltest 
es lieber damit probieren, da IRQ Betrieb schon etwas Verständnis des 
Controllers vorraussetzt.

Autor: killerkakerlake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
omg, wie peinlich, ja, es ist der C517A, aber der Atmega8 liegt auch 
daneben^^

@fox mulder
Genau danach hab ich gesucht, danke Vielmals :)

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.