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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Каким образом - читать в соответствующей литературе. Люди старались, создавали библиотеки. Берите и смело пользуйтесь. Не нравится - напишите свой, тот же самый конгруентный хотя бы.
Docendo discimus
c717411
Встал на лапы
Сообщения: 148
Зарегистрирован: Ср дек 29, 2010 21:19:03

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

Сообщение c717411 »

Сериг писал(а):А в cvavr?
P. s. Попробовал в CV - не работает

Если пролистать вышеуказанный хелп к началу, то там написано:
The prototypes for these functions are placed in the file stdlib.h, located in the .\INC subdirectory. This file must be #include -d before using the functions.
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re:

Сообщение Artos »

Negor писал(а):Итак: требуется критика(код глаза намозолил, скорее всего чегото очевидного не вижу, но в симуляторе вроде работает). Цели:
-антидребезг;
-реакция на нажатие один раз с момента нажатия до момента отпускания;
-должно быть реализованно в виде отдельной функции, кот-ая фозвращает состояние порта.
Собственно код

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

#include <tiny2313>
#include <delay>
unsigned char FrstState,ScndState,RealState,Flag;
unsigned char KeyState(void)
{
       
        FrstState=PIND;                         //Запоминаем состояние кнопок
        delay_ms(10);                           //Задержка на антидребезг
        ScndState=FrstState & PIND;             //Контрольная проверка на нажатие
        RealState=(ScndState) & ~(Flag);        //Состояние изменилось?
        Flag=ScndState;                         //Флаг для контроля состояния при след проверке
     return RealState;   
}

void main(void)
{
       
        unsigned char i=0;
        DDRB=0xFF;
        DDRD=0x00;
        while(1)
        {       
                   if (KeyState()!=0)  i++;
        }
}


Я делал так:

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

if(Key==DOWN && timer_button==0)
{
  // сработало при кратковременном нажатии.
}
if(Key==DOWN && timer_button>10)
{
  timer_button=9;
  // срабатывает при удержании
}
if(Key==UP)
{
  timer_button=0; // сбрасываем если отпустили кнопку
}
if(Key==DOWN)
{
  timer_button++; // инкремент переменной
}
delay_ms(50);
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

уважаемые коты , помогите разобраться написал программу в cvavr , в симуляторе протеусе все работает как надо , а вот в железе не так как хотелось бы , суть в том что после выполнения первой части программы , загораются светодиоды которые не должны светится по алгоритму программы. избежать этого можно если при запуске мк держаться за плюсовую или минусовую шину. в чем может быть проблема?? кондеры по питанию стоят , резистор на ресет повесил, мк атмега 8. использую внутренний RC генератор на 8мгц. прошиваю пони прогом.
вот код (он конечно не идеален, наверника можноо именьше написать но пока не умею)
Спойлер#include <mega8.h>
#include <delay.h>
#define park PORTD.0
#define zad PORTD.1
#define net PORTD.2
#define drayv PORTD.3
#define tri PORTD.4
#define odin PORTD.5

#define park_1 PORTB.0
#define zad_1 PORTB.1
#define net_1 PORTB.2
#define drayv_1 PORTB.3
#define tri_1 PORTB.4
#define odin_1 PORTB.5

#define in_park PINC.0
#define in_zad PINC.1
#define in_net PINC.2
#define in_drayv PINC.3
#define in_tri PINC.4
#define in_odin PINC.5
#define in_ruchnik PIND.6
#define in_selektor PIND.7


int t;
void zvuk (void)
{
for (t=0;t<=1000; t++)
{
PORTB.6=1;
delay_us(160);
PORTB.6=0;
delay_us(140);
};
}




void zvuk1 (void)
{
for (t=0;t<=1200; t++)
{
PORTB.6=1;
delay_us(100);
PORTB.6=0;
delay_us(100);
};
}




void main(void)
{

// Declare your local variables here
unsigned char a;
unsigned char s;


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

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

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

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// 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=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

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

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

// USART initialization
// USART disabled
UCSRB=0x00;

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

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;
delay_ms(500);
for (a=1;a<2;a++)
{



park=1;
delay_ms(180);
zad=1;
delay_ms(180);
net=1;
delay_ms(180);
drayv=1;
delay_ms(180);
tri=1;
delay_ms(180);
odin=1;
delay_ms(900);
odin=0;
delay_ms(180);
tri=0;
delay_ms(180);
drayv=0;
delay_ms(180);
net=0;
delay_ms(180);
zad=0;
delay_ms(180);
park=0;
delay_ms(180);
////////////////////////////////////
park_1=1;
delay_ms(180);
zad_1=1;
delay_ms(180);
net_1=1;
delay_ms(180);
drayv_1=1;
delay_ms(180);
tri_1=1;
delay_ms(180);
odin_1=1;
delay_ms(900);
odin_1=0;
delay_ms(180);
tri_1=0;
delay_ms(180);
drayv_1=0;
delay_ms(180);
net_1=0;
delay_ms(180);
zad_1=0;
delay_ms(180);
park_1=0;
delay_ms(180);
};
delay_ms(800);
while(1)
{
m: if (in_ruchnik==1)
{
zvuk();
delay_ms(100);
zvuk();
delay_ms(100);
zvuk();
delay_ms(100);
if (in_ruchnik==0)
{
zvuk();
delay_ms(100);
zvuk();
goto m;
}

m1: for (s=0;s<=30;s++)
{
if (in_ruchnik==0)
{
zvuk();
delay_ms(100);
zvuk();
goto m;
}

drayv=1;
park=1;
delay_ms(250);
drayv=0;
park=0;
delay_ms(500);
}
zvuk1();
delay_ms(100);
zvuk1();
goto m1;
}
////////////////////////////////////
if (in_selektor==1)
{


park=1;
delay_ms(80);
zad=1;
delay_ms(80);
net=1;
delay_ms(80);
drayv=1;
delay_ms(80);
tri=1;
delay_ms(80);
odin=1;
zvuk();
{do
{
if (in_park==1)
{ park_1=1;
}
else
{park_1=0;}
if (in_zad==1)
{zad_1=1;
}
else
{zad_1=0;
} ;
if (in_net==1)
{net_1=1;
}
else
{net_1=0;
} ;
if (in_drayv==1)
{drayv_1=1;
}
else
{drayv_1=0;
} ;
if (in_tri==1)
{tri_1=1;
}
else
{tri_1=0;
} ;
if (in_odin==1)
{odin_1=1;
}
else
{odin_1=0;
} ;
}
while (in_selektor==1);
}
delay_ms(4000);
odin=0;
delay_ms(80);
tri=0;
delay_ms(80);
drayv=0;
delay_ms(80);
net=0;
delay_ms(80);
zad=0;
delay_ms(80);
park=0;
delay_ms(80);
};

if (in_park==1)
{
park=1;
}
if (in_zad==1)
{
zad=1;
}
if (in_net==1)
{
net=1;
}
if (in_drayv==1)
{
drayv=1;
}
if (in_tri==1)
{
tri=1;
}
if (in_odin==1)
{
odin=1;
}

}
}

и файл протеуса
Вложения
КОРОБКА ПЕРЕДАЧ на мега 8.rar
(14.88 КБ) 148 скачиваний
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

pashaumnov писал(а):помогите разобраться



для начала инициализируй правильно порты
DDRx = 0 - вход
DDRx = 1 - выход

у тебя в коде я вижу бяку
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

ну порты проинициализированы визардом в кавре.вроде бы все норм с ними. звук у меня не получилось с помощью таймера сделать пришлось писать как смог)) а что бы вы еще поправили на ваш взгляд???
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

unalex писал(а):для начала инициализируй правильно порты

Для начала код отформатируйте, его же читать невозможно, и желательно сишный файл выкладывайте с отформатированым кодом и коментами.
«И всё-таки она вертится!»
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

или я тупой, или у визарда комментарии не соответствуют действительности

// Port B initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

поковырялся в коде

выводы
- визарды - ЗЛО

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

void init()
{
   // Input/Output Ports initialization
   
   // Port B initialization
   DDRB =0x00;      // B7=Out B6=Out B5=Out B4=Out B3=Out B2=Out B1=Out B0=Out
   PORTB=0x00;      // B7=0 B6=0 B5=0 B4=0 B3=0 B2=0 B1=0 B0=0 (ничего не горит)
   
   // Port C initialization
   DDRC =0xFF;      // C6=In C5=In C4=In C3=In C2=In C1=In C0=In
   
   // Port D initialization
   DDRD =0x3F;      // D7=In D6=In D5=Out D4=Out D3=Out D2=Out D1=Out D0=Out
   PORTD=0x00;      // D7=Z D6=Z D5=0 D4=0 D3=0 D2=0 D1=0 D0=0 (ничего не горит)
}


- goto - ЗЛО
даже из хитрозакрученных циклов всегда можно выкрутиться, испольуя команды break, continue, return

- русские имена переменных латиницей - ЗЛО
сейчас ты пишешь для себя, а вдруг потом выйдешь на мировой уровень, а от привычек избавляться трудно

конструкции вида

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

if (in_park==1)
{ park_1=1;
}
else
{park_1=0;}


элементарно заменяются на

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

park_1 = in_park;


для генерации звука(если пока не трогать ШИМ, таймеры и прочие плюшки) можно использовать одну функцию, передавая ей в качестве параметров длительность звучания и длительности высокого и низкого уровней

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

void sound(unsigned char duration, unsigned char hi_cycle, unsigned char lo_cycle)
{
   while(duration)
   {
      PORTB.6=1;
      delay_us(hi_cycle);
      PORTB.6=0;
      delay_us(lo_cycle);
      duration--;
   }
}


для бегущего огонька(в коде он наблюдается) тоже можно использовать функцию сдвига единички/нолика по ногам порта
ну варьируя различные логические функции можно делать различные эффекты(бегущий огонь, бегущая тень, заполнение...)

конкретно по вопросу что ДОЛЖНА делать программа и почему она это не делает, можно ответить лишь, зная что от нее ТРЕБУЕТСЯ
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

unalex писал(а):поковырялся в коде

спасибо за помощь уважаемый, немного внесу ясности, порты не соответствуют описанию потому, потом изменял их инициализацию. тут мой косяк думал все будет работать ок, а вот если другие люди смотрят то это их в водит в заблуждение.
с портами понятно.
дальше, goto зло, в данном случае не чего другого не смог придумать, не хватает знаний а goto достаточно легко использовать. почему все таки не рекомендуется использовать goto? чем он плох?
русские имена латиницей.?? если все же я не выйду на мировой уровень то возможно все таки использование русских имен латиницей.
ведь главное условие это что бы были буквы латинские , а что уж там они означают без разницы.????главное что бы это было понятно всем.)))
конструкции вида
if (in_park==1) //если на входе датчика 1
{ park_1=1; //тогда зажигаем светодиод
}
else //если нет тогда тушим светодиод.
{park_1=0;}


этому замена
park_1 = in_park;

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

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

Сообщение unalex »

pashaumnov писал(а):goto зло, в данном случае не чего другого не смог придумать, не хватает знаний а goto достаточно легко использовать. почему все таки не рекомендуется использовать goto? чем он плох?


goto нарушает структуру и последовательность программы(прыгать по коду не есть хорошо), кроме того могут случиться непредсказуемые ошибки(например чтоб изменить переменную, прыгнули туда где она еще неизвестна и пытаемся с ней работать)

чтоб в конкретном примере сказать чем заменить goto для начала нужно составить блок схему, пока непонятно что от программы требуется

pashaumnov писал(а):главное условие это что бы были буквы латинские , а что уж там они означают без разницы.????главное что бы это было понятно всем


уверен что запись sound поймет гораздо больше людей, в отличие от записи zvuk, конечно можно обзывать это как душе угодно, хоть blabla но рекомендуется давать осмысленные имена, на английском языке

со сдвигами все проще чем кажется, пример

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

PORTB = (0x01) << i;

тут мы сдвигаем единицу на i разрядов влево и выдаем на порт B

помещая это в цикл с изменяющейся i получится бегущий огонь

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

for(char i = 0; i < 8; i++)
   {
      PORTB = (0x01) << i;
   }


если предыдущее состояние порта через ИЛИ сложить с новым значением, получим заполение единицами

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

for(char i = 0; i < 8; i++)
   {
      PORTB |= (0x01) << i;
   }


ну а работать с таймерами можно после того как будут усвоены основы
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

unalex писал(а):чтоб в конкретном примере сказать чем заменить goto для начала нужно составить блок схему, пока непонятно что от программы требуется

попробую обьяснить алгоритм работы этого участка кода с примененным goto(эта работа датчика ручника)
Спойлерm: if (in_ruchnik==1) //если датчик ручника =1 , тоесть ручник поднят
{
zvuk(); //тогда мы издаем звук
delay_ms(100); //пауза
zvuk(); // еще раз звук
delay_ms(100); // пауза
zvuk(); // звук
delay_ms(100);

//проверяем состояние датчика и сели за это время ручник опустили издаем два звуковых сигнала и переходим к опросу других
датчиков по метке goto m. начиная с датчика ручника
if (in_ruchnik==0)
{
zvuk();
delay_ms(100);
zvuk();
goto m;
}
// если за время трех сигналов в начале датчик ручника остается поднятым тоесть 1 , то переходи к циклу который мигает светодиодами. но если во время мигания светодиодами ручник опустят а они мигают по циклу около 7 секунд примерно, пока 7 секунд не закончатся ничего другого не произойде , поэтому перед каждым кругом прибалвения s стоит опять проверка датчика на 1 , и если на нем 0 тогда мы пищим спикером 2 раза и переходим на метку (m) для goto.
m1: for (s=0;s<=30;s++)
{
if (in_ruchnik==0) // датчик ручника 0
{
zvuk();
delay_ms(100);
zvuk();
goto m;
}

drayv=1;
park=1;
delay_ms(250);
drayv=0;
park=0;
delay_ms(500);
}
// если мы благополучно завершили цикл то издадим 2 звуковых синала и опять вернемся на строчку с циклом (goto m1) это нужно для того чтобы пока датчик ручника =1 он не постоянно ревел а через определенной время напоминал что ручник все еще включен. (можно конечно все это было сделать в прерывании таймера по совпадению и в обработчике прерывания написать вывод звука .но как я уже сказал таймер мне не удалось проинициализировать((( пришлось городить так. в данном случае мне кажется goto не особо вредит . или я ошибась??
zvuk1();
delay_ms(100);
zvuk1();
goto m1;
}

смысл всего этого , пока ручник =1 тоесть поднят, мы больше не чего не делаем и только мигаем светодиодами первое положение ручника равное 1 мы сигнализируем трея короткими сигналами звуковыми , затем если оно не изменяется мы напоминаем об этом двумя сигналами звуковыми через определенный промежуток времени, до тех пор пока ручник не стнет =0 тогда мы уже идем опрашивать следующие датчики .
как то так
можно было бы наверное это через do while() но тогда пришлось бы хоть раз выполнить условие do а мне этого не надо.
как можно было бы обойтись без goto??
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

но тогда пришлось бы хоть раз выполнить условие do а мне этого не надо
do{...}while(exp) выполняется хотябы 1 раз, а while(exp){...} может и не выполниться, если выражение сразу же == false.
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

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

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

Сообщение unalex »

pashaumnov писал(а):как можно было бы обойтись без goto??


например так(исправил, ориентируясь не на код, а на словесное описание)

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

while(1)
{
   if(in_ruchnik == 1)                  //если ручник поднят
   {
      beep(3, 100);                  //бипкаем 3 раза
      for(s = 0; s <= 30; s++)         //и начинаем моргать
      {
         if(in_ruchnik == 0)            //проверяя при этом ручник
         {
            beep(2, 100);            //если отпущен, бикнем 2 раза
            break;                  //и больше не мигаем
         }
         
         drayv = 1;
         park = 1;
         delay_ms(250);
         drayv = 0;
         park = 0;
         delay_ms(500);
      }
      beep(2, 100);                  //если отмигали, бикнем 2 раза
      continue;                     //снова проверяем ручник
   }
   else if(in_ruchnik == 0) beep(2, 100);   //если отпущен, бикнем 2 раза
   
   //и начинаем опрос других кнопок
}
Последний раз редактировалось unalex Ср янв 22, 2014 20:24:00, всего редактировалось 1 раз.
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

тут наверное ошибка в логике программы

//проверяем состояние датчика и сели за это время ручник опустили издаем два звуковых сигнала и переходим к опросу других
датчиков по метке goto m. начиная с датчика ручника
if (in_ruchnik==0)
{
zvuk();
delay_ms(100);
zvuk();
goto m;
}


потому что если ручник опущен, программа будет постоянно возвращаться на опрос ручника, не опрашивая другие кнопки
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

нет не ошибка, просто я кидал программу по готу на опрос клавных датчиков. а это были 1 ручник, 2 селектор (когда нажимешь кнопочку что бы подвинуть ручник акпп) 3 это ряд датчиков которые показывают положение селектора и индицируют это светодиодами.
а я так понимаю beep это типо мой zvuk?
или надо вот это вставить в начале перед майн

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

void sound(unsigned char duration, unsigned char hi_cycle, unsigned char lo_cycle)
{
   while(duration)
   {
      PORTB.6=1;
      delay_us(hi_cycle);
      PORTB.6=0;
      delay_us(lo_cycle);
      duration--;
   }

и вместо beep надо писать sound??

кое что попробовал и выяснилось кое что интересное
delay_us(hi_cycle); //тут us може быть только число , ей присваивать переменную нельзя.
не работает поэтому void sound(unsigned char duration, unsigned char hi_cycle, unsigned char lo_cycle) сокращаем до void sound(unsigned char duration, )
вот с ms работает переменная.
и заодно попробовал тот код который вы мне написали я добавлю в ваших коментах то что он делает и то что надо делать

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

while(1)
{
   if(in_ruchnik == 1)                  //если ручник поднят//правильно
   {
      beep(3, 100);                  //бипкаем 3 раза   //правильно
      for(s = 0; s <= 30; s++)         //и начинаем моргать  //правильно
      {
         if(in_ruchnik == 0)            //проверяя при этом ручник  //правильно
         {
            beep(2, 100);            //если отпущен, бикнем 2 раза
            break;                  //и больше не мигаем //выходим из цикла и проверям снова датчики, правеильно
         }
         
         drayv = 1;
         park = 1;
         delay_ms(250);
         drayv = 0;
         park = 0;
         delay_ms(500);
      }
      beep(2, 100);                  //если отмигали, бикнем 2 раза //правилльно     
      continue;                     //снова проверяем ручник   // а вот тут нестыковка , бикнули два раза затем снова идем по этой команде на  if(in_ruchnik  == 1)   {  beep(3, 100);}   и бикаем еще 3 раза , а нам нужно что бы бикнули 2 раза и начали выполнят цикл for , как раз туда нас отправлял goto
 
   else if(in_ruchnik == 0) beep(2, 100);   //если отпущен, бикнем 2 раза //а тут получается что если ручник опущен и небыл поднят вообще всеравно пищим 2 раза, и потом опрашиваем остальные датчики и если везде по 0ям то снова тут пищим 2 раза, хотя при опущеном ручнике должно все молчать и тихо проверять состояние датчиков .(два раза  пикнуть если ручник был 1 и стал 0, а не все время)

   
   //и начинаем опрос других кнопок
}

так как же нам обойтись тут без gooto при услвии что таймером мы не пользуемся.???
Последний раз редактировалось pashaumnov Чт янв 23, 2014 01:33:16, всего редактировалось 2 раза.
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

pashaumnov писал(а):а я так понимаю beep это типо мой zvuk?


нет, beep это функция издающая несколько звуков sound подряд

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

void sound(unsigned char duration, unsigned char hi_cycle, unsigned char lo_cycle)
{
   while(duration)
   {
      PORTB.6=1;
      delay_us(hi_cycle);
      PORTB.6=0;
      delay_us(lo_cycle);
      duration--;
   }

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

void beep(char times, char wait)
{
   while(times)
   {
      sound();
      delay_ms(wait);
      times--;
   }
}
Последний раз редактировалось unalex Чт янв 23, 2014 01:36:48, всего редактировалось 3 раза.
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

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

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

Сообщение unalex »

дальше можно пойти двумя путями
либо сначала довести до ума остальную часть программы, пока не используя таймер, либо заняться изучением таймера
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Ответить

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