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
Didn't find your answer? Ask the community — no account required.
R
Repzak
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
T
Thomas Skyt
Jeg ville gerne afprøve den i simulatoren, men jeg synes ikke rigtig jeg kan hitte ud af det ...
/Thomas
T
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
R
Repzak
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
R
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
T
Thomas Skyt
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.
F
Finn Bindeballe
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
T
Thomas Skyt
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_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 */