AVR Embedded Tutorial - Timer, Counter/de
From Free Pascal wiki
Revision as of 23:26, 2 November 2017 by Kupferstecher (talk | contribs) (Kupferstecher moved page Timer0 und Timer1/de to AVR Embedded Tutorial - Timer/Counter/de: Bad titel)
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. Dabei sollte die LED an Pin0 etwas schneller blinken.
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 cli; assembler; inline; // Interrupt aus
asm
Cli
end;
procedure sei; assembler; inline; // Interrupt ein
asm
Sei
end;
procedure Timer0_Interrupt; public Name 'TIMER0_COMPA_ISR'; interrupt;
const
t = 10; // LED sollte nur bei jedem 10. Durchlauf umschalten.
z: integer = 0; // Zähler für Leerdurchläufe.
begin
TCNT0 := 128; // Speed halbieren 0 = langsm (default)
Inc(z);
if (z = t) then begin
PORTD := PORTD or (1 shl 0); // LED Pin0 ein
end;
if (z = t * 2) then begin
PORTD := PORTD and not (1 shl 0); // LED Pin0 aus
z := 0;
end;
end;
procedure Timer1_Interrupt; public Name 'TIMER1_COMPA_ISR'; interrupt;
const
t = 500; // LED sollte nur bei jedem 500. Durchlauf umschalten.
z: integer = 0; // Zähler für Leerdurchläufe.
begin
Inc(z);
if (z = t) then begin
PORTD := PORTD or (1 shl 1); // LED Pin1 ein
end;
if (z = t * 2) then begin
PORTD := PORTD and not (1 shl 1); // LED Pin1 aus
z := 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); // Timer0 soll Interrupt auslösen.
// -- Timer1 initialisieren.
TCCR1A := 1; // CTC-Modus
TCCR1B := %010; // CPU-Takt / 8
TIMSK := TIMSK or (1 shl OCIE1A); // Timer1 soll Interrupt auslösen.
// -- Interrupt aktivieren.
sei();
repeat
// Mache Irgendwas.
until 1 = 2;
end.