Jump to content

Дмитрий Вас

Members
  • Content Count

    2058
  • Joined

  • Last visited

Everything posted by Дмитрий Вас

  1. как при чем? хочу видеть ее онлайн, а после обработчика цикла она сразу из крайности в крайность
  2. эта переменная используется не только для вывода ее на дисплей, она и в энкодере и генерации шим и в лсд
  3. вот выполняется основная программа if (button_shot && speed > 0) { revers_f(); button_shot = 0; } внутри которой идет проверка. натыкается на функцию реверс, выполняет ее. но внутри функции переменная меняется и по завершении в lcd_chisla(speed); переменная speed получается сразу 400 а я хочу видеть как она с 0 прибавляется
  4. вот что у меня получилось if(button()) { button_time++; } } //---------------------работаем вне таймера 1 с результатами энкодера------------ if (!button() && button_time>200)//т.к. таймер срабатывает 100 раз в сек. то 200 будет = 2с { button_time = 0; button_long = 1; } if (!button() && button_time > 0 && button_time < 200) { button_time = 0; button_shot = 1; } if (button_shot && speed==0) { start(); button_shot = 0; } if (button_shot && speed > 0) { revers_f(); button_shot = 0; } if (button_shot && speed < 0) { revers_w(); button_shot = 0; } if (button_long) { stop(); button_long = 0; }
  5. и снова здравствуйте. void revers_f(void) { int s_new; s_new = ~speed + 2; for (;speed>=s_new;) { if (Flag_IT_timer0) { Flag_IT_timer0 = 0; speed--; } } } есть вот такой код. все бы ничего но, переменная speed хоть и объявлена глобально эта функция из-за цикла for выдает ее по результату так сказать. а мне нужно чтобы она менялась постепенно именно глобально во всем коде. как быть?
  6. будьте так добры, посмотрите (у кого лицензионная АС7 ну или обновляете ее) доступна ли симуляция мк at90pwm3b
  7. нужна схема ippon back power pro 500, в читабельном виде. в гугле нечитабельна, слишком светлая картинка и размытая
  8. почему не модифицировлась? выключаю оптимизацию получаю мильон ошибок, и гугл не может с ними помочь.
  9. Понял, компилятор с отладчиком перепутал. Ок почему он так делает? Потому что таймер работает только в железе? Разве в отладке не работает?
  10. @Alex я понял о чем вы говорили, но ведь в процессе отладки можно задать значение любой переменной, вот я и задал его как = 1.
  11. но тут можно задать значение и я его задаю ставлю в единицу
  12. нет, без какого то конкретного значения, но по умолчанию да это ноль. не понял. можете сами проверить, нужно просто скопировать и вставить. #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdio.h> #include <stdlib.h> #include <avr/io.h> //#define button (!(PIND&(1<<5))) unsigned char Flag_IT_timer0; unsigned char button_time; unsigned char button_long; unsigned char button_shot; short speed; int button; void port_ini (void) { //усилитель DDRB&=~(1<<3)|(1<<4);//вход усилителя для измерения тока //ЛСД DDRC|=((1<<4)|(1<<5)|(1<<6)|(1<<7)); DDRB|=((1<<2)|(1<<5)); //ШИМ DDRD|=(1<<0);DDRC|=(1<<0); DDRB|=((1<<0)|(1<<1)|(1<<6)|(1<<7)); //энкодер DDRD&=~(1<<5)|(1<<6)|(1<<7); PORTD=(1<<5)|(1<<6)|(1<<7); } void start(void)//плавный старт { for (;speed<=400;) { if (Flag_IT_timer0 == 1) { Flag_IT_timer0 = 0; speed++; } } // подключаем выходы генератора сигнала PSC к выходам порта //PSOC0 = (1 << POEN0B) | (1 << POEN0A); //PSOC1 = (1 << POEN1B) | (1 << POEN1A); //PSOC2 = (1 << POEN2B) | (1 << POEN2A); } void revers (void) { int s_new; if (speed>0) { s_new = ~speed + 1; for (;speed>=s_new;) { if (Flag_IT_timer0) { Flag_IT_timer0 = 0; speed--; } } } if (speed<0) { s_new = ~speed + 1; for(;speed>=s_new;) { if (Flag_IT_timer0) { Flag_IT_timer0 = 0; speed++; } } } } void stop (void)// стоп { for(;speed>=0;) { if (Flag_IT_timer0) { Flag_IT_timer0 = 0; speed--; } } for(;speed<=0;) { if (Flag_IT_timer0) { Flag_IT_timer0 = 0; speed++; } } // отключаем выходы генератора сигнала PSC к выходам порта //PSOC0 &=~ (1 << POEN0B) | (1 << POEN0A); //PSOC1 &=~ (1 << POEN1B) | (1 << POEN1A); //PSOC2 &=~ (1 << POEN2B) | (1 << POEN2A); } void Timer_init(void) { //инициализация энкодера содержит настройки таймера 1 TCCR1A = 0x00; TCCR1B |= (1<<CS11); // делитель на 8 TCNT1 = 0; // Обнуляем счетный регистр OCR1A=250; // Настраиваем регистр сравнения 100 раз в секунду //CS12 CS11 CS10 //0 0 0 нет тактирования //0 0 1 /1 //0 1 0 /8 //0 1 1 /64 //1 0 0 /256 //1 0 1 /1024 //1 1 0 External clock source on T1 pin. Clock on falling edge. //1 1 1 1 External clock source on T1 pin. Clock on rising edge. // Разрешаем прерывание таймера по совпадению с OCR1A TIMSK |= (1<<OCIE1A); } ISR(TIMER1_COMPA_vect) { Flag_IT_timer0 = 1; TCNT1=0; // Обнуляем счетчик } int main(void) { DDRB=0b11111101; PORTB=0b00000010; Timer_init(); sei(); while (1) { if (Flag_IT_timer0) { Flag_IT_timer0=0; if(button) { button_time++; } } //---------------------работаем вне таймера 1 с результатами энкодера------------ if (!button && button_time>200)//т.к. таймер срабатывает 100 раз в сек. то 200 будет = 2с { button_time = 0; button_long = 1; } if (!button && button_time > 0 && button_time < 200) { button_time = 0; button_shot = 1; } if (button_shot && speed==0)//первое короткое { start(); button_shot = 0; } if (button_shot)//любое другое короткое нажатие { revers(); button_shot = 0; } if (button_long) { stop(); button_long = 0; } } }
  13. использую два таймера, таймер1 для крутилки энкодера в качестве антидребезга. таймер0 для плавного пуск/стоп/реверс. крутилка работает отлично на каждый щелчок энкодера, переменная speed увеличивается/уменьшается на 10. и не требует volatile. в то время как проверка флага таймера0 не проходит да она используется внутри цикла for но это не говорит о том что проверка не должна проходить.
  14. сразу так и сделал, но Flag_IT_timer тоже считаю объявлять ей не нужно. но такой совет поступил. и результат имел место быть
  15. оптимизировал еще сильнее , что даже volatile перестала помогать полное отключение оптимизации помогло. но на сколько это правильно?
  16. какого рода могут быть проблемы? код выложен на предыдущей странице без volatile переменную speed как будто не видит
  17. причем начинается выполнение прыгает на скобку, а затем на флаг. а после уже на for и бесконечно с for на if не заходя в него не этого я ожидал заходя на форум
  18. теперь другая проблема. не заходит внутрь if, хотя Flag стоит в единице void start(void)//плавный старт { for (;speed<=400;) { if (Flag_IT_timer1) { Flag_IT_timer1 = 0; speed++; } } // подключаем выходы генератора сигнала PSC к выходам порта //PSOC0 = (1 << POEN0B) | (1 << POEN0A); //PSOC1 = (1 << POEN1B) | (1 << POEN1A); //PSOC2 = (1 << POEN2B) | (1 << POEN2A); }
  19. первое короткое нажатие на кнопку -- пуск, последующее короткое --- реверс, длинное нажатие кнопки -- стоп #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdio.h> #include <stdlib.h> #include <avr/io.h> //#define button (!(PIND&(1<<5))) unsigned char Flag_IT_timer1; unsigned char button_time=0; unsigned char button_long=0; unsigned char button_shot=0; short speed = 0; int button = 0; void port_ini (void) { //усилитель DDRB&=~(1<<3)|(1<<4);//вход усилителя для измерения тока //ЛСД DDRC|=((1<<4)|(1<<5)|(1<<6)|(1<<7)); DDRB|=((1<<2)|(1<<5)); //ШИМ DDRD|=(1<<0);DDRC|=(1<<0); DDRB|=((1<<0)|(1<<1)|(1<<6)|(1<<7)); //энкодер DDRD&=~(1<<5)|(1<<6)|(1<<7); PORTD=(1<<5)|(1<<6)|(1<<7); } void start(void)//плавный старт { for (;speed<=400;) { if (Flag_IT_timer1) { Flag_IT_timer1 = 0; speed++; } } // подключаем выходы генератора сигнала PSC к выходам порта //PSOC0 = (1 << POEN0B) | (1 << POEN0A); //PSOC1 = (1 << POEN1B) | (1 << POEN1A); //PSOC2 = (1 << POEN2B) | (1 << POEN2A); } void revers (void) { int s_new; if (speed>0) { s_new = ~speed + 1; for (;speed>=s_new;) { if (Flag_IT_timer1) { Flag_IT_timer1 = 0; speed--; } } } if (speed<0) { s_new = ~speed + 1; for(;speed>=s_new;) { if (Flag_IT_timer1) { Flag_IT_timer1 = 0; speed++; } } } } void stop (void)// стоп { for(;speed>=0;) { if (Flag_IT_timer1) { Flag_IT_timer1 = 0; speed--; } } for(;speed<=0;) { if (Flag_IT_timer1) { Flag_IT_timer1 = 0; speed++; } } // отключаем выходы генератора сигнала PSC к выходам порта //PSOC0 &=~ (1 << POEN0B) | (1 << POEN0A); //PSOC1 &=~ (1 << POEN1B) | (1 << POEN1A); //PSOC2 &=~ (1 << POEN2B) | (1 << POEN2A); } void Timer_init(void) { //инициализация энкодера содержит настройки таймера 1 TCCR1A = 0x00; TCCR1B |= (1<<CS11); // делитель на 8 TCNT1 = 0; // Обнуляем счетный регистр OCR1A=250; // Настраиваем регистр сравнения 100 раз в секунду //CS12 CS11 CS10 //0 0 0 нет тактирования //0 0 1 /1 //0 1 0 /8 //0 1 1 /64 //1 0 0 /256 //1 0 1 /1024 //1 1 0 External clock source on T1 pin. Clock on falling edge. //1 1 1 1 External clock source on T1 pin. Clock on rising edge. // Разрешаем прерывание таймера по совпадению с OCR1A TIMSK |= (1<<OCIE1A); } ISR(TIMER1_COMPA_vect) { Flag_IT_timer1 = 1; TCNT1=0; // Обнуляем счетчик } int main(void) { DDRB=0b11111101; PORTB=0b00000010; Timer_init(); sei(); while (1) { if (Flag_IT_timer1) { Flag_IT_timer1=0; if(button) { button_time++; } } //---------------------работаем вне таймера 1 с результатами энкодера------------ if (!button && button_time>200)//т.к. таймер срабатывает 100 раз в сек. то 200 будет = 2с { button_time = 0; button_long = 1; return button_long; } if (!button && button_time > 0 && button_time < 200) { button_time = 0; button_shot = 1; return button_shot; } if (button_shot && speed==0)//первое короткое { start(); button_shot = 0; } if (button_shot)//любое другое короткое нажатие { revers(); button_shot = 0; } if (button_long) { stop(); button_long = 0; } } } вот код целиком еще по мимо всего пуск и стоп должны проходить плавно
  20. да просто так получилось что на телефоне один акк а на компе другой
  21. увеличивает переменную до 401 и возвращаааает, а так то да выходит возвращать ее не нужно если она глобальная? выходит изначально у меня было правильно они там есть просто почему то подсветились
×
×
  • Create New...