Hallo, ich habe folgende Überlegung, ich möchte mit Hilfe des Timer1 und der Nutzung beider Kanäle des Timers, einen D/A Wanlder ansteuern. Ich möchte also Beispielsweise Kanal mit Kanal im CTC Modus, das CLK Signal erzeugen und mit dem Kanal B das LOAD Signal, damit der D/A Wandler weiß wann er die Bits verarbeiten soll. Wir programmieren in C und unsere ATMega16 arbeitet mit einem externen Takt von 16Mhz. Die CLK soll 64KHz haben, 16MHz/64KHz sind 250 Takte, in einer Periode wird die Flanke 2 mal gewechselt, wir brauchen also 125 Takte um auf unsere Frequenz zukommen. Davon müssen wir noch 1 Takt abzeihen, die der Timer für den Flankenwechsel braucht. Am Ende sind es als 124 Takte für ziemlich exakte 64KHz, bei einem Vorteiler von 1. Nun möchte ich den Kanal B für das Load Signal nutzen, dafür brauchen wir ein Tastenverhältnis von 1:8, ich weiß allerdings nun nicht wie ich das am geschicktesten umsetzte, bzw. ob es überhauptmöglich ist. Ich vermute das ich bei einem Vortailer von 1 und 16MHz Systemtakt, nicht hinbekomme oder? Wie müsste ich also meine Register setzten um meine Vorgaben zu erreichen? Das Timing Diagram des A/D Wandlers habe ich angehängt. Ich hoffe mir kann jemand, helfen denn ich bin da etwas ratlos. Grüße Sebastian
Das macht man nicht mit dem Timer, sondern mit dem SPI. Peter
Die SPI Schnittstelle brauchen wir schon für die Ansteurung einer MMC Karte.
Sebastian Baier wrote: > Die SPI Schnittstelle brauchen wir schon für die Ansteurung einer MMC > Karte. Man kann doch mehrere Slaves an eine SPI hängen, jeder kriegt dann nur sein eigenes /SS. Oder mach ein SPI in Software (Bitbanging). Das mit dem Timerinterrupt ist jedenfalls ne Sackgasse. Du kriegst nie 125 Zyklen Interruptrate hin, wenn noch andere Interrupts gebraucht werden. Peter
Bin leider noch kein Experte bei den ATmega uC, ich wusste wohl das ich ein Gerät über SPI ansteuern kann, aber wie geht das mit 2?
So wie ich das sehe, trifft das aber nicht auf den ATmega16 zu. Ich habe nur einen SS Pin und ich bräuchte für 2 Geräte ja mind. 2, wie soll ich sonst dazwischen unterscheiden? Außerdem kann ich die Oscillator Frequenz nur durch 2,4,8,16,32,64 und 128 teilen. Bei 16MHz CPU Takt, komme ich nicht auf im schlimmsten Fall 96KHz bei einer Wortlänge von 12 Bit für den D/A Wandler.
Der /SS-Pin hat beim Master keine Funktion (*). /SS für die Slaves muss der Master selbst zur Verfügung stellen. Jeder Slave wird vom Master über eine separate Leitung angesteuert. Und dafür kannst Du jeden beliebigen Portpin nehmen. (*) Der /SS-Pin am Master sollte unbedingt als Ausgang geschaltet werden, da er, wenn er als Eingang konfiguriert ist und Low-Pegel bekommt, den Master automatisch zu einem Slave macht! Ein /SS-Signal kann man also sinnvollerweise schon mal am /SS des Master anschließen. Weitere /SS legt man dann auf beliebige freie Portpins.
Aber warum hab ich bei der Pinbelegung des Atmega16 einen /SS Pin? Außerdem soll er ja von der MMC Karte lesen und die gelesen Bits zum D/A Wandler senden. Gleichzeitig ist das doch dann garnich möglich oder?
Sebastian Baier wrote: > Aber warum hab ich bei der Pinbelegung des Atmega16 einen /SS Pin? Weil der ATMega16 nicht nur als SPI-Master, sondern wahlweise auch als Slave betrieben werden kann (wie oben beschrieben)! Du willst ihn aber offensichtlich als Master betreiben, und da ist der /SS-Pin im Prinzip (Ausnahme siehe oben) ohne Funktion. > Außerdem soll er ja von der MMC Karte lesen und die gelesen Bits zum D/A > Wandler senden. Gleichzeitig ist das doch dann garnich möglich oder? Wie soll er das denn gleichzeitig machen? Der µC muss schon erst die Daten, die zum DAC sollen, von der Karte holen. Er kann ja nix senden, was er nicht hat...
Ok, ich kann also jeden beliebigen PIN als /SS nehmen, das hab ich verstanden. Aber warum gibt es trotzdem extra einen /SS PIN beim Atmega16 Layout? Außerdem ist es denn möglich gleichzeitig die Daten von der MMC Karte zu empfangen und an den D/A Wadnler zusenden? Ist es überhaupt möglich die beiden Geräte mit unterschiedlicher CLK anzusteuern? Also der D/A Wandler brauch die Daten mit 96KHz, damit er sie auch mit 8KHz ausgiebt, sonst spielt er die Daten ja schneller ab als sie aufgenommen wurden und gleichzeitig müssen ja die Daten der MMC Karte gelesen werden. Die nächste Frage die sich mir stellt ist, krieg ich überhaupt 96KHz bei 16MHz CPU Takt mit der SPI CLK hin oder muss ich mir selber ein CLK Signal generieren, wenn ja was muss ich dabei beachten? > Wie soll er das denn gleichzeitig machen? Der µC muss schon erst die > Daten, die zum DAC sollen, von der Karte holen. Er kann ja nix senden, > was er nicht hat... Ok, mit gleichzeit ist natürlich nicht in Echtzeit gemeint. Es ist aber doch möglich die über den MISO Pin empfangen Daten direkt nach MOSI raus zu schieben oder? Gruß Sebastian
Sebastian Baier wrote: > Ok, ich kann also jeden beliebigen PIN als /SS nehmen, das hab ich > verstanden. Aber warum gibt es trotzdem extra einen /SS PIN beim > Atmega16 Layout? Das kann doch bitteschön nicht so schwer sein! Ich zitiere mich mal selber: >> Weil der ATMega16 nicht nur als SPI-Master, sondern wahlweise auch als >> Slave betrieben werden kann (wie oben beschrieben)! Und im Slave-Betrieb braucht man den /SS-Pin nunmal. Ist übrigens im Datenblatt bei den Pinbeschreibungen sehr ausführlich und anschaulich beschrieben! > Außerdem ist es denn möglich gleichzeitig die Daten von der MMC Karte zu > empfangen und an den D/A Wadnler zusenden? Im Prinzip kann man SPI auch "durchschieben". Ist schließlich auch nur ein Schieberegister bzw. bei mehreren Teilnehmern mehrere verkettete Schieberegister. Geht allerdings nur dann, wenn die Daten nicht zwischendurch weiterverarbeitet werden müssen. > Ist es überhaupt möglich die > beiden Geräte mit unterschiedlicher CLK anzusteuern? Wenn es nicht gleichzeitig geht und es nicht möglich ist, die Karte mit demselben Takt anzusteuern, den auch der DAC bekommt, dann im Prinzip schon. Musst dann eben zwischen empfangen und senden den Takt umstellen. > Also der D/A > Wandler brauch die Daten mit 96KHz, damit er sie auch mit 8KHz ausgiebt, > sonst spielt er die Daten ja schneller ab als sie aufgenommen wurden und > gleichzeitig müssen ja die Daten der MMC Karte gelesen werden. Und welchen Sinn macht es, die Daten von der MMC mit einer anderen Übertragungsrate zu holen als sie ausgegeben werden? Schneller macht Sinn, wenn die Daten im µC noch verarbeitet werden müssen. Langsamer macht aus naheliegenden Gründen keinen Sinn. > Die nächste Frage die sich mir stellt ist, krieg ich überhaupt 96KHz bei > 16MHz CPU Takt mit der SPI CLK hin oder muss ich mir selber ein CLK > Signal generieren, wenn ja was muss ich dabei beachten? Tja, da musste jetzt ein bisschen rechnen.
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.