Страница 236 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 25, 2013 17:46:06
Marchello
Коты, выручайте! Мозг себе вынес не могу никак сообразить как вызвать подпрограмму!
Структура проекта:
void main (void)
{
whule(1)
{
}
}
void step_motor (void)
{
}
Как мне при помощи нажатия кнопки запустить выполнение подпрограммы void step_motor (void)?????
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 25, 2013 20:15:03
CS16AMX
Люди образованные поясните,почему процесс цикла не выполняется и как его запустить?
#include<mega16.h>
#define TOP 10000
#include <stdio.h>
#include <delay.h>
#define servo1(a) OCR1B=a/2
#define servo2(b) OCR1A=b/2
void servo1_position(int pos)
{
OCR1A = pos/2;
}
void servo2_position(int pos)
{
OCR1B = pos/2;
}
char i;
void main(void)
{
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
//настраиваем Timer1
TCCR1A=0xA0;
TCCR1B=0x12;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=TOP>>8;
ICR1L=TOP; //максимальное значение таймера
OCR1B=0x00;
OCR1A=0x00;
DDRD=0x30; //PORTD4 & PORTD5 сконфигурированы на выход
servo1_position(1000+i);
servo2_position(1300); //на PD4 аналогично, но длительность импульса уже 1300 мксек
printf("%u",OCR1B);
while(1); { printf("%u",i);
OCR1B++;}
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 25, 2013 20:51:04
unalex
Marchello писал(а):Как мне при помощи нажатия кнопки запустить выполнение подпрограммы void step_motor (void)?????
Код: Выделить всё
#define KEYNUM 5 // тут указываем номер лапки порта, к которой подключена кнопка
void main (void)
{
while(1)
{
if((!PINA & (1 << KEYNUM)) != 0) //если кнопка нажата
{
_delay_ms(30); //антидребезговая задержка
if((!PINA & (1 << KEYNUM)) != 0) //если все еще нажата, значит все в порядке, можно вызывать
step_motor(); //вызываем функцию
}
}
}
void step_motor (void)
{
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 25, 2013 21:01:09
unalex
CS16AMX, в программу не вникал, но по поводу функций servo_position я бы рекомедовал делать не void, а возвращать позицию в программу
Код: Выделить всё
unsigned char servo1_position(int pos)
{
return pos/2;
}
...
в самой программе
OCR1A = servo1_position(1000+i)
...
кстати что за char i;
почему она глобальная а не стоит внутри main?
почему ей не присвоено значение?
в цикле я вижу только
будет бесконечно выводится непонятное i, которое не задано
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 25, 2013 21:10:10
ibiza11
CS16AMX
while(1); { printf("%u",i);
OCR1B++;}
точка с запятой ставится в конце оператора, а не в середине.
а по Вашему коду компилятор понял, то что находится в круглых скобках - никогда не выполнится. while(1); вполне себе самостоятельное выражение.
соответственно компилятор выбросил из кода два последних действия, заключенные в скобки.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 25, 2013 21:19:02
unalex
ах точку с запятой я и не заметил, значит там вообще ничего не выполняется
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 25, 2013 23:51:30
CS16AMX
пасибо огромное) без них признаки жизни есть) если можно, то подскажите ещё вот с чем:
while(1) {
while(1) {
i++ ;
prin=getchar();
getchar();
OCR1B=1000+prin*3;
printf("%u",prin);
}
}
по сути я принимаю сигнал по юарт и должен его прибавить к сигналу шим но мне надо суммировать прошлый с новым , и вот этот проект не единственный где ищу решение по созданию буфера,если есть у кого кусок то подкиньте плизззз
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 26, 2013 00:24:35
vitalik_1984
unalex писал(а):вариант с возвращением позиции должен состоять из еще одного перебора массива, в котором как раз будет производиться это самое чтение
Все понятно, только вот как вы сообщите этой же функции read_array() с какого символа начинать считать?и зачем вообще выставлять флаг, и затем в следующем же шаге проверять его состояние, когда можно просто
Код: Выделить всё
for(unsigned char i = 0; i < arraysize; i++)
{
if(array[i] == etalon) readArray;
}
сравните со своим вариантом и определите на сколько ускорится время выполнения цикла.
А повторный перебор массива не понадобится, если функция начинает читать именно с того элемента, номер которого вернули.Вот как это выглядит.
Код: Выделить всё
find(uint8_t symbol, uint8_t * array , uint8_t arraysize ){
for(unsigned char i = 0; i < arraysize; i++)
{
if(array[i] == symbol) break;
}
return i;
}
read_array(find(125,&massive,248));
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 26, 2013 02:30:01
unalex
vitalik_1984 писал(а):с какого символа начинать считать?
вот так, например
Код: Выделить всё
unsigned char flag = 0; //флаг, при нахождении нужного элемента устанавливается в 1
unsigned char j = 0;
for(unsigned char i = 0; i < arraysize; i++)
{
if(array[i] == etalon) flag = 1;
if(flag == 1) newarray[j++] = array[i];
}
все зависит от того что автор хочет дальше делать или читать в новый массив или вызывать функцию(в этом случае отправляем в качестве параметра номер элемента)
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 26, 2013 07:54:11
eduardo
Есть еще книга Евстифеева А.В.—микроконтроллеры семейства Tiny.Почти даташит. Я купил на kniga.ru. Только вот книгу этого автора по мегам найти не могу. У меня она только в электронном виде.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 26, 2013 15:17:44
vitalik_1984
unalex писал(а):Код: Выделить всё
unsigned char flag = 0; //флаг, при нахождении нужного элемента устанавливается в 1
unsigned char j = 0;
for(unsigned char i = 0; i < arraysize; i++)
{
if(array[i] == etalon) flag = 1;
if(flag == 1) newarray[j++] = array[i];
}
согласитесь это уже немного другой подход?Тут уже видно для чего нужен флаг, только это тоже вариант не корректный.
так не будут производиться ненужные сравнения с эталоном если флаг =1
Код: Выделить всё
unsigned char flag = 0; //флаг, при нахождении нужного элемента устанавливается в 1
unsigned char j = 0;
for(unsigned char i = 0; i < arraysize; i++)
{
if(flag == 1) {newarray[j++] = array[i];}
else {if(array[i] == etalon) flag = 1; }
}
unalex писал(а): все зависит от того что автор хочет дальше делать или читать в новый массив или вызывать функцию(в этом случае отправляем в качестве параметра номер элемента)
Будем корректными, ваш первый вариант кода ничего не отправлял параметром.Мои вариант сразу передает в функцию номер символа.
Вообще можно сделать функцию перебора массива, которая возвращает число найденых символов и помещает в массив по указателю позиции где эти символы стоят.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 26, 2013 16:42:52
unalex
vitalik_1984 писал(а):Тут уже видно для чего нужен флаг, только это тоже вариант не корректный.
так не будут производиться ненужные сравнения с эталоном если флаг =1
согласен, мой вариант делает ненужные сравнения
vitalik_1984 писал(а):Будем корректными, ваш первый вариант кода ничего не отправлял параметром
ну так я там написал в общем виде - обозвал процедуру чтения абстрактным словом
readArray(мог бы просто написать blabla) - вместо этого автор сам ставит то что ему нужно
и т.п. в зависимости от фантазии и требований
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 26, 2013 17:17:34
vitalik_1984
Ну так и надо было написать, а то не совсем понятно.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 27, 2013 00:12:10
eduardo
Marchello писал(а):Коты, выручайте! Мозг себе вынес не могу никак сообразить как вызвать подпрограмму!
Структура проекта:
void main (void)
{
whule(1)
{
}
}
void step_motor (void)
{
}
Как мне при помощи нажатия кнопки запустить выполнение подпрограммы void step_motor (void)?????
А если просто вот так?:
While(1)
{
if(PINB.1==1)
{step_motor ();}
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 27, 2013 07:03:20
pyzhman
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 27, 2013 09:51:37
vitalik_1984
а вы уверены, что While именно так пишется? Вроде как си чувствителен к регистру символов.
А whule(1) вообще улыбнуло

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 27, 2013 14:34:11
unalex
smile vitalik_1984(command x)
{
if(x == while) return

;
else if(x == While) return

;
else if(x == whule) return

;
else return

;
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 27, 2013 15:06:10
Аlex
unalex писал(а):
else return

;
}
else return

;
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 27, 2013 19:58:11
vitalik_1984
unalex писал(а):smile vitalik_1984(command x)
smile vitalik_1984(command x)
{ switch(x)
- case(while): return
;break ;
case(While) :return
;break ;
default: return
;break ;
}
Error: C:\Docs\Платы\Проекты AVR\Led_light_control\Main.c(158): undefined symbol 'While'
Error: C:\Docs\Платы\Проекты AVR\Led_light_control\Main.c(158): undefined symbol 'Whule'
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 28, 2013 06:37:53
eduardo
vitalik_1984 писал(а):а вы уверены, что While именно так пишется? Вроде как си чувствителен к регистру символов.
А whule(1) вообще улыбнуло

Слово "while" нужно писать с маленькой буквы,иначе компилятор ошибку выдаст. У меня в предыдущем сообщении нарисовалась большая,виноват—писать код си на андроиде не очень удобно.