AVR Embedded Tutorial - Timer, Counter/de

From Free Pascal wiki
Revision as of 20:03, 26 October 2017 by Mathias (talk | contribs) (Beispiel-Code)

Titel

Dieses Beispiel zeigt, wie man die beiden Timer eines ATtiny2313 verwenden kann. Jeder Timer steuert eine LED an, welche an Bit 0 und 1 des PortD sind. Hier geht es nicht, das man alle Register versteht, dies sollte nur ein praktisches Beispiel sein, wie man es in FPC umsetzt. Genauere Details gibt es hier: https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR

Beispiel-Code

program Project1;

  procedure sei; assembler; inline; // Interrupt aus
  asm
           Sei
  end;

  procedure cli; assembler; inline; // Interrupt ein
  asm
           Cli
  end;

  procedure Timer0_Interrupt; public Name 'TIMER0_COMPA_ISR'; interrupt;
  const
    t = 10;         // LED sollte nur bei jedem 10. Durchlauf umschalten.
  const
    p: integer = 0;
  begin
    TCNT0 := 128;                       // Speed halbieren  0 = langsm (default)
    Inc(p);
    if (p = t) then begin
      PORTD := PORTD or (1 shl 0);      // LED Pin0 ein
    end;
    if (p = t * 2) then begin
      PORTD := PORTD and not (1 shl 0); // LED Pin1 aus
      p := 0;
    end;
  end;

  procedure Timer1_Interrupt; public Name 'TIMER1_COMPA_ISR'; interrupt;
  const
    t = 500;        // LED sollte nur bei jedem 500. Durchlauf umschalten.
  const
    p: integer = 0;
  begin
    Inc(p);
    if (p = t) then begin
      PORTD := PORTD or (1 shl 1);      // LED Pin1 ein
    end;
    if (p = t * 2) then begin
      PORTD := PORTD and not (1 shl 1); // LED Pin1 aus
      p := 0;
    end;
  end;


begin
  // Interupt unterbinden.
  cli();

  // -- Bit 0 und 1 von PortD auf Ausgabe stellen.
  DDRD := DDRD or (1 shl 0) or (1 shl 1);

  // -- Timer0 initialisieren.
  TCCR0A := 0;
  TCCR0B := %101;  // CPU-Takt / 1024
  TIMSK := TIMSK or (1 shl OCIE0A);

  // -- Timer1 initialisieren.
  TCCR1A := 1;
  TCCR1B := %010;  // CPU-Takt / 8
  TIMSK := TIMSK or (1 shl OCIE1A);

  // -- Interrupt aktivieren.
  sei();
  repeat
    // Mache Irgendwas.
  until 1 = 2;
end.