Hallo, ich bekomme von einem Prozessor über SPI Datenworte mit 16 Bit übertragen, die ich gerne mit einem Mega 16 empfangen möchte. Es gibt keine Pause nach 8 Bit. Geht das mit Atmega und co? Was ist der maximale externe Takt? 20 MHz /2 bei 20 MHz Quarz? Wäre nett wenn ich ein paar Tips bekommeen könnte Grüße
...Es gibt keine Pause nach 8 Bit.... Im Atmel schon, nach einem empfangenen Byte gibts ein Flag bzw. Interruppt. du hast dann "ein Byte lang" Zeit, das da rauszulesen, bevor das nächste kommt...
dann must du ein array bauen und die daten reinschieben.welchen compiler benutzt du ??
The clock rate selects the division of the of the oscillator frequency that serves as the SPI clock. So with 4 you will have a clockrate of 4.000000 / 4 = 1 MHz , when a 4 MHZ XTAL is used.
aaa wrote: > dann must du ein array bauen und die daten reinschieben.welchen compiler > benutzt du ?? Hallo aaa, das mit dem Array ist kein Problem solange ich es in C programmiere. Verwende GCC. Auf jeden Fall hört sich das alles schon mal gut an.
aaa wrote: > The clock rate selects the division of the of the oscillator frequency > that serves as the SPI clock. So with 4 you will have a clockrate of > 4.000000 / 4 = 1 MHz , when a 4 MHZ XTAL is used. Hi, the smallest div for SPI is 2- that means it can work with 10 MHz!? thx
@ Mathias Die Daten liegen ohne Pause an. Wenn also der Atmel nach 8 Bit eine Pause macht, dann gehen die nächsten 8 Bit verloren da der Master diese Pause nicht macht. Der Master interessiert sich nicht für die Pause die sich der AVR gönnt, sondern taktet stur weiter. Die Frage lautet doch einfach ausgedrückt: Können die AVR's ein 16 Bit datenwort empfangen, oder können die AVR's nur 8 Bit. ==> Wieviele Bit hat das Schieberegister. @Michael Kannst du die 16 Bitübertragung in 2 x 8Bit aufteilen, oder kommst du da nicht ran ? Falls es nicht geht wirst du dir anstatt der AVR's einen µC suchen müssen, der an der SPI 16 Bitworte unterstützt. z.B. ARM 7
Hey Ralph, habe das schon befürchtet- z.B. Arm 7. Aber warum sollte der AVR 8 Bit vergessen? Soweit ich gelesen habe, ist das Register doppelt gepuffert- Dann müsset es doch klappen. 8 Bit werden übernommen, wenn diese eingetroffen sind. Dann kann ich 8 auslesen, währen die nächsten 8 eintreffen. Ich komme da nicht rsan was gesendet wird- sonst wärs ja kein Problem. Michael
also so viel ich weiss kann man die SPI schnittstelle auch per software nachbilden,
> Soweit ich gelesen habe, ist das Register doppelt gepuffert- Dann müsste > es
doch klappen. 8 Bit werden übernommen, wenn diese eingetroffen sind. > Dann kann
ich 8 auslesen, währen die nächsten 8 eintreffen.
Das Datenblatt sagt dazu:
When receiving data, however, a received character must be read from the
SPI Data Register before the next character has been completely shifted
in. Otherwise, the first byte is lost.
Es sollte also tatsächlich klappe(r)n.
Ich kenne die AVR Struktur nicht gut genug um dir das genau sagen zu können. Aber es gibt hier im Forum schon genug Spezi's. Nur der Master taktet die Daten stur raus. Wenn der AVR nur ein 8 Bit Schieberegister hat, vergeht einige Zeit für das Verschieben der 1. 8 Bit ins Pufferregister. Der Master taktet weiter. Die Frage ist, ob das Timing dann noch hinkommt , oder ob dabei Bits verloren gehen. Eine zuverlässige Übertragung wirst du nur hinbekommen wenn dein µC ein 16 Bit Schieberegister hat.
Ich sehe zu, das ich morgen die Signale etwas bügel und mir nen 20 MHz Quartz besorge. Dann teste ich es morgen- ich denke theoretisch sollte es klappen.
@ Dieter Das funktioniert aber nur wenn du garantieren kannst das der IRQ, um das Datenbyte zu lesen, abgeabeitet ist, BEVOR das 2. Byte übertragen ist. Wie willst du das garantieren können? @ aaa Welche Datenrate ist denn mit einer Softwarenachbildung der SPI erreichbar? Ich bezweifele das eine Softwarelösung schnell genug ist. "Was ist der maximale externe Takt? 20 MHz /2 bei 20 MHz Quarz?"
Nein bei den Zeiten werde ich wohl einen Loop um die Abfrage nach einem neuen Byte drum bauen. Da kommen mehrere Datenworte rein und dann ist erst mal Pause. Die Pause ist fest und dann habe Zeit für andere Sachen. Und man kann sich die Dauer der Opereationen ausrechen, bzw. ausmessen. Michael
...Wenn also der Atmel nach 8 Bit eine Pause macht, dann g... nein, das habe ich nicht gesagt: Der Atmel (die Hardware) informiert die Applikation (Sotfware) nach dem Empfang von 8bit = 1Byte, dass ein Byte eingetrudelt ist. Währenddessen kann das nächste Byte (bei dir: die nächsten 8bits) hereingeschoben werden. BEVOR dieses zweite Byte (deine nächsten 8bit) komplett hereingeschoben ist, musst du dieses abgeholt haben, sonst ist das erste verloren! ich zitiere Dieter Werner (Gast) ... When receiving data, however, a received character must be read from the SPI Data Register before the next character has been completely shifted in. Otherwise, the first byte is lost. Also, es geht definitiv! Wenn du aber mit dem Atmel Daten empfängst, also im Slavemode, kann die max. SPI-Taktfrequenz nur ein Viertel des Quartztaktes sein (glaub das war so). Also bei deinen 20MHz würdest du auf 625kByte/s kommen und hättest somit 1,6µsek Zeit, das Byte abzuholen..
@aaa Wie denn sonst? für Polling musst du auf dem µC viel "freie" Zeit haben. Hat dein µC mehr zu tun als die SPI bleibt gar nichts anderes übrig.
@ Ralph (Gast): Was anderes als Polling ist definitiv NICHT möglich! Ein Interrupteinsprung+raus dauert länger als ein Byte zu übertragen! (1Byte=8bits=8*4=32Quartztakte= ~16..32ASM Befehle...) Ich habe ähnliche Versuche (nur halt µC als Master) schon gemacht. Ohne Interrupt hab ichs geschafft, 24Bytes in 35µsek aus einem nicht sortierten Array zu holen und komplett zu versenden..
1,6µsek Zeit für den Einsprung in die IRQ Routine und auslesen des 1. Bytes. Ein Strammes Timing, wie willst du garantieren das du das einhalten kannst.
@Michael Du solltest mal ernsthaft darüber nachdenken, ob der AVR Mega der richtige µC für DIESE Anwendung ist. Ich hab da meine Zweifel. Ein µC der 16 Bit SPI hardwareseitig unterstützt wäre hier wesentlich sinnvoller.
Der Master gibt den Takt an und sofern der Slave das SPI Protokoll richtig unterstützt, was wir nunmal vorraussetzen, dann sollte das kein Problem sein erst das eine Byte und anschließend das andere Byte auszulesen. Der Slave muss doch zwangsweise warten, bis der Master weitertaktet. Das hat nichts mit irgendeiner internen Pufferung zu tun. Einziges Problem das auftreten könnte, ist, dass das slave device einen gewissen timeout hat und somit eine Übertragung abbricht, falls diese nicht in einer gewissen Zeitspanne stattgefunden hat. Einfach um zu gewährleisten, dass es nicht selber in einem Endlos-Wartezustand hängt. Das ganze halte ich aber für eher unwarscheinlich.
@keksladen Der SLAVE macht die Pause. Der MASTER taktet die 16 Bit ohne Unterbrechung durch.
Der Slave macht keine Pause! Das Schieberegister ist drekt mit dem Takt des Masters verbunden!
versuch mal ein schiebe register einzubauen.. MC74HC589A http://www.onsemi.com/pub/Collateral/AND8148-D.PDF
Ralph wrote: > 1,6µsek Zeit für den Einsprung in die IRQ Routine und auslesen des 1. > Bytes. > Ein Strammes Timing, wie willst du garantieren das du das einhalten > kannst. So schwer zu garantieren ist das nun wirklich nicht... Der Einsprung in die ISR dauert je nach gerade ausgeführtem Befehl 4 Takte macht bei 20Mhz: 0,2µs Dann mußt du das Byte holen und Speichern, also etwa so: push r17 in r17, SPIDATABYTE st Z+, r17 pop r17 sind 5 Takte also 0,25µs man sollte natürlich noch ein reti durchführen das sind nochmal 2 Takte also 0,1µs Summa Summarum komme ich auf 0,55µs bleiben dir noch 1,05µs oder 21 Takte um irgenwas anderes zu machen. Also soooo stramm find ich das Timing nicht, man sollte halt dann keine anderen Interupts am laufen haben, aber das ist bei der Polling Variante ebenso. Warum wird eigentlich immer gleich nach nem größeren Prozessor geschrien ohne es mal einfach zu probieren?
Du hast folgendes vergessen: Z Register muss initialisiert werden somit muss es auch gesichert und zurückgeholt werden.. Und jetzt mache das mal in C...
Ich seh in der Frage nix mit C... Und klar sollte man das Z register am Anfang mal initialisieren, seh ich aber nicht das Problem drin er sagt ja er hat zwischendrinn ne pause und das Z-Reg zu pushen und zu popen ist ja mal dämlich, der witz ist doch das der Pointer automatisch incrementiert wird und ich beim nächstenmal nicht auf die gleiche Speicherstelle schreib. Sorry C mag ja komfortabel sein, aber manchmal sollte man ASM auch nicht ausser Acht lassen.
Hallo, das wird ja eine rege Diskussion. Ich habe 15 cm Flachbandleitung zwischen Sender und Empfänger- Resultat nichts mehr zu sehen vom Takt auf meinem STK 500. Daher brauche ich erst mal ein paar Tage um eine neue Platine zu machen. @ aaa: Ja ich denke das ist das beste, damit vertödel ich keine Rechenzeit beim pollen. Ich werde allerdings ein 64 Bit shift register (Habe ein 74 HC irgendwas gefunden) nehmen, damit ich keine 8 Steine einbauen muss. (Bekomme halt bis zu 64 Bit Daten). Wo wir gerade dabei sind, ein loggisch AND im Takt sollte es doch ermöglichen, zum Auslesen einen anderen Takt zu benutzen, wie fürs Reinschieben oder? @läubi Ich möchte auf jeden Fall beim ATMega bleiben, da ich die Werkzeuge dafür habe und da das ganze auch recht günstig ist Also wie geschrieben mache ich erst mal die neue Schaltung- hoffe das sieht dann besser aus. Grüße Michael
Das Timimg ist nicht soo kritisch. Als Slave kannst Du maximal 5MHz SPI-Takt noch sicher abfragen (20MHz / 4). Ein Byte wir demnach in 32 AVR-Takten übertragen. Ein einmaliges Auslesen von 2 Byte, wenn der AVR sonst nichts tut, geht ohne Interrupt am schnellsten (man benötigt keine Zeit zum Ein- und Ausspringen aus der Interrupt-Routine): loop11: sbis spsr,spif rjmp loop11 in R17, Spdr loop12: sbis spsr,spif rjmp loop12 in R18, Spdr Die Frage ist eher, wieviele dieser 16Bit-Werte Du in welchem Zeitraum speichern und verarbeiten mußt.
32 bit ist für den hobby breicht einfach TO MUCH-der C -compiler ist sau teuer und die hartware ebenfalz.ausserdem gibts keine alternative als C basic oder pascal compiler gibts dafür nicht.
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.