.. das konnte ich vom datenblatt jetzt aber so nicht richtig ablesen ..
??
Grüß Dich
und willkommen im Forum. Mal ein Vorschlag: druck Dir dieses Blatt (Quellprogramm im ersten Posting) aus und lege es auf Wiedervorlage Mai 2018 mit den Anmerkung: Verstehe ich was hier geschieht?
Nur interressehalber: Du setzt zweimal den gleichen Portpin PB2 auf Ausgang - willst aber offenkundig mehrere Ausgänge schalten. Wer sagt dem Controller dass Du noch gerade und ungerade Ausgänge haben möchtest? Außerdem hat der mega128 (Atmel-8151J-8-bit AVR Microcontroller_Datasheet_Complete-09/201) im Register TCCR1B kein Bit namens CS02 !
Mal ein bisschen Timerspielerei.
Hier ein Code den ich als Allzwecktimer (Timer2 !!) in fast allen meinen Controllern habe - eigentlich eher nebenbei mit dem Zweck einen Heartbeat - LED eine Sekunde an, eine Sekunde aus - zu halten. Bei mancherlei Störungen des Programmablaufs (hängenbleiben und so) bleibt der heartbeat manchmal stehen oder ändert deutlich seinen Rythmus. Dieser Code dürfte sinngemäß, d.h. mit entsprechenden Änderungen auch beim mega128@16MHz verwendbar sein - dann z.B. OCR2A auf 99 setzten etc.
Code:
/* >>
Stand .. C5_Ronny-5_etc\RCiCo\Timerbeispiel.c
=============================================================================== =
Target MCU : siehe main
Target Hardware : siehe main
Target cpu-frequ. : siehe main 20 MHz Quarz, vgl. Current Conf. Options
=============================================================================== =
Enthaltene Routinen: Verschiedene Timer
void TC2TMR_init(void) ; // Init Tmr/Cntr2, => 20 kHz = 50 µs
ISR(TIMER2_COMPA_vect) ; //
=============================================================================== =
*** Versionsgeschichte:
x00 17Jan18 1630
=============================================================================== =
*** Aufgabenstellung : Softwarebeispiel Timer2 auf ATmega328
Software ist NICHT GETESTET. Keine Garantie für jegliche Ansprüche
============================================================================== */
// ============================================================================= =
// === Initialisierung fuer Timer2 mega328 = Heartbeat-/Boardzeit-Timer
// vgl. Datenblatt Atmel-42735B-ATmega328/P_Datasheet_Complete-11/2016
void TC2TMR_init(void) // Init Tmr/Cntr 2, 8-Bit auf 20 kHz = 50 µs
{ //
TCCR2A |= (1<<WGM21); // Timer im CTC-Mode, Top=OCR2A doc S 205
TCCR2B |= (1<<CS21); // Prescaler 1/8 / Clock <- CPU 206
OCR2A = 124; // Preset 124 für 50µs bei 20Mhz
TIMSK2 |= (1<<OCIE2A); // Tmr/Cntr2 CompareA interrupt enabled
IztLEDu = 20; // Zeit als uint8_t deklarieren ==>>
// bleibt bis 255 in der uint8-Grenze
IztLEDg = 180; // - dto -
DDRB = 0b11111111; // Port B alles auf Ausgang
PORTB = 0b01010101; // alternierende Startzustände auf PORTB
} // Ende
// ============================================================================= =
// ============================================================================= =
// === 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
// ============================================================================= =
// ============================================================================= =
// === Nicht unterbrechbare ISR für timer2 => Heartbeat-/Boardzeit 20 kHz = 50 µs
ISR(TIMER2_COMPA_vect) // Vektor 8, 0x000E
// - - - - - - - - - - - - - - - -
{ //
if ( IztLEDu ) // Zähler für 1 ms, 1., 3., .. LEDs
{ //
IztLEDu --; //
} //
else // Eine Millisekunde ist voll
{ //
IztLEDu = 20; // Rückstellen
PORTB ^= (1<<PB0); // toggle LEDs
PORTB ^= (1<<PB2); //
PORTB ^= (1<<PB4); //
PORTB ^= (1<<PB6); //
} // Ende if ( IztLEDu )
//
if ( IztLEDg ) // Zähler für 9 ms, 2., 4., .. LEDs
{ //
IztLEDg --; //
} //
else // Neun Millisekunden sind voll
{ //
IztLEDg = 180; // Rückstellen
PORTB ^= (1<<PB1); // toggle LEDs
PORTB ^= (1<<PB3); //
PORTB ^= (1<<PB5); //
PORTB ^= (1<<PB7); //
}
return; // Ende ISR(TIMER2_COMPA_vect)
} //
// ============================================================================= =
// ============================================================================= =
// ===== ENDE Routinen tmrij
// ============================================================================= =
Den Timer verwende ich auch für andere, schnelle Vorgänge - siehe Code. Dieses Vorgehen ist NICHT optimal für das Schalten von lediglich zwei LEDgruppen - aber es zeigt Dir, wie ich halbwegs pflegbare Software schreibe (mal´n Kommentar ist wunderbar) und so LED-Schalterei nach DEINEM Vorschlag bewerkstelligen kann.
PS: natürlich kann man etliches im Code einfacher schreiben - aber so ist es (für nen Anfänger?) anschaulich.
PPS: LED-Blitze von ner tausendstel Sekunde sind NICHT als Einzelblitz sichtbar, auch schneller als ne hunderstel ist kaum empfindbar. Ich empfehle die Zeiten deutlich länger zu setzen.
Lesezeichen