Programmering af interrupts på DS89C450

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
Reply to
Thomas Skyt
Loading thread data ...

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

Reply to
Repzak

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

/Thomas

Reply to
Thomas Skyt

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

Flashet ind i controlleren virker det stadig ikke :-(

/Thomas

Reply to
Thomas Skyt

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

Reply to
Repzak

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

Reply to
Repzak

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.

Reply to
Thomas Skyt

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

Reply to
Finn Bindeballe

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

Reply to
Thomas Skyt

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.