|
| Interrupt Fra : Preben Holm |
Dato : 09-03-04 20:21 |
|
Hej alle
Hvordan skriver man et interrupt i C?
Dvs. lad os nu antage, at jeg vil indstille Timer 1 på 186-cpu'en til,
at generere et interrupt til en given værdi T.
Kan dette laves smart eller skal det kodes i ASM?
Derudover (hvad mere vigtigt er) hvordan refereres så at en given
funktion/metode skal servicere dette interrupt?
Mvh / Preben Holm
P.S. Har begrænset DOS-funktionalitet på udviklingskittet, men lidt er
der da *gg*!
| |
Mogens Hansen (09-03-2004)
| Kommentar Fra : Mogens Hansen |
Dato : 09-03-04 20:39 |
|
Preben Holm wrote:
[8<8<8<]
> Hvordan skriver man et interrupt i C?
Det er specifikt for din compiler -det er ikke en del af det standardiserede
sprog.
Det er meget almindeligt at compileren har et keyword "interrupt"
Venlig hilsen
Mogens Hansen
| |
Preben Holm (10-03-2004)
| Kommentar Fra : Preben Holm |
Dato : 10-03-04 00:04 |
|
Hej igen
> Det er specifikt for din compiler -det er ikke en del af det standardiserede
> sprog.
>
> Det er meget almindeligt at compileren har et keyword "interrupt"
Jeg har hentet Turbo C++ 1.01 fra borlands museum-side!
Nogen der kan fortælle lidt om hvordan jeg så gør?
Mvh / Preben
| |
Bertel Brander (10-03-2004)
| Kommentar Fra : Bertel Brander |
Dato : 10-03-04 00:15 |
|
Preben Holm wrote:
> Hej igen
>
>> Det er specifikt for din compiler -det er ikke en del af det
>> standardiserede sprog.
>>
>> Det er meget almindeligt at compileren har et keyword "interrupt"
>
>
> Jeg har hentet Turbo C++ 1.01 fra borlands museum-side!
>
> Nogen der kan fortælle lidt om hvordan jeg så gør?
>
Jeg lavede lige et lille eksempel. Jeg har brugt TC 2.01 som vist
kan downloades fra Borlands museum, hvis ikke version 1.01 kan bruges.
Det programmerer timeren til at køre 1000 Hz, og sætter en interrupt
funktion til at blive kaldt ved timer-interrupt.
Spørg endelig hvis der er noget du ikke forstår.
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#define TIMER_INT_NO 0x08
#define TIMER_CONTROL_REGISTER 0x43
#define TIMER_LATCH_REGISTER 0x40
static void far interrupt (*OldTimerVector)(void);
int TickCounterDos;
int Counter;
void SetClockFreq(int freq)
{
int Val = (int )(1193180L/freq); /* 1193180 is timer freq. */
outportb(TIMER_CONTROL_REGISTER, 0x36); /* initialize timer to 16
bit, mode 3, 2*8 bit latch */
outportb(TIMER_LATCH_REGISTER, Val); /* low byte */
outportb(TIMER_LATCH_REGISTER, Val >> 8); /* high byte */
}
void far interrupt TimerInt(void)
{
if(!(--TickCounterDos))
{
TickCounterDos = 55; /* Tick DOS at normal rate -> once for each
55 ms */
SetClockFreq(1000);
OldTimerVector();
}
else
{
disable();
outportb(0x20, 0x20); /* Ack the interrupt */
}
Counter++;
}
void Uninit(void)
{
disable();
outportb(TIMER_CONTROL_REGISTER, 0x36);
outportb(TIMER_LATCH_REGISTER, 0);
outportb(TIMER_LATCH_REGISTER, 0);
setvect(TIMER_INT_NO, OldTimerVector);
enable();
exit(0);
}
void Init(void)
{
disable();
SetClockFreq(1000);
OldTimerVector = getvect(TIMER_INT_NO);
setvect(TIMER_INT_NO, TimerInt);
TickCounterDos = 1;
enable();
}
int main(void)
{
Init();
while(Counter < 2000) /* Wait for 2000 tick -> 2 sec */
;
printf("Done!\n");
Uninit();
return 0;
}
/b
| |
|
|