// YOU MUST COMPILE THIS WITH -O3 OR THE AVR WILL NOT BE ABLE TO KEEP UP!!!!\r
//\r
\r
-#define F_CPU 3960000\r
+//#define F_CPU 3960000\r
+#define F_CPU 4000000\r
\r
#if !defined(__AVR_AT94K__)\r
#error you forgot to put -mmcu=at94k on the command line\r
UBRRHI = (((baudRate) >> 8) & 0x000F); \r
UBRR1 = ((baudRate) & 0x00FF); \r
UCSR1B |= ((1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1)); \r
- /*\r
+\r
if (doubleRate)\r
UCSR1A |= (1 << U2X1);\r
+ /*\r
else\r
UCSR1A &= ~(1 << U2X1);\r
*/\r
#define BUFSIZE (1024)\r
\r
inline void portd(int bit, int on) {\r
+ /*\r
if (on) {\r
PORTD &= ~(1<<bit);\r
} else {\r
PORTD |= (1<<bit);\r
}\r
+ */\r
}\r
inline void cts(int c) {\r
if (c) {\r
}\r
\r
\r
+static volatile int sending = 0;\r
+static volatile int32_t interrupt_count = 0;\r
+\r
// RECV //////////////////////////////////////////////////////////////////////////////\r
\r
char read_buf[BUFSIZE];\r
}\r
\r
\r
+void fpga_interrupts(int on) {\r
+ if (on/* && interrupt_count<301*/) {\r
+ //FISUA = 0x1;\r
+ FISCR = 0x80;\r
+ FISUD = 0x08;\r
+ } else {\r
+ FISUD = 0;\r
+ FISCR = 0;\r
+ }\r
+}\r
+\r
void init() {\r
read_buf_head = 0;\r
read_buf_tail = 0;\r
EIMF = 0xFF; /* Enalbe External Interrrupt*/ \r
DDRD = 0xFF; /* Configure PORTD as Output */\r
DDRE = 1 << 4; /* ability to write to E */\r
- initUART1(1, 0);\r
+ initUART1(12, 1); //for slow board\r
+ //initUART1(1, 0);\r
+ fpga_interrupts(1);\r
SREG |= 0x80;\r
sei();\r
}\r
}\r
\r
#define TIMERVAL 100\r
-static volatile int sending = 0;\r
+int portdc = 0;\r
+ISR(SIG_FPGA_INTERRUPT15) { \r
+ PORTD = portdc++;\r
+ interrupt_count++;\r
+ //PORTD = ~(interrupt_count & 0xff);\r
+ //if (interrupt_count >= 301) fpga_interrupts(0);\r
+ //sei();\r
+ fpga_interrupts(1);\r
+}\r
ISR(SIG_OVERFLOW0) { \r
+ fpga_interrupts(0);\r
PORTD = ~FISUA;\r
TCNT0 = TIMERVAL; // load the nearest-to-one-second value into the timer0\r
TIMSK |= (1<<TOIE0); // enable the compare match1 interrupt and the timer/counter0 overflow interrupt\r
if (sending) UDR1 = FISUA;\r
+ fpga_interrupts(1);\r
sei();\r
} \r
void init_timer() { \r
send('S');\r
send('\n');\r
cts(1);\r
+ int x=0, y=0, z=0;\r
for(;;) {\r
- int i, x=0, y=0, z=0, d=0;\r
- switch(recv()) {\r
+ int i, d=0;\r
+ int r = recv();\r
+ switch(r) {\r
case 1:\r
z = recv();\r
y = recv();\r
portd(1,0);\r
break;\r
case 2:\r
+ fpga_interrupts(0);\r
portd(1,1);\r
send(FISUA);\r
portd(1,0);\r
+ fpga_interrupts(1);\r
break;\r
case 3:\r
init_timer();\r
case 5:\r
sending = 0;\r
break;\r
- default: die();\r
+ case 6: {\r
+ int32_t local_interrupt_count = interrupt_count;\r
+ interrupt_count = 0;\r
+ send((local_interrupt_count >> 24) & 0xff);\r
+ send((local_interrupt_count >> 16) & 0xff);\r
+ send((local_interrupt_count >> 8) & 0xff);\r
+ send((local_interrupt_count >> 0) & 0xff);\r
+ fpga_interrupts(1);\r
+ break;\r
+ }\r
+ default: {\r
+ if ((r & 0x80) == 0x80) {\r
+ switch (r & 0x44) {\r
+ case 0x44: z = recv(); break;\r
+ case 0x40: z++; break;\r
+ case 0x04: z--; break;\r
+ }\r
+ switch (r & 0x22) {\r
+ case 0x22: y = recv(); break;\r
+ case 0x20: y++; break;\r
+ case 0x02: y--; break;\r
+ }\r
+ switch (r & 0x11) {\r
+ case 0x11: x = recv(); break;\r
+ case 0x10: x++; break;\r
+ case 0x01: x--; break;\r
+ }\r
+ d = recv();\r
+ portd(1,1);\r
+ conf(z, y, x, d);\r
+ portd(1,0);\r
+ break;\r
+ }\r
+ die();\r
+ }\r
}\r
}\r
return 0;\r