Forum: Mikrocontroller und Digitale Elektronik 2x AT89c5131A-M über die serielle Schnittstelle verbinden


von Andreas (Gast)


Lesenswert?

Hallo Zusammen,

zur Zeit arbeite ich an einem Projekt, bei dem ich von einem AT89c5131 
Daten zu einem anderen AT89c5131 über die serielle Schnittstelle 
schicken will.
(Datenblatt AT89c5131A-M: 
http://www.datasheetcatalog.org/datasheet2/b/0dg0f53fro9asl4j6ur7gy5jrzfy.pdf)
Ich habe mir dazu auch schon ein Beispiel von Atmel angeschaut:
http://www.atmel.com/dyn/resources/prod_documents/doc4346.pdf (Seite 17)

Aber leider gelang es mir nicht so ganz das zu verstehen und oder zum 
Laufen zu bringen.
Angeschlossen habe ich die beiden µCs wie folgt: Vom Sender-µC gehe ich 
vom Port 2 (Out) der Seriellen Schnittstelle an den Port 3 (In) der 
S-Schnittstelle des Empfangs-MC.

Meine bisherigen Ergebnisse sind so:
Ich kann Daten senden. Der Empfangs µC empfängt auch jedese mal ein 
Byte, wenn ich eins sende. Aber leider sind die Daten Schrott. Eine 0 
wird zur 128, eine 1 zu 127, eine 2 zu 63, eine 3 zu 126...
ABER: Wenn ich beide µCs resete, und wieder die gleichen Werte sende 
(0,1,2,3...), dann wird am Empfangs-µC auch wieder genau das Gleiche wie 
zuvor empfangen (128,127,63,126...)


Hier nun mal mein Code: Ich habe Ihn mit Ride von Raisonance 
geschrieben:
Sender:
1
code at 0
2
include 89c5131.inc 
3
4
begin:
5
  mov P2, #0    ;P2 mit LEDs null setzten
6
  mov P0, #0    ;P0 mit LEDs null setzten
7
8
  MOV SCON, #01010000b; /* uart in mode 1 (8 bit), REN=1 */
9
  ORL TMOD, #20h; /* Timer 1 in mode 2 */
10
  MOV TH1, #0FDh; /* 9600 Bds at 11.059MHz */
11
  MOV TL1, #0FDh; /* 9600 Bds at 11.059MHz */
12
13
  SETB TR1; /* Timer 1 run */
14
15
  mov A, #0
16
  call SEND_A
17
  
18
loop:
19
  jnb P3.2, loop_S1    ;wenn P3.2 gedrückt,
20
  inc P2               ;inc P2 und unten dann neu senden
21
  sjmp loop_S2
22
  
23
loop_S1:
24
  jnb P3.3, loop      ;wenn P3.3 gedrückt,
25
  dec P2          ;dec P2 und
26
  
27
loop_S2:            
28
  mov A, P2            ;P2 in Akku um dann zu senden
29
  call SEND_A
30
  call WAIT
31
sjmp loop
32
33
34
35
SEND_A:            ;Sendet das Zeichen, das im Akku ist
36
  MOV SBUF, A  
37
  WAIT_TILL_SEND:
38
    jnb TI, WAIT_TILL_SEND    ;warten, bis gesendet
39
    clr TI
40
    cpl P0.0              ;cpl, zum zeigen, dass gesendet wurde
41
ret
42
43
44
WAIT:            ;kurz warten, damit nicht zu schnell
45
  djnz R7, WAIT    ;hoch oder runter gezählt wird
46
  djnz R6, WAIT
47
ret
48
49
end



Empfänger:
1
code at 0
2
include 89c5131.inc 
3
4
begin:
5
  mov P2, #0
6
  mov P0, #0
7
8
  MOV SCON, #01010000b; /* uart in mode 1 (8 bit), REN=1 */
9
  ORL TMOD, #20h; /* Timer 1 in mode 2 */
10
  MOV TH1, #0FDh; /* 9600 Bds at 11.059MHz */
11
  MOV TL1, #0FDh; /* 9600 Bds at 11.059MHz */
12
13
  SETB TR1; timer 1 starten
14
  
15
loop:   
16
  JNB RI, loop  ; wenn daten empfangen
17
  
18
  mov P2, SBUF  ; auslesen und RI zurücksetzen
19
  CLR RI
20
  cpl P0.0  ;anzeigen, dass empfangen wurde
21
  
22
sjmp loop
23
24
end


im Moment ist für mich erst mal wichtig, dass ich überhaupt mal Daten 
über die Serielle Schnittstelle an den zweiten µC schicken kann und die 
auch noch als Daten ankommen.
Allerdings muss ich dann später auch ohne den Timer1 auskommen, da ich 
den anderweitig im Projekt brauche! Wenn mir also einer sagen kann, wie 
ich SCON, PCON und das ganze Zeugs konfigurieren muss (ich verstehs im 
AT89c5131A-M-Datenblatt einfach nicht), dann wäre ich euch sehr 
verbunden!!

Also bereits im Voraus vielen Dank für Eure Mühe! Ich hoffe ich habe 
alles wichtige erwähnt. Falls Ihr Fragen habt, sagt mir bescheid!
MfG
Andreas

von Ralf (Gast)


Lesenswert?

Was hast du an P2? LEDs? Die werden bei 8051ern für gewöhnlich lowaktiv 
angesteuert, kann es sein, dass du ne leuchtende LED mit einer logischen 
Eins assoziierst? :)

Ralf

von Ralf (Gast)


Lesenswert?

Das heisst:
1
mov p2,scon
wird geändert in:
1
mov a,sbuf
2
cpl a
3
mov p2,a

Dann sollte es richtig rüberkommen, wenn die LEDs wie ich vermute 
lowaktiv angesteuert werden.

Wegen dem Timer 1, dann nimm den internen Baudratengenerator, auf Seite 
73 im aktuellen Datenblatt findest du die Formel für die Berechnung, auf 
Seite 75 ne Tabelle mit Werten für das BRL-Register. Die Werte kann man 
ja leicht auf andere Frequenzen umrechnen...

Ralf

von Pieter (Gast)


Lesenswert?

moin moin,

wenn Timer1 sowieso anders wo gebraucht wird, verwende doch gleich den 
Baudratengenerator:

  mov  SCON,  #0x50
  mov  T2CON, #0x34
  ;Wert = #-((X2MOD+1)*XTAL)/(32*SER_BaudRate)
  mov  RCAP2H, Hi(Wert)
  mov  RCAP2L, Lo(Wert)


mfg
Pieter

von Ralf (Gast)


Lesenswert?

@Pieter:
Wenn er den internen BRG verwenden soll, warum tauchen in deinem 
Beispiel dann Timer2-Register auf?

Ralf

von Stephan H. (stephan-)


Lesenswert?

dieser Code Generator ist dafür SEHR nützlich,..

http://www.ipd.uka.de/~buchmann/microcontroller/generator.htm

einfach die Taktfrquenz eingeben, UART auswählen und los gehts...

von Pieter (Gast)


Lesenswert?

moin moin,

@Ralf
>>Timer 2 has 3 operating modes: capture, auto reload and Baud Rate >>Generator. 
These modes are selected by the combination of RCLK, TCLK and >>CP/RL2 (T2CON).

@Stephan
bei Erik gibs doch "nur" Timer0&1...

mfg
Pieter

von Ralf (Gast)


Lesenswert?

@Pieter:
Ja, okay, das ist ne Standardfunktion vom T2, aber das Teil hat doch 
einen separaten Baudratengenerator, dann kann (und sollte) er gleich den 
nehmen :)

Ralf

von Stephan H. (stephan-)


Lesenswert?

@Pieter,

darum ging es :

>> Wenn mir also einer sagen kann, wie ich SCON, PCON und das ganze Zeugs
>> konfigurieren muss (ich verstehs im AT89c5131A-M-Datenblatt einfach
>> nicht),

das kann der Generator.
Das dann umzumodeln ist ja keine Hürde.

von Pieter (Gast)


Lesenswert?

moin moin,

beim 5131AM verwende ich als XTAL 24MHz wegen USB. Dann ist Essig mit 
z.B. 115200 mit dem BRG zu erreichen. Mit Timer2 gehts dann aber immer 
noch.

mfg
Pieter

von Pieter (Gast)


Lesenswert?

moin moin,

@Stephan,

nur das Timer2 ganz anders als Timer0/1 konfiguriert wird ...8-(

mfg
Pieter

PS: Das Problem im MASM51 ist behoben, neue Version gibts Montag...

von Stephan H. (stephan-)


Lesenswert?

@Peter,
schön zu hören,....
Wollte Dir ja eigentlich mal das Beispiel senden.
Aber hier ist schon wieder DRAMA !!

Sicher ist Timer 2 anders. Captureregister....
Aber er will ja auch erst später den Timer freimachen.

von Andreas E. (andreasjava)


Lesenswert?

Problem gelöst!
An meinem Sender-µC war der Max232N hinüber... deshalb hat der Schrott 
gesendet.
Und die Konfiguration der Baudrate hab ich nun auch.

trotzdem danke!

mfg
Andreas

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.