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
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
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.