"When using a static TOP value there are practically no differences between the two modes of operation."
Diese Aussage bezieht sich auf den Unterschied von "PWM, Phase and Frequency Correct" und "PWM, Phase Correct".
Da wir mit ICR1 ein static TOP haben, verhält sich Mode 8 wie Mode 10... also dürfte Mode 8 auch nichts gegenüber Mode 10 verbessern. ok. Aber..
"The Timer/Counter Overflow Flag (TOV1) is set each time the counter reaches BOTTOM. When
either OCR1A or ICR1 is used for defining the TOP value, the OC1A or ICF1 Flag is set accordingly
at the same timer clock cycle as the OCR1x Registers are updated with the double buffer
value (at TOP). The Interrupt Flags can be used to generate an interrupt each time the counter
reaches the TOP or BOTTOM value."
Da Top = ICR1 und Bottom = 0 nicht verändert werden, müsste es so gehen.. nur warum "hüppelt" der Bot dann aber so?
Ich sehe schon ein das du theoretisch recht hast mit dem TIMER1_OVF_vect, Radbruch... praktisch tuts das aber so nicht.
Ob das an den noch nicht umgeschriebenen Registern TCCR1A = 0 (s.o.) liegen kann? Ich mach mich mal dran das zu ändern.
Denn das würde den Zeitgeber Timer1 beeinflussen und so ggf. Störungen in den 100uS Messschleifen verursachen.
Hier meine Änderungen bisher:
Init:
Dann die ISR für Timer:// Initialize Timer 0 - 2ms cycle or 500Hz RTOS
TCCR0 = (0 << WGM00) | (1 << WGM01)
| (0 << COM00) | (0 << COM01)
| (0 << CS02) | (1 << CS01) | (1 << CS00);
OCR0 = 250; // 500 Hz
// Initialize Timer1 - PWM and exTimer0 Funktions:
// PWM, phase correct with ICR1 as top value.
TCCR1A = (0 << WGM10) | (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
TCCR1B = (1 << WGM13) | (0 << WGM12) | (1 << CS10); // prescaler /1
// 20000 Hz = ICR1 400, bzw. pwm von 10000 Hz -> 0,0001 S bzw. 100 μs bei prescaler /1
ICR1 = 400; // New Phase corret PWM top value, 400 = 10 KHz 100uS
ISR (TIMER0_COMP_vect) in ISR (TIMER1_OVF_vect) geändert. Aufruf alle 100uS
ISR für den nun freien Timer0:
Um aktuell Komplikationen zu verhindern ist die nun zum RTOS gehörende ISR (TIMER0_COMP_vect)#if configUSE_PREEMPTION == 1
// ISR (TIMER0_COMP_vect, ISR_NAKED)
ISR (TIMER0_COMP_vect)
{
// vPortYieldFromTick();
// asm volatile ( "reti" );
}
#else
// ISR (TIMER0_COMP_vect, ISR_NAKED)
ISR (TIMER0_COMP_vect)
{
// vTaskIncrementTick();
}
#endif // portUSE_PREEMPTION
so geändert, das sie als normale ISR ohne ins RTOS zu wechseln 500 mal /sec nichts macht. Da das RTOS
nicht angesprungen wird liegt es nur als toter Code im Hexfile - es geht also immer noch nur um die RP6Lib.
Is also alles keine Zauberei... und trotzdem ruckelt der Bot vor sich hin statt normal zu fahren.
LG Rolf
Lesezeichen