PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CTC Modus - irgendwo muss doch ein Fehler sein



wisda.noobie
23.06.2013, 17:46
Hallo,

ich habe gerade ein kleines Programm geschrieben, um den CTC-Modus für einen Schrittmotor zu nutzen. Leider verändert sich die Frequenz bei Verschiedenen werten von OCR0A nicht. Kann mir jemand weiter helfen?
Das Board ist ein Arduino Mega



#include <avr/io.h>
#include <avr/interrupt.h>


int step = 13;








void setup() {
pinMode(step, OUTPUT);
// Timer 0 konfigurieren
TCCR0A = 0b01000000; // CTC Modus, OC0 wird getoggelt
TCCR0B = 0b00000011; // Prescaler 64
OCR0A = 24; //Obergrenze auf 24 festgelegt
}


void loop() {


}

MagicWSmoke
23.06.2013, 17:55
TCCR0A = 0b01000000; // CTC Modus, OC0 wird getoggelt
TCCR0B = 0b00000011; // Prescaler 64
CTC? So, so. Die Konfigurierung über Binärwerte ist übrigens 'ne Zumutung.

wisda.noobie
23.06.2013, 18:02
Habe das erstmal binär gemacht weil ich da am schnellsten erkenne, wie ich die register konfiguriere. Wo ist denn jetzt der Fehler?

MagicWSmoke
23.06.2013, 18:08
Schau' Dir TCCR0A nochmal genau an.

wisda.noobie
23.06.2013, 19:55
ich hatte es so verstanden, dass ich bei den ersten 2 stellen (01) angebe, dass OC0 getoggelt wird und mit den letzten beiden (00) die pwm-betriebsart deaktiviere

- - - Aktualisiert - - -

ahh manchmal ist es hilfreicher, sich die mühe zu machen, statt bei mikrocontroller.net ins datenblatt zu schauen.



TCCR0A = 0b01000010; // CTC Modus, OC0 wird getoggelt
TCCR0B = 0b00001101; // Prescaler 1024


funktioniert soweit ich weis

oberallgeier
23.06.2013, 19:58
... binär gemacht weil ich da am schnellsten erkenne, wie ich die register konfiguriere. Wo ist denn jetzt der Fehler?Er hat ja nicht von Fehler sondern von Zumutung geschrieben. Wenn Du es im Binärcode so schnell erkennst, dann ist das schon ne Sache - ich bin langsam, ich brauche da hilfen . . . und initialisiere meine CTC z.B. so (mega164-1284, 20MHz):

// ================================================== ============================ =
// == Timer Aufgabe: Servo mit Soft-PWM ansteuern auf wählbarem Port
// - - - - - - - - - - - - - - - -
void TC1TMR_init(void) // Init Timer/Counter 1 für 2 ms Servoperiode
{ //
TCCR1B |= (1<<WGM12); // WGM12 => CTC, TOP = OCR1A S135
TCCR1B |= (1<<CS11); // CS11+10 <=> clk/8 => 2,500 MHz S136
OCR1A = OCR1AV; // 10x OCR1AV = 63990=> alle 25,60 ms ein Interrupt
// Interrupt zählt bis 6400 !
OCR1B = OCR1BV; // OCR1B = {???} => 1-2 ms Rampe
// - - - - - - - - - - - - - - - -
}
// ================================================== ============================ =

MagicWSmoke
23.06.2013, 20:01
Ja, DB ist recht hilfreich ;-) Einerseits musst Du dem OCn Pin erklären, wie er sich verhalten soll, andererseits muss der Mode eingestellt werden, was Du nicht gemacht hast. Deshalb taugt auch die Bit-Konfiguration nichts, denn bei Angabe der Bits in Klarnamen fällt ein Fehler leichter auf.

wisda.noobie
23.06.2013, 20:03
das ist sicherlich eine elegantere lösung, die notation beherrsche ich noch nicht :cool:
Werde die mir aber auf jeden Fall noch anschauen, das scheint ja deutlich einfacher zu sein. Im endeffekt lag der Fehler jetzt nur noch im WGM02-Bit
Danke für die Antworten!