AVR Embedded Tutorial - Timer, Counter/de
From Lazarus wiki
Jump to navigationJump to searchTitel
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
Code
program Project1;
const
WGM10 = 0;
procedure sei; assembler; inline;
asm
Sei
end;
procedure cli; assembler; inline;
asm
Cli
end;
procedure Timer0_Interrupt; public Name 'TIMER0_COMPA_ISR'; interrupt;
const
t = 10;
const
p: integer = 0;
begin
// TCNT0 := 128;
Inc(p);
if (p = t) then begin
PORTD := PORTD or (1 shl 0);
end;
if (p = t * 2) then begin
PORTD := PORTD and not (1 shl 0);
p := 0;
end;
end;
procedure Timer1_Interrupt; public Name 'TIMER1_COMPA_ISR'; interrupt;
const
t = 500;
const
p: integer = 0;
begin
Inc(p);
if (p = t) then begin
PORTD := PORTD or (1 shl 1);
end;
if (p = t * 2) then begin
PORTD := PORTD and not (1 shl 1);
p := 0;
end;
end;
begin
cli();
DDRB := 0;
DDRD := DDRD or (1 shl 0) or (1 shl 1);
// -- Timer0 initialisieren
TCCR0A := 0;
TCCR0B := %101;
TIMSK := TIMSK or (1 shl OCIE0A);
// -- Timer1 initialisieren
TCCR1A := (1 shl WGM10);
TCCR1B := TCCR1B or %010;
TIMSK := TIMSK or (1 shl OCIE1A);
sei();
repeat
until 1 = 2;
end.