- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 21

Thema: Timer atmega 128

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    .. 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.
    Geändert von oberallgeier (17.01.2018 um 15:59 Uhr) Grund: if (IztLEDg) korrigiert
    Ciao sagt der JoeamBerg

Ähnliche Themen

  1. Atmega Timer problem
    Von Technik_Amateur im Forum C - Programmierung (GCC u.a.)
    Antworten: 21
    Letzter Beitrag: 22.11.2013, 17:07
  2. ATMEGA 16 TIMER-Problem
    Von fulltime im Forum C - Programmierung (GCC u.a.)
    Antworten: 29
    Letzter Beitrag: 16.03.2012, 14:36
  3. Atmega 8 Timer
    Von woodeye im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 15
    Letzter Beitrag: 25.09.2009, 15:44
  4. Atmega mit >3 Timer
    Von manhunt im Forum AVR Hardwarethemen
    Antworten: 12
    Letzter Beitrag: 14.12.2008, 14:10
  5. Probleme mit Timer und ATMega 32
    Von steffen21m im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 07.01.2008, 19:17

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress