/* * usermain.c (usermain) * User Main */ #include #include #include #define IntVec 30 // ITU Overflow/ch.1 #define MSTCR ((_UB *)0x00ffff5e) #define TSTR ((_UB *)0x00ffff60) #define TSNC ((_UB *)0x00ffff61) #define TMDR ((_UB *)0x00ffff62) #define TCR ((_UB *)0x00ffff6e) #define TIOR ((_UB *)0x00ffff6f) #define TIER ((_UB *)0x00ffff70) #define TSR ((_UB *)0x00ffff71) #define TCNT ((_UH *)0x00ffff72) #define GRA ((_UH *)0x00ffff74) #define GRB ((_UH *)0x00ffff76) #define TSTR_STR (1 << 1) #define TSNC_SYNC TSTR_STR #define TMDR_PWM TSTR_STR #define PBDDR ((_UB *)0x00ffffd4) #define PBDR ((_UB *)0x00ffffd6) LOCAL ID TskID; LOCAL INT Counter = 0; LOCAL void interrupt_handler(UINT vec) { Counter++; /* wake up every 100 counts */ if (!(Counter % 100)) { Counter = 0; tk_wup_tsk(TskID); } *TSR &= ~0x04; // clear OVFA return; } EXPORT INT usermain( void ) { ER err; T_DINT dint = { .intatr = TA_HLNG | TA_RNG0, .inthdr = interrupt_handler, }; /* set port4 */ *PBDDR = 0x0f; // PB0-PB3 only *PBDR = 0x00; /* get task ID */ TskID = tk_get_tid(); /* set interrupt handler */ err = tk_def_int(IntVec, &dint); if (err < E_OK) goto fin0; /* initialize timer */ *MSTCR &= ~0x20; // enable ITU *TIER = 0x00; // disable interrupt *TSTR &= ~TSTR_STR; // stop timer *TSNC &= ~TSNC_SYNC; *TMDR &= ~TMDR_PWM; *TCR = 0x00; // free-run, system clock / 1 *TIOR = 0x00; *TCNT = 0x0000; // reset counter *GRA = ~0; *GRB = ~0; *TSR &= ~0x07; // clear interrupt *TSTR |= TSTR_STR; // start timer *TIER |= 0x04; // enable interrupt /* loop */ while (1) { tk_slp_tsk(TMO_FEVR); *PBDR ^= 0xff; } fin0: tm_putstring((UB *)"something goes wrong...\n"); return 0; }