Programmering af interrupts på DS89C450

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Danish to

Threaded View
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<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<
#include <REG420.H>
#include <stdio.h>

#define TIMER0_COUNT 0xDC11     /* 10000h - ((11,059,200 Hz / (12 *
FREQ)) - 17) */

static unsigned int timer0_tick;                /* timer tick variable
              */

static void timer0_isr (void) interrupt 1 using 1
{
     unsigned int i;

     TR0 = 0;                                /* stop timer 0 */
     i = TIMER0_COUNT + TL0 + (TH0<<8);
     TL0 = i;
     TH0 = i >> 8;
     TR0 = 1;                                /* start timer 0 */

     timer0_tick++;

     return;
}

void timer0_initialize (void)
{
     EA = 0;                             /* disable interrupts */
     timer0_tick = 0;
     TR0 = 0;                            /* stop timer 0 */
     TMOD &= ~0x0F;                      /* clear timer 0 mode bits */
     TMOD |= 0x01;                       /* put timer 0 into 16-bit no
prescale */
     TL0 = (TIMER0_COUNT & 0x00FF);
     TH0 = (TIMER0_COUNT >> 8);
     ET0 = 1;                            /* enable timer 0 interrupt */
     TR0 = 1;                            /* start timer 0 */
     EA = 1;                             /* enable interrupts */

     return;
}

unsigned int timer0_count (void)
{
     unsigned int t;
     EA = 0;
     t = timer0_tick;
     EA = 1;
     return (t);
}

void timer0_delay (unsigned count)
{
     unsigned int start_count;
     start_count = timer0_count ();                   /* get the
starting count */
     while ((timer0_count () - start_count) <= count) /* wait for count
'ticks' */
     {
     }

     return;
}


void init(void)
{
     timer0_initialize();
     return;
}

void main(void)
{
     P1 = 0x00;
     init();
     P1 ^= 0x04;
     while(1) {
         timer0_delay(10);
         P1 ^= 0x08;
     }
}
8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<

Hvis nogen kan finde fejlen eller generelt hjælpe, vil jeg være meget
taknemmelig.

/Thomas

Re: Programmering af interrupts på DS89C450
Quoted text here. Click to load it

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



Re: Programmering af interrupts på DS89C450
Quoted text here. Click to load it

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

/Thomas

Re: Programmering af interrupts på DS89C450
Quoted text here. Click to load it

Hej

Måske dette kunne være noget :

http://hjemmesider.eucsyd.dk/ejl/students/2sem/Electronic/C51%20tutorial.zip

http://hjemmesider.eucsyd.dk/ejl/students/default1.htm

http://hjemmesider.eucsyd.dk/ejl/students/default1.htm

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



Re: Programmering af interrupts på DS89C450
Quoted text here. Click to load it
 >
Quoted text here. Click to load it

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

Flashet ind i controlleren virker det stadig ikke :-(

/Thomas

Re: Programmering af interrupts på DS89C450

Quoted text here. Click to load it

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



Re: Programmering af interrupts på DS89C450
Hej,

Quoted text here. Click to load it

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.

Re: Programmering af interrupts på DS89C450
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

Re: Programmering af interrupts på DS89C450
Hej Finn,

Quoted text here. Click to load it

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 <REG420.H>

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

Site Timeline