- Labornetzteil AliExpress         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: Timer atmega 128

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    17.01.2018
    Beiträge
    10

    Beitrag Timer atmega 128

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo zusammen,
    Ich muss ein Programm schreiben, in dem ich mit einen Atmega 128 eine LED ansteuerung durch einen Timer durchführe.
    Und zwar sollen die LED´s, die sich auf dem Atmega 128 befinden, angesteuert werden.
    Die ungerade anzahl an LED´s also die erste dritte ... soll eine ms leuchten und die geraden 9 ms.
    Ich habe mit dem programm schon angefangen, aber irgendetwas ist noch falsch.
    Im Anhang ist der Entwurf des Programmes.
    Ich hoffe, jemand hat einen Rat für mich.

    Viele Grüße
    Angehängte Dateien Angehängte Dateien
    • Dateityp: c main.c (980 Bytes, 5x aufgerufen)

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    also bei deiner frage fehlen entscheidende infos zum helfen, aber die fragen stelle ich mal hinterher und konzentrieren wir uns auf deinen code

    du hast den timer also initialisiert in irgend einem modus mit einem prescale wert und einem wert den du in den timer counter schreibst (könntest du den modus mal herleiten eventuell?)
    zum einen solletst du den prescale wert ERST DANN ÄNDERN wenn dein timer initialisiert ist, denn sobald du den prescale wert jenseits 0 setzt, startet der timer SOFORT und du hast schon keinen zuverlässigen timer mehr

    also MERKE: timer prescaler = 0 > timer gestoppt, timer prescaler != 0 > Timer läuft! Und änderungen am timer sollte man nur machen wenn er steht!

    außerdem macht das preloaden des timer counter keinen sinn, sobald der timer überläuft wird er auf TOP zurückgesetzt und TOp entscheidet sich je nachdem welchen WGM du programmierst


    aber ich geh mal nach dem datenblatt:
    WGM modus 0 (update on TOP, TOP = 0xFFFF, normal up counting)
    frequenz 62.5kHz
    preload TCNT mit 3036

    zeit zum überlauf = (TOP - 3036) * (1/62.5kHz) = 62499 * 16nS = 999,984mS

    da scheint also schon was mit der berechnung falsch zu sein, das ist nicht mal annähernd 9mS

    außerdem wäre ein ansatz bei dem du den timer immer neu programmierst nach jeder änderung sehr unpräzise da das umprogrammieren des timer eine undefinierte zeit braucht!


    Vorgeschlagene Lösung daher:

    programmier den timer auf einen WGM und einen prescaler damit er mit der kleinsten notwendigen zeiteinheit überläuft

    angenommen 1mS auflösung reicht: WGM=14 (Fast PWM, TOP = ICR1 Register, normal up counting) und CS02 also Prescaler auf 256 => 62500Hz
    ICR1 = 62500; (wenn TCNT = 62500 = TOP = ICR1 erreicht, klappt er auf 0 und macht einen Overflow Interrupt, somit einen overflow pro millisekunde)
    und im interrupt lässt du dann eine timer variable hochzählen und kannst anhand des timer wert dann deine LEDs bedienen

    Bei deiner beschreibung schreibst du trivial Atmega128, aber es gibt verschiedene derivate mit unterschiedlichen timern und andern peripherie funktionen, du solltest also wenn möglich den genauen atmega typen angeben!
    Außerdem hat der Atmega garkeine LEDs draufm, ich gehe davon aus dass du das Board meinst auf dem der Stmega128 sitzt !?
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    17.01.2018
    Beiträge
    10
    Hallo Ceos,

    erstmal danke für die Fehlererkennung und den Lösungsvorschlag.

    Ist das so richtig?

    Viele Grüße

    - - - Aktualisiert - - -

    Sorry, habe noch einen Fehler gefunden und behoben...
    Angehängte Dateien Angehängte Dateien
    • Dateityp: c main.c (1,0 KB, 7x aufgerufen)
    • Dateityp: c main.c (1,0 KB, 5x aufgerufen)

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    öhm was solln das mit dem "!=" da, ich vermute mal einen typo oder soll das das pipe symbol (bitweises "oder") sein, das kannst du machen indem du AltGr + spitze Klammer drückst, unten links zwischen y und a?

    WGM14 funktioniert so nicht, hast du das datenblatt von deinem controller nicht zur hand? da steht eigentlich eklärt wie du auf WGM 14 kommst!

    http://ww1.microchip.com/downloads/e...oc/doc2467.pdf einmal der link zum downloaden und dann runter zum 16-bit timer kapitel beginnend auf seite 111

    die registererklärung und die WGM modes stehen ab seite 132

    wichtig ist die bits zur kontrolle des WGM verteilen sich auf beide register TCCR1 A und B


    Code:
    //KEIN PRESCALER SETZEN
    TCCR1A = (1<<WGM11); //WGM11 und WGM10 sind in TCCR1A
    TCCR1B = (1<<WGM12) | (1<<WGM13); //laut datenblatt WGM(14) = WGM11 + WGM12 + WGM13
    TCNT = 0; //kann man sich sparen ist eh 0 nachm neustart und wir wollen nicht den counter manipulieren whrend der timer rennt
    ICR1 = 62500; //das ist das TOP register im WGM14 und bestimmt wann der counter einen overflow macht (der timer zählt aufwärts, nicht wie bei pic abwärts by default)
    TCCR1B |= (1<<CS02); //erst JETZT schalten wir den timer ein und fassen ihn auch nie wieder an
    die ISR sollte dann pro millisekunde einmal aufgerufen werden wenn cih jetzt nichts verschwitzt habe
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    17.01.2018
    Beiträge
    10
    ja vielen dank,
    das konnte ich vom datenblatt jetzt aber so nicht richtig ablesen, dass WGM sich aus WGM 11 12 und 13 ergibt aber vielen dank

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    .. 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 16:59 Uhr) Grund: if (IztLEDg) korrigiert
    Ciao sagt der JoeamBerg

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    17.01.2018
    Beiträge
    10
    Hallo ,

    ist CS02 nicht der 256 prescaler?
    ich meine schon...

    - - - Aktualisiert - - -

    ach so ja ich muss dann halt einen anderen pin als zweiten ausgang nehmen..
    aber stimmt das programm jetzt so? in der else anweisung ist halt ein befehl der alles invertiert...

    - - - Aktualisiert - - -

    viele grüße

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    .. ist CS02 nicht der 256 prescaler? .. ich meine schon...
    Was steht denn in Deinem Datenblatt zum TCCR1B? Kennst Du überhaupt das Datenblatt - und diese Stelle? Besser mal selber lesen als es sich vorlesen lassen ?
    Ciao sagt der JoeamBerg

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    17.01.2018
    Beiträge
    10
    achso sind CS 10 11 und 12.. ich konnte jetzt aber nicht genau feststellen, welcher welchen wert hat...

    - - - Aktualisiert - - -

    kann das sein, dass die richtige lösung CS100 lautet??

    - - - Aktualisiert - - -

    ahne CS 12...?

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    oh ähm ja klar timer1 .. dann isses natürlcih CS12 hab mich von dem typo hiniressen lassen ... immer dieses blöde copy&paste

    in der doku steht ja CSn0 CSn1 und CSn2 wobei n für dne timer steht haha
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

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

Berechtigungen

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

12V Akku bauen