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.
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
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?
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
eine PS2 Maus arbeitet mit syncroner serieller Schnittstelle (11 Bit) ebenso PS2 Tastatur http://de.wikipedia.org/wiki/PS/2-Schnittstelle
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
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!
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.
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 |
Genau so etwas meinte ich! Vielen Dank! Da muss ich ja jetzt nur noch den SCLK einbauen... Die Lösung finde ich genial :D
> ...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".
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...
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
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...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.