From dc41eb22bbad4419ba91ead45d5aab21ef0f7991 Mon Sep 17 00:00:00 2001 From: Philipp Hachtmann Date: Sun, 12 Feb 2017 16:58:09 +0100 Subject: [PATCH] trennfix/sw: Nice, keep! Good! Signed-off-by: Philipp Hachtmann --- trennfix/pcb/trennfix.brd | 35 +- trennfix/pcb/trennfix.sch | 100 +++--- trennfix/sw/Makefile | 4 +- trennfix/sw/config/hardware.h | 5 +- .../{trennfix_attiny85.h => trennfix_0.4.h} | 36 +- trennfix/sw/config/trennfix_attiny25.h | 87 ----- trennfix/sw/{ => include}/pin_magic.h | 0 .../{trennfix_attiny25.mk => trennfix_0.4.mk} | 18 +- trennfix/sw/mk/trennfix_attiny85.mk | 41 --- trennfix/sw/mm/src/mm_switch.c | 19 +- trennfix/sw/src/main.c | 327 ++++++++++-------- 11 files changed, 279 insertions(+), 393 deletions(-) rename trennfix/sw/config/{trennfix_attiny85.h => trennfix_0.4.h} (69%) delete mode 100644 trennfix/sw/config/trennfix_attiny25.h rename trennfix/sw/{ => include}/pin_magic.h (100%) rename trennfix/sw/mk/{trennfix_attiny25.mk => trennfix_0.4.mk} (67%) delete mode 100644 trennfix/sw/mk/trennfix_attiny85.mk diff --git a/trennfix/pcb/trennfix.brd b/trennfix/pcb/trennfix.brd index c09b877..4591f0a 100644 --- a/trennfix/pcb/trennfix.brd +++ b/trennfix/pcb/trennfix.brd @@ -2914,13 +2914,13 @@ Your Multi-CB Team - - - + + + - - - + + + @@ -2936,12 +2936,6 @@ Your Multi-CB Team - - - - - - @@ -2973,7 +2967,7 @@ Your Multi-CB Team - + @@ -2981,8 +2975,8 @@ Your Multi-CB Team - - + + @@ -2994,7 +2988,6 @@ Your Multi-CB Team - @@ -3187,17 +3180,13 @@ Your Multi-CB Team - - - - - + - - + + diff --git a/trennfix/pcb/trennfix.sch b/trennfix/pcb/trennfix.sch index bee2cb7..4089d34 100644 --- a/trennfix/pcb/trennfix.sch +++ b/trennfix/pcb/trennfix.sch @@ -8,34 +8,34 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -44,8 +44,8 @@ - - + + @@ -53,17 +53,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -12815,8 +12815,6 @@ diameter 3 mm, horizontal, grid 12.7 mm - - @@ -12894,7 +12892,7 @@ Philipp Hachtmann - + @@ -12908,8 +12906,6 @@ Philipp Hachtmann - - @@ -13049,12 +13045,6 @@ Philipp Hachtmann - - - - - - @@ -13222,12 +13212,8 @@ Philipp Hachtmann - + diff --git a/trennfix/sw/Makefile b/trennfix/sw/Makefile index 07546bd..e8e59d2 100644 --- a/trennfix/sw/Makefile +++ b/trennfix/sw/Makefile @@ -27,7 +27,7 @@ # To rebuild project do "make clean" then "make all". #---------------------------------------------------------------------------- -CONFIG?=trennfix_attiny25 +CONFIG?=trennfix_0.4 include mk/${CONFIG}.mk @@ -216,7 +216,7 @@ AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) -AVRDUDE_FLAGS += -B 20 +AVRDUDE_FLAGS += -B 2 #---------------- Debugging Options ---------------- diff --git a/trennfix/sw/config/hardware.h b/trennfix/sw/config/hardware.h index 4f07b0b..7154281 100644 --- a/trennfix/sw/config/hardware.h +++ b/trennfix/sw/config/hardware.h @@ -1,10 +1,7 @@ #ifndef __HARDWARE_H_GENERIC__ #define __HARDWARE_H_GENERIC__ - -#include __HW_CONF_HEADER__ - - +#include #endif diff --git a/trennfix/sw/config/trennfix_attiny85.h b/trennfix/sw/config/trennfix_0.4.h similarity index 69% rename from trennfix/sw/config/trennfix_attiny85.h rename to trennfix/sw/config/trennfix_0.4.h index 39c1592..964853e 100644 --- a/trennfix/sw/config/trennfix_attiny85.h +++ b/trennfix/sw/config/trennfix_0.4.h @@ -6,6 +6,7 @@ #define PIN_LED _PIN(PORTB, PORTB2) #define PIN_SENSE _PIN(PORTB, PORTB4) #define PIN_DRIVE _PIN(PORTB, PORTB3) +//#define PIN_DRIVE PIN_LED #define PIN_BTN _PIN(PORTB, PB1) #define BTN_PRESSED (!PINVAL(PIN_BTN)) @@ -14,15 +15,6 @@ #define START_TIMER1 ({TCNT1 = 1; TCCR1 = 7; GTCCR |= 2;}) #define STOP_TIMER1 ({TCCR1 = 0; TCNT1 = 1;}) - -/* - * Various sinks for valuable program memory - * - */ -// #define USE_EEPROM_UPDATE /* 14 bytes */ -//#define INTERPRET_DRIVE_COMMANDS -#define INTERPRET_DRIVE_SIMPLE - static inline void setup_hw(void) { /* Turn off the 1/8 clock prescaler - now running at 16MHz*/ @@ -45,14 +37,15 @@ static inline void setup_hw(void) TCCR0A = 0; /* Normal mode */ TCCR0B = 0; /* Timer off */ TIMSK |= _BV(OCIE0A); /* Get a match interrupt */ - - /* We need 13 + 45,5 us delay, That's 464 clocks @8MHz*/ - //OCR0A = 91; /* Prescaler 8 is used */ - /* Timer 1 for timeout */ - /* We set it to 1024us by prescaler 64 and running full 256 */ - // TCCR1 = 7; - // TIMSK |= _BV(TOIE1); /* Overflow interrupt */ +#ifdef WITH_PWM + /* Timer 1 as PWM */ + OCR1C = 14; + OCR1B = 14; + TCCR1 = 0x6; + GTCCR |= _BV(PWM1B) | _BV(COM1B0); +#endif + } /* @@ -74,12 +67,15 @@ static void __attribute__((unused)) trigger(void) */ #define MM_SENSE (!PINVAL(PIN_SENSE)) -#define MM_TSTART_FAST ({TCNT0 = 0; GTCCR |= 1; OCR0A = 110; TCCR0B = 2;}) -#define MM_TSTART_SLOW ({TCNT0 = 0; GTCCR |= 1; OCR0A = 220; TCCR0B = 2;}) -#define MM_TSTOP ({TCCR0B = 0;}) +#define MM_TSTART ({TCNT0 = 0; GTCCR |= 1; OCR0A = 115; TCCR0B = 2;}) #define MM_TIMER_INT_VECT TIMER0_COMPA_vect -/* Costs 63 bytes program memory */ +/* Costs 38 bytes program memory */ #define MM_FILTER_REPEATED +#define USE_EEPROM_UPDATE + +#ifdef USE_REGISTER_VARS +uint8_t register drive_on asm("r8"); +#endif #endif diff --git a/trennfix/sw/config/trennfix_attiny25.h b/trennfix/sw/config/trennfix_attiny25.h deleted file mode 100644 index c733c71..0000000 --- a/trennfix/sw/config/trennfix_attiny25.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef __HARDWARE_H -#define __HARDWARE_H - -#include - -#define PIN_LED _PIN(PORTB, PORTB2) -#define PIN_SENSE _PIN(PORTB, PORTB4) -//#define PIN_DRIVE _PIN(PORTB, PORTB3) -#define PIN_DRIVE PIN_LED -#define PIN_BTN _PIN(PORTB, PB1) - -#define BTN_PRESSED (!PINVAL(PIN_BTN)) - -#define START_TIMER0 ({TCNT0 = 0; TCCR0B = 2;}) -#define START_TIMER1 ({TCNT1 = 1; TCCR1 = 7; GTCCR |= 2;}) -#define STOP_TIMER1 ({TCCR1 = 0; TCNT1 = 1;}) - - -/* - * Various sinks for valuable program memory - * - */ -// #define USE_EEPROM_UPDATE /* 14 bytes */ -//#define INTERPRET_DRIVE_COMMANDS -#define INTERPRET_DRIVE_SIMPLE - -static inline void setup_hw(void) -{ - /* Turn off the 1/8 clock prescaler - now running at 16MHz*/ - CLKPR = (1 << CLKPCE); - CLKPR = 0; - - INPUT_PIN(PIN_SENSE); - INPUT_PIN(PIN_BTN); - OUTPUT_PIN(PIN_DRIVE); - OUTPUT_PIN(PIN_LED); - setpin(PIN_BTN, 1); /* Need pullup */ - - GIMSK |= _BV(PCIE); /* Enable pin change interrupt for sense port */ - PCMSK |= _BV(PCINT4); /* PB4, Rail sense input */ - - /* Change interrupt for button */ - PCMSK |= _BV(PCINT1); /* PB1 */ - - /* Setup timer 0, used for mm_switch */ - TCCR0A = 0; /* Normal mode */ - TCCR0B = 0; /* Timer off */ - TIMSK |= _BV(OCIE0A); /* Get a match interrupt */ - - /* We need 13 + 45,5 us delay, That's 464 clocks @8MHz*/ - //OCR0A = 91; /* Prescaler 8 is used */ - - /* Timer 1 for timeout */ - /* We set it to 1024us by prescaler 64 and running full 256 */ - // TCCR1 = 7; - // TIMSK |= _BV(TOIE1); /* Overflow interrupt */ -} - -/* - * Function to trigger an oscilloscope on the drive pin - * - * Can be altered to use the LED. - * - */ -static void __attribute__((unused)) trigger(void) -{ - setpin(PIN_DRIVE, 1); - _delay_us(4); - setpin(PIN_DRIVE, 0); - _delay_us(4); -} - -/* - * Configuration for mm receiver code. - */ - -#define MM_SENSE (!PINVAL(PIN_SENSE)) -#define MM_TSTART_FAST ({TCNT0 = 0; GTCCR |= 1; OCR0A = 120; TCCR0B = 2;}) -#define MM_TSTART_SLOW ({TCNT0 = 0; GTCCR |= 1; OCR0A = 230; TCCR0B = 2;}) -#define MM_TSTOP ({TCCR0B = 0;}) -#define MM_TIMER_INT_VECT TIMER0_COMPA_vect - -/* Costs 63 bytes program memory */ -#define MM_FILTER_REPEATED - -#define USE_EEPROM_UPDATE -#endif diff --git a/trennfix/sw/pin_magic.h b/trennfix/sw/include/pin_magic.h similarity index 100% rename from trennfix/sw/pin_magic.h rename to trennfix/sw/include/pin_magic.h diff --git a/trennfix/sw/mk/trennfix_attiny25.mk b/trennfix/sw/mk/trennfix_0.4.mk similarity index 67% rename from trennfix/sw/mk/trennfix_attiny25.mk rename to trennfix/sw/mk/trennfix_0.4.mk index 64cd1ad..27d0204 100644 --- a/trennfix/sw/mk/trennfix_attiny25.mk +++ b/trennfix/sw/mk/trennfix_0.4.mk @@ -5,7 +5,7 @@ SRC = src/main.c ################################################################################ AVRDUDE_PROGRAMMER = avrisp2 -MCU=attiny25 +MCU?=attiny25 F_CPU = 16000000 # Fuse-Bits gibts praktisch bei http://www.engbedded.com/fusecalc ! @@ -24,14 +24,12 @@ endif LFUSE=0x61 EFUSE=0xff -CFLAGS+=-DONLY_2K -DMM_USE_REGISTER_VARS - - - - - - - - +#CFLAGS+= -DMM_FILTER_REPEATED +CFLAGS+= -DMM_USE_REGISTER_VARS +CFLAGS+= -DUSE_REGISTER_VARS +CFLAGS+= -DWITH_EEPROM_UPDATE +CFLAGS+= -DWITH_PWM +CFLAGS+= -DWITH_SOUND +CFLAGS+= -DWITH_INITIAL_PULSE diff --git a/trennfix/sw/mk/trennfix_attiny85.mk b/trennfix/sw/mk/trennfix_attiny85.mk deleted file mode 100644 index fe044a8..0000000 --- a/trennfix/sw/mk/trennfix_attiny85.mk +++ /dev/null @@ -1,41 +0,0 @@ - -SRC = src/main.c - - -################################################################################ -################################################################################ - -AVRDUDE_PROGRAMMER = avrisp2 -MCU=attiny85 -F_CPU = 16000000 - -# Fuse-Bits gibts praktisch bei http://www.engbedded.com/fusecalc ! -# 8 MHz interner RC-Oszillator usw. Brown out 4V - - -#LFUSE=0x61 -#HFUSE=0xdc -#EFUSE=0xff - -LFUSE=0x61 - -ifneq ($(KEEP_EEPROM),) - -HFUSE=0xd4 - -else - -HFUSE=0xdc - -endif - -EFUSE=0xff - - - - - - - - - diff --git a/trennfix/sw/mm/src/mm_switch.c b/trennfix/sw/mm/src/mm_switch.c index ba68a8b..4be3e36 100644 --- a/trennfix/sw/mm/src/mm_switch.c +++ b/trennfix/sw/mm/src/mm_switch.c @@ -46,10 +46,9 @@ * Check for stuff we need * */ -#if !defined(MM_TSTART_FAST) || !defined(MM_TSTART_SLOW) || !defined(MM_TSTOP) \ - || !defined(MM_SENSE) || !defined(MM_TIMER_INT_VECT) +#if !defined(MM_TSTART) || !defined(MM_SENSE) || !defined(MM_TIMER_INT_VECT) -#error Missing timer start macro MM_TSTART_FAST! +#error Missing needed MM_... macro! #endif @@ -233,18 +232,17 @@ ISR(MM_TIMER_INT_VECT) { uint8_t address; uint8_t command; - MM_TSTART_FAST; - #ifdef MM_FILTER_REPEATED static uint8_t address_last = 0xff; static uint8_t function_last = 0xff; static uint8_t command_last = 0xff; #endif + MM_TSTART; + switch(recstate) { - case MM_FIRST_FAST_SAMPLE: - recstate = MM_FIRST_SLOW_SAMPLE ; + recstate = MM_FIRST_SLOW_SAMPLE; break; case MM_FIRST_SLOW_SAMPLE: @@ -277,6 +275,7 @@ ISR(MM_TIMER_INT_VECT) { case MM_SLOW_WAIT_FOR_CLOCK: if (mm_rec_tolerated_timeouts) { + trigger(); mm_rec_tolerated_timeouts--; recstate = MM_SLOW_WAIT_FOR_CLOCK_DELAY; return; @@ -295,6 +294,7 @@ ISR(MM_TIMER_INT_VECT) { shift_function_first = shift_function; shift_command_first = shift_command; mm_rec_tolerated_timeouts = 18; + trigger(); } if (bitno == 36) { @@ -368,7 +368,7 @@ void mm_pinchange_handler(void) if (!sense_last) return; - MM_TSTART_FAST; + MM_TSTART; switch(recstate) { case MM_IDLE: @@ -394,6 +394,9 @@ void mm_pinchange_handler(void) mm_rec_tolerated_timeouts = 0; break; + case MM_SLOW_SAMPLE_DELAY: + recstate = MM_SLOW_SAMPLE; + break; /* Not expected */ case MM_FIRST_FAST_SAMPLE: case MM_FAST_SAMPLE: diff --git a/trennfix/sw/src/main.c b/trennfix/sw/src/main.c index 47d051d..c61741e 100644 --- a/trennfix/sw/src/main.c +++ b/trennfix/sw/src/main.c @@ -44,12 +44,16 @@ enum op_mode { enum learn_mode { LM_OFF = 0, - LM_LEARN_ON_KEY, /* Learn primary key */ - LM_LEARN_OFF_KEY, /* Learn secondary key, relevant for OM_DOUBLE */ - LM_LEARN_INITIAL, /* Learn initial pulse length, 10ms steps */ - LM_LEARN_DUTY, /* Learn duty cycle 0-10 */ - LM_LEARN_OP_MODE, /* Learn operation mode */ - LM_END, /* Only a label */ + LM_LEARN_ON_KEY, /* Learn primary key */ + LM_LEARN_OFF_KEY, /* Learn secondary key, relevant for OM_DOUBLE */ + LM_LEARN_INITIAL, /* Learn initial pulse length, 10ms steps */ + LM_LEARN_DUTY, /* Learn duty cycle 0-10 */ + LM_LEARN_OP_MODE, /* Learn operation mode */ + LM_EASY_WAIT_PRESS, /* Wait for key press to enter easy mode */ + LM_EASY_WAIT_UP, /* Wait for end of key press */ + LM_EASY_WAIT_TURN, /* Wait for loco 80 turn end */ + LM_EASY_MODE, /* Easy config mode for PWM and initial kick */ + LM_END, /* Only a label */ }; struct config { @@ -66,7 +70,86 @@ struct config { static struct EEMEM config ee_config; static volatile struct config config; + +static volatile uint8_t easy_mode = 0; +static volatile uint8_t easy_mode_possible = 0; + +#ifndef USE_REGISTER_VARS static volatile uint8_t drive_on = 0; +#endif + +/****************************************************************************** + * + * Some nice sounds to play on your coil + * + */ + +#define G 180 +#define sekunde(g)(quinte((quinte(g)))*2) +#define terz(g) ((g) * 4 / 5) +#define kleine_terz(g) ((g) * 5 / 6) +#define quarte(g) ((g) * 3 / 4) +#define quinte(g) ((g) * 2 / 3) +#define tt(g) ((g) * 32 / 45) +#define septime(g) ((g) * 15 / 8) + +#if defined(WITH_SOUND) && defined(WITH_PWM) +void play_tone(uint8_t divisor, uint8_t duration, uint8_t pause) +{ + uint16_t c; + TCCR1 = 0x8; + OCR1C = divisor; + OCR1B = divisor / 2; + for (c = 0; c < duration - pause; c++) + _delay_ms(2); + OCR1B = 255; + OCR1C = 14; + for (c = 0; c < pause; c++) + _delay_ms(2); + TCCR1 = 0x6; + OCR1C = 14; + OCR1B = 14; +} + +static void tone_enter(void) +{ + play_tone((G), 70, 20); + play_tone(terz(G), 70, 20); + play_tone(quinte(G), 70, 20); + play_tone(G/2, 100, 0); +} + +static void tone_good(void) +{ + play_tone(G, 150, 120); + play_tone(terz(G), 100, 70); + play_tone(tt(G), 100, 50); + play_tone(quarte(terz((G))), 50, 0); + play_tone(quinte(G), 150, 0); + play_tone(terz(G), 100, 50); +} + +static void snd_on(void) +{ + TCCR1 = 0x8; + OCR1C = 120; + OCR1B = 60; +} + +static void snd_off(void) +{ + TCCR1 = 0x6; + OCR1C = 14; + OCR1B = 14; +} + +#else +#define play_tone(...) +#define tone_enter(...) +#define tone_good(...) +#define snd_on(...) +#define snd_off(...) +#endif static void load_config(void) { @@ -75,15 +158,13 @@ static void load_config(void) static void save_config(void) { -#ifdef USE_EEPROM_UPDATE +#ifdef WITH_EEPROM_UPDATE eeprom_update_block((uint8_t *)&config, &ee_config, sizeof(config)); #else eeprom_write_block((uint8_t *)&config, &ee_config, sizeof(config)); #endif } - - ISR(PCINT0_vect){ static uint8_t btn_last = 0; @@ -101,13 +182,9 @@ static uint8_t get_speed(uint8_t command) uint8_t b1, b3, b5, b7; b1 = ((command & 0x80) != 0); - // b2 = ((command & 0x40) != 0); b3 = ((command & 0x20) != 0); - // b4 = ((command & 0x10) != 0); b5 = ((command & 0x8) != 0); - // b6 = ((command & 0x4) != 0); b7 = ((command & 0x2) != 0); - // b8 = ((command & 0x1) != 0); //if ((b1 != b2) || (b2 != b3) || (b3 != b4) || (b5 != b6) || (b7 != b8)) // return 0xff; @@ -115,96 +192,58 @@ static uint8_t get_speed(uint8_t command) return (b1 + b3*2 + b5*4 +b7*8); } -#ifdef INTERPRET_DRIVE_COMMANDS -void mm_switch_drive(uint8_t decoder, uint8_t function, uint8_t command) +void mm_switch_drive(uint8_t loco, uint8_t function, uint8_t command) { - static uint8_t seen_before = 0; uint8_t speed; - - if (!seen_before) { - if ((decoder == 80) && (function == 0) && (command == 0xc0)) { - config.learn_mode = 1; - save_config(); - } - } - seen_before = 1; - speed = get_speed(command); - static uint8_t itsme = 0; - - if (config.learn_mode) { - if (decoder == 70) { - if (speed == 1) { - itsme = 1; - drive_on = 1; - }else { - if (itsme) { - drive_on = 0; - itsme = 0; - } - } - } - - if (decoder == 33) { - if (speed != 0xff) { - if (speed >= 1) speed -= 1; - if (speed <= 14) - config.on_duty_cycle = speed; - else - config.on_duty_cycle = 14; - - } - } - - if (decoder == 32) { - if (speed != 0xff) { - config.initial_pulse = speed; + static uint8_t alert_last = 0; + + switch(loco) { + case 80: + switch (config.learn_mode) { + case LM_OFF: + if (speed == 1) + config.learn_mode = LM_EASY_WAIT_PRESS; + break; + case LM_EASY_MODE: + if ((speed == 1) && (alert_last == 0)) { + config.learn_mode = LM_OFF; + save_config(); + tone_good(); } - } - - if (decoder == 31 && command == 0xc0) - save_config(); - } -} - -#else -#ifdef INTERPRET_DRIVE_SIMPLE + break; -static volatile uint8_t current_loco; + case LM_EASY_WAIT_PRESS: + if (speed != 1) + config.learn_mode = LM_OFF; + break; -void mm_switch_drive(uint8_t decoder, uint8_t function, uint8_t command) -{ - uint8_t speed; - speed = get_speed(command); - current_loco = decoder; - if (speed != 0xff) { - if (decoder == 50) { - setpin(PIN_LED, drive_on = function & 3); + default: + break; + } + alert_last = (speed == 1); + break; + case 50: + if (speed) + speed -= 1; + + if (config.learn_mode == LM_EASY_MODE) { config.initial_pulse = speed; - } else if (decoder == 51) { - if (speed >= 1) speed -= 1; - if (speed <= 14) - config.on_duty_cycle = speed; - else - config.on_duty_cycle = 14; - } else if (decoder == 52) { - static uint8_t last_speed; - if (speed == 1 && last_speed != 1) - save_config(); - last_speed = speed; - } + break; + case 51: + if (config.learn_mode == LM_EASY_MODE) + config.on_duty_cycle = speed; + break; } + } -#endif -#endif -static volatile uint8_t switch_on = 0; - void mm_switch_command(uint8_t decoder, uint8_t command) { static uint8_t toggle_lock = 0; + switch(config.learn_mode) { case LM_OFF: @@ -214,13 +253,11 @@ void mm_switch_command(uint8_t decoder, uint8_t command) switch(config.op_mode) { case OM_MOMENTARY: case OM_DOUBLE: - if (!switch_on && current_loco == 52) - save_config(); - switch_on = 1; + drive_on = 1; break; case OM_TOGGLE: if (!toggle_lock) { - drive_on = !drive_on; + drive_on = ~drive_on; toggle_lock = 1; } break; @@ -228,12 +265,11 @@ void mm_switch_command(uint8_t decoder, uint8_t command) break; } } - if ((decoder == config.decoder_on) && (command == 0)) { /* Primary key released */ switch(config.op_mode) { case OM_MOMENTARY: - switch_on = 0; + drive_on = 0; break; case OM_TOGGLE: toggle_lock = 0; @@ -242,6 +278,22 @@ void mm_switch_command(uint8_t decoder, uint8_t command) break; } } + break; + + case LM_EASY_WAIT_PRESS: + if ((decoder == config.decoder_on) && + (command == config.key_on)) + config.learn_mode = LM_EASY_WAIT_UP; + return; + + case LM_EASY_WAIT_UP: + if ((decoder == config.decoder_on) && + (command == 0)) { + config.learn_mode = LM_EASY_MODE; + tone_enter(); + } + return; + #ifdef HANDLE_OFF_KEY if ((decoder == config.decoder_off) && @@ -366,18 +418,33 @@ void mm_switch_command(uint8_t decoder, uint8_t command) */ void shift(uint8_t mu); +#ifdef WITH_PWM +#define DRIVE_OFF {OCR1B = 14;} +#define DRIVE_ON {OCR1B = 14 - config.on_duty_cycle;} +#define DRIVE_FULL {OCR1B = 0;} +#else +#define DRIVE_OFF {setpin(PIN_DRIVE, 0);} +#define DRIVE_ON {setpin(PIN_DRIVE, 1); setpin(PIN_LED, 1);} +#define DRIVE_FULL {setpin(PIN_DRIVE, 1); setpin(PIN_LED, 0);} +#endif + int main(void) { - uint8_t learn_mode_off; + uint16_t i; + +#ifdef WITH_INITIAL_PULSE uint8_t drive_last = 0; uint8_t drive_slope = 0; - uint8_t i; - uint8_t output_on; +#endif + +#ifdef USE_REGISTER_VARS + drive_on = 0; +#endif mm_init(); load_config(); setup_hw(); - - if ((config.op_mode == OM_ERASED) || (config.magic != EE_MAGIC)) { + + if (config.magic != EE_MAGIC) { config.magic = EE_MAGIC; config.op_mode = OM_MOMENTARY; config.decoder_on = 1; @@ -388,81 +455,59 @@ int main(void) { config.on_duty_cycle = 5; config.learn_mode = LM_LEARN_ON_KEY; } - drive_on = 0; sei(); - - //setpin(PIN_LED,1 ); - //_delay_ms(400); - //setpin(PIN_LED,0 ); while (1) { - drive_start: - output_on = drive_on || switch_on; +#ifdef WITH_INITIAL_PULSE cli(); - if (!drive_last && output_on) + if (drive_on && !drive_last) drive_slope = 1; else drive_slope = 0; - drive_last = output_on; + drive_last = drive_on; sei(); +#endif + if (drive_on) { - if (output_on) { +#ifdef WITH_INITIAL_PULSE if (drive_slope) { + DRIVE_FULL; for (i = 0; i < config.initial_pulse; i++) { - setpin(PIN_DRIVE, 1); - _delay_ms(20); + _delay_ms(5); } } - - for (i = 0; i < config.on_duty_cycle; i++) { - setpin(PIN_DRIVE, output_on); - _delay_us(1); - } - for (i = 0; i < (14 - config.on_duty_cycle); i++) { - setpin(PIN_DRIVE, 0); - _delay_us(1); - } - +#endif + DRIVE_ON; + } else { - setpin(PIN_DRIVE, 0); - if (!config.learn_mode) + DRIVE_OFF; + + if (!config.learn_mode || + config.learn_mode > LM_LEARN_OP_MODE) continue; - learn_mode_off = !config.learn_mode; - - if (output_on || (config.learn_mode && learn_mode_off)) - goto drive_start; for (i = 0; i < config.learn_mode; i++) { setpin(PIN_LED, 1); + snd_on(); _delay_ms(10); - //if (output_on || (config.learn_mode && learn_mode_off)) - // goto drive_start; setpin(PIN_LED, 0); + snd_off(); + if (drive_on) goto drive_start; _delay_ms(135); - //if (output_on || (config.learn_mode && learn_mode_off)) - // goto drive_start; - - //if (output_on || (config.learn_mode && learn_mode_off)) - // goto drive_start; + if (drive_on) goto drive_start; } for (i = 0; i < 15 - config.learn_mode; i++) { - //if (output_on || (config.learn_mode && learn_mode_off)) - // goto drive_start; - setpin(PIN_LED, 0); + if (drive_on) goto drive_start; _delay_ms(70); - //if (output_on || (config.learn_mode && learn_mode_off)) - // goto drive_start; - // _delay_ms(40); } } } return 0; } - /****************************************************************************** * The end :-) */ -- 2.32.0