www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATtiny2313 CTC-Mode OC1A & OC1B gegenphasig toggeln


Autor: greenhorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte mit einem ATTiny 2313 Soundausgabe machen. Um eine grössere 
Laustärke zu erreichen, würde ich gerne die Ausgänge OC1A und OC1B um 
180 Grad phasenverschoben togglen lassen. Das bisher funktionierende 
Codefragment:
#define SOUNDON             TCCR1B = (1<<WGM12) | (1<<CS11);

void buzzer_init(void)
{                                                                               
    DDRB |= (1 << DDB3) | (1 << DDB4);
    TCCR1A = (1<<COM1A0) | (1<<COM1B0); // CTC, Toggle OC0A/OC0B on Compare Match
    SOUNDON;
    SOUNDOFF;
}

void sound ( unsigned int high, unsigned int duration )
{
    OCR1A = high;
    OCR1B = high;
    SOUNDON;
    _delay_ms (duration);
    SOUNDOFF;
}

Dieser Code funktioniert, allerdings ist die Ausgabe an OC1A & OC1B 
gleichphasig. Wie kann ich einem Ausgang jetzt "sagen", das er genau 
entgegengesetzt arbeitet?

Gruß

Greenhorn

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst PB3/4 als normale Ausgänge betreiben.
PB3 setzt du im Zustand 1,PB4 auf 0.

Mit einen Timerinterrupt inventierst du immer die Portzustände.
Somit verändern sich beide zustände gleichzeitig.


Timer Interrupt:

com Portzustände
out PortB,Portzustände

reti

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest du mittels den FOC1 Bits einen Pin zu Beginn manuell 
toggeln. Danach wären beide immer gegenphasig.

Oder du könntest anstelle des CTC Modus aber den PWM Modus nutzen, einen 
der beiden Ausgänge invertieren, die Frequenz mittels ICR1 festlegen und 
OC1A und B jeweils auf die Hälfte von ICR1 setzen. Das wäre dann Mode 
14.

Autor: greenhorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo reti,

ja, schon, aber ich wollte das Ding eigentlich ohne Interrupt 
durchlaufen lassen.
Ich dachte mir ungefähr so, buzzer_init setze PB3 auf 1 und PB4 auf 0.
Timer startet und jetzt werden die Pins getoggelt. Das hat allerdings 
nicht funktioniert.

Gruß

Greenhorn

Autor: greenhorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Benedikt,

habe ich halluzinationen oder hattest Du nicht gerade geschrieben das 
das mit dem FOC1 bit nur bei Timer0 funktioniert?

gruß

greenhorn

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ich hatte TCCR1C im Datenblatt übersehen.

Autor: greenhorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

danke an Benedikt für den Tip mit dem FOC1 Bit. Das wars, für alle die 
es interressiert nochmal die geänderte buzzer_init.
void buzzer_init( void )
{
    DDRB |= (1 << DDB3) | (1 << DDB4);
    TCCR1A = (1<<COM1A0) | (1<<COM1B0);// CTC, Toggle OC0A/OC0B on Compare Match
    TCCR1C = (1<<FOC1A);// OC1A wird einamlig "vorgetoggled"
    SOUNDON;
    SOUNDOFF;
}

Gruß

Greenhorn

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.