Forum: Mikrocontroller und Digitale Elektronik CLK generieren mit Timer1 und Nutzung beider Kanäle


von Sebastian B. (m0nkey)


Angehängte Dateien:

Lesenswert?

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

von Sebastian B. (m0nkey)


Lesenswert?

Kann mir da keiner weiterhelfen?

von Peter D. (peda)


Lesenswert?

Das macht man nicht mit dem Timer, sondern mit dem SPI.


Peter

von Sebastian B. (m0nkey)


Lesenswert?

Die SPI Schnittstelle brauchen wir schon für die Ansteurung einer MMC 
Karte.

von Peter D. (peda)


Lesenswert?

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

von Sebastian B. (m0nkey)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?


von Sebastian B. (m0nkey)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

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.

von Sebastian B. (m0nkey)


Lesenswert?

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?

von Johannes M. (johnny-m)


Lesenswert?

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

von Sebastian B. (m0nkey)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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
Noch kein Account? Hier anmelden.