www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mutiprozessorkommunikation?


Autor: Cristian Grigoruta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute....

Möchte mal 2 µC's miteinander kommunizieren lassen und wollt einmal
fragen wie ich das genau bewerkstelligen kann. Benutze den AT89C52 und
als Progsprache C.
Hab im Datenblatt mal nachgesehn und dort ist das SM2 Bit zu setzen um
in den Mult.µC Mode zu wechseln, jedoch steht nichts Genaueres zu dem
Modi drinnen.

Hat wer ne gute Quelle oder vielleicht Lust es mir zu erklären?
Danke für jede Hilfe !

mfg Cri

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist eigentlich ganz einfach.
Im Multiprozessor Modus wird das 9. Bit als Flag für Adressen genutzt,
also wenn eine Adresse über den UART geschickt wird, setzt man das Bit,
ansonsten ist es gelöscht.
Mit dem gesetzten SM2 Bit verwirft der Controller solange die
empfangenen Daten (und erzeugt keinen RI), bis eine Adresse kommt.
Dann kann man die im IRQ mit der eigenen vergleichen und bei
Übereinstimmung SM2 löschen und alle nachfolgenden Daten empfangen, bis
eine neue Adresse kommt oder aber, wenn man weiß, wieviel Daten kommen,
eben nach Ende der Übertragung SM2 löschen.

Autor: Cristian Grigoruta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank.

Ahm..kurz mal ne andere Frage.
Was muss man eigentlich am PC einstellen wenn man den µC (AT89C52) über
die RS232 anschließt und etwas sendet?Wo sehe ich ob ich etwas empfangen
habe (am PC) und wo kann man das empfangen sehen?

mfg Cri

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Start - Programme - Zubehör - Kommunikation - HyperTerminal

HyperTerminal startet.
Im sich öffnenden Dialog 'neue Verbindung'
irgendwas als Name eingeben. OK
Im nächsten Dialog 'Verbindung herstellen über' auf
COM1 oder je nach dem wo das Kabel angeschlossen ist einstellen.
OK

Im naechsten Dialog die Verbindungsparameter (Baufrate, etc)
einstellen.

Das wars: Du kannst jetzt ueber die RS232 senden bzw. empfangen.

Autor: Cristian Grigoruta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich! Vielen Dank.

Sorry aber ich habe noch einige Fragen :)
ALso,ich habe nun den Timer 1 so geprogt das er mir ne Baudrate von
9600 erzeugt (Reloadwert von TH0 = 0xF9;) aber wo muss ich nun diese
Taktsognal verwenden?Damit meine ich wo ich es hinschalten soll.

z.B: um eine Led blinken zu lassen würde ich es ja an einen beliebigen
Portpin legen aber was mach ich mit der Baudrate?

Autor: Jack Braun (jackbraun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst doch einfach nur den UART initialisieren.
Also in Deinem Fall Modus 2 im SCON (SM0=1, SM1=0, REN=1).

Autor: Cristian Grigoruta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hab ich auch gemacht.
Und wie kann ich nun z.B. eine Zahl senden? Einfach die Zahl als
Hexzahl in SBUF? oder wie? Sorry aber bin nun mal in den Babyschuhen
:)

mfg Cri

Autor: Cristian Grigoruta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder wie sende ich einen Text vom µC zum PC?

Autor: Jack Braun (jackbraun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau, und nach dem Senden TI wieder löschen.

Autor: Jack Braun (jackbraun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zur zweiten Frage: Zeichen für Zeichen in einer Schleife.

Autor: Cristian Grigoruta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi.

Ich kapiers einfach nicht wie ich etwas senden kann...
Hier mal mein Code aber was ich in main schreiben muss um endlich was
zu sehen weiß ich noch immer nicht

#include <AT89x52.h>
#include <stdio.h>


void Init_Ser0(void)
{
  PCON = PCON | 0x80;  // SMOD setzen
  SCON = 0x50;
  ES = 1;      /* Serial Prot Int. Freigabe */
}

void T1_Init(void)
{
      TMOD |= 0x20;           /* TMOD: timer 1, mode 2, 8-bit reload
   */
      TH1   = 249;            /* TH1:  reload Wert für 9600 Baud / 12MHz
   */
      TR1   = 1;              /* TR1:  timer 1 run
   */
      TI    = 1;

}



void main(void)
{

        Init_Ser0();
  T1_Init();

}

Autor: Cristian Grigoruta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum funktioniert di Übertragung einer Zahl so

void main(void)
{

        Init_Ser0();
  T1_Init();

  while(!TI)
  {
          SBUF = 0x13;
    TI = 0;
  }



}
nicht??

hmm.-..Bitte helft mir weiter

Verzwifle noch :)

Autor: Cristian Grigoruta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kein interesse mir zu helfen?? hmm...ich schreib trotzdem weiter :9
Also ich bekomme (mit dem obigen Programm) am Terminal schon was nur
sind es leider irgendwelche Zeichen.

Wie kann ich es richtig machen? HELP!

Autor: Jack Braun (jackbraun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast den seriellen Interrupt freigegeben (ES=1), aber EA=1
(allgemeine Interruptfreigabe) fehlt anscheinend.

Autor: Willi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Jack Braun (jackbraun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grad ist mir noch was aufgefallen:
Der Reloadwert für 9600Baud ist F3, also 243dezimal nicht 249.

Autor: Jack Braun (jackbraun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein falsch, das wäre ja für 4800 bei gesetztem SMOD. 9600 geht mit
Timer 1 und 12MHz gar nicht.

Autor: Cristian Grigoruta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
9600 geht mit T1 nicht?
 Warum?

Autor: Cristian Grigoruta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm...mit dem EA hat es nichts zu tun gehabt. Läuft noch immer nicht.
Es freut mich aber das ihr mir helft. Danke!

Mfg Cri

Autor: Jack Braun (jackbraun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also:
Baudrate = (2*12000000):(32*12*[256-249])
         = 24000000:2688
         = 8928,57
Um auf 9615 Baud zu kommen, müsstest Du TH1 mit 249,5 laden, was aus
begreiflichen Gründen nicht geht. Deswegen bekommst Du auch Mist, weil
zwar die ersten Bits noch erkannt werden, aber dann driften die beiden
Baudraten immer mehr auseinander (ich meine während der 8 Bit) so daß
nur Quatsch rauskommt. Nimm doch als Reloadwert F3 (243), dann hast
Du 4807 Baud, das stimmt dann mit dem PC (4800Baud) gut überein.

Autor: Cristian Grigoruta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne das wars auch nicht...
Ich bekomme noch immer irgendwelche Zeichen.
z.B. °|- oder rechteckige schwarze Kästchen.

hmm...stimmt mein Code eigentlich?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sende mal was anderes.
Probier mal 0x41
Auf Deinem Terminal müsste ein 'A' erscheinen.

Über die Schnittstelle werden keine 'Zahlen' übertragen
sondern Zeichen. Jedes Zeichen hat einen bestimmten Code
und es wird der Code für eben jenes Zeichen übertragen,
damit das Termnial genau dieses Zeichen anzeigt.

Als nächstes googelst du mal nach 'ASCII Tabelle'. Dort
findest du die Codes.

Autor: Cristian Grigoruta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute...Habe folgendes Progi geschrieben aber ich bekomme einfach
kein Zeichen am Terminal (Tera Term =1a)

#include <AT89x52.h>
#include <stdio.h>

sbit Led = P1^0;

void uart_init (void)

{
 PCON = PCON | 0x80;
 SCON = 0x56;
 T2CON = 0x34;
 RCAP2H = 0xFF;
 RCAP2L = 0xD9;
}

void main (void)
{

 Led=0;
 uart_init();


 while (!TI)

     {

     SBUF = 0x63;
     TI = 0;

     }

}

Könntet ihr mir bitte weiterhelfen?

Autor: Jack Braun (jackbraun)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christian,

Ich habe mal zur Probe Dein C-Programm in Assembler geschrieben.
Quartz 24MHz, 19200 Baud. Zeichen werden einwandfrei empfangen.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal das:

void main (void)
{
 Led=0;
 uart_init();
 while(1) {
  while (!TI);
   TI = 0;
   SBUF = 0x63;
 }
}

Das sollte funktionieren, wenn du keinen Fehler bei der Initialisierung
hast.
Dein Original-Programm hat den Fehler in der while-Schleife:

Du sorgst dort dafür, dass SBUF immer mit einem neuen Wert beschrieben
wird, solange das TI-Flag nicht gesetzt ist. Logischerweise wird dann
der Sende-Vorgang immer neu eingeleitet, was dazu führt, dass das
TI-Flag nie gesetzt wird.

Sieh dir mein Beispiel an, das sollte funktionieren, senden also immer
den Buchstaben 'c'.

Ralf

Autor: Cristian Grigoruta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WOW!!!

Danke Ralf!
Dein progi funzt!
Habe nach SBUF noch ein while(1); reingeschrieben da er mir immer "c"
gesendet hat.
WIe kann ich nun eigentlich einen Text ausgeben?Ganz normal mit der
printf Funktion?

mfg Cri

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.