- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 11

Thema: Welcher Controller hat 2 16BIT Timer

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.698
    .. welcher Controller hat zwei 16BIT Timer am besten mit DIL Gehäuse ...
    Zitat Zitat von for_ro Beitrag anzeigen
    ... und in DIL wäre da der M1284 im 40-Pin Gehäuse ...
    Sagn wir mal, 1 1/2 16-bit-Timer - oder hast Du den schon mal programmiert ? (Ich habe hier drei, vier am Laufen).
    Ausserdem - den 128er gibts nach meiner Parametertabelle von Atmel (könnte aber schon überholt sein) nur als TQFP 64 und MLF 64. Der mega162 als TQFP 44, MLF 44 und PDIP 40 dürfte so ziemlich der Einzige mit der gewünschten Spezifikation sein. Selbstdie paar AT90CAN-Automotive-Typen gibts nicht in PDIP.
    Ciao sagt der JoeamBerg

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    Beiträge
    3.501
    Blog-Einträge
    9
    Zitat Zitat von oberallgeier Beitrag anzeigen
    Sagn wir mal, 1 1/2 16-bit-Timer - oder hast Du den schon mal programmiert ? (Ich habe hier drei, vier am Laufen).
    Ausserdem - den 128er gibts nach meiner Parametertabelle von Atmel (könnte aber schon überholt sein) nur als TQFP 64 und MLF 64. Der mega162 als TQFP 44, MLF 44 und PDIP 40 dürfte so ziemlich der Einzige mit der gewünschten Spezifikation sein. Selbstdie paar AT90CAN-Automotive-Typen gibts nicht in PDIP.
    Ach .... schmarn. Hab die Anforderung "DIL" überlesen...
    Vergiss meinen Kommentar ^^
    Mit ein bisschen Strickerei kann man doch sicher die 2 8-Bit Timer von einem Mega32 als 16-Bit Timer nutzen oder?
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    12.12.2013
    Ort
    Giessen
    Beiträge
    18
    Der Propeller hat 16 x 32bit

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.698
    Zitat Zitat von Kampi Beitrag anzeigen
    Ach Kampi .... schmarn. Hab die Anforderung "DIL" überlesen ...
    Schon gut *gg* - bin ja froh, wenn andere kurz vor Mitternacht auch schon mal nachlassen.

    Zitat Zitat von Kampi Beitrag anzeigen
    ... 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.
    Geändert von oberallgeier (17.12.2013 um 08:39 Uhr) Grund: Rampenzeilen erklärt
    Ciao sagt der JoeamBerg

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von oberallgeier Beitrag anzeigen
    Sagn wir mal, 1 1/2 16-bit-Timer - oder hast Du den schon mal programmiert ? (Ich habe hier drei, vier am Laufen).
    Hallo oberallgeier,
    was geht denn bei dem Timer1 und nicht beim Timer3?
    Meine 1284p habe ich jedenfalls bisher immer als vollwertige 2x16bit angesehen, aber natürlich noch nicht jede Ecke überprüft.

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.698
    Zitat Zitat von for_ro Beitrag anzeigen
    ... was geht .. bei ... Timer1 und nicht beim Timer3 ... aber natürlich noch nicht jede Ecke überprüft.
    Ich kenne auch nicht jede Ecke des m1284.
    Es ist ne Weile her, ich hatte meine Servoplatine (theor. 18 .. 20 Servos) programmiert und da wollte der ~3 trotz emsigen Bemühens und Lesen der dreißig Doku-Seiten nicht so wie ich wollte. Bei der Suche nach ner Möglichkeit fiel mir ein Ausweg in Form einer Variante mit dem Timer1-A/B ein, die schick und sauber läuft. Dies der Teil 1.

    Teil 2 ist die Auskunft im Datenblatt
    Peripheral Features
    ...
    – One/two 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture Mode
    so ne Bemerkung hatte ich schon mal nicht beachtet und es mit endlosen Mühen und einem krönenden Misserfolg bezahlt.
    Ciao sagt der JoeamBerg

Ähnliche Themen

  1. Zeitmessung via 16bit timer
    Von Martinius11 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 16.09.2010, 17:20
  2. 16bit-PWM mit Timer 1 (Mega 8)
    Von Sauerbruch im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 26.10.2007, 16:36
  3. asm: 16bit durch 16bit dividieren
    Von Benedikt.Seidl im Forum PIC Controller
    Antworten: 7
    Letzter Beitrag: 10.04.2007, 18:08
  4. Welcher Interrupt hat Vorrang?
    Von Murus im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 22.10.2005, 23:30
  5. 16Bit Timer/Counter 1 bei ATmega8 | Hilfe zu den Registern
    Von Sauginius im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 09.06.2005, 15:14

Berechtigungen

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

12V Akku bauen