Es wird vorerst keine Winkeyer Emulation geben, da ich die Funktion

nicht benötige. Der Wert im EEprom wurde zu geschwindigkeitsabhängigem
Punkt/Strich Verhältnis geändert. Die Berechnung muss noch in SetRatio()
erfolgen.

Anzeige auf dem Display geändert, es wird nun das eingestellte
Punkt/Strich Verhältnis und der Punkt/Strich Speicherstatus anzeigt.

Dokumentation ergänzt.
main
Tom 1 year ago
parent ffeece7d9e
commit 74f768a095

@ -15,6 +15,7 @@ const char IambicB[] = "Iambic B";
const char Ultimatic[] = "Ultimat."; const char Ultimatic[] = "Ultimat.";
const char Memory[] = "Memory"; const char Memory[] = "Memory";
const char Ratio[] = "Ratio"; const char Ratio[] = "Ratio";
const char SpeedRatio[] = "SpeedRatio";
const char ReverseRL[] = " L - R °"; const char ReverseRL[] = " L - R °";
const char ReverseLR[] = " L ° R -"; const char ReverseLR[] = " L ° R -";
const char SideToneOnOff[] = "Mithörton"; const char SideToneOnOff[] = "Mithörton";
@ -179,8 +180,8 @@ void Drehencoder(void)
bMenuCtrl.SubMenue = 1; bMenuCtrl.SubMenue = 1;
EncoderPosSubConfig = EncoderRead(1); EncoderPosSubConfig = EncoderRead(1);
break; break;
case M_WINKEYER: case M_SPEEDRATIO:
bConfig.WinkeyerEnabled = (bConfig.WinkeyerEnabled == 1) ? 0 : 1; bConfig.SpeedRatioEnabled = (bConfig.SpeedRatioEnabled == 1) ? 0 : 1;
bMenuCtrl.m_buttonPressed = 0; bMenuCtrl.m_buttonPressed = 0;
break; break;
} }
@ -247,7 +248,7 @@ void Drehencoder(void)
void ConfigMenue(void) void ConfigMenue(void)
{ {
char line[22]; char line[22];
lcd_clrscr();
lcd_charMode(NORMAL); lcd_charMode(NORMAL);
lcd_gotoxy(0,0); lcd_gotoxy(0,0);
lcd_puts(CLEARLINE); lcd_puts(CLEARLINE);
@ -360,12 +361,12 @@ void ConfigMenue(void)
sprintf(line,"%s %ims",DebounceTime, bConfig.DebounceTime); sprintf(line,"%s %ims",DebounceTime, bConfig.DebounceTime);
lcd_puts(line); lcd_puts(line);
break; break;
case M_WINKEYER: case M_SPEEDRATIO:
lcd_gotoxy(0,3); lcd_gotoxy(0,3);
if(bConfig.WinkeyerEnabled) if(bConfig.SpeedRatioEnabled)
sprintf(line,"[%s]","WinKey"); sprintf(line,"[%s]","va.Ratio");
else else
sprintf(line," %s ","WinKey"); sprintf(line," %s ","va.Ratio");
lcd_puts(line); lcd_puts(line);
break; break;
} }
@ -408,7 +409,7 @@ void UpdateDisplay(void)
if(!(bMenuCtrl.Config)) if(!(bMenuCtrl.Config))
{ {
lcd_charMode(DOUBLESIZE); lcd_charMode(DOUBLESIZE);
lcd_gotoxy(4,3); lcd_gotoxy(4,2);
if(bConfig.WpMBpM == 0) if(bConfig.WpMBpM == 0)
sprintf(line,"%i WpM ",bConfig.WpM); sprintf(line,"%i WpM ",bConfig.WpM);
else else
@ -431,11 +432,24 @@ void UpdateDisplay(void)
if(bConfig.TRX == 0) if(bConfig.TRX == 0)
sprintf(line, "%s %s", Trx1, Trx2); sprintf(line, "%s %s", Trx1, Trx2);
lcd_puts(line); lcd_puts(line);
lcd_gotoxy(0,6);
if(bConfig.SpeedRatioEnabled)
sprintf(line,"Ratio auto.");
else
sprintf(line,"Ratio 1:%.1f", (float)bConfig.Ratio/10);
lcd_puts(line);
lcd_gotoxy(13,6);
if(bConfig.Memory)
sprintf(line,"MEM ON ");
else
sprintf(line,"MEM OFF");
lcd_puts(line);
} }
if(bMenuCtrl.Config) if(bMenuCtrl.Config)
{ {
ConfigMenue(); ConfigMenue();
} }
} }
bMenuCtrl.Update = 0;
} }

@ -1,3 +1,15 @@
/** @file encoder.c
* @date 2014-12-04
* @author Frank Klee
* @brief Drehencoder Library
*
* Basisroutinen zum Abfragen eines Drehencoders mittels Polling.
* Quelle: https://www.mikrocontroller.net/articles/Drehgeber
*
* @author Tom, DL7BJ
* @date 2023-03-23
* @brief Formatierungen und Umbenennungen der Funktionen
*/
#include <avr/io.h> #include <avr/io.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
#include "encoder.h" #include "encoder.h"
@ -37,9 +49,14 @@ void EncoderInit(void)
iButtonDebounceCycles = BUTTON_DEBOUNCETIME_MS; iButtonDebounceCycles = BUTTON_DEBOUNCETIME_MS;
iButtonPressedLongCycles = BUTTON_PRESSEDLONG_MS; iButtonPressedLongCycles = BUTTON_PRESSEDLONG_MS;
} }
/** \brief EncoderPolling /** @fn void EncoderPolling(void)
* @brief EncoderPolling
*
* Abfrage des Drehencoders und des Tasters * Abfrage des Drehencoders und des Tasters
* Wird vom Timer 0 alle 5ms aufgerufen * Wird vom Timer 0 aufgerufen
*
* @param none
* @return none
*/ */
void EncoderPolling(void) void EncoderPolling(void)
{ {

@ -1,6 +1,5 @@
#ifndef ENCODER_H_ #ifndef ENCODER_H_
#define ENCODER_H_ #define ENCODER_H_
// Art des Drehencoders definieren // Art des Drehencoders definieren
// #define SingleStep // #define SingleStep
// #define TwoStep // #define TwoStep
@ -21,8 +20,18 @@
#define PHASE_B PIN(ENC_B_PORT) & (1<<ENC_B_PIN) #define PHASE_B PIN(ENC_B_PORT) & (1<<ENC_B_PIN)
#define BUTTONPRESSED (!(PIN(ENC_T_PORT) & (1<<ENC_T_PIN))) #define BUTTONPRESSED (!(PIN(ENC_T_PORT) & (1<<ENC_T_PIN)))
#define BUTTON_DEBOUNCETIME_MS 30 /** @brief Timer für Encoderpolling
#define BUTTON_PRESSEDLONG_MS 250 *
* Wenn der Timer für das Polling vom Drehencoder mit
* anderen Zeiten als 1ms läuft, dann müssen hier die
* Werte für Debounce und das lange Drücken des Tasters
* im Encoder angepasset werden. Standardwert ist normal
* 1ms, im BJ-Keyer wird 5ms verwendet.
*/
#define ENCODERTIMER 5
#define BUTTON_DEBOUNCETIME_MS 30/ENCODERTIMER
#define BUTTON_PRESSEDLONG_MS 250/ENCODERTIMER
typedef enum EButtonPressedState typedef enum EButtonPressedState
{ {

@ -13,11 +13,11 @@ uint8_t ee_KeyerMode EEMEM = 1; // Iambic A, Iambic B oder Ultimati
uint8_t ee_SidetoneEnabled EEMEM = 1; // Mithörton eingeschaltet uint8_t ee_SidetoneEnabled EEMEM = 1; // Mithörton eingeschaltet
uint8_t ee_WpMBpM EEMEM = 0; // WpM oder BpM Anzeige uint8_t ee_WpMBpM EEMEM = 0; // WpM oder BpM Anzeige
uint8_t ee_Reverse EEMEM = 0; // linkes/rechtes Paddle vertauschen uint8_t ee_Reverse EEMEM = 0; // linkes/rechtes Paddle vertauschen
uint8_t ee_WinkeyerEnabled EEMEM = 0; // Winkeyer Emulation uint8_t ee_SpeedRatioEnabled EEMEM = 0; // Ratio von der Geschwindigkeit abhängig
uint8_t ee_Ratio EEMEM = 30; // Punkt/Strich Verhältnis 1:3 uint8_t ee_Ratio EEMEM = 30; // Punkt/Strich Verhältnis 1:3
uint8_t ee_Memory EEMEM = 0; // Punkt/Strich Speicher uint8_t ee_Memory EEMEM = 0; // Punkt/Strich Speicher
uint16_t ee_SidetoneFreq EEMEM = 600; // Frequenz des Mithörtons uint16_t ee_SidetoneFreq EEMEM = 600; // Frequenz des Mithörtons
uint8_t ee_WpM EEMEM = 12; // WpM uint8_t ee_WpM EEMEM = 12; // Geschwindigkeit WpM
uint8_t ee_RiseTime EEMEM = 5; // Anstiegszeit Sinuston uint8_t ee_RiseTime EEMEM = 5; // Anstiegszeit Sinuston
uint8_t ee_RiseTimeCounter EEMEM = 5; // Anzahl Sinusschwingungen für den Anstieg uint8_t ee_RiseTimeCounter EEMEM = 5; // Anzahl Sinusschwingungen für den Anstieg
uint8_t ee_DebounceTime EEMEM = 6; // Entprellzeit für Straight Key Eingang uint8_t ee_DebounceTime EEMEM = 6; // Entprellzeit für Straight Key Eingang
@ -116,7 +116,7 @@ void WriteEEprom(void)
eeprom_write_byte(&ee_SidetoneEnabled, bConfig.SidetoneEnabled); eeprom_write_byte(&ee_SidetoneEnabled, bConfig.SidetoneEnabled);
eeprom_write_byte(&ee_WpMBpM, bConfig.WpMBpM); eeprom_write_byte(&ee_WpMBpM, bConfig.WpMBpM);
eeprom_write_byte(&ee_Reverse, bConfig.Reverse); eeprom_write_byte(&ee_Reverse, bConfig.Reverse);
eeprom_write_byte(&ee_WinkeyerEnabled, bConfig.WinkeyerEnabled); eeprom_write_byte(&ee_SpeedRatioEnabled, bConfig.SpeedRatioEnabled);
eeprom_write_byte(&ee_Ratio, bConfig.Ratio); eeprom_write_byte(&ee_Ratio, bConfig.Ratio);
eeprom_write_byte(&ee_Memory, bConfig.Memory); eeprom_write_byte(&ee_Memory, bConfig.Memory);
eeprom_write_byte(&ee_RiseTime, bConfig.RiseTime); eeprom_write_byte(&ee_RiseTime, bConfig.RiseTime);
@ -153,7 +153,7 @@ void SetEEprom(void)
bConfig.SidetoneEnabled = 1; bConfig.SidetoneEnabled = 1;
bConfig.WpMBpM = 1; bConfig.WpMBpM = 1;
bConfig.Reverse = 0; bConfig.Reverse = 0;
bConfig.WinkeyerEnabled = 0; bConfig.SpeedRatioEnabled = 0;
bConfig.Ratio = 30; bConfig.Ratio = 30;
bConfig.Memory = 0; bConfig.Memory = 0;
bConfig.RiseTime = 5; bConfig.RiseTime = 5;
@ -182,30 +182,13 @@ void ReadEEprom(void)
bConfig.SidetoneEnabled = eeprom_read_byte(&ee_SidetoneEnabled); bConfig.SidetoneEnabled = eeprom_read_byte(&ee_SidetoneEnabled);
bConfig.WpMBpM = eeprom_read_byte(&ee_WpMBpM); bConfig.WpMBpM = eeprom_read_byte(&ee_WpMBpM);
bConfig.Reverse = eeprom_read_byte(&ee_Reverse); bConfig.Reverse = eeprom_read_byte(&ee_Reverse);
bConfig.WinkeyerEnabled = eeprom_read_byte(&ee_WinkeyerEnabled); bConfig.SpeedRatioEnabled = eeprom_read_byte(&ee_SpeedRatioEnabled);
bConfig.Ratio = eeprom_read_byte(&ee_Ratio); bConfig.Ratio = eeprom_read_byte(&ee_Ratio);
bConfig.Memory = eeprom_read_byte(&ee_Memory); bConfig.Memory = eeprom_read_byte(&ee_Memory);
bConfig.RiseTime = eeprom_read_byte(&ee_RiseTime); bConfig.RiseTime = eeprom_read_byte(&ee_RiseTime);
bConfig.RiseTimeCounter = eeprom_read_byte(&ee_RiseTimeCounter); bConfig.RiseTimeCounter = eeprom_read_byte(&ee_RiseTimeCounter);
bConfig.DebounceTime = eeprom_read_byte(&ee_DebounceTime); bConfig.DebounceTime = eeprom_read_byte(&ee_DebounceTime);
IntEnable(); IntEnable();
if(bConfig.WpM > 50) {
bConfig.WpM = 15;
WriteEEpromWpM();
}
if(bConfig.RiseTime > 10) {
bConfig.RiseTime = 10;
WriteEEprom();
}
if(bConfig.RiseTimeCounter > 6) {
bConfig.RiseTimeCounter = 6;
WriteEEprom();
}
if(bConfig.DebounceTime > 22) {
bConfig.DebounceTime = 25;
WriteEEprom();
}
} }
/** @brief Aktuelle Einstellungen über serielle Schnittstelle ausgeben /** @brief Aktuelle Einstellungen über serielle Schnittstelle ausgeben
* @param none * @param none
@ -231,7 +214,7 @@ void SerialInfo(void)
SerialWriteString(sdebug); SerialWriteString(sdebug);
sprintf(sdebug,"Memory : %i\r\n", bConfig.Memory); sprintf(sdebug,"Memory : %i\r\n", bConfig.Memory);
SerialWriteString(sdebug); SerialWriteString(sdebug);
sprintf(sdebug,"Winkeyer : %i\r\n", bConfig.WinkeyerEnabled); sprintf(sdebug,"SpeedRatio : %i\r\n", bConfig.SpeedRatioEnabled);
SerialWriteString(sdebug); SerialWriteString(sdebug);
sprintf(sdebug,"RiseTime : %i\r\n", bConfig.RiseTime); sprintf(sdebug,"RiseTime : %i\r\n", bConfig.RiseTime);
SerialWriteString(sdebug); SerialWriteString(sdebug);

@ -112,10 +112,10 @@
#define M_MEMORY 8 #define M_MEMORY 8
#define M_REVERSE 9 #define M_REVERSE 9
#define M_RATIO 10 #define M_RATIO 10
#define M_WPMBPM 11 #define M_SPEEDRATIO 11
#define M_RISETIME 12 #define M_WPMBPM 12
#define M_DEBOUNCE 13 #define M_RISETIME 13
#define M_WINKEYER 14 #define M_DEBOUNCE 14
#define M_MAX 14 // maximale Menuepunke #define M_MAX 14 // maximale Menuepunke
// LCD // LCD
#define CLEARLINE " " #define CLEARLINE " "
@ -136,6 +136,7 @@ struct State
uint8_t LastSymbolWasDit: 1; // letztes Symbol war ein Punkt uint8_t LastSymbolWasDit: 1; // letztes Symbol war ein Punkt
uint8_t DitPressed: 1; // Dit Hebel betätigt uint8_t DitPressed: 1; // Dit Hebel betätigt
uint8_t DahPressed: 1; // Dah Hebel betätigt uint8_t DahPressed: 1; // Dah Hebel betätigt
uint8_t Encoder: 1; // Drekencoder wurde betätigt
uint8_t KeyState:1; // uint8_t KeyState:1; //
uint8_t KeyTX:1; uint8_t KeyTX:1;
}; };
@ -161,7 +162,7 @@ struct Config
uint8_t SidetoneEnabled: 1; // Mithörton eingeschaltet uint8_t SidetoneEnabled: 1; // Mithörton eingeschaltet
uint8_t WpMBpM: 1; // WpM oder BpM Anzeige uint8_t WpMBpM: 1; // WpM oder BpM Anzeige
uint8_t Reverse: 1; // linkes/rechtes Paddle vertauschen uint8_t Reverse: 1; // linkes/rechtes Paddle vertauschen
uint8_t WinkeyerEnabled: 1; // Winkeyer Emulation uint8_t SpeedRatioEnabled: 1; // Punkt/Strich Verhältnis Auto
uint8_t Ratio; // Punkt/Strich Verhältnis 1:3 uint8_t Ratio; // Punkt/Strich Verhältnis 1:3
uint8_t Memory:1; // Punkt/Strich Speicher uint8_t Memory:1; // Punkt/Strich Speicher
uint16_t SidetoneFreq; // Frequenz des Mithörtons uint16_t SidetoneFreq; // Frequenz des Mithörtons

@ -165,6 +165,10 @@ void Init()
// sbi(PCMSK2,PCINT18); // sbi(PCMSK2,PCINT18);
// sbi(PCMSK2,PCINT19); // sbi(PCMSK2,PCINT19);
// sbi(PCMSK2,PCINT20); // sbi(PCMSK2,PCINT20);
sbi(PCICR,PCIE0);
sbi(PCMSK0,PCINT0);
sbi(PCMSK0,PCINT1);
sbi(PCMSK0,PCINT2);
// Init serial // Init serial
UBRR0=UBRR_VALUE; // Set baud rate UBRR0=UBRR_VALUE; // Set baud rate
@ -315,14 +319,22 @@ ISR(USART_RX_vect)
data = UDR0; data = UDR0;
SerialWriteChar(data); SerialWriteChar(data);
} }
/** @brief Pin Change Interrupt /** @brief Pin Change Interrupt PORT C
* @param none * @param none
* @return none * @return none
*/ */
ISR(PCINT2_vect) ISR(PCINT2_vect)
{ {
} }
/** @brief Pin Change Interrupt PORT B
* @param none
* @return none
*/
ISR(PCINT0_vect)
{
SerialWriteChar("Encoder\r\n");
bState.Encoder = 1;
}
/** @brief Initialisierung bei Reset und Neustart /** @brief Initialisierung bei Reset und Neustart
* @param none * @param none
* @return none * @return none
@ -337,7 +349,7 @@ void ReStart(void)
Init(); Init();
DisplayVersion(); DisplayVersion();
ReadEEprom(); ReadEEprom();
WpM = 12; // 12; // 12; // 12; // 12; // 12; // 12; // 12; // 12; // 12; // 12; // 12; // bConfig.WpM; WpM = bConfig.WpM;
EncoderPos = bConfig.WpM; EncoderPos = bConfig.WpM;
EncoderWrite(bConfig.WpM); EncoderWrite(bConfig.WpM);
EncoderPosConfig = 1; EncoderPosConfig = 1;
@ -364,23 +376,20 @@ int main(void)
SerialInfo(); SerialInfo();
while(1) while(1)
{ {
Drehencoder();
// Wenn Geschwindigkeit verändert und Zeit abgelaufen, // Wenn Geschwindigkeit verändert und Zeit abgelaufen,
// dann im EEprom speichern und Merker löschen. // dann im EEprom speichern und Merker löschen.
if(bState.WriteWpMEEprom) if(bState.WriteWpMEEprom)
{ {
sprintf(sdebug," %i WpM in EEprom speichern\r\n", bConfig.WpM);
SerialWriteString(sdebug);
WriteEEpromWpM(); WriteEEpromWpM();
bState.WriteWpMEEprom = 0; bState.WriteWpMEEprom = 0;
} }
if(bState.WriteEEprom) if(bState.WriteEEprom)
{ {
sprintf(sdebug,"Einstellungen in EEprom speichern\r\n");
SerialWriteString(sdebug);
WriteEEprom(); WriteEEprom();
bState.WriteEEprom = 0; bState.WriteEEprom = 0;
} }
Drehencoder();
UpdateDisplay(); UpdateDisplay();
CheckStraightKey(); CheckStraightKey();
CheckPaddles(); CheckPaddles();

Loading…
Cancel
Save