www.mikrocontroller.net

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


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/0dg0f...)
Ich habe mir dazu auch schon ein Beispiel von Atmel angeschaut:
http://www.atmel.com/dyn/resources/prod_documents/... (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:
code at 0
include 89c5131.inc 

begin:
  mov P2, #0    ;P2 mit LEDs null setzten
  mov P0, #0    ;P0 mit LEDs null setzten

  MOV SCON, #01010000b; /* uart in mode 1 (8 bit), REN=1 */
  ORL TMOD, #20h; /* Timer 1 in mode 2 */
  MOV TH1, #0FDh; /* 9600 Bds at 11.059MHz */
  MOV TL1, #0FDh; /* 9600 Bds at 11.059MHz */

  SETB TR1; /* Timer 1 run */

  mov A, #0
  call SEND_A
  
loop:
  jnb P3.2, loop_S1    ;wenn P3.2 gedrückt,
  inc P2               ;inc P2 und unten dann neu senden
  sjmp loop_S2
  
loop_S1:
  jnb P3.3, loop      ;wenn P3.3 gedrückt,
  dec P2          ;dec P2 und
  
loop_S2:            
  mov A, P2            ;P2 in Akku um dann zu senden
  call SEND_A
  call WAIT
sjmp loop



SEND_A:            ;Sendet das Zeichen, das im Akku ist
  MOV SBUF, A  
  WAIT_TILL_SEND:
    jnb TI, WAIT_TILL_SEND    ;warten, bis gesendet
    clr TI
    cpl P0.0              ;cpl, zum zeigen, dass gesendet wurde
ret


WAIT:            ;kurz warten, damit nicht zu schnell
  djnz R7, WAIT    ;hoch oder runter gezählt wird
  djnz R6, WAIT
ret

end



Empfänger:
code at 0
include 89c5131.inc 

begin:
  mov P2, #0
  mov P0, #0

  MOV SCON, #01010000b; /* uart in mode 1 (8 bit), REN=1 */
  ORL TMOD, #20h; /* Timer 1 in mode 2 */
  MOV TH1, #0FDh; /* 9600 Bds at 11.059MHz */
  MOV TL1, #0FDh; /* 9600 Bds at 11.059MHz */

  SETB TR1; timer 1 starten
  
loop:   
  JNB RI, loop  ; wenn daten empfangen
  
  mov P2, SBUF  ; auslesen und RI zurücksetzen
  CLR RI
  cpl P0.0  ;anzeigen, dass empfangen wurde
  
sjmp loop

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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das heisst:
mov p2,scon
wird geändert in:
mov a,sbuf
cpl a
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

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

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

Ralf

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dieser Code Generator ist dafür SEHR nützlich,..

http://www.ipd.uka.de/~buchmann/microcontroller/ge...

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

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Eberle (andreasjava)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.