2x AT89c5131A-M über die serielle Schnittstelle verbinden

Gast #1216537
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
Gast #1216858
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

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