Funktionen SetRatio und Weight getestet. Punkt/Strich Speicher

implementiert und getestet.
main
Tom 1 year ago
parent 74f768a095
commit 75daf456cd

@ -1,2 +1,2 @@
:0F0000000605050C5802001E0000000101005506 :100000000605050C580200321E00000001010055D3
:00000001FF :00000001FF

@ -46,7 +46,7 @@ FORMAT = ihex
TARGET = BJ-Keyer TARGET = BJ-Keyer
# List C source files here. (C dependencies are automatically generated.) # List C source files here. (C dependencies are automatically generated.)
SRC = main.c oled/i2c.c oled/lcd.c oled/font.c encoder.c controls.c functions.c SRC = main.c oled/i2c.c oled/lcd.c oled/font.c encoder.c controls.c functions.c vt100.c
# List Assembler source files here. # List Assembler source files here.
# Make them always end in a capital .S. Files ending in a lowercase .s # Make them always end in a capital .S. Files ending in a lowercase .s

@ -15,7 +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 Weight[] = "Weight";
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";
@ -38,14 +38,15 @@ void Drehencoder(void)
if(bConfig.WpM != st) if(bConfig.WpM != st)
{ {
bConfig.WpM = st; // neuen Wert in bConfig speichern bConfig.WpM = st; // neuen Wert in bConfig speichern
bState.WpMChanged = 1; // Status für Timer 0 setzen bState.WpMChanged = 1; // Status für Timer 0 setzen
bMenuCtrl.Update = 1; // Status für UpdateDisplay setzen bMenuCtrl.Update = 1; // Status für UpdateDisplay setzen
EncoderPos = st; // neuen Werte in EncoderPos speichern EncoderPos = st; // neuen Werte in EncoderPos speichern
WpM = bConfig.WpM; // neuen Wert in WpM übernehmen WpM = bConfig.WpM; // neuen Wert in WpM übernehmen
cli(); cli();
StoreEEprom = 0; // Timer 0 Variable löschen für Update EEprom StoreEEprom = 0; // Timer 0 Variable löschen für Update EEprom
sei(); sei();
SetRatio(0); SetRatio();
SetWeight();
} }
} }
@ -153,6 +154,10 @@ void Drehencoder(void)
bMenuCtrl.SubMenue = 1; bMenuCtrl.SubMenue = 1;
EncoderPosSubConfig = EncoderRead(1); EncoderPosSubConfig = EncoderRead(1);
break; break;
case M_WEIGHT:
bMenuCtrl.SubMenue = 1;
EncoderPosSubConfig = EncoderRead(1);
break;
case M_MEMORY: case M_MEMORY:
bConfig.Memory = (bConfig.Memory == 1) ? 0 : 1; bConfig.Memory = (bConfig.Memory == 1) ? 0 : 1;
bMenuCtrl.m_buttonPressed = 0; bMenuCtrl.m_buttonPressed = 0;
@ -193,14 +198,26 @@ void Drehencoder(void)
switch(bMenuCtrl.CurMenue) switch(bMenuCtrl.CurMenue)
{ {
case M_RATIO: case M_RATIO:
EncoderMinMax(15,30); EncoderMinMax(15,45);
EncoderWrite(bConfig.Ratio); EncoderWrite(bConfig.Ratio);
st = EncoderRead(1); st = EncoderRead(1);
if(st != bConfig.Ratio) if(st != bConfig.Ratio)
bMenuCtrl.Update = 1; bMenuCtrl.Update = 1;
bConfig.Ratio = st; bConfig.Ratio = st;
if(bConfig.Ratio > 30) bConfig.Ratio = 30; if(bConfig.Ratio > 40) bConfig.Ratio = 45;
if(bConfig.Ratio < 15) bConfig.Ratio = 15; if(bConfig.Ratio < 15) bConfig.Ratio = 15;
SetRatio();
break;
case M_WEIGHT:
EncoderMinMax (25,75);
EncoderWrite(bConfig.Weight);
st = EncoderRead(1);
if(st != bConfig.Weight)
bMenuCtrl.Update = 1;
bConfig.Weight = st;
if(bConfig.Weight > 75) bConfig.Weight = 75;
if(bConfig.Weight < 25) bConfig.Weight = 25;
SetWeight();
break; break;
case M_TON_FREQ: case M_TON_FREQ:
EncoderMinMax(30,100); EncoderMinMax(30,100);
@ -313,10 +330,12 @@ void ConfigMenue(void)
break; break;
case M_RATIO: case M_RATIO:
lcd_gotoxy(0,3); lcd_gotoxy(0,3);
if(bConfig.Ratio == 30) sprintf(line,"%s %.1f", "Ratio", (float)bConfig.Ratio/10);
sprintf(line,"%s", "Ratio 3:1"); lcd_puts(line);
else break;
sprintf(line,"%s %.1f", "Ratio", (float)bConfig.Ratio/10); case M_WEIGHT:
lcd_gotoxy(0,3);
sprintf(line,"%s %i",Weight,bConfig.Weight);
lcd_puts(line); lcd_puts(line);
break; break;
case M_MEMORY: case M_MEMORY:
@ -329,10 +348,7 @@ void ConfigMenue(void)
break; break;
case M_TON_FREQ: case M_TON_FREQ:
lcd_gotoxy(0,3); lcd_gotoxy(0,3);
if(bConfig.SidetoneFreq == 650) sprintf(line,"%s %uHz", "Ton", bConfig.SidetoneFreq);
sprintf(line,"%s", "Ton 650Hz");
else
sprintf(line,"%s %uHz", "Ton", bConfig.SidetoneFreq);
lcd_puts(line); lcd_puts(line);
break; break;
case M_TON: case M_TON:
@ -409,7 +425,7 @@ void UpdateDisplay(void)
if(!(bMenuCtrl.Config)) if(!(bMenuCtrl.Config))
{ {
lcd_charMode(DOUBLESIZE); lcd_charMode(DOUBLESIZE);
lcd_gotoxy(4,2); lcd_gotoxy(4,3);
if(bConfig.WpMBpM == 0) if(bConfig.WpMBpM == 0)
sprintf(line,"%i WpM ",bConfig.WpM); sprintf(line,"%i WpM ",bConfig.WpM);
else else
@ -436,20 +452,24 @@ void UpdateDisplay(void)
if(bConfig.SpeedRatioEnabled) if(bConfig.SpeedRatioEnabled)
sprintf(line,"Ratio auto."); sprintf(line,"Ratio auto.");
else else
sprintf(line,"Ratio 1:%.1f", (float)bConfig.Ratio/10); sprintf(line, "R 1:%.1f",(float)bConfig.Ratio/10);
lcd_puts(line); lcd_puts(line);
lcd_gotoxy(13,6); lcd_gotoxy(9,6);
sprintf(line, "W %i", bConfig.Weight);
lcd_puts(line);
lcd_gotoxy(14,6);
if(bConfig.Memory) if(bConfig.Memory)
sprintf(line,"MEM ON "); sprintf(line,"Mem ON");
else else
sprintf(line,"MEM OFF"); sprintf(line,"Mem OFF");
lcd_puts(line); lcd_puts(line);
} }
if(bMenuCtrl.Config) if(bMenuCtrl.Config)
{ {
ConfigMenue(); ConfigMenue();
} }
} }
bMenuCtrl.Update = 0;
} }

@ -21,7 +21,7 @@ extern void WriteEEprom(void);
extern void SideToneOff(void); extern void SideToneOff(void);
extern void DelayMilliSeconds(uint16_t t); extern void DelayMilliSeconds(uint16_t t);
extern void Tone(uint16_t f, uint8_t t); extern void Tone(uint16_t f, uint8_t t);
extern void SetRatio(uint8_t WPMCorrectFactor); extern void SetRatio(void);
extern void SidetoneDisable(void); extern void SidetoneDisable(void);
extern void SidetoneEnable(void); extern void SidetoneEnable(void);
extern void SidetoneOff(void); extern void SidetoneOff(void);

@ -15,19 +15,19 @@ 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_SpeedRatioEnabled EEMEM = 0; // Ratio von der Geschwindigkeit abhängig 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_Weight EEMEM = 50; // Punkt/Strich Gewichtung
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; // Geschwindigkeit 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
// Stringkonstanten für VT100 Terminals //
const char CLRSCR[] = "\033[2J"; //
/** @fn void DelayMilliSeconds(uint16_t ms)
/** @brief Ein paar Millisekunden warten * @brief Zeitschleife von 1-65535 Millisekunden
* * @param Anzahl Millisekunden
* @param Zeit in Millisekunden, die gewartet werden soll * @return none
* @return void
*/ */
void DelayMilliSeconds(uint16_t ms) void DelayMilliSeconds(uint16_t ms)
{ {
@ -39,12 +39,13 @@ void DelayMilliSeconds(uint16_t ms)
{ {
ctr = t_delayms; ctr = t_delayms;
} }
CheckPaddles();
} while (ctr < ms); } while (ctr < ms);
} }
/** @brief Wert des Zählers für Millisekunden lesen /** @fn uint16_t GetMilliSeconds(void)
* * @brief Zäherwert für Zeitschleifen auslesen
* @param none * @param none
* @return milliseconds * @return Millisekunden
*/ */
uint16_t GetMilliSeconds(void) uint16_t GetMilliSeconds(void)
{ {
@ -55,8 +56,8 @@ uint16_t GetMilliSeconds(void)
} }
return ctr; return ctr;
} }
/** @brief Setzt den Zähler für Millisekunden auf 0 /** @fn void ResetMilliSeconds(void)
* * @brief Setzt den Millisekundenzähler für Zeitschleifen auf 0
* @param none * @param none
* @return none * @return none
*/ */
@ -67,7 +68,8 @@ void ResetMilliSeconds(void)
t_delayms = 0; t_delayms = 0;
} }
} }
/** @brief SREG wieder herstellen und Interrupts erlauben /** @fn void IntEnable(void)
* @brief Register wieder herstellen und Interrupts erlauben
* @param none * @param none
* @return none * @return none
*/ */
@ -76,7 +78,8 @@ void IntEnable(void)
SREG = sreg_tmp; SREG = sreg_tmp;
sei(); sei();
} }
/** @brief SREG sichern und Interrupts verbieten /** @fn void IntDisable(void)
* @brief Register sichern und Interrupts verbieten
* @param none * @param none
* @return none * @return none
*/ */
@ -85,23 +88,8 @@ void IntDisable(void)
sreg_tmp = SREG; sreg_tmp = SREG;
cli(); cli();
} }
/** @brief Pin Change Interrupt abschalten /** @fn void WriteEEprom(void)
* @param none * @brief Akt. Einstellungen in EEPROM schreiben
* @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 * @param none
* @return none * @return none
*/ */
@ -117,6 +105,7 @@ void WriteEEprom(void)
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_SpeedRatioEnabled, bConfig.SpeedRatioEnabled); eeprom_write_byte(&ee_SpeedRatioEnabled, bConfig.SpeedRatioEnabled);
eeprom_write_byte(&ee_Weight, bConfig.Weight);
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);
@ -124,21 +113,35 @@ void WriteEEprom(void)
eeprom_write_byte(&ee_DebounceTime, bConfig.DebounceTime); eeprom_write_byte(&ee_DebounceTime, bConfig.DebounceTime);
IntEnable(); IntEnable();
} }
/** @fn void ReadEEpromWpM(void)
* @brief Gespeicherte Einstellung für die Geschwindigkeit aus EEprom lesen
* @param none
* @return none
*/
void ReadEEpromWpM(void) void ReadEEpromWpM(void)
{ {
IntDisable(); IntDisable();
bConfig.WpM = eeprom_read_byte(&ee_WpM); bConfig.WpM = eeprom_read_byte(&ee_WpM);
IntEnable(); IntEnable();
} }
/** @fn void WriteEEpromWpM(void)
* @brief Akt. Einstellung für die Geschwindigkeit in EEprom schreiben
* @param none
* @return none
*/
void WriteEEpromWpM(void) void WriteEEpromWpM(void)
{ {
IntDisable(); IntDisable();
eeprom_write_byte(&ee_WpM, bConfig.WpM); eeprom_write_byte(&ee_WpM, bConfig.WpM);
IntEnable(); IntEnable();
} }
/** @fn void SetEEprom(void)
/** @brief Standardeinstellungen (bei neuem Controller) /** @brief Standardeinstellungen (bei neuem Controller)
*
* Wird ein neuer Controller verwendet, gibt es keine
* Einstellungswerte im EEprom. Diese Funktion schreibt
* die initialen Werte in das EEprom. Wird sehr selten
* benötigt ;-)
* *
* @param none * @param none
* @return none * @return none
@ -154,6 +157,7 @@ void SetEEprom(void)
bConfig.WpMBpM = 1; bConfig.WpMBpM = 1;
bConfig.Reverse = 0; bConfig.Reverse = 0;
bConfig.SpeedRatioEnabled = 0; bConfig.SpeedRatioEnabled = 0;
bConfig.Weight = 50;
bConfig.Ratio = 30; bConfig.Ratio = 30;
bConfig.Memory = 0; bConfig.Memory = 0;
bConfig.RiseTime = 5; bConfig.RiseTime = 5;
@ -161,7 +165,8 @@ void SetEEprom(void)
bConfig.DebounceTime = 5; bConfig.DebounceTime = 5;
WriteEEprom(); WriteEEprom();
} }
/** @brief EEprom lesen /** @fn void ReadEEprom(void)
* @brief Einstellungen aus dem EEprom lesen
* @param none * @param none
* @return none * @return none
*/ */
@ -184,57 +189,15 @@ void ReadEEprom(void)
bConfig.Reverse = eeprom_read_byte(&ee_Reverse); bConfig.Reverse = eeprom_read_byte(&ee_Reverse);
bConfig.SpeedRatioEnabled = eeprom_read_byte(&ee_SpeedRatioEnabled); bConfig.SpeedRatioEnabled = eeprom_read_byte(&ee_SpeedRatioEnabled);
bConfig.Ratio = eeprom_read_byte(&ee_Ratio); bConfig.Ratio = eeprom_read_byte(&ee_Ratio);
bConfig.Weight = eeprom_read_byte(&ee_Weight);
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();
} }
/** @brief Aktuelle Einstellungen über serielle Schnittstelle ausgeben /** @fn void SerialWriteChar(unsigned char data)
* @param none * @brief Ein Zeichen über serielle Schnittstelle ausgeben
* @return none
*/
void SerialInfo(void)
{
sprintf(sdebug,"WpM : %i\r\n", bConfig.WpM);
SerialWriteString(sdebug);
sprintf(sdebug,"KeyerMode : %i\r\n", bConfig.KeyerMode);
SerialWriteString(sdebug);
sprintf(sdebug,"SidetoneFreq : %u\r\n", bConfig.SidetoneFreq);
SerialWriteString(sdebug);
sprintf(sdebug,"TRX : %i\r\n", bConfig.TRX);
SerialWriteString(sdebug);
sprintf(sdebug,"SidetoneEnabled : %i\r\n", bConfig.SidetoneEnabled);
SerialWriteString(sdebug);
sprintf(sdebug,"Ratio : %i\r\n", bConfig.Ratio);
SerialWriteString(sdebug);
sprintf(sdebug,"WpMBpM : %i\r\n", bConfig.WpMBpM);
SerialWriteString(sdebug);
sprintf(sdebug,"Reverse : %i\r\n", bConfig.Reverse);
SerialWriteString(sdebug);
sprintf(sdebug,"Memory : %i\r\n", bConfig.Memory);
SerialWriteString(sdebug);
sprintf(sdebug,"SpeedRatio : %i\r\n", bConfig.SpeedRatioEnabled);
SerialWriteString(sdebug);
sprintf(sdebug,"RiseTime : %i\r\n", bConfig.RiseTime);
SerialWriteString(sdebug);
sprintf(sdebug,"RiseTimeCounter : %i\r\n", bConfig.RiseTimeCounter);
SerialWriteString(sdebug);
sprintf(sdebug,"DebounceTime : %i\r\n", bConfig.DebounceTime);
SerialWriteString(sdebug);
}
/** @brief Versionsinformation über serielle Schnittstelle ausgeben
* @param none
* @return none
*/
void SerialAbout(void)
{
sprintf(sdebug,"%s", CLRSCR);
SerialWriteString(sdebug);
sprintf(sdebug,"%s %s %s\r\n\r\n", PRG,VER,CALL);
SerialWriteString(sdebug);
}
/** @brief Ein Zeichen über serielle Schnittstelle ausgeben
* @param Zeichen * @param Zeichen
* @return none * @return none
*/ */
@ -243,7 +206,8 @@ void SerialWriteChar(unsigned char data)
while(!(UCSR0A & (1<<UDRE0))); while(!(UCSR0A & (1<<UDRE0)));
UDR0 = data; UDR0 = data;
} }
/** @brief Eine Zeichenkette über serielle Schnittstelle ausgeben /** @fn void SerialWriteString(unsigned char *s)
* @brief Eine Zeichenkette über serielle Schnittstelle ausgeben
* @param Zeiger auf Zeichenkette, die mit 0x00 abgeschlossen sein muss * @param Zeiger auf Zeichenkette, die mit 0x00 abgeschlossen sein muss
* @return none * @return none
*/ */
@ -252,19 +216,8 @@ void SerialWriteString(char *s)
while(*s != 0x00) while(*s != 0x00)
SerialWriteChar(*s++); SerialWriteChar(*s++);
} }
/** @fn void SidetoneOn(void)
/** @brief Read port pin of morse keys * @brief Mithörton einschalten
*
* This function reads the input of
* the Paddle or Straight key.
* @params: Pin to read
* @return: State of pin
*/
uint8_t ReadKeyPin(uint8_t pin)
{
return(PIND & (1<<pin));
}
/** @brief Tonausgabe einschalten
* @param none * @param none
* @return none * @return none
*/ */
@ -276,7 +229,8 @@ void SidetoneOn(void)
icnt = 0; icnt = 0;
sbi(TIMSK1,OCIE1A); sbi(TIMSK1,OCIE1A);
} }
/** @brief Tonausgabe abschalten /** @fn void SidetoneOff(void)
* @brief Mithörtone ausschalten
* @param none * @param none
* @return none * @return none
*/ */
@ -286,7 +240,8 @@ void SidetoneOff(void)
StateRiseTime = 0; StateRiseTime = 0;
StateRiseTimeCounter = 0; StateRiseTimeCounter = 0;
} }
/** @brief Audioverstärker abschalten /** @fn void SidetoneDisable(void)
/* @brief Audioverstärker abschalten
* @param none * @param none
* @return none * @return none
*/ */
@ -295,7 +250,8 @@ void SidetoneDisable(void)
bConfig.SidetoneEnabled = 0; bConfig.SidetoneEnabled = 0;
cbi(PORTB,AUDIO_EN); cbi(PORTB,AUDIO_EN);
} }
/** @brief Audioverstärker einschalten /** @fn void SidetoneEnable(void)
* @brief Audioverstärker einschalten
* @param none * @param none
* @return none * @return none
*/ */
@ -304,11 +260,14 @@ void SidetoneEnable(void)
bConfig.SidetoneEnabled = 1; bConfig.SidetoneEnabled = 1;
sbi(PORTB,AUDIO_EN); sbi(PORTB,AUDIO_EN);
} }
/** @fn void TXKey(uint8_t State)
/* * @brief Gibt ein Symbol aus
** TXKey *
** * Je nach Einstellung wird ein oder beide Transceiver
** Tastung TRX1, TRX2 oder beide * getastet oder nur der Mithörton ausgegeben.
*
* @param State - Bitfeld für Transceiver und Tonausgabe
* @return none
*/ */
void TXKey(uint8_t State) void TXKey(uint8_t State)
{ {
@ -334,17 +293,19 @@ void TXKey(uint8_t State)
} }
} }
} }
/** @fn void CheckStraightKey(void)
/** \brief StraigtKey * @brief Fragt die Handtasteneingänge ab und gibt das
* * entsprechende Symbol aus. Bei der Handtaste
* Check Straightkey * findet über einen Timer noch eine Software
* * Entprellung statt
*/ * @param none
* @return none
*/
void CheckStraightKey(void) void CheckStraightKey(void)
{ {
if(PIND & (1<<STRAIGHT_KEY)) if(PIND & (1<<STRAIGHT_KEY))
{ {
if(bState.SendStatus == NOTHING) if(bState.SendStatus == SENDING_NOTHING)
TXKey(0); TXKey(0);
StateStraightKeyPressed = NO_KEY_PRESSED; StateStraightKeyPressed = NO_KEY_PRESSED;
} else { } else {
@ -355,40 +316,78 @@ void CheckStraightKey(void)
} }
if(StateStraightKeyPressed == KEY_PRESSED) if(StateStraightKeyPressed == KEY_PRESSED)
{ {
if(bState.SendStatus == NOTHING) if(bState.SendStatus == SENDING_NOTHING)
TXKey(1); TXKey(1);
} }
} }
} }
/** \brief CheckPaddles /** @fn void CheckPaddles(void)
** ** @brief Diese Funktion prüft, ob ein Paddle betätigt wurde.
**
** Wenn dies der Fall war, ist das jeweilige Statusbit gesetzt
** und die Funktion für die Ausgabe des entsprechendem Symbol
** wird aufgerufen.
**
** @param none
** @return none
*/ */
void CheckPaddles(void) void CheckPaddles(void)
{ {
CheckDitPaddle(); CheckDitPaddle();
CheckDahPaddle(); CheckDahPaddle();
// Wenn Paddle betätigt wurde,
if(bState.SendStatus == SENDING_NOTHING)
{
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();
}
}
} }
/** \brief CheckDitPaddle /** @fn void CheckDitPaddle(void)
* @brief Prüfen, ob das Punkt Paddle betätigt wurde.
* *
* Ist dies der Fall, wird das Statusbit gesetzt.Wurde in den
* Einstellungen der Reverse Mode aktiviert, werden in der
* Abfrage die Paddle vertauscht.
* *
* @param none
* @return none
*/ */
void CheckDitPaddle(void) void CheckDitPaddle(void)
{ {
uint8_t pinvalue = 0; uint8_t pinvalue = 0;
if(PaddleMode == PADDLE_NORMAL) // no reverse paddle if(PaddleMode == PADDLE_NORMAL)
pinvalue = PIND & (1<<LEFT_PADDLE); pinvalue = PIND & (1<<LEFT_PADDLE);
else else
pinvalue = PIND & (1<<RIGHT_PADDLE); // reverse paddle pinvalue = PIND & (1<<RIGHT_PADDLE);
if(pinvalue == 0) // DitPaddle betätigt if((pinvalue == 0) && ((!(bState.SendStatus == SENDING_DIT)) || (bState.SendStatus == SENDING_NOTHING)))
{ {
bState.DitPressed = 1; bState.DitPressed = 1;
} }
// Wenn Punkt/Strich Speicher aktiviert ist, das Symbol merken, wenn es nicht identisch ist
if((pinvalue == 0) && (!(bState.SendStatus == SENDING_DIT)) && (bConfig.Memory == 1))
bState.DitPressed = 1;
} }
/* /** @fn void CheckDahPaddle(void)
** CheckDahPaddle * @brief Prüfen, ob das Strich Paddle betätigt wurde.
*/ *
* Ist dies der Fall, wird das Statusbit gesetzt. Wurde in den
* Einstellungen der Reverse Mode aktiviert, werden in der
* Abfrage die Paddle vertauscht.
*
* @param none
* @return none
*/
void CheckDahPaddle(void) void CheckDahPaddle(void)
{ {
uint8_t pinvalue = 0; uint8_t pinvalue = 0;
@ -398,54 +397,130 @@ void CheckDahPaddle(void)
else else
pinvalue = PIND & (1<<LEFT_PADDLE); // reverse paddle pinvalue = PIND & (1<<LEFT_PADDLE); // reverse paddle
if(pinvalue == 0) // Das Symbol nur merken, wenn nicht gerade eines ausgegeben wird oder gar nichts ausgegeben wird
if((pinvalue == 0) && ((!(bState.SendStatus == SENDING_DAH)) || (bState.SendStatus == SENDING_NOTHING)))
{ {
bState.DahPressed = 1; bState.DahPressed = 1;
} }
// Wenn Punkt/Strich Speicher aktiviert ist, das Symbol merken, wenn es nicht identisch ist
if((pinvalue == 0) && (!(bState.SendStatus == SENDING_DAH)) && (bConfig.Memory == 1))
bState.DahPressed = 1;
} }
void SetRatio(uint8_t WPMCorrectFactor) /** @fn void SetRatio(void)
* @brief Berechnung der Zeitdauer für Punkt und Strich
*
* Die Länge eines Symbols ist abhängig von der
* eingestellten Geschwindigkeit. Intern wird immer
* mit Wörtern pro Minute gerechnet. Das normale
* Punkt/Strich Verhältnis ist 1:3. Dies kann durch
* den Parameter Ratio in den Einstellungen verändert
* werden. Wird ein Korrekturfaktor angegeben, kann
* das Ratio über eine Tabelle in Abhängigkeit der
* Geschwindigkeit bis zu 1:2.0 verändert werden.
*
* @param none
* @return none
*/
void SetRatio(void)
{ {
DitMillis = 1200 / WpM; DitMillis = 1200 / WpM;
DahMillis = DitMillis * (float)(bConfig.Ratio/10); if(bConfig.SpeedRatioEnabled)
DahMillis = DitMillis * (float)(bState.WpMCorrectFactor / 10);
else
DahMillis = DitMillis * (float)(bConfig.Ratio/10);
} }
/** @fn void GetWpMCorrectFactor(void)
* @brief Ermittelt den Korrekturfaktor für das Ratio
* param none
* return none
*/
void GetWpMCorrectFactor(void)
{
bState.WpMCorrectFactor = 30;
if(WpM > 20)
bState.WpMCorrectFactor = 28;
/** @brief Symbol senden }
void SetWeight(void)
{
DitMillis = 1200/WpM;
DahMillis = 3 * DitMillis;
SpcMillis = 1200/WpM;
DitMillis = (bConfig.Weight/50.0) * DitMillis;
DahMillis = (bConfig.Weight/50.0) * DahMillis;
if(bConfig.Weight < 50)
SpcMillis = SpcMillis + (SpcMillis - DitMillis);
else
SpcMillis = SpcMillis - (DitMillis - SpcMillis);
}
/** @fn void SendSymbol(uint8_t Dit)
* @brief Symbol senden
* @param Dit = 1, wenn Symbol ein Punkt ist * @param Dit = 1, wenn Symbol ein Punkt ist
* @return none * @return none
*/ */
void SendSymbol(uint8_t Dit) void SendSymbol(uint8_t Dit)
{ {
volatile static uint16_t ticks; // Länge des Symbols static uint16_t ticks; // Länge des Symbols
if(Dit) if(Dit)
ticks = DitMillis; ticks = DitMillis;
else else
ticks = DahMillis; ticks = DahMillis;
t_elementlength = 0; t_elementlength = 0;
TXKey(1); TXKey(1);
DelayMilliSeconds(ticks); DelayMilliSeconds(ticks);
bState.SendStatus = SENDING_SPC;
TXKey(0); TXKey(0);
DelayMilliSeconds(DitMillis); DelayMilliSeconds(SpcMillis);
} }
/* /** @fn void SendDit(void)
** void SendDit(uint8_t SendingType) * @brief Gibt einen Punkt aus
*/ * @param none
* @return none
*/
void SendDit(void) void SendDit(void)
{ {
bState.DitPressed = 0; if((bState.SendStatus == NOTHING) || (bState.SendStatus == SENDING_DAH))
SendSymbol(DIT); {
bState.LastSymbolWasDit = 1; bState.DitPressed = 0;
bState.SendStatus = SENDING_DIT;
SendSymbol(DIT);
bState.SendStatus = SENDING_NOTHING;
bState.LastSymbolWasDit = 1;
}
if(bConfig.Memory == 0)
bState.DitPressed = 0;
} }
/** \brief Send a dah /** @fn void SendDah(void)
** A Dah with weight = 50 has the length of 3 Dits. * @brief Gibt einen Strich aus
* @param none
* @return none
*/ */
void SendDah(void) void SendDah(void)
{ {
bState.DahPressed = 0; if((bState.SendStatus == NOTHING) || (bState.SendStatus == SENDING_DIT))
SendSymbol(DAH); {
bState.LastSymbolWasDit = 0; bState.DahPressed = 0;
bState.SendStatus = SENDING_DAH;
SendSymbol(DAH);
bState.SendStatus = SENDING_NOTHING;
bState.LastSymbolWasDit = 0;
}
if(bConfig.Memory == 0)
bState.DahPressed = 0;
} }
/** @fn void SendIambic(void)
* @brief Wenn beide Paddle betätigt sind, wird alternierend
* ein Punkt und Strich ausgegeben.
*
* Beim Iambic B Mode und Ultimatic Mode wird gegebenenfalls
* noch ein gegensätzliches Zeichen des zuletzt betätigten Paddle
* angefügt. Erläuterung und Timing siehe Dokumentation.
*
* @param none
* @return none
*/
void SendIambic(void) void SendIambic(void)
{ {
bState.DahPressed = 0; bState.DahPressed = 0;
@ -485,19 +560,27 @@ void SendIambic(void)
} }
} }
} }
/* /** @fn void SetFrequency(uint16_t f)
** Set sidetone frequency * @brief Verändert die Frequenz des Mithörtons
*/ *
* Durch die Anpassung des Timers 1 für das
* Laden der Werte der Sinuskurve wird die
* Tonhöhe des Mithörtons verändert.
* @param Frequenz des Mithörtons in Hz
* @return none
*/
void SetFrequency(uint16_t f) void SetFrequency(uint16_t f)
{ {
IntDisable(); IntDisable();
OCR1A = (F_CPUPRESIN / f) - 1; OCR1A = (F_CPUPRESIN / f) - 1;
IntEnable(); IntEnable();
} }
/* /** @fn void Tone(uint16_t f, uint8_t duration)
** Output a tone width frequency f and duration duration * @brief Ausgabe eines Tons mit Dauer und Frequenz
** * @param f - Frequenz des Tons
*/ * duration - Dauer des Tons
* @return none
*/
void Tone(uint16_t f, uint8_t duration) void Tone(uint16_t f, uint8_t duration)
{ {
SetFrequency(f); SetFrequency(f);
@ -506,14 +589,29 @@ void Tone(uint16_t f, uint8_t duration)
SidetoneOff(); SidetoneOff();
SetFrequency(bConfig.SidetoneFreq); SetFrequency(bConfig.SidetoneFreq);
} }
/** @fn void Boop(void)
* @brief Boop Ton ausgeben
* @param none
* @return none
*/
void Boop(void) void Boop(void)
{ {
Tone(600,100); Tone(600,100);
} }
/** @fn void Beep(void)
* @brief Beep Ton ausgeben
* @param none
* @return none
*/
void Beep(void) void Beep(void)
{ {
Tone(1200,100); Tone(1200,100);
} }
/** @fn void BeepBoop(void)
* @brief BeepBoop Doppelton ausgeben
* @param none
* @return none
*/
void BeepBoop(void) void BeepBoop(void)
{ {
DelayMilliSeconds(10); DelayMilliSeconds(10);

@ -16,9 +16,8 @@ uint8_t sreg_tmp;
// Prototypes // Prototypes
void SymbolLoop(uint8_t Len); void SymbolLoop(uint8_t Len);
uint8_t ReadKeyPin(uint8_t pin);
void CheckPaddles(void); void CheckPaddles(void);
void SetRatio(uint8_t WpMCorrectFactor); void SetRatio(void);
void DitDahBuffers(void); void DitDahBuffers(void);
void SendDit(void); void SendDit(void);
@ -45,8 +44,6 @@ void SetEEprom(void);
// Serielle Schnittstelle // Serielle Schnittstelle
void SerialWriteString(char *s); void SerialWriteString(char *s);
void SerialWriteChar(unsigned char data); void SerialWriteChar(unsigned char data);
void SerialInfo(void);
void SerialAbout(void);
// Delay Millis // Delay Millis
void DelayMilliSeconds(uint16_t ms); void DelayMilliSeconds(uint16_t ms);
void ResetMilliSeconds(void); void ResetMilliSeconds(void);

@ -43,13 +43,10 @@
#define NOINIT __attribute__ ((section (".noinit"))) #define NOINIT __attribute__ ((section (".noinit")))
#endif #endif
#define L_WAIT 500 // Frequency for debug LED Timer 0
#define CALL " DL7BJ " #define CALL " DL7BJ "
#define PRG " BJ-Keyer " #define PRG " BJ-Keyer "
#define VER " V1.00 " #define VER " V1.00 "
// Keying states // Keying states
#define NOTHING 0 #define NOTHING 0
#define DIT_DAH_OFF 1 #define DIT_DAH_OFF 1
@ -69,14 +66,11 @@
#define SENDING_NOTHING 0 #define SENDING_NOTHING 0
#define SENDING_DIT 1 #define SENDING_DIT 1
#define SENDING_DAH 2 #define SENDING_DAH 2
#define SENDING_ELEMENT_SPACE 3 #define SENDING_SPC 3
#define SENDING_STRAIGHT 4 #define SENDING_STRAIGHT 4
// Sending Type // Sending Type
#define AUTO 0 // Automatische Pausen zwischen Elementen #define AUTO 0 // Automatische Pausen zwischen Elementen
#define MAN 1 // Manuelle Pausen zwischen Elementen #define MAN 1 // Manuelle Pausen zwischen Elementen
// Side Tone
#define SIDETONE_OFF 0
#define SIDETONE_ON 1
// Ports // Ports
#define LEFT_PADDLE PD2 // Left Paddle Input #define LEFT_PADDLE PD2 // Left Paddle Input
#define RIGHT_PADDLE PD3 // Right Paddle Input #define RIGHT_PADDLE PD3 // Right Paddle Input
@ -113,10 +107,11 @@
#define M_REVERSE 9 #define M_REVERSE 9
#define M_RATIO 10 #define M_RATIO 10
#define M_SPEEDRATIO 11 #define M_SPEEDRATIO 11
#define M_WPMBPM 12 #define M_WEIGHT 12
#define M_RISETIME 13 #define M_WPMBPM 13
#define M_DEBOUNCE 14 #define M_RISETIME 14
#define M_MAX 14 // maximale Menuepunke #define M_DEBOUNCE 15
#define M_MAX 15 // maximale Menuepunke
// LCD // LCD
#define CLEARLINE " " #define CLEARLINE " "
#define NORMAL 0 #define NORMAL 0
@ -136,7 +131,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 WpMCorrectFactor; // Korrekturfaktor für Ratio
uint8_t KeyState:1; // uint8_t KeyState:1; //
uint8_t KeyTX:1; uint8_t KeyTX:1;
}; };
@ -164,6 +159,7 @@ struct Config
uint8_t Reverse: 1; // linkes/rechtes Paddle vertauschen uint8_t Reverse: 1; // linkes/rechtes Paddle vertauschen
uint8_t SpeedRatioEnabled: 1; // Punkt/Strich Verhältnis Auto 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 Weight; // Punkt/Strich Gewichtung
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
uint8_t WpM; // WpM uint8_t WpM; // WpM
@ -185,36 +181,19 @@ uint16_t StoreEEprom;
// Globale Variablen für diverse Zwecke // Globale Variablen für diverse Zwecke
uint8_t WpM; uint8_t WpM;
uint8_t Weight;
uint8_t LengthOfElement;
// State Machines // State Machines
uint8_t PaddleMode; uint8_t PaddleMode;
uint8_t KeyerMode; uint8_t KeyerMode;
// History // History
uint8_t keyhistory;
uint8_t KeyTX; uint8_t KeyTX;
uint8_t DahBuffer;
uint8_t DitBuffer;
uint8_t Weighting;
uint8_t IambicFlag;
uint8_t DitCounter;
uint8_t DahCounter;
uint8_t CurrentTRX1;
// Sidetone generation // Sidetone generation
volatile uint8_t icnt; volatile uint8_t icnt;
volatile uint8_t ocr2a; volatile uint8_t ocr2a;
// Variablen in Timer 0
volatile uint16_t l_timer; // counter for LED on
volatile uint8_t t_timer; // Frequency of audio output
volatile uint16_t t_wait; // delayms max. 65535ms
volatile uint8_t t_pwm;
volatile uint16_t t_wait_led;
volatile uint8_t lastButton; // Wert der letzten Buttonabfrage volatile uint8_t lastButton; // Wert der letzten Buttonabfrage
volatile uint16_t DitMillis; volatile uint16_t DitMillis;
volatile uint16_t DahMillis; volatile uint16_t DahMillis;
volatile uint16_t SpcMillis;
// Zähler und Status für Entprellung der Tasteneingänge und Mithörton // Zähler und Status für Entprellung der Tasteneingänge und Mithörton
volatile uint8_t StateStraightKeyPressed; // Merker für StraightKey betätigt volatile uint8_t StateStraightKeyPressed; // Merker für StraightKey betätigt
volatile uint8_t TimerStraightKeyPressed; // Timer Variable für Entprellung volatile uint8_t TimerStraightKeyPressed; // Timer Variable für Entprellung

@ -19,6 +19,7 @@
2023-06-28 DL7BJ Port Anpassungen an neue Leiterplatte V1.01 2023-06-28 DL7BJ Port Anpassungen an neue Leiterplatte V1.01
2023-07-29 DL7BJ Menü für Einstellungen implementiert 2023-07-29 DL7BJ Menü für Einstellungen implementiert
2023-08-06 DL7BJ Quelltexte umstrukturiert, Aufteilung 2023-08-06 DL7BJ Quelltexte umstrukturiert, Aufteilung
2023-08-25 DL7BJ Code dokumentiert und aufgeräumt
ATMEGA328(P) ATMEGA328(P)
---------- ----------
@ -50,10 +51,6 @@
Pin 13 - PD7 - Mem 3 Pin 16 - PB2 - Encoder Switch Pin 13 - PD7 - Mem 3 Pin 16 - PB2 - Encoder Switch
Pin 14 - PB0 - Encoder A Pin 15 - PB1 - Encoder B Pin 14 - PB0 - Encoder A Pin 15 - PB1 - Encoder B
Value 1 2 4 8 32 64 128 255
Bit 1 2 3 4 5 6 7 8
Pin 0 1 2 3 4 5 6 7
@endverbatim @endverbatim
*/ */
@ -67,23 +64,17 @@ const unsigned char sinewave[] PROGMEM = {
0x80, 0x73, 0x67, 0x5a, 0x4f, 0x43, 0x39, 0x2f, 0x25, 0x1d, 0x15, 0x0f, 0x0a, 0x05, 0x02, 0x01 0x80, 0x73, 0x67, 0x5a, 0x4f, 0x43, 0x39, 0x2f, 0x25, 0x1d, 0x15, 0x0f, 0x0a, 0x05, 0x02, 0x01
}; };
/** /** @fn void InitTimer(void)
* \brief Initialsieren der Timer * @brief Initialsieren der Timer
*
* Alle Parameter der Timer basieren auf 16MHz Systemtakt.
* *
* Timer 0 - 8 Bit timer für 1ms * Alle Parameter der Timer basieren auf 16MHz Systemtakt.
* Timer 2 - 8 Bit timer für PWM zur Erzeugung des Sinustons
* Timer 1A - 16 Bit timer zur Erzeugung der Hüllkurve
* Timer 1B - 16 Bit timer wird nicht benutzt
* *
* T - dot duration * Timer 0 - 8 Bit timer für 1ms
* wpm - Words per Minute based on PARIS * Timer 2 - 8 Bit timer für PWM zur Erzeugung des Sinustons
* Formula T = 1200 / wpm * Timer 1A - 16 Bit timer zur Erzeugung der Hüllkurve
* Minimum speed 10 wpm - dot duration 120ms * @param none
* Maximum speed 99 wpm - dot duration 12ms * @return none
* */
*/
void InitTimer(void) void InitTimer(void)
{ {
cli(); cli();
@ -97,14 +88,10 @@ void InitTimer(void)
// Fast PWM Mode // Fast PWM Mode
sbi(TCCR2A,WGM20); sbi(TCCR2A,WGM20);
sbi(TCCR2A,WGM21); sbi(TCCR2A,WGM21);
// Phase Correct PWM
//sbi(TCCR2A,WGM22);
//sbi(TCCR2A,WGM20);
// Initial value // Initial value
OCR2A = 0x80; OCR2A = 0x80;
sbi(DDRB,PB3); sbi(DDRB,PB3);
cbi(TIMSK2,OCIE0A); cbi(TIMSK2,OCIE0A);
// Timer 1 für die Sinus Hüllkurve // Timer 1 für die Sinus Hüllkurve
TCCR1A = 0; TCCR1B = 0; TIMSK1 = 0; TCCR1A = 0; TCCR1B = 0; TIMSK1 = 0;
// CTC Mode // CTC Mode
@ -114,7 +101,6 @@ void InitTimer(void)
// Output Compare Match Interrupt Enable // Output Compare Match Interrupt Enable
OCR1A = 51; // 600Hz OCR1A = 51; // 600Hz
sbi(TIMSK1,OCIE1A); // Timer 1 Sinus Hüllkurve einschalten sbi(TIMSK1,OCIE1A); // Timer 1 Sinus Hüllkurve einschalten
// Timer 0 1ms für diverse Zähler // Timer 0 1ms für diverse Zähler
TCCR0A = 0; TCCR0B = 0; TCNT0 = 0; TCCR0A = 0; TCCR0B = 0; TCNT0 = 0;
cbi(TCCR0A,WGM00); cbi(TCCR0A,WGM00);
@ -127,8 +113,12 @@ void InitTimer(void)
sbi(TIMSK0,OCIE0A); // Timer 0 1ms einschalten sbi(TIMSK0,OCIE0A); // Timer 0 1ms einschalten
sei(); sei();
} }
/** @fn void Init(void)
void Init() * @brief Initialisierung aller Variablen, Timer
* @param none
* @return none
*/
void Init(void)
{ {
cli(); // disable all interrupts cli(); // disable all interrupts
bState.SendStatus = SENDING_NOTHING; bState.SendStatus = SENDING_NOTHING;
@ -153,23 +143,6 @@ void Init()
cbi(PORTD,LEFT_PADDLE); cbi(PORTD,LEFT_PADDLE);
cbi(PORTD,RIGHT_PADDLE); cbi(PORTD,RIGHT_PADDLE);
cbi(PORTD,STRAIGHT_KEY); cbi(PORTD,STRAIGHT_KEY);
LengthOfElement = (uint16_t)1200/bConfig.WpM;
// Pin Change Interrupts Port D - Keys
// Alle Pins liegen im PCINT2 Vektor
// 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(PCMSK2,PCINT18);
// sbi(PCMSK2,PCINT19);
// 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
sbi(UCSR0B,TXEN0); // Enable TX sbi(UCSR0B,TXEN0); // Enable TX
@ -180,7 +153,6 @@ void Init()
InitTimer(); InitTimer();
EncoderInit(); EncoderInit();
// Initialisierung Menüvariablen // Initialisierung Menüvariablen
bMenuCtrl.ClrScr = 1; bMenuCtrl.ClrScr = 1;
bMenuCtrl.Update = 1; bMenuCtrl.Update = 1;
@ -190,7 +162,14 @@ void Init()
bMenuCtrl.WriteEEprom = 0; bMenuCtrl.WriteEEprom = 0;
sei(); // enable all interrupts sei(); // enable all interrupts
} }
/** @fn ISR(TIMER1_COMPA_vect)
* @brief 8 Bit Timer 1 ISR routine
*
* Der Timer 1 lädt die Sinuswerte für die PWM
*
* params: none
* return: none
*/
ISR(TIMER1_COMPA_vect) ISR(TIMER1_COMPA_vect)
{ {
ocr2a = pgm_read_byte_near(sinewave+icnt); ocr2a = pgm_read_byte_near(sinewave+icnt);
@ -226,30 +205,24 @@ ISR(TIMER1_COMPA_vect)
} }
} }
} }
/** @fn ISR(TIMER0_COMPA_vect)
/** @brief 8 Bit Timer 0 ISR routine * @brief 8 Bit Timer 0 ISR routine
* *
* The Timer 0 CTC interrupt will be fired every millisecond and * Der Timer 0 mit CTC Interrupt läuft mit einem Takt
* has a bundle of counter variables for different timings. * von einer Millisekunde Es werden mehrere Werte innerhalb
* des Timerinterrupts verarbeitet.
* *
* params: none * params: none
* return: none * return: none
* */
*/
ISR(TIMER0_COMPA_vect) ISR(TIMER0_COMPA_vect)
{ {
t_delayms++; // 16Bit counter for milliseconds t_delayms++; // 16Bit Zähler für Warteschleifen
t_elementlength++; // Length of element dit/dah t_elementlength++; // Länge eines Symbols
t_wait++;
t_timer++;
StoreEEprom++; // Zähler für Zeitablauf speichern EEprom StoreEEprom++; // Zähler für Zeitablauf speichern EEprom
MenuCtrlTimer++; // Zähler für Zeitablauf Einstellungen MenuCtrlTimer++; // Zähler für Zeitablauf Einstellungen
EncoderTimer++; // Zähler für 5ms Drehencoder Timer EncoderTimer++; // Zähler für 5ms Drehencoder Timer
if(t_timer >= L_WAIT)
{
t_timer = 0;
}
// Alle 5ms den Drehencoder abfragen // Alle 5ms den Drehencoder abfragen
if(EncoderTimer > 5) if(EncoderTimer > 5)
{ {
@ -295,21 +268,10 @@ ISR(TIMER0_COMPA_vect)
if(TimerPaddleDahKeyPressed > bConfig.DebounceTime) if(TimerPaddleDahKeyPressed > bConfig.DebounceTime)
StatePaddleDahKeyPressed = KEY_PRESSED; StatePaddleDahKeyPressed = KEY_PRESSED;
} }
} }
/** @fn ISR(USART_RX_vect)
/** \brief 8 Bit Timer 2 * @brief Interrupt RX serielle Schnittstelle
* *
* Timer 2 overflow interrupt
* Mit diesem Interrupt wird der nächste Wert für die
* Erzeugung des Sinus für den Mithörton geladen.
*
*/
ISR(TIMER2_OVF_vect)
{
/* nothing */
}
/** @brief Interrupt RX serielle Schnittstelle
* @param none * @param none
* @return none * @return none
*/ */
@ -319,34 +281,17 @@ ISR(USART_RX_vect)
data = UDR0; data = UDR0;
SerialWriteChar(data); SerialWriteChar(data);
} }
/** @brief Pin Change Interrupt PORT C /** @fn void ReStart(void)
* @param none * @brief Initialisierung bei Reset und Power On
* @return none
*/
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
* @param none * @param none
* @return none * @return none
*/ */
void ReStart(void) void ReStart(void)
{ {
MenuCtrlTimer = 0; MenuCtrlTimer = 0;
t_delayms = 0; t_delayms = 0;
bState.SendStatus = SENDING_NOTHING; bState.SendStatus = SENDING_NOTHING;
Init();
Init();
DisplayVersion(); DisplayVersion();
ReadEEprom(); ReadEEprom();
WpM = bConfig.WpM; WpM = bConfig.WpM;
@ -354,7 +299,6 @@ void ReStart(void)
EncoderWrite(bConfig.WpM); EncoderWrite(bConfig.WpM);
EncoderPosConfig = 1; EncoderPosConfig = 1;
SetFrequency(bConfig.SidetoneFreq); SetFrequency(bConfig.SidetoneFreq);
SetRatio(0);
KeyerMode = bConfig.KeyerMode; KeyerMode = bConfig.KeyerMode;
PaddleMode = bConfig.Reverse; PaddleMode = bConfig.Reverse;
bState.KeyTX = 1; bState.KeyTX = 1;
@ -363,9 +307,11 @@ void ReStart(void)
SidetoneEnable(); SidetoneEnable();
else else
SidetoneDisable(); SidetoneDisable();
LastPINDState = 0xff; SetRatio();
SetWeight();
} }
/** @brief main() /** @fn int main(void)
* @brief One Infinite Loop
* @param none * @param none
* @return none * @return none
*/ */
@ -373,37 +319,27 @@ int main(void)
{ {
ReStart(); ReStart();
SerialAbout(); SerialAbout();
SerialInfo(); SerialMenue();
while(1) while(1)
{ {
// Wenn Geschwindigkeit verändert und Zeit abgelaufen, // Wenn Geschwindigkeit verändert und Zeit abgelaufen,
// dann im EEprom speichern und Merker löschen. // dann neue Geschwindigkeit im EEprom speichern und
// Merker löschen.
if(bState.WriteWpMEEprom) if(bState.WriteWpMEEprom)
{ {
WriteEEpromWpM(); WriteEEpromWpM();
bState.WriteWpMEEprom = 0; bState.WriteWpMEEprom = 0;
} }
// Wenn Einstellungen verändert wurde, diese im EEprom
// speichern
if(bState.WriteEEprom) if(bState.WriteEEprom)
{ {
WriteEEprom(); WriteEEprom();
bState.WriteEEprom = 0; bState.WriteEEprom = 0;
} }
Drehencoder(); // Drehencoder abfragen
Drehencoder(); UpdateDisplay(); // Display aktualisieren
UpdateDisplay(); CheckStraightKey(); // Handtaste auf Betätigung prüfen
CheckStraightKey(); CheckPaddles(); // Paddles auf Betätigung prüfen
CheckPaddles(); }
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();
}
}
} }

@ -11,6 +11,7 @@
#include "encoder.h" #include "encoder.h"
#include "functions.h" #include "functions.h"
#include "controls.h" #include "controls.h"
#include "vt100.h"
struct Config bConfig; struct Config bConfig;
struct MenuCtrl bMenuCtrl; struct MenuCtrl bMenuCtrl;

@ -0,0 +1,65 @@
/** @file vt100.c
* @brief VT100 Termial
* @author Tom, DL7BJ
*/
#include "vt100.h"
/** @brief Auswahlmenue über serielle Schnittstelle ausgeben
* @param none
* @return none
*/
void SerialMenue(void)
{
SerialWriteString("(1) Einstellungen anzeigen\r\n");
SerialWriteString("(2) Einstellungen ändern\r\n");
SerialWriteString("(3) Texte anzeigen\r\n");
SerialWriteString("(4) Texte ändern\r\n");
SerialWriteString("(5) Texte anhören\r\n");
SerialWriteString("\r\nEingabe: ");
}
/** @brief Aktuelle Einstellungen über serielle Schnittstelle ausgeben
* @param none
* @return none
*/
void SerialSetup(void)
{
sprintf(sdebug,"WpM : %i\r\n", bConfig.WpM);
SerialWriteString(sdebug);
sprintf(sdebug,"KeyerMode : %i\r\n", bConfig.KeyerMode);
SerialWriteString(sdebug);
sprintf(sdebug,"SidetoneFreq : %u\r\n", bConfig.SidetoneFreq);
SerialWriteString(sdebug);
sprintf(sdebug,"TRX : %i\r\n", bConfig.TRX);
SerialWriteString(sdebug);
sprintf(sdebug,"SidetoneEnabled : %i\r\n", bConfig.SidetoneEnabled);
SerialWriteString(sdebug);
sprintf(sdebug,"Ratio : %i\r\n", bConfig.Ratio);
SerialWriteString(sdebug);
sprintf(sdebug,"WpMBpM : %i\r\n", bConfig.WpMBpM);
SerialWriteString(sdebug);
sprintf(sdebug,"Reverse : %i\r\n", bConfig.Reverse);
SerialWriteString(sdebug);
sprintf(sdebug,"Memory : %i\r\n", bConfig.Memory);
SerialWriteString(sdebug);
sprintf(sdebug,"SpeedRatio : %i\r\n", bConfig.SpeedRatioEnabled);
SerialWriteString(sdebug);
sprintf(sdebug,"RiseTime : %i\r\n", bConfig.RiseTime);
SerialWriteString(sdebug);
sprintf(sdebug,"RiseTimeCounter : %i\r\n", bConfig.RiseTimeCounter);
SerialWriteString(sdebug);
sprintf(sdebug,"DebounceTime : %i\r\n", bConfig.DebounceTime);
SerialWriteString(sdebug);
}
/** @brief Versionsinformation über serielle Schnittstelle ausgeben
* @param none
* @return none
*/
void SerialAbout(void)
{
sprintf(sdebug,"%s", CLRSCR);
SerialWriteString(sdebug);
sprintf(sdebug,"%s %s %s\r\n\r\n",PRG,VER,CALL);
SerialWriteString(sdebug);
}

@ -0,0 +1,22 @@
/** @file vt100.h
* @brief VT100 Termial
* @author Tom, DL7BJ
*/
#ifndef VT100_H_INCLUDED
#define VT100_H_INCLUDED
#include "functions.h"
void SerialInfo(void);
void SerialAbout(void);
void SerialSetup(void);
void SerialMenue(void);
// Stringkonstanten für VT100 Terminals
static const char* const CLRSCR = "\033[2J";
unsigned char line[64];
#endif
Loading…
Cancel
Save