??.. 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.
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.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 // ============================================================================= =
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.







Zitieren

Lesezeichen