
Zitat von
Kampi
Ach Kampi .... schmarn. Hab die Anforderung "DIL" überlesen ...
Schon gut *gg* - bin ja froh, wenn andere kurz vor Mitternacht auch schon mal nachlassen.

Zitat von
Kampi
... Mit ein bisschen Strickerei kann man doch sicher die 2 8-Bit Timer ...
Sollte schon gehen - mein 8bittiger Heartbeat-timer läuft z.B. mit 20 kHz und macht seinen Sekundenübergang demnach beim 20000 (nee, ich zähl runter, das geht besser - weil meiner Meinung nach die Abfage if ( !Izeit_2 ) schicker aussieht als der "Standard"). NUR - wenn ich die ersten dre Zeilen am Threadanfang lese, dann bin ich nicht sicher, ob der Kollege das so hinkriegt.
Na ja, schaugn wa mål ob er damit etwas anfangen kann (eben bei mir "nur" als C - ich kann kein Basic):
Code:
// ============================================================================= =
// === Initialisierung fuer Timer2 mega168 ==================================== =
// ##>>> Izeit_1 wird im main initialisiert
void TC2TMR_init(void) // Init Tmr/Cntr 2, 8-Bit auf 20 kHz = 50 µs
{ //
TCCR2A |= (1<<WGM21); // Timer im CTC-Mode, Top=OCR2A S 157
TCCR2B |= (1<<CS21); // Prescaler 1/8 / Clock <- CPU S 158
// OCR2A wird für den 50µs-Timer benutzt, OCR2B für einen restlichen Timer
OCR2A = 124; // Preset 124 für 50µs bei 20Mhz
OCR2B = 124; // dito
TIMSK2 |= (1<<OCIE2A); // Tmr/Cntr2 CompareA interrupt enabled für Rampe
TIMSK2 |= (1<<OCIE2B); // Tmr/Cntr2 CompareB interrupt enabled
} // Ende void TC2TMR_init(void)
// ============================================================================= =
// ============================================================================= =
// === Stoppen Timer2 mega168
void TC2_stop(void) // Stoppe Tmr/Cntr 2
{ //
TCCR2A &= ~(1<<WGM21); // Timer WGM21 resetten
TIMSK2 &= ~(1<<OCIE2A); // Tmr/Cntr2 CompA interrupt DIS abled
} // Ende void TC2_stop(void)
// ============================================================================= =
// ============================================================================= =
// === Nicht unterbrechbare ISR für timer2
// Routine zählt hoch im Takt 20 kHz = 50 µs. Der Zählerwert wird von den ISR für
// EXT_INT0 und -INT1 ausgelesen und den Werten Iz_yseci zugewiesen
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ISR(TIMER2_COMPA_vect) // Vektor 7
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{ //
Izeit_1 --; // ###>>> Izeit_1 ist aktuell int16_t ==>>
// Izeit_1 bleibt bis 32000 in der int16-Grenze
//RCzeit1 ++; // Tupsicounter uint16_t für RC-5-Decoding
if ( Izeit_1 ) // Interrupt-Timer = 1 ... 20 000 ... (1 sec blink)
{ } // WENN Izeit_1 =|= Null => wahr => Anweisung ausgeführen
else // Izeit_1 = Null = unwahr, daher "else" ausführen
{ // Eine Sekunde ist voll =>
Izeit_1 = Izthrznt; // ansonsten: Rückstellen auf Zeithorizont
ToggleBit (PgLED, L1g); // gnLED toggeln HEARTBEAT <<####, aktuell PC1
Isecundn ++; // Sekundenzähler hochtackern, max 9 Std
} // Ende if (Izeit_1 )
return;
} // Ende ISR(TIMER2_COMPA_vect)
// ============================================================================= =
// ============================================================================= =
// === Nicht unterbrechbare ISR für timer2
// Takt Takt 20 kHz = 50 µs bei 20Mhz
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ISR(TIMER2_COMPB_vect) // Vekt 0x008, Timerroutine für "allgemeine Zwecke"
// - - - - - - - - - - - - - - - -
{ // .. die nicht so eng zeitgebunden sind
Izeit_2 --; // ###>>> Izeit_2 ist aktuell int16_t ==>>
if ( !Izeit_2 ) // WENN Izeit_2 != Null => wahr => Anweisung ausgeführen
{ // Eine Sekunde ist voll => Izeit_2 auf Hrznt_2 setzen
Izeit_2 = Hrznt_2; // ansonsten: Rückstellen auf Zeithorizont2
} // Ende if ( !Izeit_2 )
// - - - - - - - - - - - - - - - -
// PWM-Rampe für Motor1/Mot12
if ( tmot1 ) // Rampencounter > 0
{ //
tmot1 --; //
if ( !tmot1 ) // Wenn Rampenwert abgelaufen ist
{ //
M12ocr = M12ocr + M12inc; //##>>Übegang zu NEGATIVEn M12ocr möglich
// Es folgt Drehrichtungsumkehr NACH Nulldurchgang
if (-1 == M12ocr) Mrechtszur (); //
if ( 1 == M12ocr) Mrechtsvor (); //
// Setze OCR1A aus vorzeichenbehaftetem M12ocr
if (M12ocr >= 0) OCR1A = M12ocr; //
else OCR1A = -1*M12ocr; //
if (M12ocr == P1soll) tmot1 = 0; // Rampe12: Ende mit Sollwert erreicht
else tmot1 = tdek1; // ansonsten ReInit Timer auf Rampenwert
} // Ende if ( !tmot1 )
} // Ende von if ( tmot1 )
// - - - - - - - - - - - - - - - -
return;
} // Ende ISR(TIMER2_COMPB_vect)
// ============================================================================= =
Die Größen Izthrznt und Hrznt_2 sind 16bit unsigned Integer - weil Zeit eben fast nicht negativ werden kann. Damit ginge der Timer bis über 3 sekunden - mit dieser Doppeldecker-Technik.
Nachtrag:
Ach so, und diese Rechnerei mit der "Rampe" in der COMPB-ISR gehört zu einer Beschleunigungsrampe für nen DC-Motor - hier ist das nur noch drin, um einen Zweck für diese ISR zu belegen.
Lesezeichen