//------------------------------------------------------------------ //File:brs501.c //Medec Systems GmbH //Description: neu magnetic project // // //Dipl. -Ing. Stefan Stoev //Start: 11.03.2014 //Release_1.0: 27.05.2014 without sleep //Release_1.1: 06.06.2014 with sleep modus after 10 Minute //Release_1.2: 01.02.2015 //Release_1.3: 20.01.2016 Laufzeit Programm 29 angepasst //------------------------------------------------------------------ #include <16F877A.h> #include #include //#include #fuses HS,NOWDT,PROTECT,NOLVP #use delay(clock=20000000) //#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //Timer for 5s tickm //#use TIMER(TIMER=0, TICK=1000ms, BITS=16, NOISR) #define BUFFER_SIZE_LED_DISPLAY 4 #define BUFFER_DIGIT_LEFT_RIGHT 11 #define BUFFER_LEVEL_LED 8 ////Buttons #define START_STOP PIN_B2 #define T_MINUS PIN_B3 #define T_PLUS PIN_B1 #define L_MINUS PIN_B4 #define L_PLUS PIN_B5 #define TOGLE_B PIN_B0 #define BUZZER PIN_A4 ////Glasses #define left_glass PIN_C0 #define right_glass PIN_C1 //#define set_glasses PIN_C2 ////Audio #define set_in2_amp PIN_C3 #define power_in2_amp PIN_C4 #define set_in1_amp PIN_C5 #define power_in1_amp PIN_C6 #define BUFFER_START 0x1ee6 //0d7910->Puffer für die Brille Einstellung Abspeichern //Digits+Led Level byte data_led_display[BUFFER_SIZE_LED_DISPLAY]={1,0,0,80}; //Only Left and Right Digits on the Display //{0,1,2,3,4,5,6,7,8,9,-} byte digitab_l[BUFFER_DIGIT_LEFT_RIGHT]={0,40,79,109,172,229,231,104,239,237,4}; byte digitab_r[BUFFER_DIGIT_LEFT_RIGHT]={222,80,155,91,85,79,207,88,223,95,1}; byte level_led[BUFFER_LEVEL_LED]={1,2,4,8,16,32,64,128}; //time for display counter backwards .20.21.22.23.24.25.26 //......................0..1..2..3..4..5.6..7..8..9..10.11.12.13.14.15.16.17.18.19.23.24.25.27.29.34.38 byte time_program[27]={30,30,30,12,25,12,18,13,15,20,21,16,17,19,16,22,25,25,23,25,20,20,17,17,26,19,24}; //byte time_program[41]={30,30,30,12,25,12,18,13,15,20,21,16,17,19,16,22,25,25,23,25,25,25,25,20,20,17,17,17,17,26,26,26,26,26,19,19,19,19,24,24,24}; //......................0..1..2..3..4..5.6..7..8..9..10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40 //Multiplexor Shift Register byte data_mux_point_1[1]={0}; byte data_mux_point_2[1]={0}; byte data_mux_point_3[1]={0}; byte data_mux_point_4[1]={0}; byte data_mux_point_5[1]={0}; //Display_var byte program_counter = 1; byte program_counter_case = 1; byte level_counter = 0; byte program_counter_left = 0; byte program_counter_right = 0; byte level_led_counter = 0; //Clock unsigned int8 flag_13ms=0; unsigned int8 flag_300s=0; //5 Minute unsigned int8 minute=0; //for 1 Minute Display counter backwards unsigned int8 flag_60s=0; unsigned int8 for_flag_20s=0; unsigned int8 for_flag_60s=0; unsigned int8 flag_20s=0; unsigned int8 for_flag_1s=0; unsigned int8 flag_1s=0; //for sleep modus unsigned int8 for_sleep_flag=0; unsigned int8 sleep_flag=0; //ADC unsigned int8 adc_value=0; //PWM unsigned int8 pwm_value; //10bit Timer2? //unsigned int8 temp_pwm_value=0; //statets enum statmachine{START, STOP, RUN}; unsigned int8 state=STOP; //unsigned int8 i=0; unsigned int8 rest_time=0; unsigned int16 micro_seconds=2100; unsigned int8 counter_frequenzdurchlauf=0; byte umpolung=0; //0 oder 8 zum umpolen unsigned int8 time_basic_frequence=10;//200ms //LED Anzeige während das Programm läuft boolean led_on_while_run = TRUE; //boolean led_off_while_run = FALSE; boolean flag_umpolen = FALSE; boolean flag_low_frequenz = FALSE; //Puffer Brille Einstellung unsigned int8 buffer_read_glasses[2]={0x10,0x11}; unsigned int8 buffer_write_glasses[2]={0x10,0x11}; boolean gb_recentStartStop = false; //TZE #INT_TIMER0 void tick_frequency() { flag_13ms++; } #INT_TIMER1 void tick_100ms() { set_timer1(3036);//genau 100ms wie Schweizer Uhr for_sleep_flag++; for_flag_20s++; for_flag_1s++; if(for_flag_20s==200) //20s { flag_20s++; //increment every 20 seconds for_flag_20s=0; for_flag_60s++; } if(flag_20s==15) //300s { flag_300s++; //increment every 300 seconds flag_20s=0; } if(for_sleep_flag==200) //only for sleep modus, every 20 second { sleep_flag++; for_sleep_flag=0; } if(for_flag_60s==3) //1 Minute { for_flag_60s=0; flag_60s=1; rest_time--; } if(for_flag_1s==10) //1 Sekunde für Frequnsdurchlauf { flag_1s=1; for_flag_1s=0; } } ///////////////////////////////////////////////////////////////////////////////// //Funktion für Frequenzdurchlauf //30 Sekunden aufsteigen dann umpolen. Danach absteigen. Wieder von Vorne. Usw. // umpolen // /\ // /||\ // / || \ // / || \ // /20s||20s\ //--10s| || |10s-- //----------------------------------------- //////////////////////////////////////////////////////////////////////////////// void frequenz_durchlauf(void) { //Erstmal langsam aufsteigen 1/3 if((flag_1s==1)&&(flag_umpolen==FALSE)&&(counter_frequenzdurchlauf>=0)&&(counter_frequenzdurchlauf<=10)) { counter_frequenzdurchlauf++; flag_1s=0; micro_seconds-=10; umpolung=0; } //Danach schneller aufsteigen 2/3 if((flag_1s==1)&&(flag_umpolen==FALSE)&&(counter_frequenzdurchlauf>10)&&(counter_frequenzdurchlauf<30)) { counter_frequenzdurchlauf++; flag_1s=0; micro_seconds-=100; umpolung=0; } //Umpolen if(counter_frequenzdurchlauf==30) { flag_umpolen=TRUE; counter_frequenzdurchlauf=31; } //Des Weiteren schneller absteigen 2/3 if((flag_1s==1)&&(flag_umpolen==TRUE)&&(counter_frequenzdurchlauf>30)&&(counter_frequenzdurchlauf<50)) { counter_frequenzdurchlauf++; flag_1s=0; micro_seconds+=100; umpolung=8; } //Am Ende langsam absteigen 1/3 if((flag_1s==1)&&(flag_umpolen==TRUE)&&(counter_frequenzdurchlauf>=50)&&(counter_frequenzdurchlauf<60)) { counter_frequenzdurchlauf++; flag_1s=0; micro_seconds+=10; umpolung=8; } //Anschließen umpolen if(counter_frequenzdurchlauf==60) { flag_umpolen=FALSE; counter_frequenzdurchlauf=0; } delay_us(micro_seconds); } //how many time rest? // void rest_time_display(void) { level_led_counter=level_led[level_counter]; program_counter_right = digitab_r[(rest_time % 10)]; program_counter_left = digitab_l[((rest_time/10) % 10)]; data_led_display[0]=level_led_counter; data_led_display[2]=program_counter_left; data_led_display[3]=program_counter_right; } // // void blink_led_while_run(boolean led_on_while_run) { rest_time_display(); //ON-->LED data_led_display[1]|=4; if(led_on_while_run==TRUE) { switch (level_counter) { case 0: data_led_display[0]=1; //not need data_led_display[3]|=32; write_expanded_outputs(data_led_display); break; case 1: data_led_display[0]|=1; data_led_display[3]|=32; write_expanded_outputs(data_led_display); break; case 2: data_led_display[0]|=3;//3 data_led_display[3]|=32; write_expanded_outputs(data_led_display); break; case 3: data_led_display[0]|=7;//7 Level LED läuchten data_led_display[3]|=32; //Display Punkt läuchten write_expanded_outputs(data_led_display); break; case 4: data_led_display[0]|=15;//15 data_led_display[3]|=32; write_expanded_outputs(data_led_display); break; case 5: data_led_display[0]|=31;//31 data_led_display[3]|=32; write_expanded_outputs(data_led_display); break; case 6: data_led_display[0]|=63;//63 data_led_display[3]|=32; write_expanded_outputs(data_led_display); break; case 7: data_led_display[0]|=127;//127 data_led_display[3]|=32; write_expanded_outputs(data_led_display); break; default: break; } } else if(led_on_while_run==FALSE) { write_expanded_outputs(data_led_display); } } //Funktion to display program and led level //return: none void write_to_led_display(void) { program_counter_right = digitab_r[(program_counter % 10)]; program_counter_left = digitab_l[((program_counter/10) % 10)]; level_led_counter=level_led[level_counter]; data_led_display[0]=level_led_counter; //data_led_display[1]=0; data_led_display[2]=program_counter_left; data_led_display[3]=program_counter_right; write_expanded_outputs(data_led_display); } void base_impuls(umpolung) { ////set the signal wave form: (point 1,2,3,4) // 2------- // // 1------ 1------ //0------ data_mux_point_1[0]=0|umpolung; data_mux_point_2[0]=1|umpolung; data_mux_point_3[0]=1|umpolung; data_mux_point_4[0]=2|umpolung; data_mux_point_5[0]=0|umpolung; write_expanded_outputs1(data_mux_point_1); write_expanded_outputs1(data_mux_point_2); write_expanded_outputs1(data_mux_point_3); write_expanded_outputs1(data_mux_point_4); write_expanded_outputs1(data_mux_point_5); } ////Only one Impuls for frequency up 1kHz // // void one_impuls(umpolung) { data_mux_point_1[0] = 0|umpolung; data_mux_point_2[0] = 2|umpolung; data_mux_point_3[0] = 0|umpolung; write_expanded_outputs1(data_mux_point_1); write_expanded_outputs1(data_mux_point_2); write_expanded_outputs1(data_mux_point_3); } ////Glasses togle function void setup_glasses(void) { set_pwm1_duty(pwm_value); ////output_high(set_glasses); output_toggle(left_glass); output_toggle(right_glass); } //// Audio Amplifire toggle function void setup_audio(void) { // output_high(power_in1_amp); // output_high(power_in2_amp); output_toggle(set_in1_amp); output_toggle(set_in2_amp); } void stop_program_after_time(void) { //write glasses level to flash // buffer_write_glasses[0]=pwm_value; // write_program_memory(BUFFER_START, buffer_write_glasses, 2); // state=STOP; // flag_300s=0; data_led_display[1]=0; output_low(BUZZER); delay_ms(100); output_high(BUZZER); delay_ms(100); output_low(BUZZER); delay_ms(100); output_high(BUZZER); delay_ms(100); output_low(BUZZER); delay_ms(100); output_high(BUZZER); state=STOP; output_d(0x00); flag_13ms=0; flag_300s=0; for_sleep_flag=0; //set this flag for sleep wait 5 minute at this moment sleep_flag=0; //write glasses level to flash buffer_write_glasses[0]=pwm_value; // write_program_memory(BUFFER_START, buffer_write_glasses, 2); if ( buffer_write_glasses[0] != pwm_value ) { buffer_write_glasses[0] = pwm_value; write_program_memory(BUFFER_START, buffer_write_glasses, 2); } } //neu void wait_time(minute) { if(flag_20s==(minute*3)) { flag_20s=0; for_flag_20s=0; flag_300s++; } } void program_1(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); delay_us(973); wait_time(5); break; case 1: base_impuls(8);//umpolen delay_us(870); wait_time(5); break; case 2: base_impuls(0); delay_us(736); wait_time(5); break; case 3: one_impuls(8); delay_us(154); wait_time(5); break; case 4: one_impuls(0); delay_us(54); wait_time(5); break; case 5: base_impuls(8); delay_us(98); wait_time(4); break; case 6: stop_program_after_time(); break; default: break; } } void program_3(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); delay_us(2100); wait_time(3); //only 3 Minute running break; case 1: base_impuls(8); flag_low_frequenz=TRUE; time_basic_frequence=5; //delay_ms(127); break; case 2: base_impuls(0); delay_us(1981); wait_time(4); //only 4 Minute running break; case 3: stop_program_after_time(); break; default: break; } } void program_4(void) { data_led_display[1]=4; switch (flag_300s) { //subprogram1 case 0: base_impuls(0); delay_us(67); break; case 1: base_impuls(8); delay_us(67); break; case 2: base_impuls(0); delay_us(67); wait_time(1); //only 1 Minute running break; //subprogram2 case 3: base_impuls(8); flag_low_frequenz=TRUE; time_basic_frequence=5; // delay_ms(127); wait_time(3); break; //subprogram3 case 4: base_impuls(0); delay_us(369); break; //subprogram4 case 5: one_impuls(8); delay_us(154); break; case 6: stop_program_after_time(); break; default: break; } } void program_5(void) { data_led_display[1]=4; switch (flag_300s) { case 0: one_impuls(umpolung); wait_time(2); // Vorher 3 frequenz_durchlauf(); break; case 1: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=5; //delay_ms(127); break; case 2: one_impuls(umpolung); delay_us(24); break; case 3: stop_program_after_time(); break; default: break; } } void program_6(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); delay_us(3170); break; case 1: base_impuls(8); flag_low_frequenz=TRUE; time_basic_frequence=5; //delay_ms(127); break; case 2: base_impuls(0); delay_us(477); break; case 3: base_impuls(8); delay_us(154); break; case 4: stop_program_after_time(); break; default: break; } } void program_7(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); delay_us(2450);//2450 break; case 1: base_impuls(8); delay_us(2450); wait_time(3); break; case 2: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=1; // delay_us(29903); break; case 3: stop_program_after_time(); break; default: break; } } void program_8(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); delay_us(973); break; case 1: base_impuls(8); delay_us(870); break; case 2: base_impuls(0); delay_us(736); break; case 3: stop_program_after_time(); break; default: break; } } void program_9(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); delay_us(2039); break; case 1: base_impuls(8); delay_us(2039); wait_time(1); break; case 2: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=5; // delay_ms(127); break; case 3: base_impuls(8); delay_us(2450); wait_time(4); break; case 4: base_impuls(0); delay_us(3170); break; case 5: stop_program_after_time(); break; default: break; } } void program_10(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); delay_us(620); break; case 1: base_impuls(8); delay_us(16266); wait_time(2); break; // 9 Minute Frequenzdurchlauf case 2: one_impuls(umpolung); frequenz_durchlauf(); break; case 3: one_impuls(umpolung); frequenz_durchlauf(); wait_time(4); break; case 4: one_impuls(0); delay_us(54); break; case 5: stop_program_after_time(); break; default: break; } } void program_11(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); delay_us(620); break; case 1: base_impuls(8); delay_us(16266); wait_time(2); break; case 2: base_impuls(0); delay_us(16266); wait_time(4); break; case 3: one_impuls(8); delay_us(54); break; case 4: stop_program_after_time(); break; default: break; } } void program_12(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); delay_us(620); break; case 1: base_impuls(8); delay_us(477); wait_time(3); break; case 2: base_impuls(0); delay_us(4145); wait_time(4); break; case 3: base_impuls(8); delay_us(870); break; case 4: stop_program_after_time(); break; default: break; } } void program_13(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); delay_us(477); break; case 1: base_impuls(8); delay_us(477); break; case 2: base_impuls(0); delay_us(477); wait_time(4); break; case 3: base_impuls(8); delay_us(870); break; case 4: stop_program_after_time(); break; default: break; } } void program_14(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); delay_us(16266); wait_time(4); break; case 1: one_impuls(umpolung); frequenz_durchlauf(); wait_time(2); break; case 2: base_impuls(0); delay_us(2725); break; case 3: base_impuls(0); delay_us(3171); break; case 4: stop_program_after_time(); break; default: break; } } void program_15(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); // delay_ms(127); flag_low_frequenz=TRUE; time_basic_frequence=5; break; case 1: base_impuls(8); delay_us(2725); break; case 2: base_impuls(0); delay_ms(166); break; case 3: base_impuls(8); flag_low_frequenz=TRUE; time_basic_frequence=6; // delay_ms(166); break; case 4: base_impuls(0); // delay_ms(166); flag_low_frequenz=TRUE; time_basic_frequence=6; wait_time(2); break; case 5: stop_program_after_time(); break; default: break; } } void program_16(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); delay_us(4145); wait_time(4); // time_basic_frequence=15;//200ms break; case 1: base_impuls(8); delay_us(5155); break; case 2: one_impuls(umpolung); delay_us(57); break; case 3: one_impuls(umpolung); delay_us(57); wait_time(3); break; case 4: base_impuls(0); delay_us(477); wait_time(3); break; case 5: base_impuls(0); delay_us(3171); break; case 6: stop_program_after_time(); break; default: break; } } void program_18(void) { data_led_display[1]=4; switch (flag_300s) { case 0: one_impuls(umpolung); delay_us(67); break; case 1: one_impuls(umpolung); delay_us(67); wait_time(3); break; case 2: one_impuls(umpolung); frequenz_durchlauf(); wait_time(3); break; case 3: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=6; // delay_ms(166); break; case 4: base_impuls(8); flag_low_frequenz=TRUE; time_basic_frequence=6; // delay_ms(166); break; case 5: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=6; // delay_ms(166); wait_time(2); break; case 6: stop_program_after_time(); break; default: break; } } void program_19(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); delay_us(4145); wait_time(4); break; case 1: base_impuls(8); delay_us(5850); break; case 2: base_impuls(0); // delay_ms(127); flag_low_frequenz=TRUE; time_basic_frequence=5; wait_time(4); break; case 3: base_impuls(8); flag_low_frequenz=TRUE; time_basic_frequence=6; // delay_ms(166); break; case 4: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=6; // delay_ms(166); break; case 5: base_impuls(8); flag_low_frequenz=TRUE; time_basic_frequence=6; // delay_ms(166); wait_time(2); break; case 6: stop_program_after_time(); break; default: break; } } void program_23(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=5; // delay_ms(127); break; case 1: base_impuls(8); delay_us(3171); break; case 2: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=2; // delay_ms(46); break; case 3: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=2; // delay_ms(46); break; case 4: stop_program_after_time(); break; default: break; } } void program_24(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); delay_us(973); break; case 1: base_impuls(8); delay_us(3171); break; case 2: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=2; // delay_ms(47); break; case 3: base_impuls(8); flag_low_frequenz=TRUE; time_basic_frequence=2; // delay_ms(47); break; case 4: stop_program_after_time(); break; default: break; } } void program_25(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=6; // delay_ms(166); break; case 1: base_impuls(8); flag_low_frequenz=TRUE; time_basic_frequence=6; // delay_ms(166); break; case 2: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=6; // delay_ms(166); wait_time(2); break; case 3: base_impuls(8); flag_low_frequenz=TRUE; time_basic_frequence=1; // delay_ms(30); // setup_audio(); break; case 4: stop_program_after_time(); break; default: break; } } void program_27(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); delay_us(477); wait_time(3); break; case 1: base_impuls(8); delay_us(370); break; case 2: base_impuls(0); delay_us(916); break; case 3: base_impuls(8); delay_us(916); wait_time(4); break; case 4: stop_program_after_time(); break; default: break; } } void program_29(void) { data_led_display[1]=4; switch (flag_300s) { case 0: one_impuls(umpolung); frequenz_durchlauf(); wait_time(3); break; case 1: one_impuls(umpolung); delay_us(24); wait_time(4); break; case 2: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=3; // delay_ms(65); break; case 3: base_impuls(8); // delay_ms(65); flag_low_frequenz=TRUE; time_basic_frequence=3; wait_time(3); break; case 4: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=2; // delay_ms(42); break; case 5: base_impuls(8); //delay_ms(42); flag_low_frequenz=TRUE; time_basic_frequence=2; wait_time(3); break; case 6: base_impuls(0); delay_us(154); wait_time(3); break; case 7: stop_program_after_time(); break; default: break; } } void program_34(void) { data_led_display[1]=4; switch (flag_300s) { case 0: one_impuls(umpolung); frequenz_durchlauf(); wait_time(3); break; case 1: one_impuls(umpolung); delay_us(24); wait_time(4); break; case 2: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=2; // delay_ms(65); break; case 3: base_impuls(8); // delay_ms(65); flag_low_frequenz=TRUE; time_basic_frequence=2; wait_time(2); break; case 4: base_impuls(0); delay_us(54); // setup_audio(); break; case 5: stop_program_after_time(); break; default: break; } } void program_38(void) { data_led_display[1]=4; switch (flag_300s) { case 0: base_impuls(0); flag_low_frequenz=TRUE; time_basic_frequence=5; // delay_ms(127); break; case 1: one_impuls(umpolung); frequenz_durchlauf(); break; case 2: one_impuls(umpolung); frequenz_durchlauf(); break; case 3: base_impuls(8); delay_us(2450); wait_time(4); break; case 4: base_impuls(0); delay_us(870); break; case 5: stop_program_after_time(); break; default: break; } } //// select the program number from program_counter void run_program_number(program_counter) { switch (program_counter) { case 1: program_1(); // if(flag_300s==5){delay_us(70);} break; case 2: program_1(); // if(flag_300s==5){delay_us(98);} break; case 3: program_3(); break; case 4: program_4(); break; case 5: program_5(); break; case 6: program_6(); break; case 7: program_7(); break; case 8: program_8(); break; case 9: program_9(); break; case 10: program_10(); break; case 11: program_11(); break; case 12: program_12(); break; case 13: program_13(); break; case 14: program_14(); break; case 15: program_15(); break; case 16: program_16(); break; case 17: program_16(); break; case 18: program_18(); break; case 19: program_19(); break; case 20: program_19(); break; case 21: program_19(); break; case 22: program_19(); break; case 23: program_23(); break; case 24: program_24(); break; case 25: program_25(); break; case 26: program_25(); break; case 27: program_27(); break; case 28: program_27(); break; case 29: program_29(); break; case 30: program_29(); break; case 31: program_29(); break; case 32: program_29(); break; case 33: program_29(); break; case 34: program_34(); break; case 35: program_34(); break; case 36: program_34(); break; case 37: program_34(); break; case 38: program_38(); break; case 39: program_38(); break; case 40: program_38(); break; default: break; } output_d((level_counter+1)*15); } void check_program_counter(void) { if((input(T_MINUS) == TRUE) && (state==STOP)){if((program_counter)!=1){program_counter--;}} if((input(T_PLUS) == TRUE) && (state==STOP)){if((program_counter)!=40){program_counter++;}} program_counter_case=program_counter; if((program_counter==19)||(program_counter==20)||(program_counter==21)||(program_counter==22)){program_counter_case=19;} if((program_counter==23)){program_counter_case=20;} if((program_counter==24)){program_counter_case=21;} if((program_counter==25)||(program_counter==26)){program_counter_case=22;} if((program_counter==27)||(program_counter==28)){program_counter_case=23;} if((program_counter==29)||(program_counter==30)||(program_counter==31)||(program_counter==32)||(program_counter==33)){program_counter_case=24;} if((program_counter==34)||(program_counter==35)||(program_counter==36)||(program_counter==37)){program_counter_case=25;} if((program_counter==38)||(program_counter==39)||(program_counter==40)){program_counter_case=26;} // return program_counter; } void check_level_counter(void) { if(input(L_MINUS) == TRUE){if((level_counter)!=0){level_counter--;}} if(input(L_PLUS) == TRUE){if((level_counter)!=7){level_counter++;}} // return level_counter; } void check_start_stop_state(void) { if((input(START_STOP) == TRUE) && ( FALSE == gb_recentStartStop ) && (state==STOP)) { //read glasses level from flash read_program_memory(BUFFER_START, buffer_read_glasses, 2); pwm_value = buffer_read_glasses[0]; output_low(left_glass); output_high(right_glass); state=RUN; data_led_display[1]=4; rest_time = time_program[program_counter_case]; output_low(BUZZER); delay_ms(500); output_high(BUZZER); } else if((input(START_STOP) == TRUE) && ( FALSE == gb_recentStartStop ) && (state==RUN)) { output_low(BUZZER); delay_ms(100); output_high(BUZZER); delay_ms(100); output_low(BUZZER); delay_ms(100); output_high(BUZZER); delay_ms(100); output_low(BUZZER); delay_ms(100); output_high(BUZZER); state=STOP; output_d(0x00); flag_13ms=0; flag_300s=0; for_sleep_flag=0; //set this flag for sleep wait 5 minute at this moment sleep_flag=0; //write glasses level to flash // write_program_memory(BUFFER_START, buffer_write_glasses, 2); //TZE if ( buffer_write_glasses[0] != pwm_value ) { buffer_write_glasses[0] = pwm_value; write_program_memory(BUFFER_START, buffer_write_glasses, 2); } } gb_recentStartStop = input(START_STOP); //TZE } ////Increment or decrement level glasses void set_level_glasses(void) { if(input(TOGLE_B) == TRUE) { if((input(T_MINUS) == TRUE) && (state==RUN)) //decrement led level glasses { if ( pwm_value > 9 ) { pwm_value = pwm_value - 10; output_low(BUZZER); delay_us(100); output_high(BUZZER); set_pwm1_duty(pwm_value); } else if ( pwm_value > 1 ) { pwm_value = pwm_value - 1; output_low(BUZZER); delay_us(100); output_high(BUZZER); set_pwm1_duty(pwm_value); } else if ( pwm_value == 1 ) { output_low(BUZZER); delay_ms(500); output_high(BUZZER); pwm_value = 0; set_pwm1_duty(pwm_value); } } if((input(T_PLUS) == TRUE) && (state==RUN)) //increment led level glasses { if ( pwm_value < 246 ) { pwm_value = pwm_value + 10; output_low(BUZZER); delay_us(100); output_high(BUZZER); set_pwm1_duty(pwm_value); } else if ( pwm_value < 254 ) { pwm_value = pwm_value + 1; output_low(BUZZER); delay_us(100); output_high(BUZZER); set_pwm1_duty(pwm_value); } else if ( pwm_value == 254 ) { output_low(BUZZER); delay_ms(500); output_high(BUZZER); pwm_value = 255; set_pwm1_duty(pwm_value); } } } } ////Is Magnetic aplicator connected on the device? ////When not there is peaps ton void check_aplicator_connected(void) { adc_value = read_adc(); if((adc_value <1) && (flag_13ms==10)) { output_low(BUZZER); delay_ms(5); output_high(BUZZER); //delay_ms(10); } } ///////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////MAIN//////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// void main() { data_led_display[1]=0; //Start Stop LED off ////Glasses output_low(left_glass); output_high(right_glass); ////Audio output_low(power_in1_amp); output_high(power_in2_amp); output_low(set_in1_amp); output_high(set_in2_amp); ////Timers Setups setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256 ); setup_timer_1(T1_INTERNAL | T1_DIV_BY_8 ); setup_timer_2(T2_DIV_BY_4,249,1); //only timer for PWM enable_interrupts(global); enable_interrupts(int_timer0); //13.1ms enable_interrupts(int_timer1); //106ms overflow // enable_interrupts(int_timer2); ////ADC Setup // setup_port_a( ALL_ANALOG ); setup_adc( ADC_CLOCK_INTERNAL ); set_adc_channel( 4 ); ////PWM Module setup_ccp1(ccp_pwm); // setup_ccp2(ccp_pwm); set_pwm1_duty(pwm_value); // set_pwm2_duty(pwm_value); state=STOP; //set timer1 100ns first running set_timer1(3036); while(1) { ////TOGGLE STATE ////botton is pressed if(input(TOGLE_B) == TRUE) { delay_ms(120); check_program_counter(); check_level_counter(); check_start_stop_state(); write_to_led_display(); } ////RUN STATE ////when the device run it if(state==RUN) { // check_aplicator_connected(); setup_audio(); //the rest from program must be discomment - only here! if((flag_13ms==15)&&(flag_low_frequenz==FALSE)) { setup_glasses(); output_toggle(power_in1_amp); output_toggle(power_in2_amp); blink_led_while_run(led_on_while_run=TRUE); flag_13ms=0; //do notting 200ms pause while(flag_13ms!=15){} flag_13ms=0; blink_led_while_run(led_on_while_run=FALSE); } if(flag_low_frequenz==TRUE) { // setup_audio(); // time_basic_frequence=40; flag_13ms=0; while(flag_13ms!=time_basic_frequence){} blink_led_while_run(led_on_while_run=TRUE); flag_13ms=0; while(flag_13ms!=time_basic_frequence){} flag_13ms=0; setup_glasses(); // delay_ms(50); blink_led_while_run(led_on_while_run=FALSE); flag_low_frequenz=FALSE; } if(flag_60s==1){blink_led_while_run(led_on_while_run=TRUE); flag_60s=0;}; set_level_glasses(); run_program_number(program_counter); } ////STOP ////When the device stop it if(state==STOP)////PROBLEM { output_d(0x00); output_high(left_glass); output_high(right_glass); output_low(power_in1_amp); output_low(power_in2_amp); data_led_display[1]=0; //turn off power led //timer1 setting first running for_flag_20s=0; flag_20s=0; for_flag_1s=0; flag_1s=0; for_flag_60s=0; flag_60s=0; rest_time=0; micro_seconds=2100; counter_frequenzdurchlauf=0; //put in sleep modus if(sleep_flag==5)//after 10 Minute--->30, 15-->5min { data_led_display[0]=0; // data_led_display[1]=0; data_led_display[2]=0; data_led_display[3]=0; write_expanded_outputs(data_led_display); disable_interrupts(global); while(input(START_STOP) != TRUE) { flag_13ms=0; sleep_flag=0; delay_ms(80); } while(input(START_STOP) == TRUE) { flag_13ms=0; sleep_flag=0; } program_counter = 1; level_counter = 0; enable_interrupts(global); enable_interrupts(int_timer0); //13.1ms enable_interrupts(int_timer1); //106ms overflow } write_to_led_display(); } } }