Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн окт 25, 2010 11:10:46
ARV, спасибо, вроде разобрался.
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Код: Выделить всё
PORTB.0=1; //Включаем светодиод на 0 выходе порта В
delay_ms(125); //Делаем задержку на 125 миллисекунд
PORTB.0=0; //Выключаем светодиод на выходе 0 порта В
delay_ms(125); //Делаем задержку на 125 миллисекунд
.... и так далее меняется
вот понимаете,микроконтроллер от балды просто так не может взять программу!надо писать к примеру три варианта включения светодиодов,а потом деаль функцию которая будет включать циклы ,к примеру есть циклы :1,2,3,4,5 вы можете включить их в любом порядке:1,3,2,5,4 или другой вариант...a.garkin писал(а):Я конечно извиняюсь если задам до безумия тупой вопрос, есть CodeVision в ней написана гирлянда,
т.е порядок такой (на форуме не раз гворилось)Я конечно понимаю что код до безумия простой (все таки азы), как бы мне сделать когда все мои программы по порядку заканчиваются, что в следующий цикл/повтор начинался в случайном порядке (чтобы программы случайным образом выбирались). Т.е как я понимаю все мои программы надо каким то образом обозвать, а дальше сделать условие к примеру +1...Код: Выделить всё
PORTB.0=1; //Включаем светодиод на 0 выходе порта В delay_ms(125); //Делаем задержку на 125 миллисекунд PORTB.0=0; //Выключаем светодиод на выходе 0 порта В delay_ms(125); //Делаем задержку на 125 миллисекунд .... и так далее меняется
Ткните куда посмотреть, или тут надо через переменные плясать? Или условиями делать? if, else???
Прочитать то прочитал "CodeVision в вопросах и ответах", но толком ниче не понял так примерно... Зы готовое решение не надо, тока натолкните, хочу сам дойти... Желательно не до точки с ручкой)))![]()
Зы спасибо Всем!
А Вы сделайте по-простому. Каждую программу оформите в виде функции. Есть библиотечная функция rand - генератор случайных чисел. И вызывайте ту функцию, номер которой выпал. Например так:a.garkin писал(а):как бы мне сделать ... чтобы программы случайным образом выбирались...
Код: Выделить всё
#include <mega8.h>
#include <stdlib.h>
void girlyanda0(void){}
void girlyanda1(void){}
void girlyanda2(void){}
// .....
void girlyanda7(void){}
void main(void)
{
unsigned int f_number;
while (1)
{
f_number = rand()>>12;
switch (f_number)
{
case 0:
girlyanda0();
break;
case 1:
girlyanda1();
break;
case 2:
girlyanda2();
break;
// ...
case 7:
girlyanda7();
break;
default:
break;
}
};
}
так наверно будет проще,пробуйте ,скоро тоже собиру гирлянду))))Барсик писал(а):А Вы сделайте по-простому. Каждую программу оформите в виде функции. Есть библиотечная функция rand - генератор случайных чисел. И вызывайте ту функцию, номер которой выпал. Например так:a.garkin писал(а):как бы мне сделать ... чтобы программы случайным образом выбирались...Код: Выделить всё
#include <mega8.h> #include <stdlib.h> void girlyanda0(void){} void girlyanda1(void){} void girlyanda2(void){} // ..... void girlyanda7(void){} void main(void) { unsigned int f_number; while (1) { f_number = rand()>>12; switch (f_number) { case 0: girlyanda0(); break; case 1: girlyanda1(); break; case 2: girlyanda2(); break; // ... case 7: girlyanda7(); break; default: break; } }; }
Код: Выделить всё
(ADC0 * 957) / 1000Код: Выделить всё
(ADC0 * 245) / 256во-первых, если следовать стандартам Си, это выражение не должно давать прироста размера кода, но и не должно давать верного результата, т.к. в процессе вычислений будут переполнения. во-вторых. если CodeVision такой нестандартно умный компилятор, он мог и сам привести все операнды выражения к типу long - но тогда увеличение размера кода вполне обоснованно...Gudd-Head писал(а):Внимание, вопрос:
Почему если записать выражение в одну строчку:
res = (ADC0*957-268000)/1000;
Размер кода увеличивается в 2 раза(с 230 до 450 слов)???
а то, что 268000 не влезает в int вас не смущает? res какого типа? не смущает?Gudd-Head писал(а):Всем спасибо, буду думать. Кстати, если записать в три строчки, то тогда происходит переполнение, что и понятно:
res = ADC0*957 //(поскольку здесь вылезаем за 65535).
res = res - 268000;
res = res/1000;
Насчёт сокращения дроби с .../1000 до .../256 спасибо, в понедельник попробую.
Да, 268000 прямо не влезает в res, которая int. Ну а как он там проводит вычисления, это его дело. Главное что в конечном итоге получается число, которое прекрасно вписывается в int. Хотя, наверное, правильно было бы обозвать её как long int.ARV писал(а):а то, что 268000 не влезает в int вас не смущает? res какого типа? не смущает?
в том-то и дело, нифига не получается... как вы думаете, чему будет равна переменная var в следующем коде:Gudd-Head писал(а):Да, 268000 прямо не влезает в res, которая int. Ну а как он там проводит вычисления, это его дело. Главное что в конечном итоге получается число, которое прекрасно вписывается в int. Хотя, наверное, правильно было бы обозвать её как long int.ARV писал(а):а то, что 268000 не влезает в int вас не смущает? res какого типа? не смущает?
Код: Выделить всё
int a = 2000;
int b = 20;
int var = a * b / 1000;А я объявлю переменные как unsigned int и буду правARV писал(а):если вы думаете, что 40 - вы не правы!
а если b = 50 ??? тоже без знака все будет ништяк?Барсик писал(а):А я объявлю переменные как unsigned int и буду правARV писал(а):если вы думаете, что 40 - вы не правы!Нахрен мне старший разряд отдавать под знак, когда у меня арифметика беззнаковая
Будет жопа ! В смысле, 34.ARV писал(а):а если b = 50 ???