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 миллисекунд
.... и так далее меняется
Ткните куда посмотреть, или тут надо через переменные плясать? Или условиями делать? if, else???
Прочитать то прочитал "CodeVision в вопросах и ответах", но толком ниче не понял так примерно... Зы готовое решение не надо, тока натолкните, хочу сам дойти... Желательно не до точки с ручкой)))
Зы спасибо Всем!
- Сериг
- Это не хвост, это антенна
- Сообщения: 1451
- Зарегистрирован: Пт фев 19, 2010 19:39:28
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
вот понимаете,микроконтроллер от балды просто так не может взять программу!надо писать к примеру три варианта включения светодиодов,а потом деаль функцию которая будет включать циклы ,к примеру есть циклы :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 в вопросах и ответах", но толком ниче не понял так примерно... Зы готовое решение не надо, тока натолкните, хочу сам дойти... Желательно не до точки с ручкой)))![]()
Зы спасибо Всем!
вот собсна и все ,если возникнут вопросы по этой теме стучитесь в личку,и за ранее у вас скайп есть?
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) / 256245 / 256 = 0,95703125
что отличается от 0,957 приблизительно на 0.03%
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 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
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 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 в вопросах и ответах
Да, 268000 прямо не влезает в res, которая int. Ну а как он там проводит вычисления, это его дело. Главное что в конечном итоге получается число, которое прекрасно вписывается в int. Хотя, наверное, правильно было бы обозвать её как long int.ARV писал(а):а то, что 268000 не влезает в int вас не смущает? res какого типа? не смущает?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
в том-то и дело, нифига не получается... как вы думаете, чему будет равна переменная var в следующем коде:Gudd-Head писал(а):Да, 268000 прямо не влезает в res, которая int. Ну а как он там проводит вычисления, это его дело. Главное что в конечном итоге получается число, которое прекрасно вписывается в int. Хотя, наверное, правильно было бы обозвать её как long int.ARV писал(а):а то, что 268000 не влезает в int вас не смущает? res какого типа? не смущает?
Код: Выделить всё
int a = 2000;
int b = 20;
int var = a * b / 1000;если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
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
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
а если b = 50 ??? тоже без знака все будет ништяк?Барсик писал(а):А я объявлю переменные как unsigned int и буду правARV писал(а):если вы думаете, что 40 - вы не правы!Нахрен мне старший разряд отдавать под знак, когда у меня арифметика беззнаковая
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
Будет жопа ! В смысле, 34.ARV писал(а):а если b = 50 ???
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 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;


