mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Serielle Ausgabe ohne UART?


Autor: Marius O. (marius_o)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Marius O. (marius_o)
Datum:

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

Autor: spess53 (Gast)
Datum:

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

Autor: Winfried J. (Firma: Nisch-Aufzüge) (winne)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eine PS2 Maus arbeitet mit syncroner serieller Schnittstelle (11 Bit)
ebenso PS2 Tastatur

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

Autor: spess53 (Gast)
Datum:

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

Autor: Marius O. (marius_o)
Datum:

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

Autor: Andreas B. (Gast)
Datum:

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

Autor: diesOderDas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
suchst Du so etwas?

.include  "m8def.inc"

.def  quelle = r16
.def  ziel = r17
.def  count = r18

.org 0x0000

  rjmp  start

start:


  ldi  ziel, 0
  ldi  count, 8
;  ldi  quelle, 0x55
  ldi  quelle, 0xAA
;  ldi  quelle, 0xFF

loop:
  lsl quelle
  rol ziel
  dec count
  brne loop

ende:
  rjmp ende


Autor: Marius O. (marius_o)
Datum:

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

Autor: diesOderDas (Gast)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: spess53 (Gast)
Datum:

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

Autor: asdfghjklöä# (Gast)
Datum:

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

Autor: spess53 (Gast)
Datum:

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

Autor: Metatron (Gast)
Datum:

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

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.