int main(){ reportBuffer[0] = 0x00;//(1<<1); wdt_enable(WDTO_1S); usbInit(); usbDeviceDisconnect(); register uint8_t i=0; while(--i){ wdt_reset(); _delay_ms(1); } usbDeviceConnect(); sei(); CLR(DDRB, PB0); SET(DDRD, PD7); TCCR0B = 5; //prescale TC0 1024, 20 MHz -> 50 ns * 1024 * 255 = 13.056 ms while(1){ usbPoll(); wdt_reset(); if(CHK(TIFR0, TOV0)){ TIFR0 = 1<<TOV0; TCNT0 = 0; if(CHK(PINB, PB0) && changed == 0){ keydown = 1; if (prev == keydown) changed = 0; else changed = 1; prev = 1; }else{ keydown = 0; if (prev == keydown) changed =0; else changed = 1; prev = 0; } } if(changed){ changed = 0; TIFR0 = 1<<TOV0; TCNT0 = 0; if(keydown){ reportBuffer[0] = 0x02; }else{ reportBuffer[0] = 0x00; } TOG(PORTD, PD7); wdt_reset(); usbSetInterrupt(reportBuffer, sizeof(reportBuffer)); } } }
uchar usbFunctionSetup(uchar data[8]){ usbRequest_t *rq = (void *)data; TOG(PORTB, PB0); usbMsgPtr = reportBuffer; if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){ /* class request type */ if(rq->bRequest == USBRQ_HID_GET_REPORT){ /* wValue: ReportType (highbyte), ReportID (lowbyte) */ /* we only have one report type, so don't look at wValue */ return sizeof(reportBuffer); }else if(rq->bRequest == USBRQ_HID_GET_IDLE){ usbMsgPtr = &idleRate; return 1; }else if(rq->bRequest == USBRQ_HID_SET_IDLE){ idleRate = rq->wValue.bytes[1]; } }else{ /* no vendor specific requests implemented */ } return 0; }
__interrupt void CCR0_ISR(void){ SECOND_TIMER++; TOUT=1; TOG (P1OUT,0x01); CLR (TACCTL0, CCIFG); }