Forum: Mikrocontroller und Digitale Elektronik Mutiprozessorkommunikation?


von Cristian Grigoruta (Gast)


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

von Jürgen (Gast)


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.

von Cristian Grigoruta (Gast)


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

von Karl H. (kbuchegg)


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.

von Cristian Grigoruta (Gast)


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?

von Jack B. (jackbraun)


Lesenswert?

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

von Cristian Grigoruta (Gast)


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

von Cristian Grigoruta (Gast)


Lesenswert?

oder wie sende ich einen Text vom µC zum PC?

von Jack B. (jackbraun)


Lesenswert?

Genau, und nach dem Senden TI wieder löschen.

von Jack B. (jackbraun)


Lesenswert?

Zur zweiten Frage: Zeichen für Zeichen in einer Schleife.

von Cristian Grigoruta (Gast)


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();

}

von Cristian Grigoruta (Gast)


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 :)

von Cristian Grigoruta (Gast)


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!

von Jack B. (jackbraun)


Lesenswert?

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

von Willi (Gast)


Lesenswert?


von Jack B. (jackbraun)


Lesenswert?

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

von Jack B. (jackbraun)


Lesenswert?

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

von Cristian Grigoruta (Gast)


Lesenswert?

9600 geht mit T1 nicht?
 Warum?

von Cristian Grigoruta (Gast)


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

von Jack B. (jackbraun)


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.

von Cristian Grigoruta (Gast)


Lesenswert?

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

hmm...stimmt mein Code eigentlich?

von Karl H. (kbuchegg)


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.

von Cristian Grigoruta (Gast)


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?

von Jack B. (jackbraun)


Angehängte Dateien:

Lesenswert?

Hallo Christian,

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

von Ralf (Gast)


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

von Cristian Grigoruta (Gast)


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

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.