Iambic Modes fertig. StraightKey fertig.

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

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

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

@ -96,6 +96,8 @@
// States
#define ON 1
#define OFF 0
#define DIT 1
#define DAH 0
#define NO_KEY_PRESSED 0
#define KEY_PRESSED_DEBOUNCE 1
#define KEY_PRESSED 2
@ -130,7 +132,10 @@ struct State
uint8_t WriteEEprom: 1; // nicht gespeicherte EEprom Werte
uint8_t SidetoneOff: 1; // Mithörton an oder aus
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 KeyTX:1;
};
@ -165,6 +170,8 @@ struct Config
uint8_t RiseTimeCounter; // Anzahl Sinusschwingungen für den Anstieg
uint8_t DebounceTime; // Entprellzeit für Straight Key Eingang
};
// Pin Change Interrupt Merker für Port
uint8_t LastPINDState;
// Drehencoder
volatile uint8_t EncoderTimer; // 10ms Timer for Encoder

@ -161,7 +161,7 @@ void Init()
// PD4 - StraightKey - PCINT20 - Pin Change Interrupt 20
// PD3 - Right Paddle - PCINT19 - Pin Change Interrupt 19
// PD2 - Left Paddle - PCINT18 - Pin Change Interrupt 18
// sbi(PCICR,PCIE2);
sbi(PCICR,PCIE2);
// sbi(PCMSK2,PCINT18);
// sbi(PCMSK2,PCINT19);
// sbi(PCMSK2,PCINT20);
@ -315,6 +315,14 @@ ISR(USART_RX_vect)
data = UDR0;
SerialWriteChar(data);
}
/** @brief Pin Change Interrupt
* @param none
* @return none
*/
ISR(PCINT2_vect)
{
}
/** @brief Initialisierung bei Reset und Neustart
* @param none
* @return none
@ -329,7 +337,7 @@ void ReStart(void)
Init();
DisplayVersion();
ReadEEprom();
WpM = bConfig.WpM;
WpM = 12; // 12; // 12; // 12; // 12; // 12; // 12; // 12; // 12; // 12; // 12; // 12; // bConfig.WpM;
EncoderPos = bConfig.WpM;
EncoderWrite(bConfig.WpM);
EncoderPosConfig = 1;
@ -343,6 +351,7 @@ void ReStart(void)
SidetoneEnable();
else
SidetoneDisable();
LastPINDState = 0xff;
}
/** @brief main()
* @param none
@ -375,7 +384,16 @@ int main(void)
UpdateDisplay();
CheckStraightKey();
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 SetFrequency(uint16_t f);
extern void DitDahBuffers(void);
extern void DahPaddle(void);
extern void DitPaddle(void);
#endif // BJ-KEYER_H_INCLUDED

Loading…
Cancel
Save