/* * usermain.c (usermain) * User Main */ #include #include #include #define IntVec 22 // Timer V #define MSTCR1 ((_UB *)0xfff9) #define TCRV0 ((_UB *)0xffa0) #define TCSRV ((_UB *)0xffa1) #define TCORA ((_UB *)0xffa2) #define TCORB ((_UB *)0xffa3) #define TCNTV ((_UB *)0xffa4) #define TCRV1 ((_UB *)0xffa5) #define PUCR5 ((_UB *)0xffd1) #define PDR5 ((_UB *)0xffd8) #define PMR5 ((_UB *)0xffe1) #define PCR5 ((_UB *)0xffe8) 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); } *TCSRV &= ~0x20; // clear overflow flag return; } EXPORT INT usermain( void ) { ER err; T_DINT dint = { .intatr = TA_HLNG | TA_RNG0, .inthdr = interrupt_handler, }; /* set port5 */ *PMR5 = 0x00; *PCR5 = 0x3f; *PDR5 = 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 */ *MSTCR1 &= ~0x02; // enable timer V *TCRV0 = 0x00; // stop timer *TCRV1 = 0x01; // no TRGV input *TCSRV &= ~0xef; // clear flags, no TMOV output *TCRV0 = 0x23; // overflow interrupt enable, system clock/128 /* loop */ while (1) { tk_slp_tsk(TMO_FEVR); *PDR5 ^= 0xff; } fin0: tm_putstring("something goes wrong...\n"); return 0; }