[fpc-devel] AVR embedded Atmega 328p interrupts
Andrew Haines
andrewd207 at aol.com
Sun Nov 29 17:47:50 CET 2015
Hi, I am experimenting with the avr embedded compiler from trunk and am
trying to set an interrupt. I am not sure how to do it. The interrupt I
want to change is TIMER0_COMPA_ISR.
I see in the startup code there is:
.weak TIMER0_COMPA_ISR
and later there is:
.set TIMER0_COMPA_ISR, Default_IRQ_handler
I have in my test project added a procedure:
procedure TIMER0_overflow; public name 'TIMER0_COMPA_ISR';
begin
ToggleLED;
end;
OK I'll just include my test program. I am using an arduino duemilanove
clone. I got most of the code from:
https://sites.google.com/site/qeewiki/books/avr-guide/timers-on-the-atmega328
Anyway there is no LED visible. I have verified using a delay in the
main loop toggling the LED works.
What am I not doing, or doing wrong? And btw it's awesome that I can do
anything at all on this controller!
Thanks,
Andrew
program test;
{$mode objfpc}{$H-}
{uses
ATmega328P;}
const
PIN13 = $20;
WGM01 = 2;
CS02 = 2;
procedure ToggleLED;
begin
PORTB := PORTB xor PIN13;
end;
procedure TIMER0_overflow; public name 'TIMER0_COMPA_ISR';
begin
ToggleLED;
end;
procedure TimerInit;
begin
TIMSK0:= 1 shl TOIE0; // 1
TCNT0:=0;
TCCR0A := TCCR0A or 1 shl WGM01;
TCCR0B := TCCR0B or 1 shl CS02; // 1 shl 2 = 4
OCR0A:=$F9;
TIMSK0:= TIMSK0 or 1 shl OCIE0A;
asm
sei;
end;
end;
begin
DDRB := DDRB or $FF;// PIN13;
TimerInit;
while True do
begin
asm
nop;
end;
end;
end.
More information about the fpc-devel
mailing list