/* * * * */ #ifndef BJ-KEYER_H_INCLUDED #define BJ-KEYER_H_INCLUDED #define F_CPU 16000000UL #define PRESCALER 8 #define SINEWAVELENGTH 64 #define F_CPUPRESIN (F_CPU/(PRESCALER*SINEWAVELENGTH)) #define USART_BAUDRATE 9600 #define UBRR_VALUE (((F_CPU/(USART_BAUDRATE*16UL)))-1) #include #include #include #include #include #include #include #include #include #include #include #include #include #include "oled/i2c.h" #include "oled/lcd.h" #include "oled/font.h" #include "encoder.h" #include "functions.h" // Const strings for display const char CALL[] = " DL7BJ "; 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 SideToneOnOff[] = "Mithörton"; const char SideToneFreq[] = "Frequenz"; const char Yes[] = "J"; const char No[] = "N"; const char Hz[] = "Hz"; // Const strings for VT100 const char CLRSCR[] = "\033[2J"; #ifndef EEMEM #define EEMEM __attribute__ ((section (".eeprom"))) #endif #ifndef NOINIT #define NOINIT __attribute__ ((section (".noinit"))) #endif #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 #define NOTHING 0 #define DIT_DAH_OFF 1 #define DAH_DIT_OFF 2 #define DIT_DAH_ON 3 #define DAH_DIT_ON 4 // Keyer mode #define STRAIGHT 0 #define IAMBIC_B 1 #define IAMBIC_A 2 #define SINGLE_PADDLE 3 // Paddle Mode #define PADDLE_NORMAL 0 #define PADDLE_REVERSE 1 // Machine Mode #define NORMAL 0 #define COMMAND 1 // Sending Mode #define SENDING_NOTHING 0 #define SENDING_DIT 1 #define SENDING_DAH 2 #define SENDING_ELEMENT_SPACE 3 #define SENDING_STRAIGHT 4 // #define AUTOMATIC_SENDING 0 #define AUTOMATIC 0 #define MANUAL 1 #define MANUAL_SENDING 1 // Side Tone #define SIDETONE_OFF 0 #define SIDETONE_ON 1 // Ports #define LEFT_PADDLE PD2 // Left Paddle Input #define RIGHT_PADDLE PD3 // Right Paddle Input #define STRAIGHT_KEY PD4 // Straight key Input #define MORSE_LED PC3 // LED Morse Output #define MEM1 PD5 // Mem 1 Input #define MEM2 PD6 // Mem 2 Input #define MEM3 PD7 // Mem 3 Input #define MEM4 PC0 // Mem 4 Input #define MEM5 PB5 // Mem 5 Input #define TRX1 PC1 // TRX1 Output #define TRX2 PC2 // TRX2 Output #define AUDIO PB3 // PWM Audio Output #define AUDIO_EN PB4 // Audio PA Enable #define SCL PC5 // I²C LC Display #define SDA PC4 // I²C LC Display // States #define ON 1 #define OFF 0 // 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_WPMBPM 9 #define M_MAX 9 // 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 }; uint8_t sdebug[64]; // Sidetone generation double sidetone_f = 600; volatile uint8_t icnt; // Diverse Zähler für Timer 0 uint16_t StoreEEprom = 0; // Wartezeit bis EEPROM geschrieben wird uint16_t MenuCtrlTimer = 0; // Wartezeit bis zur Betriebsanzeige nach Config 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 uint8_t t_element_length; struct Merker { uint8_t WpMChanged: 1; uint8_t WriteWpMEEProm: 1; } bMerker; struct MenuCtrl { uint8_t buttonPressed: 1; uint8_t buttonPressedLong: 1; uint8_t m_buttonPressed: 1; uint8_t m_buttonPressedLong: 1; uint8_t ClrScr: 1; uint8_t Config: 1; uint8_t WriteEEProm: 1; uint8_t Update: 1; uint8_t CurMenue; } bMenuCtrl; // State Machines uint8_t MachineMode = NORMAL; uint8_t PaddleMode = PADDLE_NORMAL; uint8_t KeyerMode = IAMBIC_A; uint8_t SidetoneMode = NORMAL; uint8_t state_sidetoneoff = 0; volatile uint8_t Mode = NORMAL; volatile uint8_t SendStatus = SENDING_NOTHING; volatile uint8_t LastSendStatus = MANUAL_SENDING; // History uint8_t keyhistory = 0xff; uint8_t KeyTX = 1; uint8_t DahBuffer = 0; uint8_t DitBuffer = 0; uint8_t Weighting = 50; uint8_t IambicFlag = 0; uint8_t KeyState = 0; uint8_t DitCounter = 0; uint8_t DahCounter = 0; uint8_t CurrentTRX = TRX1; uint8_t SpeedWpM = 1; 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 encoder_timer = 0; // 10ms Timer for Encoder volatile int8_t encoder_counter = 0; // Vor/Rück Zähler // 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) 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; } bConfig; // Function prototypes void Init(void); void InitTimer(void); void CheckDahPaddle(void); void CheckDitPaddle(void); void CheckPaddle(void); void CheckStraightKey(void); void SendDit(uint8_t SendingType); void SendDah(uint8_t SendingType); void PTTKey(uint8_t State); void SideToneOff(void); void SideToneOn(void); void TXSidetoneKey(uint8_t State, uint8_t SendingType); void SendChar(uint8_t); void ChangeSpeed(void); void dah(void); void dit(void); void DoMorse(void); void SetFrequency(uint16_t f); #endif // BJ-KEYER_H_INCLUDED