Forum: Mikrocontroller und Digitale Elektronik AVR-SPI zu schnell, was tun?


von Hubert F. (hubsif)


Lesenswert?

Hallo miteinander!

Ich habe folgendes Problem:
Ich möchte mit einem AVR mega128 über SPI ein Device ansprechen,
welches laut Datenblatt allerdings nur eine Maximalgeschwindigkeit von
40KHz unterstützt.
Der uC allerdings läuft mit 16MHz und hat meines Erachtens einen
Prescaler von höchstens 128, was immer noch 125KHz SPI Clock bedeuten
würde.

Also was tun jetzt?
Kann man die USART verwenden? Selbst implementieren? Wie ist das mit
zeitkritischen Problemen?

Vielen Dank!
hubert.

von SeppK (Gast)


Lesenswert?

Hmmm....Du bist dir schon im Klaren darüber, dass man den mega128 auch
mit anderen Takten laufen lassen kann??? (siehe Fuse-Bits, anderer
Quarz)

von Michael Wilhelm (Gast)


Lesenswert?

Wenn der Systemtakt so hoch sein muss, habe ich nur eine Idee: schiebe
die Daten mit dem SPI-Takt in ein Schieberegister (z. B. 74HC595) und
takte langsam die Daten zu deinem Device.

MW

von Hannes L. (hannes)


Lesenswert?

Wie wäre es mit Software-SPI (nebenbei im Timer-Interrupt)?
Oder ein effizienteres Programm, das eine vernünftige Taktrate
ermöglicht?

...

von Hubert F. (hubsif)


Lesenswert?

Danke!

@SeppK: Bin ich mir im Klaren. Er soll aber so schnell laufen...

@HanneS: Das mit Software-SPI klingt gut. Sind da fertige Bibliotheken
verfügbar (am besten in C)?

Danke!
hubert.

von Hannes L. (hannes)


Lesenswert?

> Das mit Software-SPI klingt gut. Sind da fertige Bibliotheken
> verfügbar (am besten in C)?

Hmmmm...
Ist es denn so schlimm, in einem Timer-Interrupt, der sicherlich noch
andere Aufgaben nebenher erledigen kann, einen Taktimpuls an einem Pin
zu erzeugen und den zugehörigen Logikpegel an einen anderen Pin zu
legen und einen Logikpegel von einem anderen Pin einlesen?

Braucht man dazu eine fertige Bibliothek?

...

von Sebastian Heyn (Gast)


Lesenswert?

@hannes lux: ich kenne das problem manchmal liesst man daten ein, die so
schnell kommen dass man mit 1 mhz einfach nicht mehr hinkommt.

von Hannes L. (hannes)


Lesenswert?

> ich kenne das problem manchmal liesst man daten ein, die so
> schnell kommen dass man mit 1 mhz einfach nicht mehr hinkommt.

Das mag bei größeren Projekten schon mal der Fall sein, aber auch da
kann man durch geschickte Interrupt-Programmierung die Rechenleistung
optimal nutzen.

Um Missverständnisse zu vermeiden: Ich rede von Assembler und habe mit
dem Mega128 noch nicht gearbeitet.

...

von Spess53 .. (hardygroeger)


Lesenswert?

Hi

Der m128 besitzt ein XDIV register, evtl. könntest du für die Zeit der
Übertragung die Taktfrquenz verringern. Nach meiner Rechnung könnte man
41,67 kHz erreichen. Meinesachtens stimmt aber die Formel im Datenblatt
nicht. Ich würde mal mit Fclk/(128-XDIV) rechnen.

MfG HG

von Spess53 .. (hardygroeger)


Lesenswert?

Hi

Ich muß mich korrigieren: Die Formel im Datenblatt stimmt.

MfG HG

von Andreas Häusler (Gast)


Angehängte Dateien:

Lesenswert?

Hi

> Ich kenne das problem manchmal liesst man daten ein, die so
> schnell kommen dass man mit 1 mhz einfach nicht mehr hinkommt.

SPI ist ein synchroner Bus, das verpasst Du gar nichts, wenn Du über
den Clock nichts einliest. Das kannste mit 1Hz oder mit 1MHz einlesen,
ist egal.

Im Anhang findest Du den C-Source für die Ansteuerung eines SPI FRAM's
von Ramtron.
Bitte häng mich nicht daran auf. Der Code habe ich mal für einen
raschen Test geschrieben und ist nicht überarbeitet. (Geschrieben für
einen H8S-2378 Renesas Controller)

Vielleicht kannst Du ja was davon brauchen.

Musst übrigens in Deiner Applikation aufpassen, das Du den richtigen
SPI Mode verwendest. (Steht im Datenblatt) Mein Code verwendet Mode 3.

Gruss Andy

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.