Mutiprozessorkommunikation?

Gast #323431
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
Gast #323432
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.
Gast #323433
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
#323434
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.
Gast #323435
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?
Gast #323441
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();

}
Gast #323442
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 :)
Gast #323443
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!
#323450
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.
#323452
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.
Gast #323453
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?
Gast #323455
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
Gast #323456
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren