/* Sehr gerne darf dieser Quellcode kopiert und verändert werden, aber nur zu privaten Zwecken!! DL1YAR Oktober 2020 name CW-Keyer-01.ino interupptabfrage Paddle Nov 2020 CW-Keyer-0.9i */ //#### hier anpassen durch den Funkamateur ######################################### const char *text1[]= {"cqwna cqwna de dl1yar dl1yar pse k"}; //# const char *text2[]= {"my name winfried qth recklinghausen dok n18 "}; //# const char *text3[]= {"ur rprt rst 599-n18 5nn-n18"}; //# const char *text4[]= {"cqcq n18 n18 de dl1yar dl1yar pse k"}; //# const char Version[]= {"CW-Keyer-0.9i de dl1yar "}; //Versionsausgabe //# const char *textmuster[]= {" ()=/+-.,;? abcdefghijklmnopqrstuvwxyz 0123456789"}; //# // ######## Texte sind änderbar // #### anpassen an die örtlichen anschlüsse######################################## const int Keyer_PIN = 3; //Keyer zum TRX //# const int Pieper_PIN = 2; //Piezoport ARDU-NANO //# const int Pad_str = 11; //Strich LCD-Shield //# const int Pad_pkt = 12; //Punkt LCD-Shield //# const int poti1 = A1; // Poti für Morsetempo //# int ze_l; //Zeichenlänge für Punktdauer //uint16_t geschw_t = 6250 ; // ca 60 BpM uint16_t pkt_l , pkt_sp ;//speicher für punktlänge abwärtszähler //uint8_t pad_merker; uint8_t i; uint16_t x ; uint8_t merker; // Platz fuer 0..7 merkerbits #define pkt_bit 0 #define str_bit 1 char *zeichen; char *text; //###################################################### //###################################################### ISR(TIMER1_COMPA_vect) //Tempokontrolle Morsezeichen { // timer interrupt service routine pkt_l = pkt_l - 1 ; // zählt punktlänge runter if (digitalRead (Pad_str) ==0 ){bitWrite(merker,pkt_bit,1);} if (digitalRead (Pad_pkt) ==0 ){bitWrite(merker,str_bit,1);} } //###################################################### ISR (TIMER2_COMPA_vect) { // called when TCNT2 == OCR2A digitalWrite(Pieper_PIN, !digitalRead(Pieper_PIN)); // Piezo toggeln } //###################################################### //###################################################### //+++++++++++++++++++++++++++++++++ void wortabstand(){ TIMSK2 &= ~(1 << OCIE2A); // Ton aus pkt_l = 2*pkt_sp; do{asm("nop\n");//wartet zeit ab }while(pkt_l > 0); } void abstand(){ TIMSK2 &= ~(1 << OCIE2A); // Ton aus pkt_l = 2*pkt_sp; //zwei Punktlängen do{asm("nop\n"); }while(pkt_l > 0);//wartet zeit ab } void punkt(){ //punkt_taste = 0; digitalWrite(Keyer_PIN,HIGH); //Keyerpin TIMSK2 |= (1 << OCIE2A); //Ton an pkt_l =pkt_sp; do{asm("nop\n");} while(pkt_l > 0); //######### TIMSK2 &= ~(1 << OCIE2A); // interrupt stopp Ton aus digitalWrite(Keyer_PIN,LOW); //Keyerpin pkt_l =pkt_sp; do{asm("nop\n");} while(pkt_l > 0); //Pause bitWrite(merker,pkt_bit,0); } void strich(){ digitalWrite(Keyer_PIN,HIGH); //Keyerpin TIMSK2 |= (1 << OCIE2A); // Ton an pkt_l = pkt_sp * 3; do{ asm("nop\n");} while(pkt_l > 0); TIMSK2 &= ~(1 << OCIE2A); // Ton aus digitalWrite(Keyer_PIN,LOW); //Keyerpin pkt_l =pkt_sp; do{asm("nop\n");} while(pkt_l > 0);// ASM NOP damit die schleife nicht wegoptimiert wird bitWrite(merker,str_bit,0); } void tempo(){ pkt_sp = (analogRead (poti1))/5;//###########Tempo########## Serial.print(analogRead (poti1)); Serial.print(" "); Serial.println(pkt_sp); } void ausgabe(){ int i; for (i =0;i<=(strlen(text));i++){ tempo(); //########### if (bitRead(merker,pkt_bit) ) i= strlen(text) ; //Textabbruch if (bitRead(merker,str_bit) ) i= strlen(text) ; //Textabbruch switch(int(text[i])){ case 32 :abstand();abstand();abstand();break; //Wortabstand(Space) case 40 :strich();punkt();strich(),strich();punkt();abstand();break; // ( case 41 :strich();punkt();strich(),strich();punkt();strich();abstand();break; // ) case 43 :punkt();strich();punkt();strich();punkt();abstand();break; // + case 44 :strich();strich();punkt();punkt();strich();strich();abstand();break; // , case 45 :strich();punkt();punkt();punkt();strich();abstand();break; // - case 46 :punkt();strich();punkt();strich();punkt();strich();abstand();break; // . case 47 :strich();punkt();punkt();strich();punkt();abstand();break; // / case 48 :strich();strich();strich();strich();strich();abstand();break; //0 case 49 :punkt();strich();strich();strich();strich();abstand();break; //1 case 50 :punkt();punkt();strich();strich();strich();abstand();break; //2 case 51 :punkt();punkt();punkt();strich();strich();abstand();break; //3 case 52 :punkt();punkt();punkt();punkt();strich();abstand();break; //4 case 53 :punkt();punkt();punkt();punkt();punkt();abstand();break; //5 case 54 :strich();punkt();punkt();punkt();punkt();abstand();break; //6 case 55 :strich();strich();punkt();punkt();punkt();abstand();break; //7 case 56 :strich();strich();strich();punkt();punkt();abstand();break; //8 case 57 :strich();strich();strich();strich();punkt();abstand();break; //9 case 59 :strich();punkt();strich();punkt();strich();punkt();abstand();break; // ; case 61 :strich();punkt();punkt();punkt();strich();abstand();break; // = case 63 :punkt();punkt();strich();strich();punkt();punkt();abstand();break; // ? case 97 :punkt();strich();abstand();break; //a case 98 :strich();punkt();punkt();punkt();abstand();break; //b case 99 :strich();punkt();strich();punkt();abstand();break; //c case 100 :strich();punkt();punkt();abstand();break; //d case 101 :punkt();abstand();break; //e case 102 :punkt();punkt();strich();punkt();abstand();break; //f case 103 :strich();strich();punkt();abstand();break; //g case 104 :punkt();punkt();punkt();punkt();abstand();break; //h case 105 :punkt();punkt();abstand();break; //i case 106 :punkt();strich();strich();strich();abstand();break; //j case 107 :strich();punkt();strich();abstand();break; //k case 108 :punkt();strich();punkt();punkt();abstand();break; //l case 109 :strich();strich();abstand();break; //m case 110 :strich();punkt();abstand();break; //n case 111 :strich();strich();strich();abstand();break; //o case 112 :punkt();strich();strich();punkt();abstand();break; //p case 113 :strich();strich();punkt();strich();abstand();break; //q case 114 :punkt();strich();punkt();abstand();break; //r case 115 :punkt();punkt();punkt();abstand();break; //s case 116 :strich();abstand();break; //t case 117 :punkt();punkt();strich();abstand();break; //u case 118 :punkt();punkt();punkt();strich();abstand();break; //v case 119 :punkt();strich();strich();abstand();break; //w case 120 :strich();punkt();punkt();strich();abstand();break; //x case 121 :strich();punkt();strich();strich();abstand();break; //y case 122 :strich();strich();punkt();punkt();abstand();break; //z case 123 :punkt();punkt();punkt();punkt();punkt();punkt();punkt();punkt();abstand();break; //irrung default: abstand();break; } } } void textausgabe(){ x = analogRead (0); if (x < 10) { do{asm("nop\n");} while (analogRead(0) <=801);//taste losslassen text = *text1; ausgabe(); } else if (x < 520){ do{asm("nop\n");} while (analogRead(0) <=801);//taste losslassen text = *text2; ausgabe(); } else if (x < 690){ do{asm("nop\n");} while (analogRead(0) <=801);//taste losslassen text = *text3; ausgabe(); } else if (x < 770){ do{asm("nop\n");} while (analogRead(0) <=801);//taste losslassen text = *text4; ausgabe(); } } void merkerfrage(){ if (bitRead(merker,pkt_bit) ==1) {bitWrite(merker,pkt_bit,0);punkt();} if (bitRead(merker,str_bit)==1) {strich();bitWrite(merker,str_bit,0);} } //+++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++ void setup() { pinMode(Pieper_PIN, INPUT_PULLUP); pinMode(Pad_str,INPUT_PULLUP); pinMode(Pad_pkt,INPUT_PULLUP); pinMode(Keyer_PIN, OUTPUT); pinMode(Pieper_PIN, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(Keyer_PIN,LOW); //Keyerpin Serial.begin(9600); // Aufbau einer seriellen Verbindung Serial.println(); Serial.println(Version); noInterrupts(); // Interrupts ausschalten TCCR1A = 0; // Timer1 initialisieren TCCR1B = 0; TCNT1 = 0; OCR1A = 100; // Vergleichsregister um die Zeit einzustellen 16MHz/256/100Hz punktlänge GETESTET TCCR1B |= (1 << WGM12); // CTC mode TCCR1B |= (1 << CS12); // 256 prescaler TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt an //+++++++++++++++++++++++++++++++++ // ca 700Hz-Ton TCCR2A = 0; // Timer2 initialisieren TCCR2B = 0; TCNT2 = 0; OCR2A = 3089; // Vergleichsregister um die Zeit einzustellen 16MHz/256/700Hz 89~700hz TCCR2B |= (1 << WGM12); // CTC mode TCCR2B |= (1 << CS12); // 256 prescaler TIMSK2 |= (1 << OCIE2A); // enable timer compare interrupt start ; // Interrups einschalten TIMSK2 &= ~(1 << OCIE2A); // enable timer compare interrupt stopp Ton aus bitWrite(merker,str_bit,0); bitWrite(merker,pkt_bit,0); interrupts(); } //+++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++ void loop() { merkerfrage(); tempo(); textausgabe(); } //######################################