/** @file functions.c * @brief Diverse Funktionen * @author Tom, DL7BJ */ #include "functions.h" // EEProm uint8_t Dummy; uint8_t ee_Dummy EEMEM = 0x55; // Dummy for Address 0 uint8_t ee_TRX EEMEM = 0; // TRX 1 oder 2 oder beide uint8_t ee_KeyerMode EEMEM = 1; // Iambic A, Iambic B oder Ultimatic uint8_t ee_SidetoneEnabled EEMEM = 1; // Mithörton eingeschaltet uint8_t ee_WpMBpM EEMEM = 0; // WpM oder BpM Anzeige uint8_t ee_Reverse EEMEM = 0; // linkes/rechtes Paddle vertauschen uint8_t ee_WinkeyerEnabled EEMEM = 0; // Winkeyer Emulation uint8_t ee_Ratio EEMEM = 30; // Punkt/Strich Verhältnis 1:3 uint8_t ee_Memory EEMEM = 0; // Punkt/Strich Speicher uint16_t ee_SidetoneFreq EEMEM = 600; // Frequenz des Mithörtons uint8_t ee_WpM EEMEM = 12; // WpM uint8_t ee_RiseTime EEMEM = 5; // Anstiegszeit Sinuston uint8_t ee_RiseTimeCounter EEMEM = 5; // Anzahl Sinusschwingungen für den Anstieg uint8_t ee_DebounceTime EEMEM = 6; // Entprellzeit für Straight Key Eingang // Stringkonstanten für VT100 Terminals char CLRSCR[] = "\033[2J"; /** @brief Ein paar Millisekunden warten * * Dieser Variable muss atomar sein, weil es eine 16Bit Variable ist, * die im Timer 0 verwendet wird. * @param Zeit in Millisekunden, die gewartet werden soll * @return void */ void DelayMilliSeconds(uint16_t ms) { t_delayms = 0; // ResetMilliSeconds(); //ATOMIC_BLOCK(ATOMIC_FORCEON) { while(t_delayms < ms); //} } /** @brief Wert des Zählers für Millisekunden lesen * * Dieser Variable muss atomar sein, weil es eine 16Bit Variable ist, * die im Timer 0 verwendet wird. * @param none * @return milliseconds */ uint16_t GetMilliSeconds(void) { uint16_t m; ATOMIC_BLOCK(ATOMIC_FORCEON){ m = t_delayms; } return m; } /** @brief Setzt den Zähler für Millisekunden auf 0 * * Dieser Variable muss atomar sein, weil es eine 16Bit Variable ist, * die im Timer 0 verwendet wird. * @param none * @return none */ void ResetMilliSeconds(void) { //ATOMIC_BLOCK(ATOMIC_FORCEON){ t_delayms = 0; //} } /** @brief SREG wieder herstellen und Interrupts erlauben * @param none * @return none */ void IntEnable(void) { SREG = sreg_tmp; sei(); } /** @brief SREG sichern und Interrupts verbieten * @param none * @return none */ void IntDisable(void) { sreg_tmp = SREG; cli(); } /** \brief EEPROM schreiben */ void WriteEEprom(void) { cli(); eeprom_write_byte(&ee_Dummy,0x55); eeprom_write_byte(&ee_WpM, bConfig.WpM); eeprom_write_byte(&ee_KeyerMode, bConfig.KeyerMode); eeprom_write_word(&ee_SidetoneFreq, bConfig.SidetoneFreq); eeprom_write_byte(&ee_TRX, bConfig.TRX); eeprom_write_byte(&ee_SidetoneEnabled, bConfig.SidetoneEnabled); eeprom_write_byte(&ee_WpMBpM, bConfig.WpMBpM); eeprom_write_byte(&ee_Reverse, bConfig.Reverse); eeprom_write_byte(&ee_WinkeyerEnabled, bConfig.WinkeyerEnabled); eeprom_write_byte(&ee_Ratio, bConfig.Ratio); eeprom_write_byte(&ee_Memory, bConfig.Memory); eeprom_write_byte(&ee_RiseTime, bConfig.RiseTime); eeprom_write_byte(&ee_RiseTimeCounter, bConfig.RiseTimeCounter); eeprom_write_byte(&ee_DebounceTime, bConfig.DebounceTime); sei(); } void ReadEEpromWpM(void) { cli(); bConfig.WpM = eeprom_read_byte(&ee_WpM); sei(); } void WriteEEpromWpM(void) { cli(); eeprom_write_byte(&ee_WpM, bConfig.WpM); sei(); } void ReadEEprom(void) { sprintf(sdebug,"EEprom lesen\r\n"); SerialWriteString(sdebug); cli(); bConfig.WpM = eeprom_read_byte(&ee_WpM); bConfig.KeyerMode = eeprom_read_byte(&ee_KeyerMode); bConfig.SidetoneFreq = eeprom_read_word(&ee_SidetoneFreq); bConfig.TRX = eeprom_read_byte(&ee_TRX); bConfig.SidetoneEnabled = eeprom_read_byte(&ee_SidetoneEnabled); bConfig.WpMBpM = eeprom_read_byte(&ee_WpMBpM); bConfig.Reverse = eeprom_read_byte(&ee_Reverse); bConfig.WinkeyerEnabled = eeprom_read_byte(&ee_WinkeyerEnabled); bConfig.Ratio = eeprom_read_byte(&ee_Ratio); bConfig.Memory = eeprom_read_byte(&ee_Memory); bConfig.RiseTime = eeprom_read_byte(&ee_RiseTime); bConfig.RiseTimeCounter = eeprom_read_byte(&ee_RiseTimeCounter); bConfig.DebounceTime = eeprom_read_byte(&ee_DebounceTime); sei(); 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(); } sprintf(sdebug,"WpM : %i\r\n", bConfig.WpM); SerialWriteString(sdebug); sprintf(sdebug,"SidetoneFreq: %ul\r\n", bConfig.SidetoneFreq); SerialWriteString(sdebug); sprintf(sdebug,"WpMBpM : %i\r\n", bConfig.WpMBpM); SerialWriteString(sdebug); } void SerialWriteChar(unsigned char data) { while(!(UCSR0A & (1<