serielle Datenübertragung mit Atmel Controllern

Gast #153759
Lesenswert?

Hallo!

Ich möchte einen digitalen Lautstärkesteller von Burr- Brown ( Typ. PGA
2310 ) über einen Atmel- Controller ( z.B. den 90S2313) ansteuern.
Dieses IC empfängt 16 Bit Daten ( jeweils 8 Bit pro Kanal ) die seriell
übertragen werden müssen. Mittels "Chip Select"- Leitung wird die
Datenübertragung freigeschaltet. Wie kann ich das mit Atmel- µCs
hinbekommen? Ich habe überlegt, den UART zu verwenden, aber hier stören
die Start- und Stop- Bits. Die 16 Bits müssen direkt hintereinander und
synchron zum CPU- Takt an den PGA 2310 geschickt werden.

Vielen Dank für Ideen und Anregungen.
Gast #153762
Lesenswert?

Kann. Und muss?

Sind die zu übertragenden Daten der Audiodatenstrom oder ist das die
nur gelegentlich zu übertragende Lautstärkeeinstellung? (habe gerade
kein Datenblatt des PGA vor mir)

Wenn letzteres zutrifft, erscheint mir eine so hohe Datenrate für das
Verstellen der Lautstärke etwas unnötig.
Gast #153763
Lesenswert?

6,25 MHz ist die maximal mögliche Taktfrequenz. Übertragen wird
tatsächlich nur die Lautstärkeeinstellung, die Verarbeitung analoger
Signale findet ausschließlich im PGA 2310 statt.
Ich habe über einen Audioversand einen Bausatz entdeckt, in dem ein
Atmel 90 S 2313 für den PGA 2310 genau diese Aufgabe verrichtet. Wie
kann das mit diesem Controller ( ohne SPI, wie von A.K. oben
vorgeschlagen ) funktionieren?
Ich möchte den angebotenen Bausatz nicht nutzen, da die Einstellung der
Lautstärke über eine Tastatur vorgenommen wird, ich selbst aber mit
Drehencodern arbeiten will.
Gast #153764
Lesenswert?

Interessant ist hier also nicht die maximale, sondern die minimale
Taktfrequenz, die der PGA auf dieser Schnittstelle akzeptiert. Solange
die nicht allzu hoch ist, kann die Schnittstelle in Software per "bit
banging" implementiert werden.

Da dieses Interface dem SPI sehr ähnlich zu sein scheint, solltest Du
mal nach "software spi" suchen.
Je nach Entwicklungssystem kann das sogar eine mitgelieferte
Libraryfunktion sein. Der Basic-Compiler BASCOM beispielsweise
unterstützt Software-SPI auch mit anderen Wortlängen als 8 Bit.

Betr. Drehencoder: Hast Du Dir mal Schrittmotoren angesehen? Die kann
man wunderbar zu Drehencodern umfunktionieren, und sie haben eine sehr
"wertige" Haptik aufgrund der bewegten Masse und des Einrastens an
den Polstellen. Wenn ausreichend Platz im Gerät ist, ist so ein
Schrittmotor eine sehr schöne Alternative zu anders aufgebauten
Drehencodern. Wie die analoge Signalaufbereitung aufzubauen ist, wurde
hier des öfteren besprochen; 's ist nicht arg kompliziert.
Gast #153765
Lesenswert?

Danke für den Encoder- Tip!

Ich nutze zum Programmieren den AVR- Assembler. Weißt Du, ob hier auch
entsprechende Libraryfunktionen wie bei BASCOM existieren?

Um die analoge Signalaufbereitung brauche ich mich beim PGA 2310 nicht
zu kümmern. Dieses gute Teil besteht intern aus Widerstandsnetzwerken,
Analogschaltern und Operationsverstärkern. Das Audiosignal wird einfach
nur auf das Widerstandsnetzwerk gegeben, das entsprechend der digitalen
Ansteuerung ( in meinem Fall über den Atmel ) geschaltet wird.
Gast #153768
Lesenswert?

So wie ich das Datenblatt verstehe, ist es wirklich SPI, wobei einfach
zwei Bytes nachreinander übertragen werden; das erste für den linken
und das zweite für den rechten Kanal.

Die Daten werden mit der steigenden Flanke an SCL übernommen.
Es gibt sogar ein SDO.
Vier Anschlüsse: SCLK, SDI, SDO, /CS.
Synchrone serielle Datenübertragung... SPI!
Bei der Atmel-SPI muß man sich doch auch um das /CS selber kümmern.
Beispielcode (leider in C, da kein Programmierer über 12 Jahren noch in
Basic programmiert...[Ich möchte jetzt keinen dieser Glaubenskriege
anfangen, welche Sprache besser ist. Das ist die Aussage eines
professioneller Programmierer (nicht meine!!!)]):

void write(unsigned char rechts, unsigned char links)
{
  PORTB &= ~(1<<SlaveSelect);    // SPI-Übertragung einleiten
  SPDR = rechts;          // Write-Kommando (0x02) senden
  while (!(SPSR && (1<<SPIF)));    // Warten, bis Byte gesendet wurde
  SPDR = links;            // Register-Adresse übertragen
  while (!(SPSR && (1<<SPIF)));    // Warten, bis Byte gesendet wurde
  PORTB |= (1<<SlaveSelect);      // SPI-Übertragung beenden
}

So schwierig siehr das doch auch gar nicht aus. Alles im Poll-Betrieb.
Gast #153771
Lesenswert?

Hallo zusammen.
Ich habe ein ähnliches Problem. Ich will ein 16 Bit-Wort über die
8-Bit-Hardware-SPI-Schnittstelle eines AT90CAN128 übertragen.
Wie schaffe ich es, daß die beiden Bytes "aneinandergeklebt" (also
quasi als 16Bit-Wort übertragen werden). Der SPI-Clock müßte mit 2MHz
laufen.
Ich programmiere mit WINAVR (also in C).

Vielen Dank und viele Grüße
Helmut

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren