roboforum.ru

Технический форум по робототехнике.

помогите с программой...

Re: помогите с программой...

dccharacter » 22 май 2011, 16:13

Так смотри, что ты делаешь (если я правильно эти ваши атмеги понимаю):

1. Ты нажимаешь кнопку
2. Через терминал и УАРТ отправляется код этой кнопки
3. МК обрабатывает нажатие этой кнопки (загорелся светодиод)
4. Ты отпускашь кнопку. Вопрос - что отправляется в терминал? Как МК узнает, что ты отпустил кнопку?

Re: помогите с программой...

chinga » 22 май 2011, 16:16

dccharacter писал(а):4. Ты отпускашь кнопку. Вопрос - что отправляется в терминал? Как МК узнает, что ты отпустил кнопку?

вот это и хотел узнать)

Re: помогите с программой...

dccharacter » 22 май 2011, 16:56

Правильный ответ - никак :-)

Re: помогите с программой...

chinga » 22 май 2011, 18:04

а если вот так сделать, то когда нажимаешь мигает потом тока горит, и когда отпускаешь нормально гаснет. вот почему когда нажимаешь и держишь в начале мигает и потом только горит?
Код: Выделить всёРазвернуть
while (1){                  
        char asd;
      while(UCSRA.7==1){
        asd = UDR;
        if(asd == 'w'){
            PORTB.0 = 1;
            PORTB.2 = 0;
            PORTB.4 = 0;
            PORTB.6 = 0;
            delay_ms(100);   
        }
        if(asd == 'a'){
            PORTB.2 = 1;
            PORTB.0 = 0;
            PORTB.4 = 0;
            PORTB.6 = 0;
            delay_ms(100);
        }
        if(asd == 'd'){
            PORTB.4 = 1;
            PORTB.0 = 0;
            PORTB.2 = 0;
            PORTB.6 = 0;
            delay_ms(100);
        }
        if(asd == 's'){
            PORTB.6 = 1;
            PORTB.0 = 0;
            PORTB.2 = 0;
            PORTB.4 = 0;
            delay_ms(100);
        }         
  }
            asd = 'q';
            if(asd == 'q'){
                PORTB.6 = 0;
                PORTB.0 = 0;
                PORTB.2 = 0;
                PORTB.4 = 0;
            } 
}

вроде должен так работать, ну как я понимаю, когда нажимаю "w","a","s","d" заходит while(UCSRA.7==1) а когда не нажимаю, выходит из этого цикла, правильно? если я отпускаю то должны все светодиоды не гореть, то есть программа не заходит в while(UCSRA.7==1) то есть asd = 'q' и все светодиоды гаснут...я правильно понимаю?

Re: помогите с программой...

dccharacter » 22 май 2011, 18:15

asd = 'q';
if(asd == 'q')

Это - очень круто!!!!!!

Re: помогите с программой...

chinga » 22 май 2011, 18:21

dccharacter писал(а):asd = 'q';
if(asd == 'q')

Это - очень круто!!!!!!

ну я то буду еще что то добавлять кроме этой программы) что б еще от мк передавать сигналы на ПК)

Re: помогите с программой...

HarryStar » 22 май 2011, 18:28

У вас нет ничего, что бы гасило светодиоды при отпускании кнопок.
Если кнопки не нажаты, вы не попадаете во внутренний while(UCSRA.7==1), и крутитесь во внешнем while(1), где ничего не гасит светодиоды. Поэтому у вас так и происходит. Поставьте перед while(UCSRA.7==1) строчку PORTB = 0; и все, светодиоды всегда будут погашены, и будут только загораться (точнее мигать) когда вы держите кнопки.

Внутри цикла вместо кучи IF поставьте лучше switch - будет короче и красивее

Re: помогите с программой...

chinga » 22 май 2011, 18:48

вот именно, у меня мигает, а мне надо что б только горел, вообщем я хотел сделать так: когда нажимаю "w" моторы должны крутиться вперед, а когда "s" назад, "a" - влево,"d"-вправо, но у меня тут когда нажимаешь и держишь, в начале мигает(когда моторы будут то будет робот трести) потом тока горит... вообщем надо что б когда нажимаешь должны моторы нормально крутиться) вроде объяснил))

Re: помогите с программой...

HarryStar » 22 май 2011, 19:25

Уберите задержки - будет чаще мигать, почти гореть - это простой вариант. Над более сложным уж сами подумайте :)

Re: помогите с программой...

chinga » 22 май 2011, 19:38

если задержки убрать то ваще не горит)

Re: помогите с программой...

chinga » 23 май 2011, 20:33

HarryStar писал(а):Уберите задержки - будет чаще мигать, почти гореть - это простой вариант.

а почему если задержку убрать то ваще не горит?

Re: помогите с программой...

HarryStar » 23 май 2011, 22:56

Возможно задержка необходима для нормально работы UART, а возможно большую часть времени прога находится в состоянии обмена данными и светодиод загорается лишь на мгновение, не заметное глазу.

В вашем случае проблему можно решить несколькими способами, лучше бы конечно если бы вы сами над ними думали а не ждали чужого решения.

Вот 1 из вариантов:
настраиваете таймер, который вызывает прерывание например 10 раз в секунду (возможно придется подобрать экспериментально) именно в нем и только в нем вы гасите светодиоды (выключаете свои моторы). А в обработке нажатий клавиш вы зажигаете нужные светодиоды И переводите таймер т.о. чтоб прерывание в ближайшие 1/10 секунды не произошло.

Итого получается, что если вы держите кнопку, то таймер постоянно переводится и прерывания не происходит. Соотв светодиод горит постоянно. Как только перестали нажимать, через 1/10 сек произойдет прерывание и погасит светодиоды.

Можно придумать кучу других вариантов, тренируйтесь в алгоритмизации, это интересно и полезно.


Rambler\'s Top100 Mail.ru counter