Forum: Mikrocontroller und Digitale Elektronik Serielle Ausgabe ohne UART?


von Marius O. (marius_o)


Lesenswert?

Hallo,

Ich habe vor, an mehrere Geräte Daten seriell von einem ATMega32 zu 
übertragen (an einen Maussensor, also auch empfangen, und and ein 
Funkmodul). Ich brauche für beides natürlich nicht die UART-Genauigkeit. 
Ich frage mich jetzt nur, wie ich (zunächst in Assembler, C muss ich mir 
erst noch anschauen :D) nacheinander alle Bits eines Registers in ein 
Bit eines anderen schreiben kann. Hat jemand da bereits ein fertiges 
Stück Code oder kann mir erklären, wie ich irgendein Bit von einem 
Register an eine andere Stelle (im selben oder in einem anderen 
Register) kopieren kann?

Vielen Dank im Voraus
Marius O.

von Peter D. (peda)


Lesenswert?

Marius O. schrieb:
> Ich brauche für beides natürlich nicht die UART-Genauigkeit.

???

Wenn das eine SW-UART werden soll, brauchst Du auch immer die 
Genauigeit, also mindestens <2%, deutlich stabiler sind aber <1% Fehler.

% heißt, der Fehler ist völlig unabhängig von der Baudrate, also auch 
bei 75Baud müssen es <2% sein.


SW-UART gibts z.B. in der Codesammlung.
Natürlich müssen dann alle anderen Interrupts deutlich kürzer als eine 
Bitzeit dauern.


Peter

von Marius O. (marius_o)


Lesenswert?

Also soweit ich das verstanden habe gibt es für die Datenübertragung bei 
dem Maussensor keine Maximaldauer pro Bit, sondern lediglich eine 
Begrenzung nach unten. D.h. ich kann mir nach jedem Bit so viel Zeit 
lassen, wie ich will...
Oder stimmt das etwa nicht?

von spess53 (Gast)


Lesenswert?

Hi

>Also soweit ich das verstanden habe gibt es für die Datenübertragung bei
>dem Maussensor keine Maximaldauer pro Bit,...

Von was für einen Maussensor redest du?

> sondern lediglich eine Begrenzung nach unten. D.h. ich kann mir nach
>jedem Bit so viel Zeit lassen, wie ich will...

Das geht eigentlich nur bei einer synchronen Datenübertragung. Also mit 
zusätzlichem Takt.

MfG Spess

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

eine PS2 Maus arbeitet mit syncroner serieller Schnittstelle (11 Bit)
ebenso PS2 Tastatur

http://de.wikipedia.org/wiki/PS/2-Schnittstelle

von spess53 (Gast)


Lesenswert?

Hi

>eine PS2 Maus arbeitet mit syncroner serieller Schnittstelle (11 Bit)
>ebenso PS2 Tastatur

11 Bit müsste sowieso in Software gemacht werden. Selbst die UARTs der 
AT90PWMxxx haben zwischen 9 und 13 Bit eine Lücke.

MfG Spess

von Marius O. (marius_o)


Lesenswert?

Sry hatte den Maussensor vergessen... Es ist ein Avago ADNS-2051, der 
über einen SDIO und einen SCLK Pin verfügt... da der Takt damit also vom 
Mikrocontroller bestimmt wird, ist die Frequenz doch eigentlich egal 
oder nicht? (Solang ich mich an die Wartezeiten aus dem Datenblatt 
halte)

Meine Frage wäre daher nur, wie ich alle Bits eines Registers 
nacheinander in ein bestimmtes Bit eines anderen Registers schreiben 
kann. Mir ist nämlich keine saubere Lösung eingefallen. Über einen 
Denkanstoß oder ein kleines Codebeispiel wäre ich also sehr dankbar!

von Andreas B. (Gast)


Lesenswert?

Eine synchrone serielle Kommunikation musst du sowieso ohne UART machen. 
Schließlich steht das A in UART für asynchron.

Laut dem Datenblatt (ab Seite 18) ist die Kommunikation ähnlich SPI, nur 
ohne Chip Select und Ein-/Ausgang auf dem selben Pin. Das verkompliziert 
die Sache etwas, ein integriertes SPI Interface im Controller zu 
verwenden verlangt da etwas Vorsicht.

Ansonsten kann man natürlich die Übertragung einfach per Software direkt 
auf den Pins machen. Im Gegensatz zur asynchronen Übertragung ist das 
einfach.

von diesOderDas (Gast)


Lesenswert?

suchst Du so etwas?
1
.include  "m8def.inc"
2
3
.def  quelle = r16
4
.def  ziel = r17
5
.def  count = r18
6
7
.org 0x0000
8
9
  rjmp  start
10
11
start:
12
13
14
  ldi  ziel, 0
15
  ldi  count, 8
16
;  ldi  quelle, 0x55
17
  ldi  quelle, 0xAA
18
;  ldi  quelle, 0xFF
19
20
loop:
21
  lsl quelle
22
  rol ziel
23
  dec count
24
  brne loop
25
26
ende:
27
  rjmp ende

von Marius O. (marius_o)


Lesenswert?

Genau so etwas meinte ich! Vielen Dank! Da muss ich ja jetzt nur noch 
den SCLK einbauen... Die Lösung finde ich genial :D

von diesOderDas (Gast)


Lesenswert?

> ...Die Lösung finde ich genial :D

ich auch :D , weil sie nicht non mir ist.
Meine einzige Software (der oder die) Uart war für ein Colour Genie 
EG2000 für den Z80.
Die Idee dahinter ist ja, über (durch) das Carry Bit zu schieben und 
damit auswerten zu können, ob es eine Null oder eine Eins ist.
Da ich mit Z80 Assembler angefangen habe, stammt dies aus dem Z89 Buch 
von , Rodnay Zaks "Programming the Z80".

von Klaus W. (mfgkw)


Lesenswert?

Andreas B. schrieb:
> Eine synchrone serielle Kommunikation musst du sowieso ohne UART machen.
> Schließlich steht das A in UART für asynchron.

Atmega32 hat eine USART, und sie kann synchron (daher das S :-).

Hilft natürlich nichts, wenn es wegen 11 Bit etc. dann nicht
damit geht, aber der Vollständigkeit halber...

von spess53 (Gast)


Lesenswert?

Hi

>Hilft natürlich nichts, wenn es wegen 11 Bit etc. dann nicht
>damit geht, aber der Vollständigkeit halber...

Die Kommunikation mit dem adns-2051 lässt sich über 8-Bit Zugriffe 
händeln.

Der Unterschied zu SPI bzw. synchroner UART ist, das nur eine 
Datenleitung für TX und RX benutzt wird. Die Beispielsoftware im 
Datenblatt ist zwar für einen CY7C63000. Ist aber aus meiner Sicht 
problemlos auf einen AVR umsetzbar.

MfG Spess

von asdfghjklöä# (Gast)


Lesenswert?

Winfried J. schrieb:
> eine PS2 Maus arbeitet mit syncroner serieller Schnittstelle (11 Bit)
> ebenso PS2 Tastatur

8 + 3 ist zwar 11, aber start + 8 + parity + stop sind immer noch 8 
datenbits...

von spess53 (Gast)


Lesenswert?

Hi

>8 + 3 ist zwar 11, aber start + 8 + parity + stop sind immer noch 8
>datenbits...

Es ist aber keine UART mit Start-,Parity- und Stopbit(s). Und es hat 
auch nichts mit 11 Bit zu tun.

MfG Spess

von Metatron (Gast)


Lesenswert?

Lustig, ich hab genau den Chip letztens erst missbraucht.
Ich hab das ganze aber in C gemacht.

Ich kann dir empfehlen, die eingebaute SPI Schnittstelle des Megas zu 
nehmen.
Die Ein- Ausgangsleitungen verbindest du zu deiner Gemeinsamen 
Kommunikationsleitung. SS und Clock ganz normal an den Sensor.

Schreiben an den Maussensor ist komplett unproblematisch. Lesen wird 
wegen den verbundenen Sende und Empfangsleitungen etwas schwieriger. Das 
Problem is folgendes:
SPI gibt nur eine Clock aus wenn auch Daten gesendet werden.

Zum lesen erst des Register an die Maus schicken das gelesen werden soll 
(ich glaub war 1 bit zur Auswahl ob lesen oder schreiben+7 bit adresse).

Dann wartest die Zeit die im Datenblatt steht, schaltest die Richtung 
des Ausgangspins am Mega um auf Eingang (damit nix gesendet werden kann 
(HI-Z)) und schickst ein Byte beliegeber daten auf den SPI (wird ja eh 
nicht gesendet).

Die Antwort kannst du ganz normal auslesen. Wenn du doch mal ne richtige 
Programmiersprache lernen willst kann ich dir gerne meinen Code 
schicken.

Beste Grüße,

Metatron

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.