Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

vitalik_1984 писал(а):Самый маленький код.Ведь как по условиям места мало вот я и поставил экономию места
а у меня размер кода равен 172 байта для кода urry при оптимизации -Os... ну и чуть поменьше для альтернативного варианта. а если в коде urry исправить явный ляп в предпоследнем return arr[1]; на более логичный return arr[0]; как во всех предыдущих случаях, то разница становится вообще несущественной - то ли 2, то ли 4 байта...
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Реклама
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Сообщение juzik »

Какие камни и версии gcc?
Реклама
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

ну, камень atmega88 - не думаю, что это принципиально :) а версия WinAVR 20100110 - довольно древненькая, но надежненькая :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Сообщение juzik »

Мастер Ломастер писал(а):ну, камень atmega88 - не думаю, что это принципиально :)
Если только не в pgmspace. Хотя это здесь не вариант. Так, мысли в слух :)
Мастер Ломастер писал(а):а версия WinAVR 20100110 - довольно древненькая, но надежненькая :)))
А другой вроде нету..
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

juzik писал(а):А другой вроде нету..
как WinAVR - нету, но принципиально имеются и более свежие (и более продвинутые) сборки AVR-GCC. например, на электрониксе некто Klen делает свои сборки...
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Реклама
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Сообщение juzik »

Ну я имел в виду оф. версии, http://winavr.sourceforge.net/
Реклама
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

официально по той ссылке надо повесить табличку "Проект закрыт. Все ушли в Atmel" :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Я в пятой версии студии компилил.массив глобально обьявлен.
Пробовал локально в майне определить 292 байта стала занимать:)Глобально 290
В поисках истины человек развивается.
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

я объявил массив volatile int arr[3]; а основной код сделал таким:

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

int main(void){
   PORTB = sfSelect(arr);
}
если 5-я студия делает аж 290 байт - фтопку ее :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Сообщение juzik »

Студия то тут причем? Она просто дергает соответствующие бинарники из gcc toolchain'а. Надо глянуть makefile, мб лажа в билде.
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

тулчейн-то там уже не WinAVR-овский, а как бы "обновленный". может, все дело в нем как раз :))) а это уже студия, т.к. тулчейн с некоторых пор ее неотъемлемая часть
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

что может быть неправильного в этой команде ? :dont_know:

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

switch (i) 
      {
      case 0: PORTC=0b00101111&m(i); break;
      case 1: PORTC=0b00011111&m(i); break;
      }; 
компилятор выдает предупреждение
Изображение
Вложения
77.jpg
(15.1 КБ) 457 скачиваний
Tell Me The Truth
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Сообщение juzik »

Сначала подумал что бинарная константа трактуется как-то странно, но ошибся. Что такое "m"? Функция? Или макрос? Если макрос, то покажите его определение.
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

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

#include <mega8.h>
#include <delay.h>
char z=0,i=0;
char m[2]; // это массив

unsigned char is_button_pressed(void){
   unsigned char btn; // переменная для хранения первого опроса состояния
   btn = PIND.0;      // опросили первый раз
   delay_ms(15);      // задержка для подавления дребезга
   if(btn == PIND.0)  // сравниваем первое состояние и текущее
      return !btn;    // если они одинаковы, то кнопка нажата, если на пине 0
                      // (а мы возвращаем в этом случае 1)
   else
      return 0;       // а если разные - будем считать кнопку ненажатой
                      // принудительно, игнорируя реальное значение
}

void main(void)
{

PORTC=0x00;
DDRC=0x7F;

PORTD=0xFF;
DDRD=0x00;

while (1)
      {
      
      if(is_button_pressed()) {z++;while(is_button_pressed()){};};
      if (z==100) z=0;
        
        m[0]=z%10;
        m[1]=z/10;
     
      switch (i) 
      {
      case 0: PORTC=0b00101111&m(i); break;
      case 1: PORTC=0b00011111&m(i);break;
      }; 
      
      i++;
      if (i>1) i=0; 
      
     



      };
}
Tell Me The Truth
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Сообщение juzik »

m это массив, а индексация делается через оператор [], т.е.:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Семён Семёныч! :)))
СПАСИБО :beer:
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

прошу совета..............., я пытаюсь освоить мышление на языке Си...................., на данный момент пытаюсь написать прогу с помощью которой я бы мог при каждом нажатии кнопки выводить число от 0 до 99, выводить число от 0 до 9 при каждом нажатии кнопки я уже умею......., если кто может, научите меня мыслить в данном направлении.........., как правильно придумать алгоритм работы данной программы ?
http://4put.ru/pictures/max/274/842090.jpg
Tell Me The Truth
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Сообщение juzik »

Я так понимаю осталось доделать часть, которая будет выводить десятки?
Любой число в данном контексте можно представить как

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

number = dec * 10 + ed
где number собственно само число, dec - десятки, ed - единицы.
Значит Вам надо число нацело поделить на 10. Это будут Ваши десятки, которые вывести на табло, используя методы для отображения единиц, но выбраб другую лампу.

А мышление я думаю везде одинаковое должно быть -- придумать алгоритм. Язык программирования позволит лишь его описать.
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

juzik писал(а):Я так понимаю осталось доделать часть, которая будет выводить десятки?
в вышеприведенной программе я уже это сделал

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

m[0]=z%10;
 m[1]=z/10;
только вот прога не работает :(
Tell Me The Truth
Встал на лапы
Сообщения: 128
Зарегистрирован: Пт сен 23, 2011 23:49:20
Откуда: Симферополь, Украина

Сообщение juzik »

Кажется я понял в чем затык.

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

while(1)
...
PORTC = (m[i] & 0x0F) | 1 << (i++ % 2 + 4);
...
Это вывод каждого разряда за 1 проход. Что он делает:
m -- берет значение разряда десятки\единицы
(m & 0x0F) -- убираем лишние данные, не относящиеся к выводимому значению (можно опустить)
1 << (i++ % 2) -- для стробирования ламп надо подать 1 на PC4 или PC5, в заисимости от того что выводить -- десятки или единицы. Инструкция i++ % 2 убирает нужду добавлять оператор if
m | 1 << (i++ % 2) -- битовая сумма операторов, что в конечном итоге даст нужно число на порте
Ответить

Вернуться в «Разные вопросы по МК»