2 #include <avr/interrupt.h>
5 //********************************************************************//
7 #define DATA_OUT_PIN 13
14 // offset is number of alphas (0.08ms)
16 const rf_bit_t zero_bit[] = { { 4, 1 },
22 const rf_bit_t one_bit[] = { { 12, 1 },
28 const rf_bit_t float_bit[] = { { 4, 1 },
34 const rf_bit_t sync_bit[] = { { 4, 1 },
38 typedef enum { ZERO = 0, ONE , FLOAT , SYNC } adbit_t;
39 typedef byte ad_bit_t;
41 typedef ad_bit_t word_t[WORD_LEN];
43 const rf_bit_t* bit_defs[] = { zero_bit, one_bit, float_bit, sync_bit };
49 const ad_bit_t* current_word;
50 byte volatile frame_finished = 1;
74 const word_t words[] = {
75 { ZERO, ZERO, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC }, // A1_ON
76 { ZERO, ZERO, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC }, // A1_OFF
77 { ZERO, ZERO, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC }, // A2_ON
78 { ZERO, ZERO, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC }, // A2_OFF
80 { FLOAT, ZERO, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC }, // B1_ON
81 { FLOAT, ZERO, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC }, // B1_OFF
82 { FLOAT, ZERO, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC }, // B2_ON
83 { FLOAT, ZERO, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC }, // B2_OFF
85 { ZERO, FLOAT, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC }, // C1_ON
86 { ZERO, FLOAT, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC }, // C1_OFF
87 { ZERO, FLOAT, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC }, // C2_ON
88 { ZERO, FLOAT, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC }, // C2_OFF
90 { FLOAT, FLOAT, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC }, // D1_ON
91 { FLOAT, FLOAT, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC }, // D1_OFF
92 { FLOAT, FLOAT, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC }, // D2_ON
93 { FLOAT, FLOAT, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC } // D2_OFF
97 //********************************************************************//
102 TCCR1A = 0; // prescaler 1:8, WGM = 4 (CTC)
103 TCCR1B = 1<<WGM12 | 1<<CS11; //
104 OCR1A = 159; // (1+159)*8 = 1280 -> 0.08ms @ 16 MHz -> 1*alpha
105 // OCR1A = 207; // (1+207)*8 = 1664 -> 0.104ms @ 16 MHz -> 1*alpha
106 TCNT1 = 0; // reseting timer
107 TIMSK1 = 1<<OCIE1A; // enable Interrupt
110 void stop_timer() // stop the timer
113 TCCR1B = 0; // no clock source
114 TIMSK1 = 0; // disable timer interrupt
117 void init_word(const word_t w)
124 if(bit_defs[current_word[bit_cnt]][chunk_cnt].state)
125 digitalWrite(DATA_OUT_PIN, HIGH);
127 digitalWrite(DATA_OUT_PIN, LOW);
132 ISR(TIMER1_COMPA_vect)
135 if(alpha_cnt < bit_defs[current_word[bit_cnt]][chunk_cnt].offset)
139 if(bit_defs[current_word[bit_cnt]][chunk_cnt].offset != 0) {
140 if(bit_defs[current_word[bit_cnt]][chunk_cnt].state)
141 digitalWrite(DATA_OUT_PIN, HIGH);
143 digitalWrite(DATA_OUT_PIN, LOW);
148 if(bit_cnt < WORD_LEN) {
151 if(bit_defs[current_word[bit_cnt]][chunk_cnt].state)
152 digitalWrite(DATA_OUT_PIN, HIGH);
154 digitalWrite(DATA_OUT_PIN, LOW);
158 digitalWrite(DATA_OUT_PIN, LOW);
161 if(word_cnt < FRAME_LEN)
162 init_word(current_word);
170 void send_frame(const word_t w)
181 //********************************************************************//
185 pinMode(DATA_OUT_PIN, OUTPUT);
186 digitalWrite(DATA_OUT_PIN, LOW);
192 if(Serial.available()) {
193 char command = Serial.read();
196 send_frame(words[A1_ON]);
197 else if(command == 'a')
198 send_frame(words[A1_OFF]);
199 else if(command == 'w')
200 send_frame(words[A2_ON]);
201 else if(command == 's')
202 send_frame(words[A2_OFF]);
204 else if(command == 'e')
205 send_frame(words[B1_ON]);
206 else if(command == 'd')
207 send_frame(words[B1_OFF]);
208 else if(command == 'r')
209 send_frame(words[B2_ON]);
210 else if(command == 'f')
211 send_frame(words[B2_OFF]);
213 else if(command == 't')
214 send_frame(words[C1_ON]);
215 else if(command == 'g')
216 send_frame(words[C1_OFF]);
217 else if(command == 'z')
218 send_frame(words[C2_ON]);
219 else if(command == 'h')
220 send_frame(words[C2_OFF]);
222 else if(command == 'u')
223 send_frame(words[D1_ON]);
224 else if(command == 'j')
225 send_frame(words[D1_OFF]);
226 else if(command == 'i')
227 send_frame(words[D2_ON]);
228 else if(command == 'k')
229 send_frame(words[D2_OFF]);