CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
ARV, спасибо, вроде разобрался.
- Реклама
-
a.garkin
- Нашел транзистор. Понюхал.
- Сообщения: 175
- Зарегистрирован: Вт сен 29, 2009 09:28:51
- Откуда: Ульяновск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Я конечно извиняюсь если задам до безумия тупой вопрос, есть CodeVision в ней написана гирлянда,
т.е порядок такой (на форуме не раз гворилось)
Я конечно понимаю что код до безумия простой (все таки азы), как бы мне сделать когда все мои программы по порядку заканчиваются, что в следующий цикл/повтор начинался в случайном порядке (чтобы программы случайным образом выбирались). Т.е как я понимаю все мои программы надо каким то образом обозвать, а дальше сделать условие к примеру +1...
Ткните куда посмотреть, или тут надо через переменные плясать? Или условиями делать? if, else???
Прочитать то прочитал "CodeVision в вопросах и ответах", но толком ниче не понял так примерно... Зы готовое решение не надо, тока натолкните, хочу сам дойти... Желательно не до точки с ручкой)))
Зы спасибо Всем!
т.е порядок такой (на форуме не раз гворилось)
Код: Выделить всё
PORTB.0=1; //Включаем светодиод на 0 выходе порта В
delay_ms(125); //Делаем задержку на 125 миллисекунд
PORTB.0=0; //Выключаем светодиод на выходе 0 порта В
delay_ms(125); //Делаем задержку на 125 миллисекунд
.... и так далее меняется
Я конечно понимаю что код до безумия простой (все таки азы), как бы мне сделать когда все мои программы по порядку заканчиваются, что в следующий цикл/повтор начинался в случайном порядке (чтобы программы случайным образом выбирались). Т.е как я понимаю все мои программы надо каким то образом обозвать, а дальше сделать условие к примеру +1...
Ткните куда посмотреть, или тут надо через переменные плясать? Или условиями делать? if, else???
Прочитать то прочитал "CodeVision в вопросах и ответах", но толком ниче не понял так примерно... Зы готовое решение не надо, тока натолкните, хочу сам дойти... Желательно не до точки с ручкой)))
Зы спасибо Всем!
- Сериг
- Это не хвост, это антенна
- Сообщения: 1451
- Зарегистрирован: Пт фев 19, 2010 19:39:28
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
a.garkin писал(а):Я конечно извиняюсь если задам до безумия тупой вопрос, есть CodeVision в ней написана гирлянда,
т.е порядок такой (на форуме не раз гворилось)Код: Выделить всё
PORTB.0=1; //Включаем светодиод на 0 выходе порта В
delay_ms(125); //Делаем задержку на 125 миллисекунд
PORTB.0=0; //Выключаем светодиод на выходе 0 порта В
delay_ms(125); //Делаем задержку на 125 миллисекунд
.... и так далее меняется
Я конечно понимаю что код до безумия простой (все таки азы), как бы мне сделать когда все мои программы по порядку заканчиваются, что в следующий цикл/повтор начинался в случайном порядке (чтобы программы случайным образом выбирались). Т.е как я понимаю все мои программы надо каким то образом обозвать, а дальше сделать условие к примеру +1...
Ткните куда посмотреть, или тут надо через переменные плясать? Или условиями делать? if, else???
Прочитать то прочитал "CodeVision в вопросах и ответах", но толком ниче не понял так примерно... Зы готовое решение не надо, тока натолкните, хочу сам дойти... Желательно не до точки с ручкой)))![]()
Зы спасибо Всем!
вот понимаете,микроконтроллер от балды просто так не может взять программу!надо писать к примеру три варианта включения светодиодов,а потом деаль функцию которая будет включать циклы ,к примеру есть циклы :1,2,3,4,5 вы можете включить их в любом порядке:1,3,2,5,4 или другой вариант...
вот собсна и все ,если возникнут вопросы по этой теме стучитесь в личку,и за ранее у вас скайп есть?
Re: CodeVision AVR в вопросах и ответах
А Вы сделайте по-простому. Каждую программу оформите в виде функции. Есть библиотечная функция 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;
}
};
}
- Сериг
- Это не хвост, это антенна
- Сообщения: 1451
- Зарегистрирован: Пт фев 19, 2010 19:39:28
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
Барсик писал(а):А Вы сделайте по-простому. Каждую программу оформите в виде функции. Есть библиотечная функция 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;
}
};
}
так наверно будет проще,пробуйте ,скоро тоже собиру гирлянду))))
- Реклама
-
a.garkin
- Нашел транзистор. Понюхал.
- Сообщения: 175
- Зарегистрирован: Вт сен 29, 2009 09:28:51
- Откуда: Ульяновск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
СПАСИБО!!! Вроде просветление пошло... 
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: CodeVision AVR в вопросах и ответах
У меня вопрос не конкретно по CodeVision, а в принципе по СИ применительно к контроллерам.
Итак, есть кристалл со встроенным температурным датчиком и АЦП 10 бит. Формула вычисления температуры:
t(°С) = [код АЦП]*0,957 - 268.
Вводим целочисленную переменную "res" без знака длиной 2 байта (почему именно так?... поначалу просто присваивал res результат преобразования АЦП).
Просто умножить на 0,957 компилятор мне не дал (подозреваю т.к. тип не float). Посему я сделал так:
res = ADC0*957-268000;
res = res/1000;
Т.к. максимальное значение res равно 65535, до 65°С измерения корректны. Внимание, вопрос:
Почему если записать выражение в одну строчку:
res = (ADC0*957-268000)/1000;
Размер кода увеличивается в 2 раза
(с 230 до 450 слов)???
Итак, есть кристалл со встроенным температурным датчиком и АЦП 10 бит. Формула вычисления температуры:
t(°С) = [код АЦП]*0,957 - 268.
Вводим целочисленную переменную "res" без знака длиной 2 байта (почему именно так?... поначалу просто присваивал res результат преобразования АЦП).
Просто умножить на 0,957 компилятор мне не дал (подозреваю т.к. тип не float). Посему я сделал так:
res = ADC0*957-268000;
res = res/1000;
Т.к. максимальное значение res равно 65535, до 65°С измерения корректны. Внимание, вопрос:
Почему если записать выражение в одну строчку:
res = (ADC0*957-268000)/1000;
Размер кода увеличивается в 2 раза
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: CodeVision AVR в вопросах и ответах
Если уж так интересно, сравните ассемблерные файлы, которые сгенерил компилятор, и разбирайтесь с ними до упаду... 
А так... Есть одно подозрение... В первых двух строчках используется только умножение с величинами long int (четырёхбайтовая арифметика, поскольку число 268000 двумя байтами представить нельзя) далее, результат приводится к unsined int - двум байтам. Во второй строчке арифметика (деление) уже только двухбайтовая.
Когда записано одной строкой, то вся арифметика четырёхбайтовая, в том числе, и деление! А деление - не очень простая операция...
Кстати, код, который получился у меня для Вашего примера, был длиннее не в два раза, а НА 20 слов...
А так... Есть одно подозрение... В первых двух строчках используется только умножение с величинами long int (четырёхбайтовая арифметика, поскольку число 268000 двумя байтами представить нельзя) далее, результат приводится к unsined int - двум байтам. Во второй строчке арифметика (деление) уже только двухбайтовая.
Когда записано одной строкой, то вся арифметика четырёхбайтовая, в том числе, и деление! А деление - не очень простая операция...
Кстати, код, который получился у меня для Вашего примера, был длиннее не в два раза, а НА 20 слов...
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Что там и как CodeVision генерит и что подлинковывает не знаю, но вот в данном конкретном случае, если константа 0.957 не подлежит калибровке, я бы вычислял не
а
Вменяемый компилятор деление на 256 заменит на несколько пересыланий байт по регистрам. Кода займёт меньше, чем вызов процедуры деления.
245 / 256 = 0,95703125
что отличается от 0,957 приблизительно на 0.03%
Код: Выделить всё
(ADC0 * 957) / 1000Код: Выделить всё
(ADC0 * 245) / 256Вменяемый компилятор деление на 256 заменит на несколько пересыланий байт по регистрам. Кода займёт меньше, чем вызов процедуры деления.
245 / 256 = 0,95703125
что отличается от 0,957 приблизительно на 0.03%
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
во-первых, если следовать стандартам Си, это выражение не должно давать прироста размера кода, но и не должно давать верного результата, т.к. в процессе вычислений будут переполнения. во-вторых. если CodeVision такой нестандартно умный компилятор, он мог и сам привести все операнды выражения к типу long - но тогда увеличение размера кода вполне обоснованно...Gudd-Head писал(а):Внимание, вопрос:
Почему если записать выражение в одну строчку:
res = (ADC0*957-268000)/1000;
Размер кода увеличивается в 2 раза(с 230 до 450 слов)???
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: CodeVision AVR в вопросах и ответах
Всем спасибо, буду думать. Кстати, если записать в три строчки, то тогда происходит переполнение, что и понятно:
res = ADC0*957 //(поскольку здесь вылезаем за 65535).
res = res - 268000;
res = res/1000;
Насчёт сокращения дроби с .../1000 до .../256 спасибо, в понедельник попробую.
res = ADC0*957 //(поскольку здесь вылезаем за 65535).
res = res - 268000;
res = res/1000;
Насчёт сокращения дроби с .../1000 до .../256 спасибо, в понедельник попробую.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
а то, что 268000 не влезает в int вас не смущает? res какого типа? не смущает?Gudd-Head писал(а):Всем спасибо, буду думать. Кстати, если записать в три строчки, то тогда происходит переполнение, что и понятно:
res = ADC0*957 //(поскольку здесь вылезаем за 65535).
res = res - 268000;
res = res/1000;
Насчёт сокращения дроби с .../1000 до .../256 спасибо, в понедельник попробую.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: CodeVision AVR в вопросах и ответах
ARV писал(а):а то, что 268000 не влезает в int вас не смущает? res какого типа? не смущает?
Да, 268000 прямо не влезает в res, которая int. Ну а как он там проводит вычисления, это его дело. Главное что в конечном итоге получается число, которое прекрасно вписывается в int. Хотя, наверное, правильно было бы обозвать её как long int.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Gudd-Head писал(а):ARV писал(а):а то, что 268000 не влезает в int вас не смущает? res какого типа? не смущает?
Да, 268000 прямо не влезает в res, которая int. Ну а как он там проводит вычисления, это его дело. Главное что в конечном итоге получается число, которое прекрасно вписывается в int. Хотя, наверное, правильно было бы обозвать её как long int.
в том-то и дело, нифига не получается... как вы думаете, чему будет равна переменная var в следующем коде:
Код: Выделить всё
int a = 2000;
int b = 20;
int var = a * b / 1000;если вы думаете, что 40 - вы не правы! результат хоть и влезает в int, но, увы, будет удивительным образом равным -25
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
В CodeVision есть не безызвестная вставка под названием delay.h, так вот - в delay_ms(x); можно в скобках указывать переменную, а в delay_us(x) переменную использовать нельзя. Почему, и как можно это изменить подскажите?
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Re: CodeVision AVR в вопросах и ответах
А я объявлю переменные как unsigned int и буду правARV писал(а):если вы думаете, что 40 - вы не правы!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
а если b = 50 ??? тоже без знака все будет ништяк?Барсик писал(а):А я объявлю переменные как unsigned int и буду правARV писал(а):если вы думаете, что 40 - вы не правы!Нахрен мне старший разряд отдавать под знак, когда у меня арифметика беззнаковая
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
Будет жопа ! В смысле, 34.ARV писал(а):а если b = 50 ???

- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
не по адресу ваш выстрел, т.к. я тоже преследовал целью намекнуть, что с вычислениями надо быть поосторожнее. не в мой пост надо было вам целиться 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
Дык я не в Вас целился. Боже сохрани! Просто хотел обратить внимание уважаемой аудитории, что если не аккуратно относиться к арифметике, то возможны "удивительные чудеса". Типа "у меня контроллер плохой - неправильно считает"...
Поэтому, я напишу вот так, и будет счастье: var = ((long int)a) *((long int)b) / 1000;
Поэтому, я напишу вот так, и будет счастье: var = ((long int)a) *((long int)b) / 1000;


