CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

Re: CodeVision AVR в вопросах и ответах

Сообщение Marchello »

Коты, выручайте! Мозг себе вынес не могу никак сообразить как вызвать подпрограмму!

Структура проекта:
void main (void)
{
whule(1)
{
}
}

void step_motor (void)
{
}

Как мне при помощи нажатия кнопки запустить выполнение подпрограммы void step_motor (void)?????
CS16AMX
Нашел транзистор. Понюхал.
Сообщения: 195
Зарегистрирован: Вт ноя 30, 2010 00:50:40

Re: CodeVision AVR в вопросах и ответах

Сообщение 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++;}
}
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: CodeVision AVR в вопросах и ответах

Сообщение 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)
{
}
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: CodeVision AVR в вопросах и ответах

Сообщение unalex »

CS16AMX, в программу не вникал, но по поводу функций servo_position я бы рекомедовал делать не void, а возвращать позицию в программу

Код: Выделить всё

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 в вопросах и ответах

Сообщение ibiza11 »

CS16AMX

while(1); { printf("%u",i);
OCR1B++;}

точка с запятой ставится в конце оператора, а не в середине.
а по Вашему коду компилятор понял, то что находится в круглых скобках - никогда не выполнится. while(1); вполне себе самостоятельное выражение.
соответственно компилятор выбросил из кода два последних действия, заключенные в скобки.
Ставим плюсы: )
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: CodeVision AVR в вопросах и ответах

Сообщение unalex »

ах точку с запятой я и не заметил, значит там вообще ничего не выполняется
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
CS16AMX
Нашел транзистор. Понюхал.
Сообщения: 195
Зарегистрирован: Вт ноя 30, 2010 00:50:40

Re: CodeVision AVR в вопросах и ответах

Сообщение CS16AMX »

пасибо огромное) без них признаки жизни есть) если можно, то подскажите ещё вот с чем:

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 в вопросах и ответах

Сообщение 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));
 
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: CodeVision AVR в вопросах и ответах

Сообщение 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];
}


все зависит от того что автор хочет дальше делать или читать в новый массив или вызывать функцию(в этом случае отправляем в качестве параметра номер элемента)
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Re: CodeVision AVR в вопросах и ответах

Сообщение eduardo »

Есть еще книга Евстифеева А.В.—микроконтроллеры семейства Tiny.Почти даташит. Я купил на kniga.ru. Только вот книгу этого автора по мегам найти не могу. У меня она только в электронном виде.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение 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 писал(а): все зависит от того что автор хочет дальше делать или читать в новый массив или вызывать функцию(в этом случае отправляем в качестве параметра номер элемента)
Будем корректными, ваш первый вариант кода ничего не отправлял параметром.Мои вариант сразу передает в функцию номер символа.

Вообще можно сделать функцию перебора массива, которая возвращает число найденых символов и помещает в массив по указателю позиции где эти символы стоят.
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: CodeVision AVR в вопросах и ответах

Сообщение unalex »

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 в вопросах и ответах

Сообщение vitalik_1984 »

Ну так и надо было написать, а то не совсем понятно.
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Re: CodeVision AVR в вопросах и ответах

Сообщение eduardo »

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 в вопросах и ответах

Сообщение pyzhman »

Или проще

Код: Выделить всё

While(1)
{
if(PINB.1) step_motor ();
}
Docendo discimus
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

а вы уверены, что While именно так пишется? Вроде как си чувствителен к регистру символов. :)

А whule(1) вообще улыбнуло :)))
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: CodeVision AVR в вопросах и ответах

Сообщение unalex »

smile vitalik_1984(command x)
{
if(x == while) return :beer: ;
else if(x == While) return :) ;
else if(x == whule) return :))) ;
else return :facepalm: ;
}
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

unalex писал(а): else return :facepalm: ;
}

else return :dont_know: ;
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

unalex писал(а):smile vitalik_1984(command x)

smile vitalik_1984(command x)
{ switch(x)
      case(while): return :beer: ;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'
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Re: CodeVision AVR в вопросах и ответах

Сообщение eduardo »

vitalik_1984 писал(а):а вы уверены, что While именно так пишется? Вроде как си чувствителен к регистру символов. :)

А whule(1) вообще улыбнуло :)))

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

Вернуться в «AVR»