1 | /* MIDI RECEIVE AND TRANSMIT WITH BUFFERS */
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <avr/interrupt.h>
|
5 | #include <stdint.h>
|
6 |
|
7 | void midi_init(void);
|
8 | void TXbuf_to_UDR(void);
|
9 | void SEND(uint8_t byte1, uint8_t byte2, uint8_t byte3);
|
10 |
|
11 |
|
12 | /* Transmit Buffer */
|
13 |
|
14 | volatile uint8_t TXbuf[256];
|
15 | volatile uint8_t TXbuf_write_pointer=0;
|
16 | volatile uint8_t TXbuf_read_pointer=0;
|
17 |
|
18 | /* Receive Buffer */
|
19 |
|
20 | volatile uint8_t RXbuf[256];
|
21 | volatile uint8_t RXbuf_write_pointer=0;
|
22 | volatile uint8_t RXbuf_read_pointer=0;
|
23 |
|
24 |
|
25 |
|
26 | int main(void)
|
27 | {
|
28 | sei(); // Global Interupt Enable
|
29 | midi_init();
|
30 |
|
31 | uint8_t byte1, byte2, byte3;
|
32 |
|
33 |
|
34 | while (1)
|
35 | {
|
36 | if ((abs(RXbuf_write_pointer - RXbuf_read_pointer))>2)
|
37 | {
|
38 |
|
39 | byte1=RXbuf[RXbuf_read_pointer]; // Read 3 bytes of receive buffer
|
40 | RXbuf_read_pointer++;
|
41 | //RXbuf_read_pointer &= 63;
|
42 |
|
43 | byte2=RXbuf[RXbuf_read_pointer];
|
44 | RXbuf_read_pointer++;
|
45 | //RXbuf_read_pointer &= 63;
|
46 |
|
47 | byte3=RXbuf[RXbuf_read_pointer];
|
48 | RXbuf_read_pointer++;
|
49 | //RXbuf_read_pointer &= 63;
|
50 |
|
51 | SEND(byte1,byte2,byte3);
|
52 |
|
53 | }
|
54 | }
|
55 | }
|
56 |
|
57 |
|
58 | void SEND(uint8_t byte1, uint8_t byte2, uint8_t byte3)
|
59 | {
|
60 | TXbuf[TXbuf_write_pointer]=byte1; // Write 3 bytes to transmit buffer
|
61 | TXbuf_write_pointer++;
|
62 | //TXbuf_write_pointer &= 63;
|
63 |
|
64 | TXbuf[TXbuf_write_pointer]=byte2;
|
65 | TXbuf_write_pointer++;
|
66 | //TXbuf_write_pointer &= 63;
|
67 |
|
68 | TXbuf[TXbuf_write_pointer]=byte3;
|
69 | TXbuf_write_pointer++;
|
70 | //TXbuf_write_pointer &= 63;
|
71 |
|
72 | UCSRB |= (1<<UDRIE); // UDR Empty Interupt enable
|
73 | }
|
74 |
|
75 |
|
76 | void midi_init(void) // settings for MIDI
|
77 | {
|
78 |
|
79 | UCSRC |= (1<<UCSZ1) | (1<<UCSZ0); // 8 Data Bits
|
80 |
|
81 | UBRRH = 0;
|
82 | UBRRL=1; // 32500 BAUD
|
83 |
|
84 | UCSRB |= (1<<RXCIE) | (1<<RXEN) | (1<<TXEN); // reciever and transmitter enable, receive interupt enable
|
85 |
|
86 | }
|
87 |
|
88 |
|
89 |
|
90 | ISR (USART_RXC_vect) // receive interupt
|
91 | {
|
92 | RXbuf[RXbuf_write_pointer] = UDR;
|
93 | RXbuf_write_pointer++;
|
94 | //RXbuf_write_pointer &= 63;
|
95 | }
|
96 |
|
97 |
|
98 |
|
99 | ISR (USART_UDRE_vect) // UDR emty interupt
|
100 | {
|
101 | TXbuf_to_UDR();
|
102 | }
|
103 |
|
104 |
|
105 | void TXbuf_to_UDR(void) // write 1 byte of transmit buffer to UDR
|
106 | {
|
107 |
|
108 | UCSRB &= (~(1<<UDRIE)); // UDR emty interupt disable
|
109 |
|
110 | if (TXbuf_read_pointer ^ TXbuf_write_pointer) // if size of buffer != 0
|
111 | {
|
112 | UDR=TXbuf[TXbuf_read_pointer];
|
113 | TXbuf_read_pointer++;
|
114 | //TXbuf_read_pointer &= 127;
|
115 |
|
116 | UCSRB |= (1<<UDRIE); // UDR emty interupt enable
|
117 | }
|
118 |
|
119 | }
|