//------------------------------------------------------------------------------ int __attribute__((OS_main)) main(void) { dnaUsbInit(); // will initialize the port and start listening sei(); // turning interrupts on starts the system going enableLed(); setLedOn(); for(;;) { usbPoll(); // must be called at least once every 50ms to service USB data // user code here } }
//------------------------------------------------------------------------------ int __attribute__((OS_main)) main(void) { dnaUsbInit(); enableLed(); usbCommand = ceCommandIdle; usbRNAPacketExpected = 1; TCCR0B = 1<<CS01 | 1<<CS00; // set 8-bit timer prescaler to div/64 TIMSK0 = 1<<TOIE0; // enable the interrupt rnaInit(); sei(); setLedOff(); for(;;) { rnaPoll(); if ( rnaPacketAvail ) { setLedOn(); rnaPacketAvail = 0; _delay_ms( 50 ); while ( !rnaSend(usbRNATo, usbRNAPacket, usbRNAPacketExpected) ) { _delay_ms(1); } setLedOff(); } /* if ( usbRNAPacketPos == usbRNAPacketExpected ) { usbRNAPacketPos = 0; if ( *usbRNAPacket == RNATypeDebugString ) { usbRNAPacket[usbRNAPacketExpected] = 0; usbprint( (char *)usbRNAPacket + 1, usbRNAPacketExpected ); } } */ } }
//------------------------------------------------------------------------------ int __attribute__((OS_main)) main(void) { setupA(); setupB(); setupVariables(); dnaUsbInit(); INSTALL_MORLOCK_DEFAULTS; saveEEPROMConstants(); loadEEPROMConstants(); // 12000000 / (64 * 94) = 1994.680 interrupts per second // accomplished by using timer0 in waveform generation mode 2 TCCR0B = 1<<CS01 | 1<<CS00; // set 8-bit timer prescaler to div/64 OCR0A = 94; TCCR0A = 1<<WGM01; TIMSK0 = 1<<OCIE0A; // mode 2, reset counter when it reaches OCROA TCCR1B = 1<<WGM12 | 1<<CS12;// CTC for OCR1A, clock select // set up A2D ADMUX = 1<<MUX0; // A1, Vcc ref ADCSRA = 1<<ADEN | 1<<ADPS2; // enable A2D, x16 DIDR0 = ADC1D; // disable all digital function on A1 ADCSRB = 1<<ADLAR; // knock off lower two bits, implementation is not that accurate PRR = 1<<PRUSI; // not using USI (yet) rnaInit(); sei(); _delay_ms(2); // let state settle, and make sure housekeeping ISR runs if( !triggerState && !consts.locked ) { timesToBlinkLight = 1; inProgramMode = true; } for(;;) { PRR |= 1<<PRTIM1; // power down timer, don't waste power // spin until a fire condition is triggered from the ISR while( !startFireCycle ) { sampleEye = false; if ( rnaRequestsConfigData ) { usbRNAPacket[0] = RNATypeSetConfigData; for( unsigned char c=0; c<sizeof(consts); c++ ) { usbRNAPacket[c+1] = ((unsigned char *)&consts)[c]; } rnaSend( rnaRequestsConfigData, usbRNAPacket, sizeof(consts) + 1 ); rnaRequestsConfigData = 0; } if ( !millisecondCountBox && consts.eyeEnabled ) { millisecondCountBox--; digitizeEye(); isLedOn = eyeBlocked ? true : false; } if ( eepromConstantsDirty ) { isLedOn = true; setLedOn(); eepromConstantsDirty = false; saveEEPROMConstants(); isLedOn = false; } if ( rnaPacketAvail ) { isLedOn = true; setLedOn(); rnaPacketAvail = false; _delay_ms( 50 ); rnaSend( usbRNATo, usbRNAPacket, usbRNAPacketExpected ); isLedOn = false; } } sampleEye = true; // set up the timer PRR &= ~(1<<PRTIM1); // timer back on TCNT1 = 0; // reset the timer TIFR1 |= 1<<OCF1A; // reset compare match if ( shotsInString < consts.rampEnableCount ) { shotsInString++; } // setup complete, cycle the marker if ( consts.singleSolenoid ) { cycleSingleSolenoid(); } else { cycleDoubleSolenoid(); } // bursting? if so count it down if ( burstCount && --burstCount ) { startFireCycle = true; } else if ( currentFireMode != ceFullAuto ) { startFireCycle = false; } isLedOn = false; // make sure at least this much time elapses at the end of a fire cycle millisecondCountBox = consts.shortCyclePreventionInterval; while( millisecondCountBox ); while( !(TIFR1 & 1<<OCF1A) ); // wait for end of fire cycle if ( currentFireMode == ceRamp && startFireCycle && (consts.rampTopMode != ceSemi) ) // officially hit top rate, blow guts out { // a shot was scheduled at the maximum rate it could be, go // ahead and shift up to whatever top mode the user wanted currentFireMode = consts.rampTopMode; scheduleShotBox = 0; scheduleShotRate = 0; } } }