Programmering af interrupts på DS89C450

Apr 19, 2005 8 Replies

Hej,



jeg har svært ved at få interrupts til at fungere på min DS89C450 med kode skrevet i Keil C51 efter vejledning gennem Application Note 105 fra keil.de.



Koden kompilerer fejlfrit, endda uden warnings og kan uden videre flashes ind i controlleren, men når jeg så resetter controlleren og måler med oscilloscopet på det ben, jeg har sat til at oscillere hvert sekund får jeg intet ud - bortset fra en pæn vandret streg ...



Hele min kode ser (uden kommentarer) således ud - noget af den er ren copy-paste fra pdf'en:


8

Hej

Er det ikke hurtigt lige at afprøve i simulatoren?

Jeg syntes simulatoren er ret cool i keil og har brugt den til at finde en del fejl

Kasper

Jeg ville gerne afprøve den i simulatoren, men jeg synes ikke rigtig jeg kan hitte ud af det ...

/Thomas

Nu har jeg afprøvet det i "debugging session" - og det kører uden problemer.

Flashet ind i controlleren virker det stadig ikke :-(

/Thomas

Hej

Måske dette kunne være noget :

formatting link

formatting link

formatting link

Men jeg testede det lige og i simulatoren er der et pin på P1vardet vidst der togglede....

så MÅSKE det ikker er i koden det er galt

Kasper

Ikke jeg ved om det har noget betydning, men fjern lige det der using 1, så den ikke bruger en anden bank...

static void timer0_isr (void) interrupt 1 using 1

og evt prøv dette :

void timer0_isr (void) interrupt 1

og så fjern return

tror ikke det har det vilde at sige, men de bud jeg lige har pt

Kasper

Begge dele er rettet til, men lige lidt hjælper det på hardwaren. Simulatoren kører lige så fint som før ...

På printet - et splynternit veroboard anskaffet til dette formål og loddet med rolig hånd i sirligt mønster - er der ingen kortslutninger at se omkring Int1 og \Int1, ej heller om de andre interrupt-ben.

/Thomas Som lægger sig og tænker over det i drømmeland.

hej....

hvad med at prøve at flippe et ben i ISR'en... det tror jeg da at jeg villle prøve. Det viser om interruptet køre ...

/F

Det gør den skam, men de if-sætninger jeg nu har plastret ind i den for at tælle sekunder, minutter og timer op, springer uC'en let og elefant hen over.

Den aktuelle kode ser sådan ud og virker fint i simulatoren, men på uC'en bliver if'erne som sagt ignoreret.

+--------------------------+ #include

unsigned int timer0_tick; unsigned int secs,mins,hrs;

void timer0_isr(void) interrupt 1 { timer0_tick++; P1 ^= 0xA0; if(timer0_tick == 16) { secs++; timer0_tick = 0; P1 ^= 0x01; } if(secs == 60) { secs = 0; mins++; P1 ^= 0x02; } if(mins == 60) { mins = 0; hrs++; P1 ^= 0x04; } if(hrs == 24) { hrs = 0; P1 ^= 0x08; } }

void timer0_initialize(void) { /*-------------------------------------- Set Timer0 for 16-bit timer mode. The timer counts to 65535, overflows, and generates an interrupt.

Set the Timer0 Run control bit. --------------------------------------*/ EA = 0; /* disable interrupts */ TMOD = (TMOD & 0xF0) | 0x01; /* Set T/C0 Mode */ ET0 = 1; /* Enable Timer 0 Interrupts */ TR0 = 1; /* Start Timer 0 Running */ EA = 1; /* enable interrupts */

timer0_tick = 0;

return; }

void init(void) { timer0_tick = 0; timer0_initialize();

secs, mins, hrs = 0; P1 = 0x00; }

void main(void) { init();

while(1) {

} }

+--------------------------+

/Thomas

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required