Dies ist eine alte Version des Dokuments!
Side-Tone Generator für PCW Fistcheck
Für das reglmässige Gebe-Training mit der Hand-Taste ist für die Nutzung mit PWC-Fistcheck
(Ernst F. Schroeder DJ7HS https://www.qsl.net/dj7hs/download.htm) ein Side-Tone Generator mit zwei Ausgängen enstanden.
/* CW Side-Tone genarator with adjustable frequency and two outputs (One for head-phones and one for PC-SoundCard The code has been written to train Morse-Code with straight key and check with Precision CW Fistcheck From Ernst F. Schroeder DJ7HS see https://www.qsl.net/dj7hs/download.htm December 2018 Kai DM3KB */ // Analog Pins // int potPin = 0; // input pin for the potentiometer A0 Hardware Pin 19 // Digital Pins // int tonePin = 10; // Tone output to headphone pin D10 Hardware Pin 13 int outpin = 5; // Tone output to PC pin D05 Hardware Pin 8 int keyin = 6; // Input from Key pin D06 Hardware Pin 9 int led = 13; // LED Pin D13 Hardware Pin 16 // Declare Variables int val = 0; // variable to store the value read from the potentiometer int wave = 1; // variable to flag half wave int timerstat = 0; // Timer Status Flag int playflag = 0; // Play Tone Flag int ledstat = 0; // LED Status Flag unsigned long LTCNT1; // variable for Timer1 pre-set to match of halve-wave of a frequency void setup() { // initialize the digital pin as an output. pinMode(tonePin, OUTPUT); // declare the tonePin as an OUTPUT pinMode(outpin, OUTPUT); // declare the outpin as an OUTPUT pinMode(led, OUTPUT); // declare the ledPin as an OUTPUT // Setup control input pins pinMode(keyin, INPUT); // Setup control output pins digitalWrite(led, LOW); // turn the LED off by making the voltage LOW // Timer 1, set up to enable Overflow interrupt after 65536 with prescale 1 noInterrupts(); // Switch of all Interrupts TCCR1A = 0; // set entire TCCR0A register to 0 TCCR1B = 0; // set entire TCCR0B register to 0 TCNT1 = 39168; // Pre-Inizialize the Timer1 TCCR1B |= (0 << CS12) | (0 << CS11) | (1 << CS10); // set 1 as Prescale-Wert TIMSK1 |= (1 << TOIE1); // Activate Timer Overflow Interrupt interrupts(); // Enable all Interrupts again //Serial.begin(9600); // open the serial port at 9600 bps: } // Interrupt -andler for // Timer1 Overflow ISR(TIMER1_OVF_vect) { TCNT1 = LTCNT1; // Init counter again with actual value from Poti if (playflag == 1) { // If play Flag valid (1) play // square-wave to both output pins with timing read from Potentiometer which meet the frequency if (wave == 1) { //Play positive wave part digitalWrite(tonePin, HIGH); digitalWrite(outpin, HIGH); } else { //Play negative wave part digitalWrite(tonePin, LOW); digitalWrite(outpin, LOW); } } wave = !wave; // Toggel wave Flag } // The (Main) loop routine runs over and over again forever: void loop() { // Check if Key is pressed if (digitalRead(keyin)== LOW){ wave = 1; while(digitalRead(keyin)== LOW){ // As long key in is LOW (Key is pressed so we need an output!!!) // Enable Interrupt if (timerstat == 0 ) { //Serial.print(" = : Enable Interupt Play\n"); playflag = 1; timerstat = 1; } if ( ledstat == 0 ) { digitalWrite(led, HIGH); // turn the LED on by making the voltage HIGH ledstat = 1; } // Read tone frequency from Poti and map to sutialbe values val = analogRead(potPin); // read the value from the sensor // TCNT1 is the pre-set for the timer to start. // So Timer1 will count starting from 39168 or 55625 or any value in between and creating an // Overflow Interrupt when reaching 65536 // I needs to be set to time that a halve wave of the frequency need. // Formula is here: 65536 - (65536 - 16000000 / 1 / 350 / 2) // Max Value of Timer - ( Max Value of Timer / Arduino Clock Rate / PreScale / Frequency in Hz / 2 ) LTCNT1 = map(val, 0, 1023, 39168, 55625); //Map to value for TCNT1: 350 Hz = 39168 - 1250 Hz = 55625 // Generate square-wave to both output pins with frequency read from Potentiometer // by Timer1 Interrupt routine ISR(TIMER1_OVF_vect) } } if (digitalRead(keyin)== HIGH){ while(digitalRead(keyin)== HIGH){ // Key has bee released so no output if ( timerstat == 1 ) { //Serial.print(" = : Disable Interrupt Play\n"); playflag = 0; timerstat = 0; } wave = 0; // But check Speed-Potentiometer val = analogRead(potPin); // read the value from the sensor LTCNT1 = map(val, 0, 1023, 39168, 55625); //Map to value for TCNT1: 350 Hz = 39168 - 1250 Hz = 55625 if ( ledstat == 1 ) { digitalWrite(led, LOW); // turn the LED off by making the voltage LOW ledstat = 0; } } } } // End