#include <avr/pgmspace.h>const PROGMEM byte wav_0[3936] = { 0x80, 0x82, ........... 0x78, 128};const PROGMEM byte wav_1[3934] = { 0x79, 0x76,.......... 0x79, 128};const PROGMEM byte wav_2[3932] = { 0x82, 0x87, .......... 0x79, 128};const PROGMEM byte wav_3[3934] = { 0x80, 0x85, ......... 0x73, 128};const PROGMEM byte wav_4[3946] = { 0x7f, 0x8a, .......... 0x75, 128};const PROGMEM byte wav_5[3955] = { 0x6e, 0x60,......... 0x81, 128};//// options table at http://wiki.openmusiclabs.com/wiki/PWMDAC//// Timer1 PWM. 9b, Phase Correct, 15.6kHz, single pin// The WAV samples are 8it, 16kHz,//#define PWM_FREQ 0x01FF // pwm frequency - see table, 0x01FF is 15.6kHz#define PWM_MODE 0 // Fast (1) or Phase Correct (0)#define PWM_QTY 1 // number of pwms, either 1 or 2#define PWM_SHIFT 1 // 15.6kHz and 1 pin gives 9bit resolution, so shift the sample 1 bit left#define WAV_VOLUME 20#define BEL_PIN 2void setup(){ cli(); // turnoff interrupts // setup PWM TCCR1A = 0; TCCR1B = 0; TCCR1A = (((PWM_QTY - 1) << 5) | 0x80 | (PWM_MODE << 1)); // TCCR1B = ((PWM_MODE << 3) | 0x11); // ck/1 TIMSK1 = 0x20; // interrupt on capture interrupt ICR1H = (PWM_FREQ >> 8); ICR1L = (PWM_FREQ & 0xff); DDRB |= ((PWM_QTY << 1) | 0x02); // turn on outputs sei(); // turn on interrupts // Setup the bell activation pin pinMode(BEL_PIN, INPUT);}//// When the bell has to ring, set this on//volatile bool bellRinging = false;void loop() { if (digitalRead(BEL_PIN) == HIGH) { bellRinging = true; } else { bellRinging = false; }}//// Some state data for the ISR// Some state data for getNextSoundSample with their initial values.//int debugCnt = 0;unsigned int wavValue = 128; // start at the zero point of the soundint wavByteIndex = 0;int wavTableSize = 3935;byte *wavTable = wav_0;ISR(TIMER1_CAPT_vect){ // // If at the begin of the sound sample, the sound toggle is of, // return immediate, so no bell is ringing // if ((wavByteIndex == 0) && (!bellRinging)) { wavTableSize = 3935; wavTable = wav_0; return; } // output high byte on OC1A OCR1AH = wavValue >> 8; // takes top 8 bits OCR1AL = wavValue; // takes bottom 8 bits wavValue = (getNextSoundSample() * WAV_VOLUME) / 100;}unsigned int getNextSoundSample(){ unsigned int sample = (pgm_read_byte_near(wavTable + wavByteIndex)) << PWM_SHIFT; if (++wavByteIndex >= wavTableSize) { // // Restart the table // wavByteIndex = 0; switch (random(0, 6)) { case 0: wavTableSize = 3935; wavTable = wav_0; break; case 1: wavTableSize = 3933; wavTable = wav_1; break; case 2: wavTableSize = 3931; wavTable = wav_2; break; case 3: wavTableSize = 3933; wavTable = wav_3; break; case 4: wavTableSize = 3945; wavTable = wav_4; break; case 5: wavTableSize = 3954; wavTable = wav_5; break; default: wavTableSize = 3935; wavTable = wav_0; break; } } return sample;}
Maar ik vind de overzichtelijkheid en helderheid van de code belangrijker dan het besparen van 8 bits.
class BlinkingLed {private: const byte blPin; const unsigned short blinkInterval; bool blinking; bool ledOn; unsigned long lastTime;public: BlinkingLed(byte pin, unsigned short interval) : blPin(pin), blinkInterval(interval) {}
Die 3 termen van je moet ik eens opzoeken. Geen idee wat het is. Ik weet wel dat ik in de wonderlijke assembly wereld op werk soms bijzonder van streek wordt gemaakt door de meest verschrikkelijke "abominations" dat zij daar software noemen.
Als in koploper een trein van punt A naar punt B laat rijden en hij komt halverwege een bepaalde melder tegen kan je dan een instructie voor een soort overweg ding aansturen? Je kan natuurlijk seinstanden en wisselstanden kan opsturen, maar onbekend als ik ben met koploper, weet ik niet of je zo ook een overgang kan dichtgooien. Hoe ga je dat aanpakken? Wat wel interessant is, is dat je arduino informatie kan ontvangen over de wisselstanden. Daar moet je toch zeker mee kunnen werken?
Een wissel staat recht of afbuigend.
Die zet gewoon het wissel in rechtdoor of afbuigend, het is dan aan het wisselobject zelf om het wissel in beweging te brengen en die beweging te controleren tot dat het wissel in de gewenste stand staat.