CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
Коты, выручайте! Мозг себе вынес не могу никак сообразить как вызвать подпрограмму!
Структура проекта:
void main (void)
{
whule(1)
{
}
}
void step_motor (void)
{
}
Как мне при помощи нажатия кнопки запустить выполнение подпрограммы void step_motor (void)?????
Структура проекта:
void main (void)
{
whule(1)
{
}
}
void step_motor (void)
{
}
Как мне при помощи нажатия кнопки запустить выполнение подпрограммы void step_motor (void)?????
Re: CodeVision AVR в вопросах и ответах
Люди образованные поясните,почему процесс цикла не выполняется и как его запустить?
#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++;}
}
#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++;}
}
- unalex
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Сб авг 25, 2007 22:02:05
- Откуда: Германия, Viernheim
Re: CodeVision AVR в вопросах и ответах
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)
{
}Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
- unalex
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Сб авг 25, 2007 22:02:05
- Откуда: Германия, Viernheim
Re: CodeVision AVR в вопросах и ответах
CS16AMX, в программу не вникал, но по поводу функций servo_position я бы рекомедовал делать не void, а возвращать позицию в программу
кстати что за char i;
почему она глобальная а не стоит внутри main?
почему ей не присвоено значение?
в цикле я вижу только
будет бесконечно выводится непонятное i, которое не задано
Код: Выделить всё
unsigned char servo1_position(int pos)
{
return pos/2;
}
...
в самой программе
OCR1A = servo1_position(1000+i)
...кстати что за char i;
почему она глобальная а не стоит внутри main?
почему ей не присвоено значение?
в цикле я вижу только
Код: Выделить всё
while(1); { printf("%u",i);
OCR1B++;}
}будет бесконечно выводится непонятное i, которое не задано
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
CS16AMX
while(1); { printf("%u",i);
OCR1B++;}
точка с запятой ставится в конце оператора, а не в середине.
а по Вашему коду компилятор понял, то что находится в круглых скобках - никогда не выполнится. while(1); вполне себе самостоятельное выражение.
соответственно компилятор выбросил из кода два последних действия, заключенные в скобки.
while(1); { printf("%u",i);
OCR1B++;}
точка с запятой ставится в конце оператора, а не в середине.
а по Вашему коду компилятор понял, то что находится в круглых скобках - никогда не выполнится. while(1); вполне себе самостоятельное выражение.
соответственно компилятор выбросил из кода два последних действия, заключенные в скобки.
Ставим плюсы: )
- unalex
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Сб авг 25, 2007 22:02:05
- Откуда: Германия, Viernheim
Re: CodeVision AVR в вопросах и ответах
ах точку с запятой я и не заметил, значит там вообще ничего не выполняется
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Re: CodeVision AVR в вопросах и ответах
пасибо огромное) без них признаки жизни есть) если можно, то подскажите ещё вот с чем:
while(1) {
while(1) {
i++ ;
prin=getchar();
getchar();
OCR1B=1000+prin*3;
printf("%u",prin);
}
}
по сути я принимаю сигнал по юарт и должен его прибавить к сигналу шим но мне надо суммировать прошлый с новым , и вот этот проект не единственный где ищу решение по созданию буфера,если есть у кого кусок то подкиньте плизззз
while(1) {
while(1) {
i++ ;
prin=getchar();
getchar();
OCR1B=1000+prin*3;
printf("%u",prin);
}
}
по сути я принимаю сигнал по юарт и должен его прибавить к сигналу шим но мне надо суммировать прошлый с новым , и вот этот проект не единственный где ищу решение по созданию буфера,если есть у кого кусок то подкиньте плизззз
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
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));
- unalex
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Сб авг 25, 2007 22:02:05
- Откуда: Германия, Viernheim
Re: CodeVision AVR в вопросах и ответах
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];
}
все зависит от того что автор хочет дальше делать или читать в новый массив или вызывать функцию(в этом случае отправляем в качестве параметра номер элемента)
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Re: CodeVision AVR в вопросах и ответах
Есть еще книга Евстифеева А.В.—микроконтроллеры семейства Tiny.Почти даташит. Я купил на kniga.ru. Только вот книгу этого автора по мегам найти не могу. У меня она только в электронном виде.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
согласитесь это уже немного другой подход?Тут уже видно для чего нужен флаг, только это тоже вариант не корректный.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 писал(а): все зависит от того что автор хочет дальше делать или читать в новый массив или вызывать функцию(в этом случае отправляем в качестве параметра номер элемента)
Вообще можно сделать функцию перебора массива, которая возвращает число найденых символов и помещает в массив по указателю позиции где эти символы стоят.
- unalex
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Сб авг 25, 2007 22:02:05
- Откуда: Германия, Viernheim
Re: CodeVision AVR в вопросах и ответах
vitalik_1984 писал(а):Тут уже видно для чего нужен флаг, только это тоже вариант не корректный.
так не будут производиться ненужные сравнения с эталоном если флаг =1
согласен, мой вариант делает ненужные сравнения
vitalik_1984 писал(а):Будем корректными, ваш первый вариант кода ничего не отправлял параметром
ну так я там написал в общем виде - обозвал процедуру чтения абстрактным словом readArray(мог бы просто написать blabla) - вместо этого автор сам ставит то что ему нужно
Код: Выделить всё
newarray[j++] = array[i];Код: Выделить всё
readArray(i)Код: Выделить всё
blabla = readArray(i)и т.п. в зависимости от фантазии и требований
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Ну так и надо было написать, а то не совсем понятно.
Re: CodeVision AVR в вопросах и ответах
Marchello писал(а):Коты, выручайте! Мозг себе вынес не могу никак сообразить как вызвать подпрограмму!
Структура проекта:
void main (void)
{
whule(1)
{
}
}
void step_motor (void)
{
}
Как мне при помощи нажатия кнопки запустить выполнение подпрограммы void step_motor (void)?????
А если просто вот так?:
While(1)
{
if(PINB.1==1)
{step_motor ();}
}
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Или проще
Код: Выделить всё
While(1)
{
if(PINB.1) step_motor ();
}Docendo discimus
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
а вы уверены, что While именно так пишется? Вроде как си чувствителен к регистру символов. 
А whule(1) вообще улыбнуло
А whule(1) вообще улыбнуло
- unalex
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Сб авг 25, 2007 22:02:05
- Откуда: Германия, Viernheim
Re: CodeVision AVR в вопросах и ответах
smile vitalik_1984(command x)
{
if(x == while) return
;
else if(x == While) return
;
else if(x == whule) return
;
else return
;
}
{
if(x == while) return
;else if(x == While) return
else if(x == whule) return
else return
;}
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
unalex писал(а): else return;
}
else return
;- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
unalex писал(а):smile vitalik_1984(command x)
smile vitalik_1984(command x)
{ switch(x)
- case(while): return
;break ;case(While) :return
default: return
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 в вопросах и ответах
vitalik_1984 писал(а):а вы уверены, что While именно так пишется? Вроде как си чувствителен к регистру символов.
А whule(1) вообще улыбнуло
Слово "while" нужно писать с маленькой буквы,иначе компилятор ошибку выдаст. У меня в предыдущем сообщении нарисовалась большая,виноват—писать код си на андроиде не очень удобно.