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
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.
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
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.
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?
Du brauchst doch einfach nur den UART initialisieren. Also in Deinem Fall Modus 2 im SCON (SM0=1, SM1=0, REN=1).
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
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(); }
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 :)
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!
Du hast den seriellen Interrupt freigegeben (ES=1), aber EA=1 (allgemeine Interruptfreigabe) fehlt anscheinend.
Grad ist mir noch was aufgefallen: Der Reloadwert für 9600Baud ist F3, also 243dezimal nicht 249.
nein falsch, das wäre ja für 4800 bei gesetztem SMOD. 9600 geht mit Timer 1 und 12MHz gar nicht.
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
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.
ne das wars auch nicht... Ich bekomme noch immer irgendwelche Zeichen. z.B. °|- oder rechteckige schwarze Kästchen. hmm...stimmt mein Code eigentlich?
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.
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?
Hallo Christian, Ich habe mal zur Probe Dein C-Programm in Assembler geschrieben. Quartz 24MHz, 19200 Baud. Zeichen werden einwandfrei empfangen.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.