timer/counter 1+pwm auf pin ausgeben

Gast #441197
Lesenswert?
• ▲
▼
dabei handelt es sich um einen atmega32,
das problem ist, das auf beide pins immer ein und dieselbe PWM 
ausgegeben wird, resultat dessen ist, das die beiden motoren immer 
gleich schnell drehen und man den einen motor nicht halb so schnell wie 
den anderen laufen lassen kann...
und das ganze passiert obwohl die vergleichswerte unterschiedlich sind
z.b.
OCR1A = 1024;
OCR1B = 512;

dabei ist der prescaler auf 1 gesetzt und wir haben einen externen takt 
von 16MHz

////////////////////////////////////////
////  Variablendefinition      ////
////////////////////////////////////////

OCR1A = 1024;
OCR1B = 512;

//////////////////////////////////////
//  Timer / Counter        //
//////////////////////////////////////

TCCR1A   = 0xA3;  //Startet Timer/Counter 1
TCCR1B   = 0x19;  //Startet Timer/Counter 1
ICR1=0x03FF;
Gast #441202
Lesenswert?
• ▲
▼
Ach ja, Du würdest hilfswilligen Lesern Deines Codes (und nicht zuletzt 
auch Dir selbst) einen großen Gefallen tun, wenn Du Sachen wie
1
TCCR1A   = 0xA3;  //Startet Timer/Counter 1
2
TCCR1B   = 0x19;  //Startet Timer/Counter 1
mit den Bitnamen in der Art
1
TCCR1A = (1 << BITNAME1)|(1 << BITNAME2)|(1 << BITNAME3); //usw....
schreibst. Dann kann man nämlich sofort sehen, welche Steuerbits Du da 
gesetzt hast.
Gast #441207
Lesenswert?
• ▲
▼
BTW: Wenn Du als TOP-Wert eh 0x3FF verwendest (10-Bit-PWM), dann kannst 
Du auch den PWM-Modus 3 (phase correct 10-Bit) oder 7 (fast 10-Bit) 
nehmen und brauchst das ICR1 nicht zu behelligen...
Gast #441212
Lesenswert?
• ▲
▼
Hmm, also wenn ich die Bits richtig auseinandergefummelt hab, dann sind 
alle WGM-Bits 1 (PWM-Mode 15). Das heißt, dass der TOP-Wert OCR1A ist. 
Der Timer läuft also immer nur bis zu dem Wert hoch, den du in OCR1A 
speicherst. Der Wert von ICR1 ist dann eh wurscht.
Ich nehme an, du wolltest PWM-Mode 14 haben.
Gast #441220
Lesenswert?
• ▲
▼
ok ich habs mal lesbarer gemacht...

OCR1A = 1000;
OCR1B = 50;
wert =0;
//////////////////////////////////////
//  Timer / Counter       ///
//////////////////////////////////////
TCCR1A =   (1 << COM1A1)|(0 << COM1A0)|(1 << COM1B1)|(0 << COM1B0)
       |(0 << FOC1A)|(0 << FOC1B) |(1 << WGM11)|(1 << WGM10);
TCCR1B =   (0 << ICNC1)|(0 << ICES1)|(0 << WGM13)
       |(1 << WGM12)|(1 << CS12) |(0 << CS11)|(1 << CS10);

Fahrt_vorwaerts();



////hier die funktion ///////
#define  MRR  PORTC  &=  0x7F;
#define  MRV  PORTC  |=  0x80;
#define  MLR  PORTC  &=  0xBF;
#define  MLV  PORTC  |=  0x40;

void Fahrt_vorwaerts(void)
{
  MLV;
  MRR;
}

so aber weiterhin besteht das problem, das auf beide ports (D4 D5)
das gleiche PWM geliefert wird, obwohl
OCR1A = 1000;
OCR1B = 50;
einen unterschiedlichen wert enthalten....

muss ich noch irgendein register setzten oder geht es generell nicht, 
das man mit einem Timer/counter 2 unterschiedliche PWM auf die dafür 
zuständigen PWM-Ports geben kann ???
Gast #441226
Lesenswert?
• ▲
▼
Lass die "0 << irgendwas" besser weg... Die bringen nichts. Die 
Reihenfolge ist ebenfalls egal. Hauptsache, man muss sich nicht erst das 
komplette Bitmuster aufmalen und alles auseinandertüddeln.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.