Styring_af_analog_repeater_OZ1LN_07-04-2018_v_1_07 device Arduino NANO fra v 1.06_j kræves Starttid bærebølge for valid pilottone ved start fra v 1.06_j kræves ResetTid uden bærebølge ved genstart efter TimeOut fra v 1.06_N pilotfrekvens justeret i match OCR1A register fra v 1.06_o pilot kobles på når pilot_ok == 1 deklaration af pins ---------------------------------------- const int disponibel_2 = 2; (bruges ikke lige nu) const int disponibel_3 = 3; (bruges ikke lige nu) const int pilot_gate = 4; ud optokobler 1 const int pilot_ud = 5; altid pilottone ud 88.5 Hz (Timer 1) const int tone_ud = 6; morsetegn og dyt output LF const int TimeOutLED = 7; viser TimeOUT på LED const int disponibel_8 = 8; ud optokobler 3 const int tx_tast = const int disponibel_10= 10; const int disponibel_11= 11; 9; ud optokobler 4, taster sender const int disponibel_12= 12; const int blinkled = 13; pin 13 er LED på NANO const int pilot_ind = 14; ind optokobler 1, Pilottone const int disponibel_15= 15; ind optokobler 2, interrupt variable til millis tidskonstant -------------------------- unsigned long SlutStartMillis = 0; morse-tegn timer unsigned long SlutAktuelMillis = 0; morse-tegn timer unsigned long SlutInterval = 0; morse-tegn timer unsigned long MaxStartMillis = 0; unsigned long MaxAktuelMillis = 0; unsigned long MaxInterval = 0; unsigned long MaxStep = 1000; unsigned long Max_TX_tid = 180; max TX timer max TX timer max TX timer Step Max_TX_tid (milliseconds) Max_TX_tid default 180 sec unsigned long GenStartStartMillis = 0; GenStart timer unsigned long GenStartAktuelMillis = 0; GenStart timer unsigned long GenStartInterval = 0; GenStart timer unsigned long GenStartStep = 1000; Step GenStart_TX_tid (milliseconds) unsigned long GenStart_TX_tid = 3; Stille tid før GenStart (seconds) unsigned long BlinkLastTime; a-live-delay timer boolean toggle1 = 0; pilottone timer 1 interrupt (pilotgenerator) deklaration af globale variable -------------------------------------- boolean Start_OK = 0; boolean Pilot_OK = 0; boolean Send_OK = 0; Flag for modtaget start pilottone Flag for modtaget pilottone Flag til tast af sender Side 1
boolean TX_Stop = 0; Flag for max taletid const int StartTid = 1; Krævet bærebølge-tid (sekund + 1) ved første tast const int ResetTid = 20; Krævet pause (K)(20*70 msec) til reset Max_TX_tid const int TegnFrekv = 1000; LF frekvensen på Morsetegn (Hz) const int DytFrekv = 800; LF frekvensen på pause Dyt (Hz) const int BotFrekv = 600; LF frekvensen på pause Bot (Hz) const int SlutStep = 70; Step i morse = dot længde (millisec) const int BlinkDelay = 1000; a-live LED pin13 (milliseconds) int BlinkStatus; a-live LED pin13 (milliseconds) int DotTid = SlutStep; længde af en prik int DashTid = 3 * DotTid; længde af en streg -------------------------------------------------------------- void setup() Serial.begin(9600); sender til konsol i IDE for debug pinmode(pilot_ind, INPUT_PULLUP); pilottone modtaget = LOW pinmode(tone_ud, OUTPUT); pinmode(pilot_gate, OUTPUT); pinmode(pilot_ud, OUTPUT); pinmode(timeoutled, OUTPUT); pinmode(tx_tast, OUTPUT); pinmode(blinkled, OUTPUT); morse og dyt, tone() styring af pilot_gate Timer 1 88.5 Hz LED lyser ved TimeOut taster sender blink LED på Nano digitalwrite(pilot_gate, LOW); turn pilot tone ON cli(); stop interrupts ***** IKKE PILLE ***** ---------------Her genereres 88.5 Hz pilottone START------------------ set 16 bit timer1 interrupt ved 177Hz (output 177 / 2 = 88.5 Hz) TCCR1A = 0; sæt hele TCCR1A register til 0 TCCR1B = 0; sæt hele TCCR1B register til 0 TCNT1 = 0; initialize counter værdi til 0 sæt compare match register til 177 Hz increments, test mod god tæller OCR1A = 11305; ((16*10^6) / (177*8)) - 1 = 11298 (must be <65536) TCCR1B = (1 << WGM12); turn on CTC mode TCCR1B = (1 << CS11); Sæt CS11 bits for 8 prescaler TIMSK1 = (1 << OCIE1A); enable timer compare interrupt -------------------------------------------------------------- sei(); allow interrupts ***** IKKE PILLE ***** ---------------------------timer interrupts setup end--------- timer1 interrupt 177 Hz toggles pin pilot_ud (88.5 Hz output) ISR(TIMER1_COMPA_vect) if (toggle1) digitalwrite(pilot_ud,high); toggle1 = 0; else digitalwrite(pilot_ud,low); toggle1 = 1; Side 2
---------------Her genereres 88.5 Hz pilottone SLUT------------------ ---------------------Her begynder funktioner--------------- void aliveblink() blink med LED på NANO for at vise vi er i live if(millis()- BlinkLastTime >= BlinkDelay) BlinkStatus=!BlinkStatus; digitalwrite(13,blinkstatus); BlinkLastTime = millis(); Serial.print("blink "); Serial.print(BlinkStatus);Serial.println(" "); ------------------------------------------------------------ void GenStartMax_TX_timer() GenStartStartMillis = millis(); if ((GenStartStartMillis - GenStartAktuelMillis >= GenStartStep)&&(TX_Stop == 1)&&(Pilot_OK == 0)) GenStartInterval = GenStartInterval + 1; GenStartAktuelMillis = GenStartStartMillis; if (GenStartInterval >= GenStart_TX_tid) TX_Stop = 0; digitalwrite(timeoutled,low); GenStartInterval = 0; ------------------------------------------------------------ void Max_TX_timer() stopper sender, hvis mere end Max_TX_tid uden at høre K MaxStartMillis = millis(); if ((MaxStartMillis - MaxAktuelMillis >= MaxStep)&&(TX_Stop == 0)) MaxInterval = MaxInterval + 1; MaxAktuelMillis = MaxStartMillis; if ((MaxInterval == StartTid) && (Pilot_OK == 1)) Start_OK = 1; Krævet bærebølge ved start if (MaxInterval == (Max_TX_tid + 0)) tone(tone_ud, DytFrekv, DashTid); if (MaxInterval == (Max_TX_tid + 1)) tone(tone_ud, BotFrekv, DashTid); if (MaxInterval == (Max_TX_tid + 2)) tone(tone_ud, DytFrekv, DashTid); if (MaxInterval == (Max_TX_tid + 3)) tone(tone_ud, BotFrekv, DashTid); if (MaxInterval == (Max_TX_tid + 4)) tone(tone_ud, DytFrekv, DashTid); if (MaxInterval == (Max_TX_tid + 5)) tone(tone_ud, BotFrekv, DashTid); if (MaxInterval == (Max_TX_tid + 6)) tone(tone_ud, DytFrekv, DashTid); if (MaxInterval == (Max_TX_tid + 7)) tone(tone_ud, BotFrekv, DashTid); if (MaxInterval == (Max_TX_tid + 8)) tone(tone_ud, DytFrekv, DashTid); if (MaxInterval == (Max_TX_tid + 9)) tone(tone_ud, BotFrekv, DashTid); if (MaxInterval >= (Max_TX_tid + 10)) TX_Stop = 1; digitalwrite(timeoutled,high); MaxInterval = 0; Side 3
------------------------------------------------------------ void SlutGenerator() SlutStartMillis = millis(); if ((SlutStartMillis - SlutAktuelMillis >= SlutStep)&&(TX_Stop == 0)&&(Pilot_OK == 0)) SlutInterval = SlutInterval + 1; SlutAktuelMillis = SlutStartMillis; if (SlutInterval == 12) tone(tone_ud, TegnFrekv, DashTid); K if (SlutInterval == 16) tone(tone_ud, TegnFrekv, DotTid); K if (SlutInterval == 18) tone(tone_ud, TegnFrekv, DashTid); K if (SlutInterval == ResetTid) MaxInterval = 0; Krævet pause til Reset af Max_TX_timer if (SlutInterval == 58) tone(tone_ud, DytFrekv, DotTid); if (SlutInterval == 88) tone(tone_ud, DytFrekv, DotTid); ----------------Morse begynd------------------------------------------ if (SlutInterval == 108) digitalwrite(pilot_gate, HIGH); pilot tone OFF if (SlutInterval == 120) tone(tone_ud, TegnFrekv, DashTid); O if (SlutInterval == 124) tone(tone_ud, TegnFrekv, DashTid); if (SlutInterval == 128) tone(tone_ud, TegnFrekv, DashTid); if (SlutInterval == 134) tone(tone_ud, TegnFrekv, DashTid); Z if (SlutInterval == 138) tone(tone_ud, TegnFrekv, DashTid); if (SlutInterval == 142) tone(tone_ud, TegnFrekv, DotTid); if (SlutInterval == 144) tone(tone_ud, TegnFrekv, DotTid); if (SlutInterval == 148) tone(tone_ud, TegnFrekv, DashTid); 7 if (SlutInterval == 152) tone(tone_ud, TegnFrekv, DashTid); if (SlutInterval == 156) tone(tone_ud, TegnFrekv, DotTid); if (SlutInterval == 158) tone(tone_ud, TegnFrekv, DotTid); if (SlutInterval == 160) tone(tone_ud, TegnFrekv, DotTid); if (SlutInterval == 164) tone(tone_ud, TegnFrekv, DotTid); R if (SlutInterval == 166) tone(tone_ud, TegnFrekv, DashTid); if (SlutInterval == 170) tone(tone_ud, TegnFrekv, DotTid); if (SlutInterval == 174) tone(tone_ud, TegnFrekv, DotTid); E if (SlutInterval == 178) tone(tone_ud, TegnFrekv, DotTid); S if (SlutInterval == 180) tone(tone_ud, TegnFrekv, DotTid); if (SlutInterval == 182) tone(tone_ud, TegnFrekv, DotTid); if (SlutInterval == 190) digitalwrite(pilot_gate, LOW); pilot tone ON if (SlutInterval >= 190) Send_OK = 0; Start_OK = 0; SlutInterval = 0; Side 4
------------------------------------------------------------ void Test_Input() Pilot_OK =!digitalread(pilot_ind); Bemærk: pilot_ind inverteres if ((Pilot_OK == 1) && (TX_Stop == 0)) Send_OK = 1; *************************************************************** HOVEDPROGRAM. Her står den kode, som kører i uendelig sløjfe. void loop() aliveblink(); Max_TX_timer(); SlutGenerator(); GenStartMax_TX_timer(); Test_Input(); if (TX_Stop == 1) digitalwrite(tx_tast,low); TX blokeres pga Max_TX_timer if (Pilot_OK == 1) digitalwrite(pilot_gate, LOW); turn pilot tone ON if (Pilot_OK == 1) Send_OK = 1; if (Pilot_OK == 1) SlutInterval = 0; nulstil SlutGenerator if (Pilot_OK == 1) GenStartInterval = 0; nulstil GenStart timer if ((Pilot_OK == 0) && (Start_OK == 0)) Send_OK = 0; if (Send_OK == 0) SlutInterval = 0; nulstil SlutGenerator if (Send_OK == 0) MaxInterval = 0; nulstil Max_TX_timer if (Send_OK == 0) digitalwrite(tx_tast,low); TX tast OFF if ((Send_OK == 1) && (TX_Stop == 0)) digitalwrite(tx_tast,high); TX tast ON /* --- efterfølgende bruges til dbug til monitor, og bør ud-blankes ------- ---- Brug af monitor i denne mængde nedsætter morse-hastigheden -------- Serial.print("Pilot "); Serial.print(Pilot_OK); Serial.print(" Max "); Serial.print(MaxInterval); Serial.print(" Start "); Serial.print(Start_OK); Serial.print(" Send "); Serial.print(Send_OK); Serial.print(" Slut "); Serial.print(SlutInterval); Serial.print(" Gen "); Serial.print(GenStartInterval); Serial.print(" Stop "); Serial.print(TX_Stop); Serial.println(); */ *************************************************************** Side 5