Технический форум по робототехнике.
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;
}
}
}
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 раз.
chinga » 21 май 2011, 21:19
HarryStar писал(а):1) Научитесь русскому языку. Это главное.
в смысле?)
Grem » 21 май 2011, 21:29
в смысле?)
здравствуйте!
я вот учусь программированию, и наткнулся на такую ошибку, по идеи работать должен так, када нажимаю кнопку и значение увеличивается на к++, и должен после каждой нажатий вывести на экран, точнее на терминал, работает через rs232. Почему када нажимаю увеличивается тока на 1 и дальше не идет, и глобально объявлял к, но все же, такой ответ выходит
Ну и кучка пунктуационных и стилистических.
HarryStar » 21 май 2011, 21:30
chinga писал(а):в смысле?)
Помечу красным ошибки, зеленым пропущенные слова или неправильный смысл.
я вот учусь программированию, и наткнулся на такую ошибку, по
идеи (тут пропущено слово код) работать должен так,
када нажимаю кнопку и
(лишний союз) значение увеличивается на к++
(на 1 а не на к++), и должен после
каждой нажатий вывести
(пропущено слово значение)на экран, точнее на терминал,
работает через rs232. Почему
када нажимаю увеличивается тока на 1 и дальше не идет
, и глобально объявлял к, но все же, такой ответ выходит
(последние слова вообще не в тему)Кроме ошибок у вас сильно нарушен порядок слов в предложении и некоторые связующие слова пропущены, из за чего весь ваш текст почти лишен смысла, пришлось догадываться. Это не придирки, будь вопрос более сложным, его было бы просто невозможно понять.
RootAdmin » 21 май 2011, 21:35
HarryStar правильно указал на ошибку в коде.
Как-то так:
Я вот учусь программированию. По задумке моя программа работать должна так: когда нажимаю кнопку - значение переменной k изменяется в строке k++, после каждого изменения ее значение выводится на терминал, подключенный через rs232. Почему-то когда нажимаю - отрабатывает один инкремент, занчение меняется на 1 и дальше не изменяется.
Что пробовал для поиска ошибки: глобально объявлял к. Результат тот же.
Сорри за редактуру. На хороший вопрос и отвечать приятно.
chinga » 21 май 2011, 21:43
извините))) я прост пишу как говорю)
=DeaD= » 21 май 2011, 22:54
Вот именно что пишете код так же как говорите
Есть такое правило - если не можешь грамотно выразить алгоритм русским языком, значит скорее всего и напишешь его неправильно в коде. Поэтому учите русский.
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;
}
}
}
RealRobot » 22 май 2011, 14:52
пристали к человеку, учи да учи. Может он индиец или африканец. И тогда такой уровень русского это ого.го.го. Вы бы так смогли бегло изъясняться по африкански? да еще код на мегу написать, на фарси например?
chinga » 22 май 2011, 14:58
RealRobot писал(а):пристали к человеку, учи да учи. Может он индиец или африканец. И тогда такой уровень русского это ого.го.го. Вы бы так смогли бегло изъясняться по африкански? да еще код на мегу написать, на фарси например?
казах
RealRobot » 22 май 2011, 15:15
для Чинга
Смотря как и чем отсылается символ? а в коде меги надо в тот момент когда зажигаешь один светодиот гасить все остальные кроме зажигаемого.
Добавлено спустя 3 минуты 42 секунды:
ну вот видите, Чинга казах. Чинга, у вас там неверно уже и русский то в школах не преподают? или если преподают, то как иностранный? в этих реалиях то, что вы сносно изъясняетесь по русски уже подвиг.
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;
}
RealRobot » 22 май 2011, 15:45
else .. уже не нужен
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);
}
}