roboforum.ru

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

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

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

chinga » 21 май 2011, 18:11

здравствуйте!
я вот учусь программированию, и наткнулся на такую ошибку, по идеи работать должен так, када нажимаю кнопку и значение увеличивается на к++, и должен после каждой нажатий вывести на экран, точнее на терминал, работает через rs232. Почему када нажимаю увеличивается тока на 1 и дальше не идет, и глобально объявлял к, но все же, такой ответ выходит
Код: Выделить всёРазвернуть
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.8b Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Chip type               : ATmega32
Program type            : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 512
*****************************************************/

#include <mega32.h>
#include <delay.h>

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0xFF;
DDRA=0;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0xFF;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0xFF;
DDRD=0;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;


// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;


// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

while (1){                 
      int k;
        k = 20;
        switch(PIND){
        case 0b11111011:
            delay_ms(200);
            k++; 
            printf("%d \r\n\0", k);
            break;
        case 0b11110111: 
            delay_ms(200);
            k--;
            printf("%d \r\n\0", k);
            break;
        default: break;
        }
  }
}

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

HarryStar » 21 май 2011, 21:16

1) Научитесь русскому языку. Это главное.
2) Вынесите объявление переменной "int k;" и присвоение ей начального значения за цикл while, т.е. перед ним.

У вас переменная k объявляется, потом k=20, потом например приращивается k++ потом переменная k объявляется, потом k=20, потом например приращивается k++ потом переменная k объявляется, потом k=20, потом например приращивается k++ потом переменная k объявляется, потом k=20 ...

Т.о. у вас k всегда равно или 19 или 21 в зависимости от порта D
Последний раз редактировалось HarryStar 21 май 2011, 21:20, всего редактировалось 1 раз.

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

chinga » 21 май 2011, 21:19

HarryStar писал(а):1) Научитесь русскому языку. Это главное.

в смысле?)

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

Grem » 21 май 2011, 21:29

в смысле?)

здравствуйте!
я вот учусь программированию, и наткнулся на такую ошибку, по идеи работать должен так, када нажимаю кнопку и значение увеличивается на к++, и должен после каждой нажатий вывести на экран, точнее на терминал, работает через rs232. Почему када нажимаю увеличивается тока на 1 и дальше не идет, и глобально объявлял к, но все же, такой ответ выходит

Ну и кучка пунктуационных и стилистических.

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

HarryStar » 21 май 2011, 21:30

chinga писал(а):в смысле?)


Помечу красным ошибки, зеленым пропущенные слова или неправильный смысл.

я вот учусь программированию, и наткнулся на такую ошибку, по идеи (тут пропущено слово код) работать должен так, када нажимаю кнопку и (лишний союз) значение увеличивается на к++(на 1 а не на к++), и должен после каждой нажатий вывести (пропущено слово значение)на экран, точнее на терминал, работает через rs232. Почему када нажимаю увеличивается тока на 1 и дальше не идет, и глобально объявлял к, но все же, такой ответ выходит (последние слова вообще не в тему)

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

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

RootAdmin » 21 май 2011, 21:35

HarryStar правильно указал на ошибку в коде.
Как-то так:
Я вот учусь программированию. По задумке моя программа работать должна так: когда нажимаю кнопку - значение переменной k изменяется в строке k++, после каждого изменения ее значение выводится на терминал, подключенный через rs232. Почему-то когда нажимаю - отрабатывает один инкремент, занчение меняется на 1 и дальше не изменяется.
Что пробовал для поиска ошибки: глобально объявлял к. Результат тот же.
Сорри за редактуру. :)

На хороший вопрос и отвечать приятно.

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

chinga » 21 май 2011, 21:43

:D извините))) я прост пишу как говорю)

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

=DeaD= » 21 май 2011, 22:54

Вот именно что пишете код так же как говорите :)

Есть такое правило - если не можешь грамотно выразить алгоритм русским языком, значит скорее всего и напишешь его неправильно в коде. Поэтому учите русский.

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

chinga » 22 май 2011, 14:39

еще такая проблема: при нажатий кнопки должен светодиод гореть, и когда отпускаю должен гаснуть) кнопки с компа: w, a, s, d. а у меня сейчас нажимаю и горит пока не нажмешь вторую кнопку, нажимаешь вторую этот светодиод гаснет и горит следующий.
Код: Выделить всёРазвернуть
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.8b Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Chip type               : ATmega32
Program type            : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 512
*****************************************************/

#include <mega32.h>
#include <delay.h>

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here

void main(void)
{

// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0xFF;
DDRA=0;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0xFF;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0xFF;
DDRD=0;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;


// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;


// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

while (1){                 
     
      while(UCSRA.7==1){
        char asd;
        asd = UDR;
        if(asd == 'w'){
            PORTB.0 = 1;
            asd = 0;
            UCSRA.7 = 0;
            UCSRA.6 = 0;
            UDR = 0;
            //delay_ms(100);   
        }else{
            PORTB.0 = 0;
        }
        if(asd == 'a'){
            PORTB.2 = 1;
            //delay_ms(100);
        }else{
            PORTB.2 = 0;
        }
        if(asd == 'd'){
            PORTB.4 = 1;
            //delay_ms(100);
        }else{
            PORTB.4 = 0;
        }
        if(asd == 's'){
            PORTB.6 = 1;
            //delay_ms(100);
        }else{
            PORTB.6 = 0;
        }         
  }
}



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

RealRobot » 22 май 2011, 14:52

пристали к человеку, учи да учи. Может он индиец или африканец. И тогда такой уровень русского это ого.го.го. Вы бы так смогли бегло изъясняться по африкански? да еще код на мегу написать, на фарси например?

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

chinga » 22 май 2011, 14:58

RealRobot писал(а):пристали к человеку, учи да учи. Может он индиец или африканец. И тогда такой уровень русского это ого.го.го. Вы бы так смогли бегло изъясняться по африкански? да еще код на мегу написать, на фарси например?

казах :D

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

RealRobot » 22 май 2011, 15:15

для Чинга
Смотря как и чем отсылается символ? а в коде меги надо в тот момент когда зажигаешь один светодиот гасить все остальные кроме зажигаемого.

Добавлено спустя 3 минуты 42 секунды:
ну вот видите, Чинга казах. Чинга, у вас там неверно уже и русский то в школах не преподают? или если преподают, то как иностранный? в этих реалиях то, что вы сносно изъясняетесь по русски уже подвиг.

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

chinga » 22 май 2011, 15:31

RealRobot писал(а):ну вот видите, Чинга казах. Чинга, у вас там неверно уже и русский то в школах не преподают? или если преподают, то как иностранный? в этих реалиях то, что вы сносно изъясняетесь по русски уже подвиг.

это только у меня проблема с русским, и еще в таких случаях когда объясняю, еще хуже становится) у нас учат русский) и не как иностранный))
RealRobot писал(а):для Чинга
Смотря как и чем отсылается символ? а в коде меги надо в тот момент когда зажигаешь один светодиот гасить все остальные кроме зажигаемого.

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

        }
        if(asd == 'd'){
            PORTB.4 = 1;
            PORTB.0 = 0;
            PORTB.2 = 0;
            PORTB.6 = 0;
            //asd = 0;
            //UCSRA.7 = 0;
            //UCSRA.6 = 0;
            //UDR = 0;
            //delay_ms(100);
        }else{
            PORTB.0 = 0;
            PORTB.2 = 0;
            PORTB.4 = 0;
            PORTB.6 = 0;

        }
        if(asd == 's'){
            PORTB.6 = 1;
            PORTB.0 = 0;
            PORTB.2 = 0;
            PORTB.4 = 0;
            //asd = 0;
            //UCSRA.7 = 0;
            //UCSRA.6 = 0;
            //UDR = 0;
            //delay_ms(100);
        }else{
            PORTB.0 = 0;
            PORTB.2 = 0;
            PORTB.4 = 0;
            PORTB.6 = 0;
        }

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

RealRobot » 22 май 2011, 15:45

else .. уже не нужен

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

chinga » 22 май 2011, 15:50

RealRobot писал(а):else .. уже не нужен

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


Rambler\'s Top100 Mail.ru counter