/* * usermain.c (usermain) * User Main */ #include #include #include #define IntVec 39 // 8bit Timer #define MSTCRL ((_UB *)0x00fee01d) #define TCR ((_UB *)0x00ffff80) #define TCSR ((_UB *)0x00ffff82) #define TCORA ((_UB *)0x00ffff84) #define TCORB ((_UB *)0x00ffff86) #define TCNT ((_UB *)0x00ffff88) #define P4DDR ((_UB *)0x00fee003) #define P4DR ((_UB *)0x00ffffd3) #define P4PCR ((_UB *)0x00fee03e) LOCAL ID TskID; LOCAL INT Counter = 0; LOCAL void interrupt_handler(UINT vec) { Counter++; /* wake up every 250 counts */ if (!(Counter % 250)) { Counter = 0; tk_wup_tsk(TskID); } *TCSR &= ~0x20; // clear overflow flag return; } EXPORT INT usermain( void ) { ER err; T_DINT dint = { .intatr = TA_HLNG | TA_RNG0, .inthdr = interrupt_handler, }; /* set port4 */ *P4DDR = 0xc0; // P46, P47 only *P4DR = 0xff; /* get task ID */ TskID = tk_get_tid(); /* set interrupt handler */ err = tk_def_int(IntVec, &dint); if (err < E_OK) goto fin0; /* start timer */ *MSTCRL &= ~0x08; // enable 8bit timer *TCR = 0x00; // stop timer *TCNT = 0x00; // reset count *TCSR &= ~0xef; // clear flags, no capture *TCR = 0x22; // overflow interrupt enable, system clock/64 /* loop */ while (1) { tk_slp_tsk(TMO_FEVR); *P4DR ^= 0xff; } fin0: tm_putstring("something goes wrong...\n"); return 0; }