00001
00010 #include <avr/io.h>
00011 #include <avr/interrupt.h>
00012 #include <avr/pgmspace.h>
00013 #include <util/delay.h>
00014
00015 #include "usbdrv.h"
00016 #include "oddebug.h"
00017 #include "usbservo.h"
00018
00020 static uint8_t angle;
00021
00026 static void timerInterrupt(void) {
00027 int i;
00028 PORTC = 0xff;
00029
00030 for (i = 0; i < 72; i++) {
00031 _delay_us(100);
00032 }
00033
00034 for (i = 0; i < angle; i++) {
00035 _delay_us(70);
00036 }
00037 PORTC = 0x00;
00038 }
00039
00046 uchar usbFunctionSetup(uchar data[8]) {
00047 static uchar replyBuffer[8];
00048 uchar replyLength;
00049
00050 replyBuffer[0] = msgOK;
00051 switch (data[1]) {
00052 case CMD_ECHO:
00053 replyBuffer[0] = data[2];
00054 replyBuffer[1] = data[3];
00055 replyLength = 2;
00056 break;
00057 case CMD_GET:
00058 replyBuffer[0] = angle;
00059 replyLength = 1;
00060 break;
00061 case CMD_SET:
00062 angle = data[2];
00063 replyLength = 0;
00064 break;
00065 default:
00066 replyBuffer[0] = msgErr;
00067 replyLength = 1;
00068 break;
00069 }
00070 usbMsgPtr = replyBuffer;
00071 return replyLength;
00072 }
00073
00079 int main(void) {
00080 uchar i, j;
00081 odDebugInit();
00082 DDRD = ~0;
00083 PORTD = 0x00;
00084 DDRC = 0xff;
00085 PORTC = 0x00;
00086
00087 j = 0;
00088 while (--j) {
00089
00090 i = 0;
00091 while (--i);
00092 }
00093 DDRD = ~USBMASK;
00094 TCCR0 = 5;
00095 usbInit();
00096 sei();
00097
00098 for (i = 0; i < 10; i++) {
00099
00100
00101
00102 _delay_ms(100);
00103 }
00104
00105 angle = 0;
00106
00107 while (1) {
00108 usbPoll();
00109 if (TIFR & (1 << TOV0)) {
00110 TIFR |= 1 << TOV0;
00111 timerInterrupt();
00112 }
00113 }
00114 return 0;
00115 }