Forum: Mikrocontroller und Digitale Elektronik serielle Datenübertragung mit Atmel Controllern


von Joachim Eisenberg (Gast)


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.

von A.K. (Gast)


Lesenswert?

Klingt sehr nach SPI. Gibt's als Schrumpfversion (USI) im Tiny2313 oder
etwas vollständiger im Mega8. Wie schnell getaktet? Nur 1 Bit Zeit, um
das erste Byte abzuholen.

von Joachim Eisenberg (Gast)


Lesenswert?

...vielen Dank für die schnelle Antwort.

Der PGA 2310 kann bis 6,25 MHz Taktfrequenz arbeiten.

von Rufus T. Firefly (Gast)


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.

von Joachim Eisenberg (Gast)


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.

von Rufus T. Firefly (Gast)


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.

von Joachim Eisenberg (Gast)


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.

von Rufus T. Firefly (Gast)


Lesenswert?


von Joachim Eisenberg (Gast)


Lesenswert?

Vielen Dank, werde mich da mal einarbeiten.

von Rahul (Gast)


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.

von Rufus T. Firefly (Gast)


Lesenswert?

Einige AVRs haben aber anscheinend kein Hardware-SPI, das aber betrifft
wohl nur die "älteren Semester".

von Rahul (Gast)


Lesenswert?

Die Kommentare stammen noch aus dem Original-Programm. Haben leider
nicht ganz den Sinn, den Kommentare haben sollten...

Gruß Rahul

von Helmut (Gast)


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

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.