Timer2 in Kombination mit SPI

Hallo,

ich möchte bei meinem Arduino Nano sowohl Timer2 benutzen, um ein sauberes 40kHz Signal zu erzeugen, als auch SPI, um von einer SD-Karte Sounds abzuspielen.

Folgende Funktion erzeugt mir das 40kHz Signal, welches dann über D11 läuft und fehlerfrei funktioniert.

void startOszillator()
{
  TCCR2A = _BV(COM2A0) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(WGM22) | _BV(CS20);
  OCR2A = B11000111; // 199, so timer2 counts from 0 to 199 (200 cycles at 16 MHz)
}

D11 selber wird ja aber auch für den MOSI der SD-Karte benötigt. Wenn ich jetzt den Ausgabe-Pin für das 40 kHz Signal auf D3 lege, müsste das ja ungefähr so aussehen: (COM2A0 zu COM2B1 und OCR2A zu OCR2B)

void startOszillator()
{
  TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(WGM22) | _BV(CS20);
  OCR2B = B11000111; // 199, so timer2 counts from 0 to 199 (200 cycles at 16 MHz)
}

Allerdings erzeugt das nur Käse. Muss ich noch mehr ändern, um mein Signal über D3 zu nutzen?

Andere Überlegung: Kann ich den MOSI der SD-Karte irgendwie weglassen? Soweit ich MOSI verstanden habe, ist der für die Datenübertragung auf die SD-Karte zuständig. Da ich die Sounddateien von der Karte nur abspiele, ist doch eigentlich nur der MISO wichtig, oder seh ich das falsch?

Danke schon mal für Hilfestellungen

Du meinst COM2B0 oder? Das ist "Toggle on Compare Match"

A0/A1 und B0/B1 sind jeweils 2 Bits um 4 Optionen zu codieren: Nicht verwendet, Toggle, Set, Clear

Und du brauchst auch MOSI, du möchtest doch auch die Karte starten. MOSI wird auch zur Steuerung der SD-Karte benötigt.

Serenifly: Du meinst COM2B0 oder? Das ist "Toggle on Compare Match"

A0/A1 und B0/B1 sind jeweils 2 Bits um 4 Optionen zu codieren: Nicht verwendet, Toggle, Set, Clear

Ok, das heißt, die Änderungen, die ich probiert hab, haben nichts mit dem Pin zu tun, der angesteuert werden soll, richtig? Timer2 soll ja mit D11 und D3 funktionieren. Wo muss ich dem das denn sonst noch sagen, dass das Signal über D3 laufen soll?

Der Pin der angesteuert wird über A oder B ausgewählt (auf größeren Prozessoren gibt noch Kanal C)

Du musst COM2A0 auf COM2B0 ändern. Du hast es aber auf COM2B1 gesetzt. Damit bist zu zwar auf Kanal B und dem richtigen Pin aber hast dem Pin gesagt dass er beim Compare Match gesetzt werden soll. Statt zu toggeln.

Komisch, auch wenn ich das so mache, wie du sagst und COM2A0 zu COM2B0 ändere, liefert Pin 3 keine vernünftige Ausgabe. Hardwareseitig sollte auch alles iO sein. Hab mit 3 verschiedenen Nanos gute Ergebnisse bei Pin 11 aber bei keinem auf Pin 3. Und die einzigen Änderungen im Code sind COM2A0 zu COM2B0 und in der Kopfzeile eine 11 zu ner 3.

Ist mir ein Rätsel, warum das nicht geht. Bin für weitere Vorschlägen dankbar. Bei Interesse verschick ich auch den ganzen Code per PN.

Das Compare Match Register musst du auch auf Kanal B ändern (OCR2B)! Das war korrekt.

Wenn du was machst lerne auch was du genau tust und kopiere nicht nur Code. Die Vorgehensweise ist wie folgt: 1.) Der Timer teilt den Prozessor Takt durch den eingestellten Prescaler (CS = Clock Select) 2.) Mit diesem Takt zählt das TCNT (Timer Counter) Register hoch 3.) Wenn das TCNT Register den Wert des Compare Match Registers erreicht hat wird eine Aktion ausgelöst. Dann bist du denke ich im CTC Modus (Clear Timer on Compare Match) wodurch das TCNT Register automatisch auf 0 gesetzt wird. 4.) Diese Aktion könnte ein Interrupt sein, aber hier wird einfach der Pin geschaltet je nachdem wie die 2 COM Bits des Kanals konfiguriert sind

Hallo,

hast du Pin 3 auch als neuen Ausgang definiert? Ansonsten zeig doch mal den gesamten Code. Denn kannste als Datei anhängen. Du mußt nichts verschicken.