/* 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-------------- --------- cw-keyer jan 21 Änderungen text 4 ist nun tempoeinstellung ---------- */ //#### hier anpassen durch den Funkamateur ##################################################### const char *text1[]= {" cqcqcq de dl1yar dl1yar cq de dl1yar pse k "}; //# sw-taste const char *text2[]= {"cqefa cqefa de dl1yar dl1yar cqefa de dl1yar pse k "}; //# rt-taste const char *text3[]= {"ur rprt rst 599-n18 5nn-n18 "}; //# gn-taste const char *text4[]= {"s"}; //# graue const char Version[]= {"CW-Keyer-EFA-DL mit EEPROM de dl1yar August 21"}; //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 //# const int Pad_pkt = 12; //Punkt //# const int AD_pin = 0 ; // Ad-wandler //# const int taste_grau = 0; //# const int taste_sw = 574; //# const int taste_rt = 767; //# const int taste_gn = 863; //# // ################################################################################## uint16_t pkt_l , pkt_sp ;//speicher für punktlänge ,Morsetempoabwärtszähler //uint8_t pad_merker; uint8_t i,txt_loop; uint16_t x ; int ze_l; //Zeichenlänge für Punktdauer uint8_t merker; // Platz fuer 0..7 merkerbits #define pkt_bit 0 //Punktpaddle #define str_bit 1 //Strichpaddle #define sp_bit 2 // Tempoeinstellung char *zeichen; char *text; #include //Einfügen der EEPROM Bibliothek byte speed = 255; // übergabe dees Wertes 255 an die neue Vriable wert int adr_sp = 0; // im EEPROM //###################################################### 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 punkt_laenge(); punkt_laenge(); //zwei Punktlängen } void abstand(){ TIMSK2 &= ~(1 << OCIE2A); // Ton aus punkt_laenge(); punkt_laenge(); //zwei Punktlängen do{asm("nop\n"); }while(pkt_l > 0); //damit die Schleife nicht wegoptimiert wird###### } void punkt_laenge(){ pkt_l =pkt_sp; do{asm("nop\n");} while(pkt_l > 0); // damit die Schleife nicht wegoptimiert wird###### } void punkt(){ //punkt_taste = 0; digitalWrite(Keyer_PIN,HIGH); //Keyerpin TIMSK2 |= (1 << OCIE2A); //Ton an punkt_laenge(); TIMSK2 &= ~(1 << OCIE2A); // interrupt stopp Ton aus digitalWrite(Keyer_PIN,LOW); //Keyerpin punkt_laenge(); bitWrite(merker,pkt_bit,0); } void strich(){ digitalWrite(Keyer_PIN,HIGH); //Keyerpin TIMSK2 |= (1 << OCIE2A); // Ton an punkt_laenge(); punkt_laenge(); punkt_laenge(); //3 mal punkt TIMSK2 &= ~(1 << OCIE2A); // Ton aus digitalWrite(Keyer_PIN,LOW); //Keyerpin punkt_laenge(); bitWrite(merker,str_bit,0); } void tempo(){ do{Serial.println(x); x =analogRead(0);} while (x <=8);//taste losslassen //sp_ = EEPROM.read(adr_sp); // Morsetempo einlesen do{ Serial.print("Tempo ");Serial.println(pkt_sp); punkt(); if (digitalRead (Pad_str) ==0 )pkt_sp = pkt_sp- 4; if (digitalRead (Pad_pkt) ==0 )pkt_sp = pkt_sp + 5; }while (analogRead(0) >=800); do{asm("nop\n");} while (analogRead(0) <=801);//taste losslassen EEPROM.write(adr_sp, pkt_sp); //Tempo sichern } void ausgabe(){ int i; txt_loop=0; do{ Serial.println(text); for (i =0;i<=(strlen(text));i++){ if (bitRead(merker,pkt_bit) ) {i= strlen(text) ;txt_loop = 1;} //Textabbruch if (bitRead(merker,str_bit) ) {i= strlen(text) ; txt_loop = 1;} //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; } } }while(txt_loop == 0); //Dauerschleife bitWrite(merker,str_bit,0); bitWrite(merker,pkt_bit,0); } void merkerfrage(){ if (bitRead(merker,pkt_bit)==1) {;punkt();bitWrite(merker,pkt_bit,0);} if (bitRead(merker,str_bit)==1) {strich();bitWrite(merker,str_bit,0);} } void ad_abfrage(){ Serial.println("AD-abfrage "); x=0; for (i =0;i<=8;){ //Serial.print("AD-"); x =x +( analogRead (0));//############### i++;} x = x/8; Serial.println(x); Serial.println(x); if (x <= taste_grau) {tempo();x=1000;} // AD 0 gr-taste if (x <= (taste_sw +5) ) {text = *text1;ausgabe();x=1000;};// AD 638 sw-taste if (x <= (taste_rt +5)) {text = *text2;ausgabe();x=1000;}; //AD 852 rt-taste if (x <= (taste_gn +5)) {text = *text3;ausgabe();x=1000;};// AD 959 gn-taste } //+++++++++++++++++++++++++++++++++ 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); pkt_sp = (EEPROM.read(adr_sp));//tempo();####### if (pkt_sp ==255){ pkt_sp =60; EEPROM.write(adr_sp,pkt_sp); //Tempo sichern } Serial.print( pkt_sp);Serial.println(" "); delay(999); 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); merker=0; //alle merker löschen interrupts(); } //+++++++++++++++++++++++++++++++++ void loop() { merkerfrage(); ad_abfrage(); }