Erweiterung des Menüs für die Einstellungen und Speicherung von
Einstellungen im EEprom.
Dieser Commit ist enthalten in:
Ursprung
c815b6c36b
Commit
0ce89c6276
@ -1,2 +1,2 @@
|
||||
:080000000032005802000F5508
|
||||
:080000000032005802000C550B
|
||||
:00000001FF
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*
|
||||
* BJ-Keyer
|
||||
*
|
||||
*
|
||||
* 2023-07-29 Tom, DL7BJ
|
||||
*
|
||||
*/
|
||||
#ifndef BJ-KEYER_H_INCLUDED
|
||||
@ -13,7 +14,6 @@
|
||||
#define USART_BAUDRATE 9600
|
||||
#define UBRR_VALUE (((F_CPU/(USART_BAUDRATE*16UL)))-1)
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
@ -42,19 +42,20 @@ const char PRG[] = " BJ-Keyer ";
|
||||
const char VER[] = " V1.0 ";
|
||||
const char Trx1[] = "TRX 1";
|
||||
const char Trx2[] = "TRX 2";
|
||||
const char Trx[] = "Beide TRX";
|
||||
const char IambicA[] = "Iambic A";
|
||||
const char IambicB[] = "Iambic B";
|
||||
const char Ratio[] = "Ratio";
|
||||
const char Reverse[] = "R";
|
||||
const char ReverseRL[] = " L - R °";
|
||||
const char ReverseLR[] = " L ° R -";
|
||||
const char SideToneOnOff[] = "Mithörton";
|
||||
const char SideToneFreq[] = "Frequenz";
|
||||
|
||||
const char RiseTime[] = "Anstieg";
|
||||
const char DebounceTime[] = "Entprl.";
|
||||
const char Yes[] = "J";
|
||||
const char No[] = "N";
|
||||
const char Hz[] = "Hz";
|
||||
|
||||
// Const strings for VT100
|
||||
// Const strings for VT100 Terminals
|
||||
const char CLRSCR[] = "\033[2J";
|
||||
|
||||
#ifndef EEMEM
|
||||
@ -68,12 +69,9 @@ const char CLRSCR[] = "\033[2J";
|
||||
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) // clear bit
|
||||
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) // set bit
|
||||
|
||||
// The length of one dit at 1wpm is 1.2s. The timer resolution
|
||||
// of Timer 1 is set to 64µs, so there are 18750 ticks needed.
|
||||
#define TICKS_PER_WPM 18750
|
||||
|
||||
#define L_WAIT 500 // Frequency for debug LED Timer 0
|
||||
|
||||
// Keying states
|
||||
#define NOTHING 0
|
||||
#define DIT_DAH_OFF 1
|
||||
#define DAH_DIT_OFF 2
|
||||
@ -126,25 +124,20 @@ const char CLRSCR[] = "\033[2J";
|
||||
// Menue und Drehencoder
|
||||
#define M_TRX1 1
|
||||
#define M_TRX2 2
|
||||
#define M_IAMBICA 3
|
||||
#define M_IAMBICB 4
|
||||
#define M_REVERSE 5
|
||||
#define M_RATIO 6
|
||||
#define M_TON_FREQ 7
|
||||
#define M_TON 8
|
||||
#define M_TON 3
|
||||
#define M_TON_FREQ 4
|
||||
#define M_IAMBICA 5
|
||||
#define M_IAMBICB 6
|
||||
#define M_REVERSE 7
|
||||
#define M_RATIO 8
|
||||
#define M_WPMBPM 9
|
||||
#define M_MAX 9 // maximale Menuepunke
|
||||
#define M_RISETIME 10
|
||||
#define M_DEBOUNCE 11
|
||||
#define M_MAX 11 // maximale Menuepunke
|
||||
// LCD
|
||||
#define CLEARLINE " "
|
||||
|
||||
// Sine wave table for PWM, 256 values
|
||||
//const unsigned char sinewave[] PROGMEM = {
|
||||
// 0x80,0x8d,0x99,0xa5,0xb1,0xbd,0xc8,0xd2,0xdb,0xe3,0xeb,0xf1,0xf6,0xfa,0xfd,0xff, // 16
|
||||
// 0xff,0xfe,0xfc,0xf8,0xf4,0xee,0xe7,0xdf,0xd6,0xcd,0xc2,0xb7,0xab,0x9f,0x93,0x86, // 32
|
||||
// 0x7a,0x6d,0x61,0x55,0x49,0x3e,0x33,0x2a,0x21,0x19,0x12,0x0c,0x08,0x04,0x02,0x01, // 48
|
||||
// 0x01,0x03,0x06,0x0a,0x0f,0x15,0x1d,0x25,0x2e,0x38,0x43,0x4f,0x5b,0x67,0x73,0x80 // 64
|
||||
//};
|
||||
|
||||
// Sinustabelle für PWM mit 64 Werten
|
||||
const unsigned char sinewave[] PROGMEM = {
|
||||
0x00, 0x01, 0x02, 0x05, 0x0a, 0x0f, 0x15, 0x1d, 0x25, 0x2f, 0x39, 0x43, 0x4f, 0x5a, 0x67, 0x73,
|
||||
0x80, 0x8c, 0x98, 0xa5, 0xb0, 0xbc, 0xc6, 0xd0, 0xda, 0xe2, 0xea, 0xf0, 0xf5, 0xfa, 0xfd, 0xfe,
|
||||
@ -152,23 +145,10 @@ const unsigned char sinewave[] PROGMEM = {
|
||||
0x80, 0x73, 0x67, 0x5a, 0x4f, 0x43, 0x39, 0x2f, 0x25, 0x1d, 0x15, 0x0f, 0x0a, 0x05, 0x02, 0x01
|
||||
};
|
||||
|
||||
//const unsigned char sinewave[] PROGMEM = {
|
||||
//0 , 0 , 0 , 1 , 2 , 3 , 5 , 7 , 9 , 12 , 14 , 17 , 21 , 24 , 28 , 32,
|
||||
//36 , 41 , 46 , 51 , 56 , 61 , 66 , 72 , 78 , 83 , 89 , 95 , 101 , 107 , 114 , 120,
|
||||
//127 , 133 , 139 , 145 , 151 , 157 , 163 , 169 , 175 , 181 , 186 , 192 , 197 , 202 , 207 , 212,
|
||||
//216 , 221 , 225 , 228 , 232 , 235 , 238 , 241 , 244 , 246 , 248 , 250 , 251 , 252 , 253 , 253,
|
||||
//253 , 253 , 253 , 252 , 251 , 250 , 248 , 246 , 244 , 241 , 239 , 236 , 232 , 229 , 225 , 221,
|
||||
//216 , 212 , 207 , 202 , 197 , 192 , 187 , 181 , 175 , 169 , 164 , 158 , 151 , 145 , 139 , 133,
|
||||
//127 , 120 , 114 , 108 , 102 , 96 , 90 , 84 , 78 , 72 , 67 , 61 , 56 , 51 , 46 , 41,
|
||||
//37 , 33 , 28 , 25 , 21 , 18 , 15 , 12 , 9 , 7 , 5 , 3 , 2 , 1 , 0 , 0
|
||||
//};
|
||||
|
||||
|
||||
|
||||
uint8_t sdebug[64];
|
||||
char sdebug[64];
|
||||
|
||||
// Sidetone generation
|
||||
double sidetone_f = 600;
|
||||
double FrequencySidetone = 600;
|
||||
volatile uint8_t icnt;
|
||||
volatile uint8_t ocr2a;
|
||||
|
||||
@ -178,14 +158,14 @@ uint16_t MenuCtrlTimer = 0; // Wartezeit bis zur Betriebsanzeige nac
|
||||
volatile uint16_t ms; // Timer 0 max. 65535ms, all purpose timer variable
|
||||
volatile uint16_t mselement; // Timer 0 max. 65535ms, element length of dit or dah
|
||||
|
||||
int8_t wpm = 15; // Geschwindigkeit in wpm
|
||||
uint8_t weight = 50; // Gewichtung Punkt-Strich Verhältnis
|
||||
int8_t WpM = 12; // Geschwindigkeit in wpm
|
||||
uint8_t Weight = 50; // Gewichtung Punkt-Strich Verhältnis
|
||||
uint8_t t_element_length;
|
||||
|
||||
struct Merker
|
||||
{
|
||||
uint8_t WpMChanged: 1;
|
||||
uint8_t WriteWpMEEProm: 1;
|
||||
uint8_t WriteWpMEEprom: 1;
|
||||
} bMerker;
|
||||
|
||||
struct MenuCtrl
|
||||
@ -196,10 +176,9 @@ struct MenuCtrl
|
||||
uint8_t m_buttonPressedLong: 1;
|
||||
uint8_t ClrScr: 1;
|
||||
uint8_t Config: 1;
|
||||
uint8_t WriteEEProm: 1;
|
||||
uint8_t WriteEEprom: 1;
|
||||
uint8_t Update: 1;
|
||||
uint8_t CurMenue;
|
||||
|
||||
} bMenuCtrl;
|
||||
|
||||
// State Machines
|
||||
@ -216,7 +195,6 @@ volatile uint8_t LastSendStatus = MANUAL_SENDING;
|
||||
// History
|
||||
uint8_t keyhistory = 0xff;
|
||||
|
||||
|
||||
uint8_t KeyTX = 1;
|
||||
|
||||
uint8_t DahBuffer = 0;
|
||||
@ -227,42 +205,51 @@ uint8_t KeyState = 0;
|
||||
uint8_t DitCounter = 0;
|
||||
uint8_t DahCounter = 0;
|
||||
uint8_t CurrentTRX = TRX1;
|
||||
uint8_t SpeedWpM = 1;
|
||||
uint8_t StateRisetime = 0;
|
||||
volatile uint8_t StateRisetimeCounter = 0;
|
||||
uint8_t StateRiseTime = 0;
|
||||
volatile uint8_t StateRiseTimeCounter = 0;
|
||||
|
||||
// Variablen in Timer 0
|
||||
volatile uint16_t l_timer = 0; // counter for LED on
|
||||
volatile uint8_t t_timer = 0; // Frequency of audio output
|
||||
volatile uint16_t t_wait = 0; // delayms max. 65535ms
|
||||
volatile uint8_t t_pwm = 0;
|
||||
volatile uint16_t t_wait_led = 50;
|
||||
volatile uint8_t lastButton = 0; // Wert der letzten Buttonabfrage
|
||||
|
||||
volatile uint8_t encoder_timer = 0; // 10ms Timer for Encoder
|
||||
volatile int8_t encoder_counter = 0; // Vor/Rück Zähler
|
||||
// Drehencoder
|
||||
volatile uint8_t EncoderTimer = 0; // 10ms Timer for Encoder
|
||||
volatile int8_t EncoderCounter = 0; // Vor/Rück Zähler
|
||||
volatile int8_t EncoderPos; // Encoderposition für WpM/BpM
|
||||
volatile int8_t EncoderPosConfig; // Encoderposition für Einstellungen
|
||||
|
||||
volatile uint8_t StateStraightKeyPressed = 0; // Merker für StraightKey betätigt
|
||||
volatile uint8_t TimerStraightKeyPressed = 0; // Timervariable für Entprellung
|
||||
|
||||
// EEPROM
|
||||
uint8_t dummy = 0x55;
|
||||
uint8_t ee_dummy EEMEM = 0x55; // Dummy for Address 0
|
||||
uint8_t ee_wpm EEMEM = 15; // WpM
|
||||
uint8_t ee_sidetone EEMEM = 0; // Mithörton An (1) oder Aus (0)
|
||||
uint16_t ee_sidetone_f EEMEM = 600; // Frequenz des Mithörtons
|
||||
uint8_t ee_iambic EEMEM = 0; // Iambic Mode A oder B
|
||||
uint8_t ee_weight EEMEM = 50; // Dah dit Ratio
|
||||
uint8_t ee_trx EEMEM = 0; // TRX 1 (0), TRX 2 (1), Beide (2)
|
||||
uint8_t Dummy = 0x55;
|
||||
uint8_t ee_Dummy EEMEM = 0x55; // Dummy for Address 0
|
||||
uint8_t ee_WpM EEMEM = 12; // WpM
|
||||
uint8_t ee_Sidetone EEMEM = 0; // Mithörton An (1) oder Aus (0)
|
||||
uint16_t ee_FrequencySidetone EEMEM = 600; // Frequenz des Mithörtons
|
||||
uint8_t ee_IambicMode EEMEM = 0; // Iambic Mode A oder B
|
||||
uint8_t ee_Weight EEMEM = 50; // Dah dit Ratio
|
||||
uint8_t ee_TRX EEMEM = 0; // TRX 1 (0), TRX 2 (1), Beide (2)
|
||||
|
||||
struct Config
|
||||
{
|
||||
uint8_t trx;
|
||||
uint8_t iambic;
|
||||
uint8_t ratio;
|
||||
uint16_t sidetone_f;
|
||||
uint8_t sidetone;
|
||||
uint8_t wpmbpm;
|
||||
uint8_t wpm;
|
||||
uint8_t reverse;
|
||||
uint8_t weight;
|
||||
uint8_t Risetime;
|
||||
uint8_t RisetimeCounter;
|
||||
uint8_t TRX; // TRX 1 oder 2 oder beide
|
||||
uint8_t IambicMode; // Iambic A oder Iambic B Mode
|
||||
uint8_t Ratio; // Punkt/Strich Verhältnis
|
||||
uint16_t FrequencySidetone; // Frequenz des Mithörtons
|
||||
uint8_t SidetoneEnabled; // Mithörton eingeschaltet
|
||||
uint8_t WpMBpM; // WpM oder BpM Anzeige
|
||||
uint8_t WpM; // WpM
|
||||
uint8_t Reverse; // linkes/rechtes Paddle vertauschen
|
||||
uint8_t Weight; // ???
|
||||
uint8_t RiseTime; // Anstiegszeit Sinuston
|
||||
uint8_t RiseTimeCounter; // Anzahl Sinusschwingungen für den Anstieg
|
||||
uint8_t DebounceTime; // Entprellzeit für Straight Key Eingang
|
||||
uint8_t WinkeyerEnabled; // Winkeyer2 Emulation
|
||||
} bConfig;
|
||||
// Function prototypes
|
||||
void Init(void);
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include "encoder.h"
|
||||
@ -7,24 +6,13 @@ int8_t DrehgeberPosition;
|
||||
int8_t DrehgeberMax = 127;
|
||||
int8_t DrehgeberMin = -127;
|
||||
|
||||
#define DDR(x) (*(&x-1))
|
||||
#define Port(x) (*(&x))
|
||||
#define PIN(x) (*(&x-2))
|
||||
|
||||
#define PHASE_A PIN(ENC_A_PORT) & (1<<ENC_A_PIN)
|
||||
#define PHASE_B PIN(ENC_B_PORT) & (1<<ENC_B_PIN)
|
||||
#define BUTTONPRESSED (!(PIN(ENC_T_PORT) & (1<<ENC_T_PIN)))
|
||||
|
||||
#define BUTTON_DEBOUNCETIME_MS 30
|
||||
#define BUTTON_PRESSEDLONG_MS 1000
|
||||
|
||||
volatile int8_t enc_delta;
|
||||
static int8_t last;
|
||||
|
||||
volatile int16_t iButtonPressedCounter = 0;
|
||||
volatile int16_t iButtonDebounceCycles = 0;
|
||||
volatile int16_t iButtonPressedLongCycles = 0;
|
||||
|
||||
volatile int8_t enc_delta;
|
||||
static int8_t last;
|
||||
|
||||
typedef enum EButtonState
|
||||
{
|
||||
ButtonState_Unpressed,
|
||||
@ -77,16 +65,19 @@ void EncoderPolling(void)
|
||||
if(iButtonPressedCounter >= iButtonDebounceCycles && (! BUTTONPRESSED))
|
||||
{
|
||||
buttonState = ButtonState_Released;
|
||||
if(buttonPressed != ButtonPressed_Long) buttonPressed = ButtonPressed_Short;
|
||||
if(buttonPressed != ButtonPressed_Long)
|
||||
buttonPressed = ButtonPressed_Short;
|
||||
}
|
||||
if(iButtonPressedCounter >= iButtonPressedLongCycles)
|
||||
{
|
||||
buttonState = ButtonState_Released;
|
||||
buttonPressed = ButtonPressed_Long;
|
||||
}
|
||||
break;
|
||||
case ButtonState_Released:
|
||||
iButtonPressedCounter = 0;
|
||||
buttonState = ButtonState_Unpressed;
|
||||
if(!BUTTONPRESSED)
|
||||
buttonState = ButtonState_Unpressed;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -13,19 +13,30 @@
|
||||
#define ENC_T_PORT PORTB /**< port for button */
|
||||
#define ENC_T_PIN PB2 /**< pin for button */
|
||||
|
||||
#define DDR(x) (*(&x-1))
|
||||
#define Port(x) (*(&x))
|
||||
#define PIN(x) (*(&x-2))
|
||||
|
||||
#define PHASE_A PIN(ENC_A_PORT) & (1<<ENC_A_PIN)
|
||||
#define PHASE_B PIN(ENC_B_PORT) & (1<<ENC_B_PIN)
|
||||
#define BUTTONPRESSED (!(PIN(ENC_T_PORT) & (1<<ENC_T_PIN)))
|
||||
|
||||
#define BUTTON_DEBOUNCETIME_MS 30
|
||||
#define BUTTON_PRESSEDLONG_MS 250
|
||||
|
||||
typedef enum EButtonPressedState
|
||||
{
|
||||
ButtonPressed_Unpressed,
|
||||
ButtonPressed_Short,
|
||||
ButtonPressed_Long
|
||||
|
||||
ButtonPressed_Unpressed,
|
||||
ButtonPressed_Short,
|
||||
ButtonPressed_Long
|
||||
}tEButtonPressedState;
|
||||
|
||||
// Initialisiert den Encoder und aktiviert den Interrupt + Timer
|
||||
void EncoderInit( void );
|
||||
// Liest die Position des Encoders aus
|
||||
// Wenn Ueberlauf=1 dann zählt der Encoder nach Max
|
||||
// wieder von Min und umgekehrt
|
||||
int8_t EncoderRead( char Ueberlauf );
|
||||
int8_t EncoderRead(char Ueberlauf);
|
||||
// Ruft den Status des Encoder-Knopfes
|
||||
tEButtonPressedState EncoderGetButtonState(void);
|
||||
// Setzt die aktuelle Drehencoderposition
|
||||
|
@ -39,37 +39,41 @@ void ResetMilliSeconds(void)
|
||||
|
||||
/** \brief EEPROM schreiben
|
||||
*/
|
||||
void WriteEEProm(void)
|
||||
void WriteEEprom(void)
|
||||
{
|
||||
cli();
|
||||
eeprom_write_byte(&ee_dummy,0x55);
|
||||
eeprom_write_byte(&ee_wpm, bConfig.wpm);
|
||||
eeprom_write_byte(&ee_iambic, bConfig.iambic);
|
||||
eeprom_write_word(&ee_sidetone_f, bConfig.sidetone_f);
|
||||
eeprom_write_byte(&ee_trx, bConfig.trx);
|
||||
eeprom_write_byte(&ee_Dummy,0x55);
|
||||
eeprom_write_byte(&ee_WpM, bConfig.WpM);
|
||||
eeprom_write_byte(&ee_IambicMode, bConfig.IambicMode);
|
||||
eeprom_write_word(&ee_FrequencySidetone, bConfig.FrequencySidetone);
|
||||
eeprom_write_byte(&ee_TRX, bConfig.TRX);
|
||||
sei();
|
||||
}
|
||||
|
||||
void ReadEEProm(void)
|
||||
void ReadEEprom(void)
|
||||
{
|
||||
// wpm = eeprom_read_byte(&ee_wpm);
|
||||
}
|
||||
|
||||
void WriteEEProm_WpM(void)
|
||||
void WriteEEpromWpM(void)
|
||||
{
|
||||
cli();
|
||||
eeprom_write_byte(&ee_wpm, bConfig.wpm);
|
||||
cli();
|
||||
sprintf(sdebug," %i WpM in EEprom schreiben\r\n",bConfig.WpM);
|
||||
SendSerialString(sdebug);
|
||||
eeprom_write_byte(&ee_WpM, bConfig.WpM);
|
||||
sei();
|
||||
}
|
||||
|
||||
void ReadEEProm_WpM(void)
|
||||
void ReadEEpromWpM(void)
|
||||
{
|
||||
cli();
|
||||
bConfig.wpm = eeprom_read_byte(&ee_wpm);
|
||||
bConfig.WpM = eeprom_read_byte(&ee_WpM);
|
||||
sei();
|
||||
if(bConfig.wpm > 50) {
|
||||
bConfig.wpm = 15;
|
||||
WriteEEProm_WpM();
|
||||
sprintf(sdebug," %i WpM von EEprom gelesen\r\n",bConfig.WpM);
|
||||
SendSerialString(sdebug);
|
||||
if(bConfig.WpM > 50) {
|
||||
bConfig.WpM = 15;
|
||||
WriteEEpromWpM();
|
||||
}
|
||||
}
|
||||
|
||||
@ -99,8 +103,8 @@ uint8_t ReadKeyPin(uint8_t pin)
|
||||
void SideToneOn(void)
|
||||
{
|
||||
state_sidetoneoff = 0;
|
||||
StateRisetime = bConfig.Risetime;
|
||||
StateRisetimeCounter = 0;
|
||||
StateRiseTime = bConfig.RiseTime;
|
||||
StateRiseTimeCounter = 0;
|
||||
icnt = 0;
|
||||
sbi(TIMSK1,OCIE1A);
|
||||
}
|
||||
@ -110,8 +114,8 @@ void SideToneOn(void)
|
||||
void SideToneOff(void)
|
||||
{
|
||||
state_sidetoneoff = 1;
|
||||
StateRisetime = 0;
|
||||
StateRisetimeCounter = 0;
|
||||
StateRiseTime = 0;
|
||||
StateRiseTimeCounter = 0;
|
||||
}
|
||||
/*
|
||||
** TXSidetoneKey
|
||||
@ -148,9 +152,20 @@ void TXSidetoneKey(uint8_t State, uint8_t SendingType)
|
||||
void CheckStraightKey(void)
|
||||
{
|
||||
if(PIND & (1<<STRAIGHT_KEY))
|
||||
{
|
||||
TXSidetoneKey(0,MANUAL_SENDING);
|
||||
else
|
||||
TXSidetoneKey(1,MANUAL_SENDING);
|
||||
StateStraightKeyPressed = 0;
|
||||
} else {
|
||||
if(StateStraightKeyPressed == 0)
|
||||
{
|
||||
StateStraightKeyPressed = 1;
|
||||
TimerStraightKeyPressed = 0;
|
||||
}
|
||||
if(StateStraightKeyPressed == 2)
|
||||
{
|
||||
TXSidetoneKey(1,MANUAL_SENDING);
|
||||
}
|
||||
}
|
||||
}
|
||||
/** \brief CheckPaddles
|
||||
* Original code K3NG keyer line 5654
|
||||
@ -234,10 +249,6 @@ void CheckPaddles(void)
|
||||
*/
|
||||
long ServiceStraightKey(void)
|
||||
{
|
||||
long l;
|
||||
static uint8_t last_straight_key_state = 0;
|
||||
|
||||
return l;
|
||||
}
|
||||
|
||||
|
||||
@ -288,9 +299,9 @@ void SendDit(uint8_t SendingType)
|
||||
{
|
||||
SendStatus = SENDING_DIT;
|
||||
TXSidetoneKey(1,SendingType);
|
||||
Loop(1,0,wpm,SendingType);
|
||||
Loop(1,0,WpM,SendingType);
|
||||
TXSidetoneKey(0,SendingType);
|
||||
Loop(1,0,wpm,SendingType);
|
||||
Loop(1,0,WpM,SendingType);
|
||||
}
|
||||
/** \brief Send a dah
|
||||
** A Dah with weight = 50 has the length of 3 Dits.
|
||||
@ -299,9 +310,9 @@ void SendDah(uint8_t SendingType)
|
||||
{
|
||||
SendStatus = SENDING_DAH;
|
||||
TXSidetoneKey(1,SendingType);
|
||||
Loop(3,0,wpm,SendingType);
|
||||
Loop(3,0,WpM,SendingType);
|
||||
TXSidetoneKey(0,SendingType);
|
||||
Loop(1,0,wpm,SendingType);
|
||||
Loop(1,0,WpM,SendingType);
|
||||
}
|
||||
/*
|
||||
** Set sidetone frequency
|
||||
@ -322,6 +333,7 @@ void Tone(uint16_t f, uint8_t duration)
|
||||
SideToneOn();
|
||||
delayms(duration);
|
||||
SideToneOff();
|
||||
SetFrequency(bConfig.FrequencySidetone);
|
||||
}
|
||||
void Boop(void)
|
||||
{
|
||||
@ -392,7 +404,7 @@ void SendChar(unsigned char c)
|
||||
// ***TODO Sonderzeichen
|
||||
|
||||
}
|
||||
Loop(3,0,wpm,AUTOMATIC);
|
||||
Loop(3,0,WpM,AUTOMATIC);
|
||||
}
|
||||
|
||||
|
||||
|
@ -24,9 +24,12 @@ void IntEnable(void);
|
||||
|
||||
|
||||
// EEPROM
|
||||
void WriteEEProm(void);
|
||||
void ReadEEProm(void);
|
||||
void WriteEEProm_WpM(void);
|
||||
void ReadEEProm_WpM(void);
|
||||
void WriteEEprom(void);
|
||||
void ReadEEprom(void);
|
||||
void WriteEEpromWpM(void);
|
||||
void ReadEEpromWpM(void);
|
||||
|
||||
// Serielle Schnittstelle
|
||||
void SendSerialString(char *s);
|
||||
|
||||
#endif
|
||||
|
243
Source/main.c
243
Source/main.c
@ -18,6 +18,7 @@
|
||||
2022-09-02 DL7BJ viele Softwareänderungen, neuer Filter für PWM
|
||||
2022-09-11 DL7BJ Encoder, LC-Display, Frontplatine "entsorgt"
|
||||
2023-06-28 DL7BJ Port Anpassungen an neue Leiterplatte V1.01
|
||||
2023-07-29 DL7BJ Menü für Einstellungen implementiert
|
||||
|
||||
ATMEGA328(P)
|
||||
----------
|
||||
@ -159,7 +160,7 @@ void Init()
|
||||
cbi(PORTD,RIGHT_PADDLE);
|
||||
cbi(PORTD,STRAIGHT_KEY);
|
||||
|
||||
t_element_length = (uint16_t)1200/bConfig.wpm;
|
||||
t_element_length = (uint16_t)1200/bConfig.WpM;
|
||||
|
||||
// Pin Change Interrupts Port D - Keys
|
||||
// PD4 - StraightKey - PCINT20 - Pin Change Interrupt 20
|
||||
@ -186,20 +187,22 @@ void Init()
|
||||
bMenuCtrl.Update = 1;
|
||||
bMenuCtrl.Config = 0;
|
||||
bMenuCtrl.buttonPressed = 0;
|
||||
bMenuCtrl.WriteEEProm = 0;
|
||||
bMenuCtrl.WriteEEprom = 0;
|
||||
bMenuCtrl.buttonPressedLong = 0;
|
||||
// Initialisierung Konfiguration
|
||||
bConfig.iambic = 1;
|
||||
bConfig.sidetone_f = 600;
|
||||
bConfig.sidetone = 1;
|
||||
bConfig.trx = 0;
|
||||
bConfig.weight = 50;
|
||||
bConfig.wpmbpm = 1;
|
||||
bConfig.wpm = 15;
|
||||
bConfig.ratio = 30;
|
||||
bConfig.reverse = 0;
|
||||
bConfig.Risetime = 4;
|
||||
bConfig.RisetimeCounter = 4;
|
||||
bConfig.IambicMode = 1;
|
||||
bConfig.FrequencySidetone = 600;
|
||||
bConfig.SidetoneEnabled = 1;
|
||||
bConfig.TRX = 0;
|
||||
bConfig.Weight = 50;
|
||||
bConfig.WpMBpM = 1;
|
||||
bConfig.WpM = 12;
|
||||
bConfig.Ratio = 30;
|
||||
bConfig.Reverse = 0;
|
||||
bConfig.RiseTime = 6;
|
||||
bConfig.RiseTimeCounter = 6;
|
||||
bConfig.DebounceTime = 5;
|
||||
bConfig.WinkeyerEnabled = 0;
|
||||
sei(); // enable all interrupts
|
||||
}
|
||||
/** \brief 16 Bit Timer 1A
|
||||
@ -218,8 +221,8 @@ ISR(TIMER1_COMPA_vect)
|
||||
{
|
||||
ocr2a = pgm_read_byte_near(sinewave+icnt);
|
||||
icnt++;
|
||||
if(StateRisetime > 0)
|
||||
OCR2A = (ocr2a >> StateRisetime);
|
||||
if(StateRiseTime > 0)
|
||||
OCR2A = (ocr2a >> StateRiseTime);
|
||||
else
|
||||
OCR2A = ocr2a;
|
||||
|
||||
@ -228,20 +231,20 @@ ISR(TIMER1_COMPA_vect)
|
||||
icnt = 0;
|
||||
if(state_sidetoneoff == 0)
|
||||
{
|
||||
if(StateRisetime > 0)
|
||||
if(StateRiseTime > 0)
|
||||
{
|
||||
StateRisetimeCounter++;
|
||||
if(StateRisetimeCounter > bConfig.RisetimeCounter)
|
||||
StateRisetime--;
|
||||
StateRiseTimeCounter++;
|
||||
if(StateRiseTimeCounter > bConfig.RiseTimeCounter)
|
||||
StateRiseTime--;
|
||||
}
|
||||
}
|
||||
if(state_sidetoneoff == 1)
|
||||
{
|
||||
if(StateRisetime < bConfig.Risetime)
|
||||
if(StateRiseTime < bConfig.RiseTime)
|
||||
{
|
||||
StateRisetimeCounter++;
|
||||
if(StateRisetimeCounter > bConfig.RisetimeCounter)
|
||||
StateRisetime++;
|
||||
StateRiseTimeCounter++;
|
||||
if(StateRiseTimeCounter > bConfig.RiseTimeCounter)
|
||||
StateRiseTime++;
|
||||
} else {
|
||||
OCR2A = 0;
|
||||
cbi(TIMSK1,OCIE1A);
|
||||
@ -259,41 +262,51 @@ ISR(TIMER1_COMPA_vect)
|
||||
*/
|
||||
ISR(TIMER0_COMPA_vect)
|
||||
{
|
||||
ms++;
|
||||
StoreEEprom++;
|
||||
MenuCtrlTimer++;
|
||||
|
||||
mselement++; // element length of dit or dat
|
||||
ms++; // allgemeiner Millisekundenzähler
|
||||
StoreEEprom++; // Zähler für Zeitablauf speichern EEprom
|
||||
MenuCtrlTimer++; // Zähler für Zeitablauf Einstellungen
|
||||
EncoderTimer++; // Zähler für 5ms Drehencoder Timer
|
||||
|
||||
mselement++; // element length of dit or dat
|
||||
t_wait++;
|
||||
l_timer++;
|
||||
encoder_timer++;
|
||||
|
||||
if(l_timer >= L_WAIT){
|
||||
if(l_timer >= L_WAIT)
|
||||
{
|
||||
l_timer = 0;
|
||||
}
|
||||
// Alle 5ms den Drehencoder abfragen
|
||||
if(encoder_timer > 5) {
|
||||
if(EncoderTimer > 5)
|
||||
{
|
||||
EncoderTimer = 0;
|
||||
EncoderPolling();
|
||||
// Schalter vom Drehencoder abfragen
|
||||
if(EncoderGetButtonState() == ButtonPressed_Short)
|
||||
lastButton = EncoderGetButtonState();
|
||||
if(lastButton == ButtonPressed_Short)
|
||||
{
|
||||
bMenuCtrl.buttonPressed = 1;
|
||||
SendSerialString("Button pressed short\r\n");
|
||||
SendSerialString("Encoder Button pressed short\r\n");
|
||||
}
|
||||
if(EncoderGetButtonState() == ButtonPressed_Long)
|
||||
if(lastButton == ButtonPressed_Long)
|
||||
{
|
||||
bMenuCtrl.buttonPressedLong = 1;
|
||||
SendSerialString("Button pressed long\r\n");
|
||||
SendSerialString("Encoder Button pressed long\r\n");
|
||||
}
|
||||
}
|
||||
// Wpm verändert?
|
||||
// WpM verändert? Nach einer Sekunde im EEPROM Speichern
|
||||
if((StoreEEprom > 1000) && (bMerker.WpMChanged))
|
||||
{
|
||||
StoreEEprom = 0;
|
||||
bMerker.WriteWpMEEProm = 1;
|
||||
bMerker.WriteWpMEEprom = 1;
|
||||
bMerker.WpMChanged = 0;
|
||||
}
|
||||
// Softwareentprellung für StraightKey
|
||||
TimerStraightKeyPressed++;
|
||||
if(StateStraightKeyPressed == 1)
|
||||
{
|
||||
if(TimerStraightKeyPressed > bConfig.DebounceTime)
|
||||
StateStraightKeyPressed = 2;
|
||||
}
|
||||
|
||||
// Konfiguration nach 3 Sekunden verlassen
|
||||
// if((MenuCtrlTimer > 3000) && (bMenuCtrl.Config == 1))
|
||||
// {
|
||||
@ -428,7 +441,9 @@ void ConfigMenue(void)
|
||||
|
||||
lcd_charMode(NORMAL);
|
||||
lcd_gotoxy(0,0);
|
||||
sprintf(line,"%s - %i","Konfiguration", bMenuCtrl.CurMenue);
|
||||
lcd_puts(CLEARLINE);
|
||||
lcd_gotoxy(0,0);
|
||||
sprintf(line,"%s - %i","Einstellungen", bMenuCtrl.CurMenue);
|
||||
lcd_puts(line);
|
||||
lcd_charMode(DOUBLESIZE);
|
||||
lcd_gotoxy(0,3);
|
||||
@ -437,63 +452,63 @@ void ConfigMenue(void)
|
||||
{
|
||||
case M_TRX1:
|
||||
lcd_gotoxy(0,3);
|
||||
if((bConfig.trx == 1) || (bConfig.trx == 0))
|
||||
if((bConfig.TRX == 1) || (bConfig.TRX == 0))
|
||||
sprintf(line,"[%s]", "TRX 1");
|
||||
else
|
||||
sprintf(line,"%s", "TRX 1");
|
||||
sprintf(line," %s ", "TRX 1");
|
||||
lcd_puts(line);
|
||||
break;
|
||||
case M_TRX2:
|
||||
lcd_gotoxy(0,3);
|
||||
if((bConfig.trx == 2) || (bConfig.trx == 0))
|
||||
if((bConfig.TRX == 2) || (bConfig.TRX == 0))
|
||||
sprintf(line,"[%s]", "TRX 2");
|
||||
else
|
||||
sprintf(line,"%s", "TRX 2");
|
||||
sprintf(line," %s ", "TRX 2");
|
||||
lcd_puts(line);
|
||||
break;
|
||||
case M_IAMBICA:
|
||||
lcd_gotoxy(0,3);
|
||||
if(bConfig.iambic == 1)
|
||||
sprintf(line,"[%s]", "Iambic A");
|
||||
else
|
||||
sprintf(line,"%s", "Iambic A");
|
||||
if(bConfig.IambicMode == 1)
|
||||
sprintf(line,"[%s]", IambicA);
|
||||
else
|
||||
sprintf(line," %s ", IambicB);
|
||||
lcd_puts(line);
|
||||
break;
|
||||
case M_IAMBICB:
|
||||
lcd_gotoxy(0,3);
|
||||
if(bConfig.iambic == 2)
|
||||
sprintf(line,"[%s]", "Iambic B");
|
||||
if(bConfig.IambicMode == 2)
|
||||
sprintf(line,"[%s]", IambicB);
|
||||
else
|
||||
sprintf(line,"%s", "Iambic B");
|
||||
sprintf(line," %s ", IambicB);
|
||||
lcd_puts(line);
|
||||
break;
|
||||
case M_REVERSE:
|
||||
lcd_gotoxy(0,3);
|
||||
if(bConfig.reverse == 0)
|
||||
sprintf(line,"%s", "L . R -");
|
||||
if(bConfig.Reverse == 0)
|
||||
sprintf(line,"%s", ReverseLR);
|
||||
else
|
||||
sprintf(line,"%s", "L - R .");
|
||||
sprintf(line,"%s", ReverseRL);
|
||||
lcd_puts(line);
|
||||
break;
|
||||
case M_RATIO:
|
||||
lcd_gotoxy(0,3);
|
||||
if(bConfig.ratio == 30)
|
||||
if(bConfig.Ratio == 30)
|
||||
sprintf(line,"%s", "Ratio 3:1");
|
||||
else
|
||||
sprintf(line,"%s %f:1", "Ratio", bConfig.ratio/10);
|
||||
sprintf(line,"%s %i:1", "Ratio", bConfig.Ratio/10);
|
||||
lcd_puts(line);
|
||||
break;
|
||||
case M_TON_FREQ:
|
||||
lcd_gotoxy(0,3);
|
||||
if(bConfig.sidetone_f == 650)
|
||||
if(bConfig.FrequencySidetone == 650)
|
||||
sprintf(line,"%s", "Ton 650Hz");
|
||||
else
|
||||
sprintf(line,"%s %uHz", "Ton", bConfig.sidetone_f);
|
||||
sprintf(line,"%s %uHz", "Ton", bConfig.FrequencySidetone);
|
||||
lcd_puts(line);
|
||||
break;
|
||||
case M_TON:
|
||||
lcd_gotoxy(0,3);
|
||||
if(bConfig.ratio == 1)
|
||||
if(bConfig.SidetoneEnabled == 1)
|
||||
sprintf(line,"%s", "Ton an");
|
||||
else
|
||||
sprintf(line,"%s", "Ton aus");
|
||||
@ -501,12 +516,22 @@ void ConfigMenue(void)
|
||||
break;
|
||||
case M_WPMBPM:
|
||||
lcd_gotoxy(0,3);
|
||||
if(bConfig.wpmbpm == 0)
|
||||
if(bConfig.WpMBpM == 0)
|
||||
sprintf(line,"%s", "WpM");
|
||||
else
|
||||
sprintf(line,"%s", "BpM");
|
||||
lcd_puts(line);
|
||||
break;
|
||||
case M_RISETIME:
|
||||
lcd_gotoxy(0,3);
|
||||
sprintf(line,"%s %ims",RiseTime, bConfig.RiseTime);
|
||||
lcd_puts(line);
|
||||
break;
|
||||
case M_DEBOUNCE:
|
||||
lcd_gotoxy(0,3);
|
||||
sprintf(line,"%s %ims",DebounceTime, bConfig.DebounceTime);
|
||||
lcd_puts(line);
|
||||
break;
|
||||
}
|
||||
bMenuCtrl.Update = 0;
|
||||
lcd_charMode(NORMAL);
|
||||
@ -528,29 +553,30 @@ void UpdateDisplay(void)
|
||||
{
|
||||
lcd_clrscr();
|
||||
bMenuCtrl.ClrScr = 0;
|
||||
bMenuCtrl.Update = 1;
|
||||
}
|
||||
if(!(bMenuCtrl.Config))
|
||||
{
|
||||
lcd_charMode(DOUBLESIZE);
|
||||
lcd_gotoxy(4,3);
|
||||
if(bConfig.wpmbpm)
|
||||
sprintf(line,"%i WpM ",bConfig.wpm);
|
||||
if(bConfig.WpMBpM)
|
||||
sprintf(line,"%i WpM ",bConfig.WpM);
|
||||
else
|
||||
sprintf(line,"%i BpM ", bConfig.wpm*5);
|
||||
sprintf(line,"%i BpM ", bConfig.WpM*5);
|
||||
lcd_puts(line);
|
||||
lcd_charMode(NORMAL);
|
||||
lcd_gotoxy(13,0);
|
||||
if(bConfig.iambic == 1)
|
||||
if(bConfig.IambicMode == 1)
|
||||
sprintf(line,"%s", IambicA);
|
||||
if(bConfig.iambic == 2)
|
||||
if(bConfig.IambicMode == 2)
|
||||
sprintf(line,"%s", IambicB);
|
||||
lcd_puts(line);
|
||||
lcd_gotoxy(0,0);
|
||||
if(bConfig.trx == 1)
|
||||
if(bConfig.TRX == 1)
|
||||
sprintf(line, "%s", Trx1);
|
||||
if(bConfig.trx == 2)
|
||||
if(bConfig.TRX == 2)
|
||||
sprintf(line, "%s", Trx2);
|
||||
if(bConfig.trx == 0)
|
||||
if(bConfig.TRX == 0)
|
||||
sprintf(line, "%s %s", Trx1, Trx2);
|
||||
lcd_puts(line);
|
||||
}
|
||||
@ -570,11 +596,16 @@ void Drehencoder(void)
|
||||
{
|
||||
EncoderMinMax(5,50);
|
||||
st = EncoderRead(1);
|
||||
if(bConfig.wpm != st)
|
||||
if(bConfig.WpM != st)
|
||||
{
|
||||
bConfig.wpm = st;
|
||||
bMerker.WpMChanged = 1;
|
||||
bMenuCtrl.Update = 1;
|
||||
bConfig.WpM = st; // neuen Wert in bConfig speichern
|
||||
bMerker.WpMChanged = 1; // Merker für Timer 0 setzen
|
||||
bMenuCtrl.Update = 1; // Merker für UpdateDisplay setzen
|
||||
EncoderPos = st; // neuen Werte in EncoderPos speichern
|
||||
WpM = bConfig.WpM; // neuen Wert in WpM übernehmen
|
||||
cli();
|
||||
StoreEEprom = 0; // Timer 0 Variable löschen für Update EEprom
|
||||
sei();
|
||||
}
|
||||
}
|
||||
|
||||
@ -583,6 +614,10 @@ void Drehencoder(void)
|
||||
bMenuCtrl.Config = 1;
|
||||
MenuCtrlTimer = 0;
|
||||
bMenuCtrl.buttonPressed = 0;
|
||||
EncoderPos = EncoderRead(1);
|
||||
bMenuCtrl.CurMenue = EncoderPosConfig;
|
||||
EncoderWrite(EncoderPosConfig);
|
||||
bMenuCtrl.Update = 1;
|
||||
}
|
||||
|
||||
if((bMenuCtrl.buttonPressedLong == 1) && (bMenuCtrl.Config == 1))
|
||||
@ -592,8 +627,11 @@ void Drehencoder(void)
|
||||
bMenuCtrl.buttonPressedLong = 0;
|
||||
bMenuCtrl.buttonPressed = 0;
|
||||
bMenuCtrl.m_buttonPressed = 0;
|
||||
bMenuCtrl.m_buttonPressed = 0;
|
||||
MenuCtrlTimer = 0;
|
||||
EncoderPosConfig = EncoderRead(1);
|
||||
EncoderWrite(EncoderPos);
|
||||
bMenuCtrl.ClrScr = 1;
|
||||
Beep();
|
||||
}
|
||||
|
||||
if(bMenuCtrl.Config == 1)
|
||||
@ -603,9 +641,9 @@ void Drehencoder(void)
|
||||
EncoderMinMax(1,M_MAX);
|
||||
st = EncoderRead(1);
|
||||
sprintf(sdebug,"Encoder %i\r\n",st);
|
||||
SendSerialString(sdebug);
|
||||
if(last != st)
|
||||
{
|
||||
SendSerialString(sdebug);
|
||||
bMenuCtrl.CurMenue = st;
|
||||
bMenuCtrl.Update = 1;
|
||||
}
|
||||
@ -624,47 +662,52 @@ void Drehencoder(void)
|
||||
switch(bMenuCtrl.CurMenue)
|
||||
{
|
||||
case M_TRX1:
|
||||
if(bConfig.trx == 2)
|
||||
bConfig.trx = 0;
|
||||
if(bConfig.TRX == 2)
|
||||
bConfig.TRX = 0;
|
||||
else
|
||||
bConfig.trx = 1;
|
||||
bConfig.TRX = 1;
|
||||
bMenuCtrl.m_buttonPressed = 0;
|
||||
break;
|
||||
case M_TRX2:
|
||||
if(bConfig.trx == 1)
|
||||
bConfig.trx = 0;
|
||||
if(bConfig.TRX == 1)
|
||||
bConfig.TRX = 0;
|
||||
else
|
||||
bConfig.trx = 2;
|
||||
bConfig.TRX = 2;
|
||||
bMenuCtrl.m_buttonPressed = 0;
|
||||
break;
|
||||
case M_IAMBICA:
|
||||
bConfig.iambic = 1;
|
||||
bConfig.IambicMode = 1;
|
||||
bMenuCtrl.m_buttonPressed = 0;
|
||||
break;
|
||||
case M_IAMBICB:
|
||||
bConfig.iambic = 2;
|
||||
bConfig.IambicMode = 2;
|
||||
bMenuCtrl.m_buttonPressed = 0;
|
||||
break;
|
||||
case M_REVERSE:
|
||||
if(bConfig.reverse == 1)
|
||||
bConfig.reverse = 0;
|
||||
if(bConfig.Reverse == 1)
|
||||
bConfig.Reverse = 0;
|
||||
else
|
||||
bConfig.reverse = 1;
|
||||
bConfig.Reverse = 1;
|
||||
bMenuCtrl.m_buttonPressed = 0;
|
||||
if(bConfig.Reverse == 1)
|
||||
PaddleMode = PADDLE_REVERSE;
|
||||
else
|
||||
PaddleMode = PADDLE_NORMAL;
|
||||
bMenuCtrl.Update = 1;
|
||||
break;
|
||||
case M_RATIO:
|
||||
EncoderMinMax(15,30);
|
||||
st = EncoderRead(1);
|
||||
bConfig.ratio = st;
|
||||
if(bConfig.ratio > 30) bConfig.ratio = 30;
|
||||
if(bConfig.ratio < 15) bConfig.ratio = 15;
|
||||
bConfig.Ratio = st;
|
||||
if(bConfig.Ratio > 30) bConfig.Ratio = 30;
|
||||
if(bConfig.Ratio < 15) bConfig.Ratio = 15;
|
||||
bMenuCtrl.Update = 1;
|
||||
break;
|
||||
case M_TON_FREQ:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -687,21 +730,29 @@ int main(void)
|
||||
|
||||
MachineMode = NORMAL;
|
||||
KeyerMode = IAMBIC_A;
|
||||
ReadEEProm_WpM();
|
||||
|
||||
SendSerialString(CLRSCR);
|
||||
SendSerialString(CLRSCR);
|
||||
SendSerialString("BJ-Keyer V1.00\r\n");
|
||||
SendSerialString("Ready!\r\n");
|
||||
EncoderWrite(bConfig.wpm);
|
||||
|
||||
ReadEEpromWpM();
|
||||
WpM = bConfig.WpM;
|
||||
EncoderPos = bConfig.WpM;
|
||||
EncoderWrite(bConfig.WpM);
|
||||
EncoderPosConfig = 1;
|
||||
|
||||
SetFrequency(600);
|
||||
|
||||
|
||||
while(1)
|
||||
{
|
||||
Drehencoder();
|
||||
|
||||
if(bMerker.WriteWpMEEProm)
|
||||
WriteEEProm_WpM();
|
||||
// Wenn Geschwindigkeit verändert und Zeit abgelaufen,
|
||||
// dann im EEprom speichern und Merker löschen.
|
||||
if(bMerker.WriteWpMEEprom)
|
||||
{
|
||||
sprintf(" %i WpM in EEprom speichern\r\n", bConfig.WpM);
|
||||
WriteEEpromWpM();
|
||||
bMerker.WriteWpMEEprom = 0;
|
||||
}
|
||||
|
||||
UpdateDisplay();
|
||||
|
||||
|
Laden…
x
In neuem Issue referenzieren
Einen Benutzer sperren