Iambic Modes fertig. StraightKey fertig.

In der nächsten Version testen, ob Drehencoder nicht besser über
PinChangeInterrupt aufgerufen werden sollte.
main
Tom 1 year ago
parent 463869f62f
commit ffeece7d9e

@ -85,8 +85,25 @@ void IntDisable(void)
sreg_tmp = SREG; sreg_tmp = SREG;
cli(); cli();
} }
/** @brief Pin Change Interrupt abschalten
/** \brief EEPROM schreiben * @param none
* @return none
*/
void DisablePinChangeIRQ(void)
{
cbi(PCICR,PCIE2);
}
/** @brief Pin Change Interrupt einschalten
* @param none
* @return none
*/
void EnablePinChangeIRQ(void)
{
sbi(PCICR,PCIE2);
}
/** @brief EEPROM schreiben
* @param none
* @return none
*/ */
void WriteEEprom(void) void WriteEEprom(void)
{ {
@ -365,85 +382,8 @@ void CheckStraightKey(void)
*/ */
void CheckPaddles(void) void CheckPaddles(void)
{ {
static uint8_t LastAction = NOTHING;
CheckDitPaddle(); CheckDitPaddle();
CheckDahPaddle(); CheckDahPaddle();
if(bConfig.KeyerMode == ULTIMATIC)
{
switch(LastAction)
{
case DAH_DIT_ON:
if(DahBuffer) {
if(DitBuffer)
DitBuffer = 0;
else
LastAction = DAH_DIT_OFF;
} else {
if(DitBuffer)
LastAction = DIT_DAH_OFF;
else
LastAction = NOTHING;
}
break;
case DIT_DAH_ON:
if(DitBuffer) {
if(DahBuffer)
DahBuffer = 0;
else
LastAction = DIT_DAH_OFF;
} else {
if(DahBuffer)
LastAction = DAH_DIT_OFF;
else
LastAction = NOTHING;
}
break;
case DAH_DIT_OFF:
if(DitBuffer) {
if(DahBuffer)
{
LastAction = DIT_DAH_ON;
DahBuffer = 0;
} else {
LastAction = DIT_DAH_OFF;
}
} else {
if(!DahBuffer)
LastAction = NOTHING;
}
break;
case DIT_DAH_OFF:
if(DahBuffer) {
if(DitBuffer)
{
LastAction = DAH_DIT_ON;
DitBuffer = 0;
} else {
LastAction = DAH_DIT_OFF;
}
} else {
if(!DitBuffer)
LastAction = NOTHING;
}
break;
case NOTHING:
if((DitBuffer) && (!DahBuffer)) {
LastAction = NOTHING;
} else {
if((DahBuffer) && (!DitBuffer)) {
LastAction = DAH_DIT_OFF;
} else {
if((DitBuffer) && (DahBuffer)) {
LastAction = DIT_DAH_ON;
DahBuffer = 0;
}
}
}
break;
}
}
} }
/** \brief CheckDitPaddle /** \brief CheckDitPaddle
* *
@ -460,7 +400,7 @@ void CheckDitPaddle(void)
if(pinvalue == 0) // DitPaddle betätigt if(pinvalue == 0) // DitPaddle betätigt
{ {
DitBuffer = 1; bState.DitPressed = 1;
} }
} }
/* /*
@ -477,146 +417,91 @@ void CheckDahPaddle(void)
if(pinvalue == 0) if(pinvalue == 0)
{ {
DahBuffer = 1; bState.DahPressed = 1;
} }
} }
void SetRatio(uint8_t WPMCorrectFactor) void SetRatio(uint8_t WPMCorrectFactor)
{ {
DitMillis = 1200 / WpM; DitMillis = 1200 / WpM;
DahMillis = DitMillis * (float)(bConfig.Ratio/10); DahMillis = DitMillis * (float)(bConfig.Ratio/10);
} }
/** @brief Schleife für die Dauer eines Zeichenelements Dit oder Dah /** @brief Symbol senden
* * @param Dit = 1, wenn Symbol ein Punkt ist
* @param Len Anzahl der Symbole (in Dits)
* @return none * @return none
*/ */
void SymbolLoop(uint8_t Len) void SendSymbol(uint8_t Dit)
{ {
volatile static uint16_t ticks; // lengths of elements + AddMilliSeconds in ms volatile static uint16_t ticks; // Länge des Symbols
if(Dit)
ticks = DitMillis * Len; // ticks = DitMillis;
t_elementlength = 0; // Reset Timer 0 variable else
while(t_elementlength < ticks) ticks = DahMillis;
{ t_elementlength = 0;
if(KeyerMode != ULTIMATIC) TXKey(1);
{ DelayMilliSeconds(ticks);
if((KeyerMode == IAMBIC_A) && (!(PIND & (1<<LEFT_PADDLE))) && (!(PIND & (1<<RIGHT_PADDLE)))) TXKey(0);
{ DelayMilliSeconds(DitMillis);
IambicFlag = 1;
SerialWriteString("526:IambicFlag == 1\r\n");
}
if(bState.SendStatus == SENDING_DIT)
{
CheckDahPaddle();
} else {
if(bState.SendStatus == SENDING_DAH)
{
CheckDitPaddle();
} else {
CheckDahPaddle();
CheckDitPaddle();
}
}
} else {
if(bState.SendStatus == SENDING_DIT)
{
CheckDahPaddle();
} else {
if(bState.SendStatus == SENDING_DAH)
{
CheckDitPaddle();
} else {
CheckDahPaddle();
CheckDitPaddle();
}
}
}
}
// Wenn Taste losgelassen, dann im KeyerMode IAMBIC_A das IambicFlag löschen
if((KeyerMode == IAMBIC_A) && (IambicFlag) && (PIND & (1<<LEFT_PADDLE)) && (PIND & (1<<RIGHT_PADDLE)))
{
IambicFlag = 0;
DitBuffer = 0;
DahBuffer = 0;
SerialWriteString("562:IambicFlag == 0\r\n");
}
if((bState.SendStatus == SENDING_DIT) || (bState.SendStatus == SENDING_DAH))
{
if(bConfig.Memory == 0)
{
DitBuffer = 0;
DahBuffer = 0;
}
}
} }
/* /*
** void SendDit(uint8_t SendingType) ** void SendDit(uint8_t SendingType)
*/ */
void SendDit(uint8_t SendingType) void SendDit(void)
{ {
bState.SendStatus = SENDING_DIT; bState.DitPressed = 0;
TXKey(1); SendSymbol(DIT);
SymbolLoop(1); bState.LastSymbolWasDit = 1;
TXKey(0);
SymbolLoop(1);
bState.SendStatus = NOTHING;
CheckPaddles();
} }
/** \brief Send a dah /** \brief Send a dah
** A Dah with weight = 50 has the length of 3 Dits. ** A Dah with weight = 50 has the length of 3 Dits.
*/ */
void SendDah(uint8_t SendingType) void SendDah(void)
{ {
bState.SendStatus = SENDING_DAH; bState.DahPressed = 0;
TXKey(1); SendSymbol(DAH);
SymbolLoop(3); bState.LastSymbolWasDit = 0;
TXKey(0);
SymbolLoop(1);
bState.SendStatus = NOTHING;
CheckPaddles();
} }
/** @brief Bearbeiten der Punkt- und Strichbuffer für Iambic Modes
* void SendIambic(void)
* Bei Iambic A wird der Buffer gelöscht, bei Iambic B voher das
* gegensätzliche Zeichen ausgegeben.
* @param none
* @return none
*/
void DitDahBuffers(void)
{ {
if((bConfig.KeyerMode == IAMBIC_A) || (bConfig.KeyerMode == IAMBIC_B)) bState.DahPressed = 0;
bState.DitPressed = 0;
if(bState.LastSymbolWasDit)
{ {
// IAMBIC_A SendDah();
if((bConfig.KeyerMode == IAMBIC_A) && (IambicFlag) && (PIND & (1<<LEFT_PADDLE)) && (PIND & (1<<RIGHT_PADDLE))) if(bConfig.KeyerMode == IAMBIC_B && !bState.DahPressed && !bState.DitPressed)
{ {
IambicFlag = 0; SendDit();
DitBuffer = 0;
DahBuffer = 0;
SerialWriteString("616:IambicFlag == 0\r\n");
} else { } else {
// IAMBIC_B if(bConfig.KeyerMode == ULTIMATIC)
if(DitBuffer)
{ {
DitBuffer = 0; while(bState.DahPressed)
SendDit(MAN); {
bState.DitPressed = 0;
bState.DahPressed = 0;
SendDah();
}
} }
if(DahBuffer) }
} else {
SendDit();
if(bConfig.KeyerMode == IAMBIC_B && !bState.DitPressed && !bState.DahPressed)
{
SendDah();
} else {
if(bConfig.KeyerMode == ULTIMATIC)
{ {
DahBuffer = 0; while(bState.DitPressed)
SendDah(MAN); {
bState.DitPressed = 0;
bState.DahPressed = 0;
SendDit();
}
} }
} }
} }
if(bConfig.KeyerMode == ULTIMATIC)
{
SerialWriteString("Ultimatic\r\n");
}
} }
/* /*
** Set sidetone frequency ** Set sidetone frequency
*/ */
@ -659,6 +544,7 @@ void SendChar(unsigned char c)
switch(c) switch(c)
{ {
// Buchstaben // Buchstaben
/*
case 'A': SendDit(AUTO); SendDah(AUTO); break; case 'A': SendDit(AUTO); SendDah(AUTO); break;
case 'B': SendDah(AUTO); SendDit(AUTO); SendDit(AUTO); SendDit(AUTO); break; case 'B': SendDah(AUTO); SendDit(AUTO); SendDit(AUTO); SendDit(AUTO); break;
case 'C': SendDit(AUTO); SendDah(AUTO); SendDit(AUTO); SendDah(AUTO); break; case 'C': SendDit(AUTO); SendDah(AUTO); SendDit(AUTO); SendDah(AUTO); break;
@ -703,6 +589,7 @@ void SendChar(unsigned char c)
case ',': SendDah(AUTO); SendDah(AUTO); SendDit(AUTO); SendDit(AUTO); SendDah(AUTO); SendDah(AUTO); break; case ',': SendDah(AUTO); SendDah(AUTO); SendDit(AUTO); SendDit(AUTO); SendDah(AUTO); SendDah(AUTO); break;
case '?': SendDit(AUTO); SendDit(AUTO); SendDah(AUTO); SendDah(AUTO); SendDit(AUTO); SendDit(AUTO); break; case '?': SendDit(AUTO); SendDit(AUTO); SendDah(AUTO); SendDah(AUTO); SendDit(AUTO); SendDit(AUTO); break;
case '@': SendDit(AUTO); SendDah(AUTO); SendDah(AUTO); SendDit(AUTO); SendDah(AUTO); SendDit(AUTO); break; case '@': SendDit(AUTO); SendDah(AUTO); SendDah(AUTO); SendDit(AUTO); SendDah(AUTO); SendDit(AUTO); break;
*/
} }
} }

@ -20,6 +20,10 @@ uint8_t ReadKeyPin(uint8_t pin);
void CheckPaddles(void); void CheckPaddles(void);
void SetRatio(uint8_t WpMCorrectFactor); void SetRatio(uint8_t WpMCorrectFactor);
void DitDahBuffers(void); void DitDahBuffers(void);
void SendDit(void);
void SendDah(void);
void SendIambic(void);
// Sidetone // Sidetone
void SideToneOn(void); void SideToneOn(void);
void SideToneOff(void); void SideToneOff(void);
@ -30,6 +34,8 @@ void BeepBoop(void);
// Interrupt // Interrupt
void IntDisable(void); void IntDisable(void);
void IntEnable(void); void IntEnable(void);
void DisablePinChangeIRQ(void);
void EnablePinChangeIRQ(void);
// EEPROM // EEPROM
void WriteEEprom(void); void WriteEEprom(void);
void ReadEEprom(void); void ReadEEprom(void);

@ -96,6 +96,8 @@
// States // States
#define ON 1 #define ON 1
#define OFF 0 #define OFF 0
#define DIT 1
#define DAH 0
#define NO_KEY_PRESSED 0 #define NO_KEY_PRESSED 0
#define KEY_PRESSED_DEBOUNCE 1 #define KEY_PRESSED_DEBOUNCE 1
#define KEY_PRESSED 2 #define KEY_PRESSED 2
@ -130,7 +132,10 @@ struct State
uint8_t WriteEEprom: 1; // nicht gespeicherte EEprom Werte uint8_t WriteEEprom: 1; // nicht gespeicherte EEprom Werte
uint8_t SidetoneOff: 1; // Mithörton an oder aus uint8_t SidetoneOff: 1; // Mithörton an oder aus
uint8_t SidetoneEnabled: 1; // Mithörton ein- oder ausgeschaltet uint8_t SidetoneEnabled: 1; // Mithörton ein- oder ausgeschaltet
uint8_t SendStatus; // uint8_t SendStatus; // Status, ob Symbol gesendet wird
uint8_t LastSymbolWasDit: 1; // letztes Symbol war ein Punkt
uint8_t DitPressed: 1; // Dit Hebel betätigt
uint8_t DahPressed: 1; // Dah Hebel betätigt
uint8_t KeyState:1; // uint8_t KeyState:1; //
uint8_t KeyTX:1; uint8_t KeyTX:1;
}; };
@ -165,6 +170,8 @@ struct Config
uint8_t RiseTimeCounter; // Anzahl Sinusschwingungen für den Anstieg uint8_t RiseTimeCounter; // Anzahl Sinusschwingungen für den Anstieg
uint8_t DebounceTime; // Entprellzeit für Straight Key Eingang uint8_t DebounceTime; // Entprellzeit für Straight Key Eingang
}; };
// Pin Change Interrupt Merker für Port
uint8_t LastPINDState;
// Drehencoder // Drehencoder
volatile uint8_t EncoderTimer; // 10ms Timer for Encoder volatile uint8_t EncoderTimer; // 10ms Timer for Encoder

@ -161,7 +161,7 @@ void Init()
// PD4 - StraightKey - PCINT20 - Pin Change Interrupt 20 // PD4 - StraightKey - PCINT20 - Pin Change Interrupt 20
// PD3 - Right Paddle - PCINT19 - Pin Change Interrupt 19 // PD3 - Right Paddle - PCINT19 - Pin Change Interrupt 19
// PD2 - Left Paddle - PCINT18 - Pin Change Interrupt 18 // PD2 - Left Paddle - PCINT18 - Pin Change Interrupt 18
// sbi(PCICR,PCIE2); sbi(PCICR,PCIE2);
// sbi(PCMSK2,PCINT18); // sbi(PCMSK2,PCINT18);
// sbi(PCMSK2,PCINT19); // sbi(PCMSK2,PCINT19);
// sbi(PCMSK2,PCINT20); // sbi(PCMSK2,PCINT20);
@ -315,6 +315,14 @@ ISR(USART_RX_vect)
data = UDR0; data = UDR0;
SerialWriteChar(data); SerialWriteChar(data);
} }
/** @brief Pin Change Interrupt
* @param none
* @return none
*/
ISR(PCINT2_vect)
{
}
/** @brief Initialisierung bei Reset und Neustart /** @brief Initialisierung bei Reset und Neustart
* @param none * @param none
* @return none * @return none
@ -329,7 +337,7 @@ void ReStart(void)
Init(); Init();
DisplayVersion(); DisplayVersion();
ReadEEprom(); ReadEEprom();
WpM = bConfig.WpM; WpM = 12; // 12; // 12; // 12; // 12; // 12; // 12; // 12; // 12; // 12; // 12; // 12; // bConfig.WpM;
EncoderPos = bConfig.WpM; EncoderPos = bConfig.WpM;
EncoderWrite(bConfig.WpM); EncoderWrite(bConfig.WpM);
EncoderPosConfig = 1; EncoderPosConfig = 1;
@ -343,6 +351,7 @@ void ReStart(void)
SidetoneEnable(); SidetoneEnable();
else else
SidetoneDisable(); SidetoneDisable();
LastPINDState = 0xff;
} }
/** @brief main() /** @brief main()
* @param none * @param none
@ -375,7 +384,16 @@ int main(void)
UpdateDisplay(); UpdateDisplay();
CheckStraightKey(); CheckStraightKey();
CheckPaddles(); CheckPaddles();
DitDahBuffers();
if(bState.DitPressed || bState.DahPressed)
{
if(bState.DitPressed && !bState.DahPressed)
SendDit();
else if(bState.DahPressed && !bState.DitPressed)
SendDah();
else if(bState.DahPressed && bState.DitPressed)
SendIambic();
}
} }
} }

@ -25,4 +25,7 @@ extern void CheckDitPaddle(void);
extern void CheckStraightKey(void); extern void CheckStraightKey(void);
extern void SetFrequency(uint16_t f); extern void SetFrequency(uint16_t f);
extern void DitDahBuffers(void); extern void DitDahBuffers(void);
extern void DahPaddle(void);
extern void DitPaddle(void);
#endif // BJ-KEYER_H_INCLUDED #endif // BJ-KEYER_H_INCLUDED

Loading…
Cancel
Save