Forum: Mikrocontroller und Digitale Elektronik USART synchroner Modus Frage


von Philipp B. (phbu)


Angehängte Dateien:

Lesenswert?

Hallo Forumnutzer,

mein erster Beitrag mit einer wahrscheinlich sehr einfachen Frage.

Im Anhang seht Ihr die Beschaltung für den USART im synchronen Modus.
Den USART des ATtiny2313 für den Master initialisiere ich wie folgt:
1
#ifndef F_CPU
2
#define F_CPU 1000000UL
3
#endif
4
#define BAUD 9600
5
#define UBRR_VAL (F_CPU/(2*BAUD))-1
6
#define RxD PD0
7
#define TxD PD1
8
#define XCK PD2
9
10
/* Eingänge/Ausgänge definieren */
11
DDRD=(0<<RxD)|(1<<TxD)|(1<<XCK); // Datenrichtungsregister D definieren
12
/* USART initiailisieren */
13
UBRRH=(uint8_t)UBRR_VAL>>8; // Baudrate (9600) einstellen
14
UBRRL=(uint8_t)UBRR_VAL&0xFF; // Baudrate (9600) einstellen
15
UCSRB=(1<<RXEN)|(1<<TXEN); // Receiver aktivieren, Transmitter aktivieren
16
UCSRC=(1<<UMSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(1<<UCPOL); // synchroner Modus, 2 Stop-Bits, 8 Bit-Zeichen, Polarität umkehren

Wie Ihr in der ersten Codezeile sehen könnt, ist XCK (PD2) als Ausgang 
beschaltet. Beginnt der Controller dann sofort mit der Taktung an XCR 
(=> er ist der Master)?
Bei den Slaves (andere AVRs) wird XCK einfach als Eingang definiert, 
damit dieser einen Takt empfängt, richtig?

In der letzten Codezeile ist das UCPOL-Bit auf 1 gesetzt. Bei den Slaves 
müssen doch dann theoretisch die UCPOL-Bits auf 0 gesetzt werden, oder?

Danke im Voraus!

Mit freundlichen Grüßen
PHBU

von Dussel (Gast)


Lesenswert?

Philipp Buchmann schrieb:
> Bei den Slaves müssen doch dann theoretisch die UCPOL-Bits
> auf 0 gesetzt werden, oder?
Warum? Bei einer fallenden Flanke werden die Daten geändert, bei einer 
steigenden liegen sie fest an und können übernommen werden. Das gilt für 
Master und Slave. Umgekehrt natürlich bei umgekehrte Taktpolarität.

Philipp Buchmann schrieb:
> Wie Ihr in der ersten Codezeile sehen könnt, ist XCK (PD2) als Ausgang
> beschaltet.
Philipp Buchmann schrieb:
> Bei den Slaves (andere AVRs) wird XCK einfach als Eingang definiert,
> damit dieser einen Takt empfängt, richtig?
Nach dem ATMega8-Datenblatt muss das nicht sein. Die Pinfunktion wird 
vom USART 'überschrieben'. Ich denke, dass das bei allen AVR so ist.

von Philipp Buchmann (Gast)


Lesenswert?

Hallo Dussel!

Also zusammengefasst:

- UCPOL ist bei Master und Slave gleich
- an dem DDRD bruache ich nichts zu ändern

Dussel schrieb:
> Nach dem ATMega8-Datenblatt muss das nicht sein. Die Pinfunktion wird
> vom USART 'überschrieben'. Ich denke, dass das bei allen AVR so ist.

Gehe dann davon richtig aus, dass sobald ich in das UBRRH- bzw. 
UBRRL-Register einen Wert (in meinem Fall UBRR_VAL) schreibe, der AVR 
dann XCK automatisch taktet bzw. als Master ansieht?
Und bei den anderen AVRs schreibe ich keinen Wert in UBBRx und diese 
werden dann automatisch als Slave betrachtet (XCK=Input), oder?

Danke nochmal für die Antwort!

MfG
PHBU

von Dussel (Gast)


Lesenswert?

Philipp Buchmann schrieb:
> Also zusammengefasst:
>
> - UCPOL ist bei Master und Slave gleich
> - an dem DDRD bruache ich nichts zu ändern
Garantieren kann ich es nicht, aber so habe ich es verstanden.

Philipp Buchmann schrieb:
> Gehe dann davon richtig aus, dass sobald ich in das UBRRH- bzw.
> UBRRL-Register einen Wert (in meinem Fall UBRR_VAL) schreibe, der AVR
> dann XCK automatisch taktet bzw. als Master ansieht?
Nein. Du musst den Sender oder Empfänger einschalten über RXEN oder TXEN 
(ATMega8). Allerdings weiß ich gerade nicht, wie man Master und Slave 
bestimmt. Was passiert, wenn man bei beiden Controllern den Sender 
einschaltet und sendet? Versuchen dann beide, CLK zu treiben? Das steht 
sicher im Datenblatt, aber ich muss jetzt weg.
Das weiß aber sicher jemand hier.

von Philipp B. (phbu)


Lesenswert?

Hallo nochmal,
1
When using synchronous mode (UMSEL = 1), the Data Direction Register for the XCK
2
pin (DDR_XCK) controls whether the clock source is internal (Master mode) or external (Slave
3
mode). The XCK pin is only active when using synchronous mode.

Es soll angeblich ein DDR_XCK-Register existieren. Problem nur: Wie 
greife ich darauf zu?

Wenn ich einfach
1
DDR_XCK=0xFF

schreibe, sagt der Compiler, dass er dieses Register nicht kennt...

Hat einer schon Erfahrung mit diesem Register? Oder liegt es in einer 
bestimmten include-Datei, die ich noch nicht eingebunden habe?

MfG

PHBU

von Stefan E. (sternst)


Lesenswert?

DDR_XCK = DDRD

von Philipp B. (phbu)


Lesenswert?

ALso muss ich doch DDRD (Pin XCK) auf 1 setzen beim Master und auf 0 
beim Slave, richtig?

von Stefan E. (sternst)


Lesenswert?

Ja.

von Philipp B. (phbu)


Lesenswert?

Alles klar, vielen Dank!
Dann werde ich die Schaltung mal irgendwann ausprobieren!

Danke nochmal für Eure Hilfe!

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.