AVR Embedded Tutorial - Timer, Counter/de
From Free Pascal wiki
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.