Radio Junk Box
/
KAMUI_DIN-SYNC_Example
KAMUI DIN-SYNC Example
main.cpp@0:e3174b02ec81, 2012-05-05 (annotated)
- Committer:
- radiojunkbox
- Date:
- Sat May 05 11:34:19 2012 +0000
- Revision:
- 0:e3174b02ec81
Rev. 1.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
radiojunkbox | 0:e3174b02ec81 | 1 | //------------------------------------------------------------- |
radiojunkbox | 0:e3174b02ec81 | 2 | // KAMUI DIN SYNC Example |
radiojunkbox | 0:e3174b02ec81 | 3 | // Copyright (C) 2012 RJB RadioJunkBox |
radiojunkbox | 0:e3174b02ec81 | 4 | // Released under the MIT License: http://mbed.org/license/mit |
radiojunkbox | 0:e3174b02ec81 | 5 | //------------------------------------------------------------- |
radiojunkbox | 0:e3174b02ec81 | 6 | |
radiojunkbox | 0:e3174b02ec81 | 7 | #include "mbed.h" |
radiojunkbox | 0:e3174b02ec81 | 8 | #include "TextLCD.h" |
radiojunkbox | 0:e3174b02ec81 | 9 | |
radiojunkbox | 0:e3174b02ec81 | 10 | //------------------------------------------------------------- |
radiojunkbox | 0:e3174b02ec81 | 11 | // Define |
radiojunkbox | 0:e3174b02ec81 | 12 | |
radiojunkbox | 0:e3174b02ec81 | 13 | #define AD5551 // 14bitDAC |
radiojunkbox | 0:e3174b02ec81 | 14 | |
radiojunkbox | 0:e3174b02ec81 | 15 | #define SPI_RATE 1000000 // 1Mbps |
radiojunkbox | 0:e3174b02ec81 | 16 | #define MIDI_RATE 31250 // 31.25kbps |
radiojunkbox | 0:e3174b02ec81 | 17 | #define BEEP_FREQ 1760.0 // 1760Hz |
radiojunkbox | 0:e3174b02ec81 | 18 | #define UPDATE_INTERVAL 50 // 50us |
radiojunkbox | 0:e3174b02ec81 | 19 | #define SW_WATCH_INTERVAL (25000/UPDATE_INTERVAL) // 25ms |
radiojunkbox | 0:e3174b02ec81 | 20 | |
radiojunkbox | 0:e3174b02ec81 | 21 | #define UPDATE_MODE0 0 // Update Interval CV ch1-6 600us, ch7,8 200us |
radiojunkbox | 0:e3174b02ec81 | 22 | #define UPDATE_MODE1 1 // Update Interval CV ch1-6 N/A, ch7,8 100us |
radiojunkbox | 0:e3174b02ec81 | 23 | |
radiojunkbox | 0:e3174b02ec81 | 24 | #define GATE1 0x01 |
radiojunkbox | 0:e3174b02ec81 | 25 | #define GATE2 0x02 |
radiojunkbox | 0:e3174b02ec81 | 26 | #define GATE3 0x04 |
radiojunkbox | 0:e3174b02ec81 | 27 | #define GATE4 0x08 |
radiojunkbox | 0:e3174b02ec81 | 28 | |
radiojunkbox | 0:e3174b02ec81 | 29 | #define SYNC1CLK 0x01 |
radiojunkbox | 0:e3174b02ec81 | 30 | #define SYNC1RUN 0x02 |
radiojunkbox | 0:e3174b02ec81 | 31 | #define SYNC2CLK 0x04 |
radiojunkbox | 0:e3174b02ec81 | 32 | #define SYNC2RUN 0x08 |
radiojunkbox | 0:e3174b02ec81 | 33 | |
radiojunkbox | 0:e3174b02ec81 | 34 | #define MODE_CV 0x00 |
radiojunkbox | 0:e3174b02ec81 | 35 | #define MODE_GATE 0x40 |
radiojunkbox | 0:e3174b02ec81 | 36 | #define MODE_SYNC 0x80 |
radiojunkbox | 0:e3174b02ec81 | 37 | #define MODE_SET_SYNC 0xC0 |
radiojunkbox | 0:e3174b02ec81 | 38 | |
radiojunkbox | 0:e3174b02ec81 | 39 | #define SW1 0x01 |
radiojunkbox | 0:e3174b02ec81 | 40 | #define SW2 0x02 |
radiojunkbox | 0:e3174b02ec81 | 41 | #define SW3 0x04 |
radiojunkbox | 0:e3174b02ec81 | 42 | #define SW4 0x08 |
radiojunkbox | 0:e3174b02ec81 | 43 | #define SYNC1CLK_IN 0x10 |
radiojunkbox | 0:e3174b02ec81 | 44 | #define SYNC1RUN_IN 0x20 |
radiojunkbox | 0:e3174b02ec81 | 45 | #define SYNC2CLK_IN 0x40 |
radiojunkbox | 0:e3174b02ec81 | 46 | #define GATE_IN 0x80 |
radiojunkbox | 0:e3174b02ec81 | 47 | |
radiojunkbox | 0:e3174b02ec81 | 48 | #define _ENABLE 0 |
radiojunkbox | 0:e3174b02ec81 | 49 | #define _DISABLE 1 |
radiojunkbox | 0:e3174b02ec81 | 50 | |
radiojunkbox | 0:e3174b02ec81 | 51 | #define TBASE (60*1000000/(48*UPDATE_INTERVAL)) |
radiojunkbox | 0:e3174b02ec81 | 52 | |
radiojunkbox | 0:e3174b02ec81 | 53 | //------------------------------------------------------------- |
radiojunkbox | 0:e3174b02ec81 | 54 | // Functions |
radiojunkbox | 0:e3174b02ec81 | 55 | |
radiojunkbox | 0:e3174b02ec81 | 56 | void InitKamui(void); |
radiojunkbox | 0:e3174b02ec81 | 57 | void UpdateCV(void); |
radiojunkbox | 0:e3174b02ec81 | 58 | void DinSync(unsigned char); |
radiojunkbox | 0:e3174b02ec81 | 59 | unsigned char CheckSW(unsigned char); |
radiojunkbox | 0:e3174b02ec81 | 60 | |
radiojunkbox | 0:e3174b02ec81 | 61 | //------------------------------------------------------------- |
radiojunkbox | 0:e3174b02ec81 | 62 | // Global Variables |
radiojunkbox | 0:e3174b02ec81 | 63 | |
radiojunkbox | 0:e3174b02ec81 | 64 | int gUpdateMode; |
radiojunkbox | 0:e3174b02ec81 | 65 | unsigned short gCV[8]; |
radiojunkbox | 0:e3174b02ec81 | 66 | unsigned char gGATE; |
radiojunkbox | 0:e3174b02ec81 | 67 | unsigned char gSYNC; |
radiojunkbox | 0:e3174b02ec81 | 68 | unsigned short gT1,gT2; |
radiojunkbox | 0:e3174b02ec81 | 69 | |
radiojunkbox | 0:e3174b02ec81 | 70 | union { |
radiojunkbox | 0:e3174b02ec81 | 71 | unsigned short WORD; |
radiojunkbox | 0:e3174b02ec81 | 72 | struct { |
radiojunkbox | 0:e3174b02ec81 | 73 | unsigned char L; |
radiojunkbox | 0:e3174b02ec81 | 74 | unsigned char H; |
radiojunkbox | 0:e3174b02ec81 | 75 | } BYTE; |
radiojunkbox | 0:e3174b02ec81 | 76 | } gDAC; |
radiojunkbox | 0:e3174b02ec81 | 77 | |
radiojunkbox | 0:e3174b02ec81 | 78 | //------------------------------------------------------------- |
radiojunkbox | 0:e3174b02ec81 | 79 | // mbed Functions |
radiojunkbox | 0:e3174b02ec81 | 80 | |
radiojunkbox | 0:e3174b02ec81 | 81 | // TextLCD |
radiojunkbox | 0:e3174b02ec81 | 82 | TextLCD gLCD(p23, p24, p25, p26, p29, p30); // rs, e, d4-d7 |
radiojunkbox | 0:e3174b02ec81 | 83 | |
radiojunkbox | 0:e3174b02ec81 | 84 | // SPI |
radiojunkbox | 0:e3174b02ec81 | 85 | SPI gSPI(p11,p12,p13); |
radiojunkbox | 0:e3174b02ec81 | 86 | DigitalOut gCSA(p14); |
radiojunkbox | 0:e3174b02ec81 | 87 | DigitalOut gCSB(p22); |
radiojunkbox | 0:e3174b02ec81 | 88 | |
radiojunkbox | 0:e3174b02ec81 | 89 | // Sirial MIDI |
radiojunkbox | 0:e3174b02ec81 | 90 | Serial gMIDI(p9,p10); |
radiojunkbox | 0:e3174b02ec81 | 91 | |
radiojunkbox | 0:e3174b02ec81 | 92 | // AnalogIn |
radiojunkbox | 0:e3174b02ec81 | 93 | AnalogIn gAIN1(p15); // VR1 |
radiojunkbox | 0:e3174b02ec81 | 94 | AnalogIn gAIN2(p16); // VR2 |
radiojunkbox | 0:e3174b02ec81 | 95 | AnalogIn gAIN3(p17); // VR3 |
radiojunkbox | 0:e3174b02ec81 | 96 | AnalogIn gAIN4(p18); // VR4 |
radiojunkbox | 0:e3174b02ec81 | 97 | AnalogIn gAIN5(p19); // IN1 |
radiojunkbox | 0:e3174b02ec81 | 98 | AnalogIn gAIN6(p20); // IN2 |
radiojunkbox | 0:e3174b02ec81 | 99 | |
radiojunkbox | 0:e3174b02ec81 | 100 | // BEEP |
radiojunkbox | 0:e3174b02ec81 | 101 | PwmOut gBEEP(p21); |
radiojunkbox | 0:e3174b02ec81 | 102 | |
radiojunkbox | 0:e3174b02ec81 | 103 | // LED |
radiojunkbox | 0:e3174b02ec81 | 104 | DigitalOut gLED1(LED1); |
radiojunkbox | 0:e3174b02ec81 | 105 | DigitalOut gLED2(LED2); |
radiojunkbox | 0:e3174b02ec81 | 106 | DigitalOut gLED3(LED3); |
radiojunkbox | 0:e3174b02ec81 | 107 | DigitalOut gLED4(LED4); |
radiojunkbox | 0:e3174b02ec81 | 108 | BusOut gLEDS(LED1,LED2,LED3,LED4); |
radiojunkbox | 0:e3174b02ec81 | 109 | |
radiojunkbox | 0:e3174b02ec81 | 110 | // Ticker |
radiojunkbox | 0:e3174b02ec81 | 111 | Ticker gTICKER; |
radiojunkbox | 0:e3174b02ec81 | 112 | |
radiojunkbox | 0:e3174b02ec81 | 113 | //------------------------------------------------------------- |
radiojunkbox | 0:e3174b02ec81 | 114 | // main |
radiojunkbox | 0:e3174b02ec81 | 115 | |
radiojunkbox | 0:e3174b02ec81 | 116 | int main() { |
radiojunkbox | 0:e3174b02ec81 | 117 | |
radiojunkbox | 0:e3174b02ec81 | 118 | unsigned int pot1, pot2, pot3, pot4; |
radiojunkbox | 0:e3174b02ec81 | 119 | unsigned int tempo; |
radiojunkbox | 0:e3174b02ec81 | 120 | unsigned int t,s; |
radiojunkbox | 0:e3174b02ec81 | 121 | |
radiojunkbox | 0:e3174b02ec81 | 122 | InitKamui(); |
radiojunkbox | 0:e3174b02ec81 | 123 | |
radiojunkbox | 0:e3174b02ec81 | 124 | while(1) { |
radiojunkbox | 0:e3174b02ec81 | 125 | |
radiojunkbox | 0:e3174b02ec81 | 126 | // POT1 Tempo 40 - 220 bpm |
radiojunkbox | 0:e3174b02ec81 | 127 | // POT2 Suffle Rate |
radiojunkbox | 0:e3174b02ec81 | 128 | // POT3 CV1 - CV4 0V - +10V |
radiojunkbox | 0:e3174b02ec81 | 129 | // POT4 CV5 - CV8 -10V - +10V |
radiojunkbox | 0:e3174b02ec81 | 130 | |
radiojunkbox | 0:e3174b02ec81 | 131 | pot1 = gAIN1.read_u16(); |
radiojunkbox | 0:e3174b02ec81 | 132 | pot2 = gAIN2.read_u16() / 0x0400; |
radiojunkbox | 0:e3174b02ec81 | 133 | pot3 = gAIN3.read_u16() / 2 + 0x8000; |
radiojunkbox | 0:e3174b02ec81 | 134 | pot4 = gAIN4.read_u16(); |
radiojunkbox | 0:e3174b02ec81 | 135 | |
radiojunkbox | 0:e3174b02ec81 | 136 | tempo = pot1 / 364 + 40; |
radiojunkbox | 0:e3174b02ec81 | 137 | t = TBASE / tempo; |
radiojunkbox | 0:e3174b02ec81 | 138 | s = t * pot2 / 127; |
radiojunkbox | 0:e3174b02ec81 | 139 | |
radiojunkbox | 0:e3174b02ec81 | 140 | gT1 = t + s; |
radiojunkbox | 0:e3174b02ec81 | 141 | gT2 = t - s; |
radiojunkbox | 0:e3174b02ec81 | 142 | |
radiojunkbox | 0:e3174b02ec81 | 143 | gCV[0] = pot3; |
radiojunkbox | 0:e3174b02ec81 | 144 | gCV[1] = pot3; |
radiojunkbox | 0:e3174b02ec81 | 145 | gCV[2] = pot3; |
radiojunkbox | 0:e3174b02ec81 | 146 | gCV[3] = pot3; |
radiojunkbox | 0:e3174b02ec81 | 147 | gCV[4] = pot4; |
radiojunkbox | 0:e3174b02ec81 | 148 | gCV[5] = pot4; |
radiojunkbox | 0:e3174b02ec81 | 149 | gCV[6] = pot4; |
radiojunkbox | 0:e3174b02ec81 | 150 | gCV[7] = pot4; |
radiojunkbox | 0:e3174b02ec81 | 151 | |
radiojunkbox | 0:e3174b02ec81 | 152 | gLCD.locate( 0, 1 ); |
radiojunkbox | 0:e3174b02ec81 | 153 | gLCD.printf("TEMPO=%03d SFL=%02d", tempo, pot2); |
radiojunkbox | 0:e3174b02ec81 | 154 | } |
radiojunkbox | 0:e3174b02ec81 | 155 | } |
radiojunkbox | 0:e3174b02ec81 | 156 | |
radiojunkbox | 0:e3174b02ec81 | 157 | //------------------------------------------------------------- |
radiojunkbox | 0:e3174b02ec81 | 158 | // Initialize KAMUI |
radiojunkbox | 0:e3174b02ec81 | 159 | |
radiojunkbox | 0:e3174b02ec81 | 160 | void InitKamui() |
radiojunkbox | 0:e3174b02ec81 | 161 | { |
radiojunkbox | 0:e3174b02ec81 | 162 | // Init. Variables |
radiojunkbox | 0:e3174b02ec81 | 163 | for( int i=0; i<8; i++) { |
radiojunkbox | 0:e3174b02ec81 | 164 | gCV[i] = 0x8000; |
radiojunkbox | 0:e3174b02ec81 | 165 | } |
radiojunkbox | 0:e3174b02ec81 | 166 | gGATE = 0; |
radiojunkbox | 0:e3174b02ec81 | 167 | gSYNC = 0; |
radiojunkbox | 0:e3174b02ec81 | 168 | |
radiojunkbox | 0:e3174b02ec81 | 169 | gUpdateMode = UPDATE_MODE0; |
radiojunkbox | 0:e3174b02ec81 | 170 | |
radiojunkbox | 0:e3174b02ec81 | 171 | // Init. SPI |
radiojunkbox | 0:e3174b02ec81 | 172 | gCSA = _DISABLE; |
radiojunkbox | 0:e3174b02ec81 | 173 | gCSB = _DISABLE; |
radiojunkbox | 0:e3174b02ec81 | 174 | gSPI.format(8,0); |
radiojunkbox | 0:e3174b02ec81 | 175 | gSPI.frequency(SPI_RATE); |
radiojunkbox | 0:e3174b02ec81 | 176 | |
radiojunkbox | 0:e3174b02ec81 | 177 | // Init. Serial MIDI |
radiojunkbox | 0:e3174b02ec81 | 178 | gMIDI.baud(MIDI_RATE); |
radiojunkbox | 0:e3174b02ec81 | 179 | |
radiojunkbox | 0:e3174b02ec81 | 180 | // Ticker |
radiojunkbox | 0:e3174b02ec81 | 181 | gTICKER.attach_us(&UpdateCV, UPDATE_INTERVAL); |
radiojunkbox | 0:e3174b02ec81 | 182 | |
radiojunkbox | 0:e3174b02ec81 | 183 | // Beep |
radiojunkbox | 0:e3174b02ec81 | 184 | gBEEP.period(1.0/BEEP_FREQ); |
radiojunkbox | 0:e3174b02ec81 | 185 | gBEEP.write(0.5); |
radiojunkbox | 0:e3174b02ec81 | 186 | wait(0.2); |
radiojunkbox | 0:e3174b02ec81 | 187 | gBEEP.write(0.0); |
radiojunkbox | 0:e3174b02ec81 | 188 | |
radiojunkbox | 0:e3174b02ec81 | 189 | // Init Display |
radiojunkbox | 0:e3174b02ec81 | 190 | gLCD.locate( 0, 0 ); |
radiojunkbox | 0:e3174b02ec81 | 191 | // 123456789ABCDEF |
radiojunkbox | 0:e3174b02ec81 | 192 | gLCD.printf("DIN-SyncExample"); |
radiojunkbox | 0:e3174b02ec81 | 193 | } |
radiojunkbox | 0:e3174b02ec81 | 194 | |
radiojunkbox | 0:e3174b02ec81 | 195 | //------------------------------------------------------------- |
radiojunkbox | 0:e3174b02ec81 | 196 | // Update CV, GATE, SYNC |
radiojunkbox | 0:e3174b02ec81 | 197 | |
radiojunkbox | 0:e3174b02ec81 | 198 | void UpdateCV() |
radiojunkbox | 0:e3174b02ec81 | 199 | { |
radiojunkbox | 0:e3174b02ec81 | 200 | unsigned char rcv,sw,ch; |
radiojunkbox | 0:e3174b02ec81 | 201 | unsigned char ptn[] = { 0,1,6,7,2,3,6,7,4,5,6,7 }; |
radiojunkbox | 0:e3174b02ec81 | 202 | const int numptn = (sizeof ptn / sizeof ptn[0]) - 1; |
radiojunkbox | 0:e3174b02ec81 | 203 | static unsigned char cnt; |
radiojunkbox | 0:e3174b02ec81 | 204 | |
radiojunkbox | 0:e3174b02ec81 | 205 | // SET DAC |
radiojunkbox | 0:e3174b02ec81 | 206 | ch = ptn[cnt]; |
radiojunkbox | 0:e3174b02ec81 | 207 | if(gUpdateMode) ch |= 0x06; |
radiojunkbox | 0:e3174b02ec81 | 208 | |
radiojunkbox | 0:e3174b02ec81 | 209 | #ifdef AD5551 // 14bitDAC |
radiojunkbox | 0:e3174b02ec81 | 210 | gDAC.WORD = gCV[ch] >> 2; |
radiojunkbox | 0:e3174b02ec81 | 211 | #else |
radiojunkbox | 0:e3174b02ec81 | 212 | gDAC.WORD = gCV[ch]; |
radiojunkbox | 0:e3174b02ec81 | 213 | #endif |
radiojunkbox | 0:e3174b02ec81 | 214 | |
radiojunkbox | 0:e3174b02ec81 | 215 | gCSA = _ENABLE; |
radiojunkbox | 0:e3174b02ec81 | 216 | gSPI.write(gDAC.BYTE.H); |
radiojunkbox | 0:e3174b02ec81 | 217 | gSPI.write(gDAC.BYTE.L); |
radiojunkbox | 0:e3174b02ec81 | 218 | gCSA = _DISABLE; |
radiojunkbox | 0:e3174b02ec81 | 219 | |
radiojunkbox | 0:e3174b02ec81 | 220 | // GATE or SYNC OUT |
radiojunkbox | 0:e3174b02ec81 | 221 | if(cnt & 0x01) { |
radiojunkbox | 0:e3174b02ec81 | 222 | // GATE OUT |
radiojunkbox | 0:e3174b02ec81 | 223 | gCSB = _ENABLE; |
radiojunkbox | 0:e3174b02ec81 | 224 | rcv = gSPI.write(gGATE | MODE_GATE) & 0x0F; |
radiojunkbox | 0:e3174b02ec81 | 225 | gCSB = _DISABLE; |
radiojunkbox | 0:e3174b02ec81 | 226 | } |
radiojunkbox | 0:e3174b02ec81 | 227 | else { |
radiojunkbox | 0:e3174b02ec81 | 228 | // SYNC OUT |
radiojunkbox | 0:e3174b02ec81 | 229 | gCSB = _ENABLE; |
radiojunkbox | 0:e3174b02ec81 | 230 | rcv = gSPI.write(gSYNC | MODE_SYNC); |
radiojunkbox | 0:e3174b02ec81 | 231 | gCSB = _DISABLE; |
radiojunkbox | 0:e3174b02ec81 | 232 | } |
radiojunkbox | 0:e3174b02ec81 | 233 | |
radiojunkbox | 0:e3174b02ec81 | 234 | // SEL CV CHANNEL |
radiojunkbox | 0:e3174b02ec81 | 235 | gCSB = _ENABLE; |
radiojunkbox | 0:e3174b02ec81 | 236 | gSPI.write(ch); |
radiojunkbox | 0:e3174b02ec81 | 237 | gCSB = _DISABLE; |
radiojunkbox | 0:e3174b02ec81 | 238 | |
radiojunkbox | 0:e3174b02ec81 | 239 | cnt < numptn ? cnt++ : cnt = 0; |
radiojunkbox | 0:e3174b02ec81 | 240 | |
radiojunkbox | 0:e3174b02ec81 | 241 | sw = CheckSW(rcv); |
radiojunkbox | 0:e3174b02ec81 | 242 | DinSync(sw); |
radiojunkbox | 0:e3174b02ec81 | 243 | } |
radiojunkbox | 0:e3174b02ec81 | 244 | |
radiojunkbox | 0:e3174b02ec81 | 245 | //------------------------------------------------------------- |
radiojunkbox | 0:e3174b02ec81 | 246 | // DIN Sync |
radiojunkbox | 0:e3174b02ec81 | 247 | |
radiojunkbox | 0:e3174b02ec81 | 248 | void DinSync(unsigned char sw) { |
radiojunkbox | 0:e3174b02ec81 | 249 | |
radiojunkbox | 0:e3174b02ec81 | 250 | static unsigned int cnt; |
radiojunkbox | 0:e3174b02ec81 | 251 | static unsigned char cnt48; |
radiojunkbox | 0:e3174b02ec81 | 252 | static unsigned char _cnt48; |
radiojunkbox | 0:e3174b02ec81 | 253 | |
radiojunkbox | 0:e3174b02ec81 | 254 | // BEAT COUNTER |
radiojunkbox | 0:e3174b02ec81 | 255 | if((cnt48 % 24) < 12) { |
radiojunkbox | 0:e3174b02ec81 | 256 | if( cnt >= gT1) { |
radiojunkbox | 0:e3174b02ec81 | 257 | cnt = 0; |
radiojunkbox | 0:e3174b02ec81 | 258 | cnt48++; |
radiojunkbox | 0:e3174b02ec81 | 259 | } |
radiojunkbox | 0:e3174b02ec81 | 260 | } |
radiojunkbox | 0:e3174b02ec81 | 261 | else { |
radiojunkbox | 0:e3174b02ec81 | 262 | if( cnt >= gT2) { |
radiojunkbox | 0:e3174b02ec81 | 263 | cnt = 0; |
radiojunkbox | 0:e3174b02ec81 | 264 | cnt48++; |
radiojunkbox | 0:e3174b02ec81 | 265 | } |
radiojunkbox | 0:e3174b02ec81 | 266 | } |
radiojunkbox | 0:e3174b02ec81 | 267 | if(cnt48 >= 48) cnt48 = 0; |
radiojunkbox | 0:e3174b02ec81 | 268 | |
radiojunkbox | 0:e3174b02ec81 | 269 | // START/STOP |
radiojunkbox | 0:e3174b02ec81 | 270 | if(sw & (SW1 | SW2)) { |
radiojunkbox | 0:e3174b02ec81 | 271 | if( !(gSYNC & (SYNC1RUN | SYNC2RUN))){ |
radiojunkbox | 0:e3174b02ec81 | 272 | cnt = 0; |
radiojunkbox | 0:e3174b02ec81 | 273 | cnt48 = 0; |
radiojunkbox | 0:e3174b02ec81 | 274 | gGATE = 0; |
radiojunkbox | 0:e3174b02ec81 | 275 | } |
radiojunkbox | 0:e3174b02ec81 | 276 | if(sw & SW1) gSYNC ^= SYNC1RUN; |
radiojunkbox | 0:e3174b02ec81 | 277 | if(sw & SW2) gSYNC ^= SYNC2RUN; |
radiojunkbox | 0:e3174b02ec81 | 278 | } |
radiojunkbox | 0:e3174b02ec81 | 279 | |
radiojunkbox | 0:e3174b02ec81 | 280 | // TOGGLE SYNC CLOCK |
radiojunkbox | 0:e3174b02ec81 | 281 | if(cnt48 & 0x01) { |
radiojunkbox | 0:e3174b02ec81 | 282 | gSYNC &= ~(SYNC1CLK | SYNC2CLK); |
radiojunkbox | 0:e3174b02ec81 | 283 | } |
radiojunkbox | 0:e3174b02ec81 | 284 | else { |
radiojunkbox | 0:e3174b02ec81 | 285 | gSYNC |= (SYNC1CLK | SYNC2CLK); |
radiojunkbox | 0:e3174b02ec81 | 286 | } |
radiojunkbox | 0:e3174b02ec81 | 287 | |
radiojunkbox | 0:e3174b02ec81 | 288 | // SYNC LED |
radiojunkbox | 0:e3174b02ec81 | 289 | gLED1 = gSYNC & SYNC1RUN ? 1 : 0; |
radiojunkbox | 0:e3174b02ec81 | 290 | gLED2 = gSYNC & SYNC2RUN ? 1 : 0; |
radiojunkbox | 0:e3174b02ec81 | 291 | gLED4 = cnt48 < 8 ? 1 : 0; |
radiojunkbox | 0:e3174b02ec81 | 292 | |
radiojunkbox | 0:e3174b02ec81 | 293 | // TOGGLE GATE OUT |
radiojunkbox | 0:e3174b02ec81 | 294 | if(gSYNC & (SYNC1RUN | SYNC2RUN)) { |
radiojunkbox | 0:e3174b02ec81 | 295 | if(cnt48 != _cnt48) { |
radiojunkbox | 0:e3174b02ec81 | 296 | if((cnt48 % 6) == 0) gGATE ^= GATE1; |
radiojunkbox | 0:e3174b02ec81 | 297 | if((cnt48 % 12) == 0) gGATE ^= GATE2; |
radiojunkbox | 0:e3174b02ec81 | 298 | if((cnt48 % 24) == 0) gGATE ^= GATE3; |
radiojunkbox | 0:e3174b02ec81 | 299 | if((cnt48 % 48) == 0) gGATE ^= GATE4; |
radiojunkbox | 0:e3174b02ec81 | 300 | } |
radiojunkbox | 0:e3174b02ec81 | 301 | } |
radiojunkbox | 0:e3174b02ec81 | 302 | else gGATE = 0; |
radiojunkbox | 0:e3174b02ec81 | 303 | _cnt48 = cnt48; |
radiojunkbox | 0:e3174b02ec81 | 304 | |
radiojunkbox | 0:e3174b02ec81 | 305 | cnt++; |
radiojunkbox | 0:e3174b02ec81 | 306 | } |
radiojunkbox | 0:e3174b02ec81 | 307 | |
radiojunkbox | 0:e3174b02ec81 | 308 | //------------------------------------------------------------- |
radiojunkbox | 0:e3174b02ec81 | 309 | // Check SW |
radiojunkbox | 0:e3174b02ec81 | 310 | |
radiojunkbox | 0:e3174b02ec81 | 311 | unsigned char CheckSW(unsigned char c) { |
radiojunkbox | 0:e3174b02ec81 | 312 | |
radiojunkbox | 0:e3174b02ec81 | 313 | static unsigned char swbuf[2]; |
radiojunkbox | 0:e3174b02ec81 | 314 | static unsigned int cntsw; |
radiojunkbox | 0:e3174b02ec81 | 315 | unsigned char ret = 0; |
radiojunkbox | 0:e3174b02ec81 | 316 | |
radiojunkbox | 0:e3174b02ec81 | 317 | if(cntsw > SW_WATCH_INTERVAL) { |
radiojunkbox | 0:e3174b02ec81 | 318 | if(c &= 0x0F) { |
radiojunkbox | 0:e3174b02ec81 | 319 | if(!swbuf[1]) { |
radiojunkbox | 0:e3174b02ec81 | 320 | if( swbuf[0] == c) { |
radiojunkbox | 0:e3174b02ec81 | 321 | swbuf[1] = c; |
radiojunkbox | 0:e3174b02ec81 | 322 | ret = c; |
radiojunkbox | 0:e3174b02ec81 | 323 | } |
radiojunkbox | 0:e3174b02ec81 | 324 | else { |
radiojunkbox | 0:e3174b02ec81 | 325 | swbuf[0] = c; |
radiojunkbox | 0:e3174b02ec81 | 326 | } |
radiojunkbox | 0:e3174b02ec81 | 327 | } |
radiojunkbox | 0:e3174b02ec81 | 328 | } |
radiojunkbox | 0:e3174b02ec81 | 329 | else { |
radiojunkbox | 0:e3174b02ec81 | 330 | swbuf[1] = 0; |
radiojunkbox | 0:e3174b02ec81 | 331 | swbuf[0] = 0; |
radiojunkbox | 0:e3174b02ec81 | 332 | } |
radiojunkbox | 0:e3174b02ec81 | 333 | cntsw = 0; |
radiojunkbox | 0:e3174b02ec81 | 334 | } |
radiojunkbox | 0:e3174b02ec81 | 335 | cntsw++; |
radiojunkbox | 0:e3174b02ec81 | 336 | return ret; |
radiojunkbox | 0:e3174b02ec81 | 337 | } |