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.
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.
...vielen Dank für die schnelle Antwort. Der PGA 2310 kann bis 6,25 MHz Taktfrequenz arbeiten.
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.
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.
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.
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.
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.
Einige AVRs haben aber anscheinend kein Hardware-SPI, das aber betrifft wohl nur die "älteren Semester".
Die Kommentare stammen noch aus dem Original-Programm. Haben leider nicht ganz den Sinn, den Kommentare haben sollten... Gruß Rahul
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.