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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Maximka_18
Открыл глаза
Сообщения: 50
Зарегистрирован: Пт ноя 26, 2010 23:12:18

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

Сообщение Maximka_18 »

Здравствуйте!
кто может прокомментировать код на Си?

Очень нужно, думаю многим пригодится :)

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

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>

#include "font.h"

const prog_char message[] = " \003\001 Hello World! Write message here! ";
unsigned char message_length = 0;

unsigned int display_idx = 0;
unsigned char scan_idx = 0;

unsigned int signal_cnt = 0;
unsigned int speed = 200;

unsigned char display[8] = {0,0,0,0,0,0,0,0};

SIGNAL(SIG_OVERFLOW0) {
   if(PIND & _BV(PIND6)) {
      signal_cnt++;
   } else {
      speed = 200;
   }

   if(signal_cnt>speed) {
      signal_cnt = 0;

      speed -= 40;
      if( speed < 40 ) {
         speed = 40;
      }

      unsigned char i;
      for(i=0; i<8; i++) {
         unsigned char char_idx = (display_idx+i)%4;
         unsigned char msg_idx = ((display_idx+i-char_idx)/4)%message_length;
         display[i] = pgm_read_byte(font+(pgm_read_byte(message+msg_idx))*4+char_idx);
      }

      display_idx++;
      if(display_idx>(message_length+2)*4-9) {
         display_idx = 0;
      }
   }

   PORTB = ~(0x000000001 << scan_idx);
   PORTD = display[scan_idx];

   scan_idx++;
   if(scan_idx>6) {
      scan_idx = 0;
   }
}


int main(void) {
   message_length = strlen_P(message);
   signal_cnt = speed+1;

   DDRB = 0b01111111;
   PORTB= 0b01111111;
   DDRD = 0b00011111;
   PORTD= 0b00000000;

   TCNT0 = 0;
   TIMSK = _BV(TOIE0);
   TCCR0 = 3;

   sei();

   for(;;) {
      asm("sleep");
   }

   return 0;
}
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Gudd-Head писал(а):А у меня sprintf() сожрало больше килобайта (!) флэш-памяти :(
А так и должно быть. Даже за два может перевалить, если полная поддержка всех форматов сделана. Стека — зависит от реализации, в avr-gcc он есть байт двадцать в варианте без плавающих форматов и байт сорок с плавающими.

*printf по сути интерпретаторы простого языка управления выводом. Если они используются только с форматными строками вида "%d", а место во флеше жмёт, то лучше itoa() использовать или вообще вручную.
*printf становятся интересными когда кило-два флеша не жалко, чтобы позволить себе писать

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

    printf( "foo = %5d (%04X), moo = %+dV", var1, var1, var2);
вместо

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

    put_str( "foo = " );
    put_int( var1 ); // да, тут ещё надо как-то объяснить, что короткие числа надо дополнять до 5 знаков пробелами
    put_str( " (" );
    put_hex( var1 ); // а тут нужно вывести старшие незначащие нули до ширины поля 4 знака
    put_str( "), moo = " );
    put_int( var2 ); // а тут пробелами дополнять не надо, но если число положительное, то перед ним тоже надо знак нарисовать
    put_char( 'V');

Я уже не говорю про

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

    int a;
    printf( "%*c", a, 'I');
которое означает приблизительно

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

    if( a > 0 ) {
        int b = a;         // a ещё будет нужно ниже
        do put_char( ' ' ); while( --b);
    }
    put_char( 'I' );
    if( a < 0 ) {
        do put_char( ' ' ); while( ++a);
    }
Да, не всегда нужно аж такое, но программируемую ширину поля вывода я иногда использую :-)
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Maximka_18
Открыл глаза
Сообщения: 50
Зарегистрирован: Пт ноя 26, 2010 23:12:18

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

Сообщение Maximka_18 »

А мне кто нить поможет? :? :cry:
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Maximka_18 писал(а):А мне кто нить поможет?

А зачем?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

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

Сообщение lix »

Gudd-Head писал(а):
Maximka_18 писал(а):А мне кто нить поможет?

А зачем?


а за что? :)))

это вывод на сообщения на светодиодную матрицу, да. :)
Maximka_18
Открыл глаза
Сообщения: 50
Зарегистрирован: Пт ноя 26, 2010 23:12:18

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

Сообщение Maximka_18 »

:dont_know:
Аватара пользователя
asteroid7
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

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

Сообщение asteroid7 »

Комментирую:

Код приведён не полностью. Стиль хороший, читабельный. Прерывание по переполнению таймера задействовано. Присутствует излишество в описании типов переменных, но это не портит общее восприятие программы.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

:))) :))) :)))
молодца, Asteroid!
Ставим плюсы: )
Аватара пользователя
Liv
Вымогатель припоя
Сообщения: 525
Зарегистрирован: Сб сен 20, 2008 12:12:30
Откуда: Minsk
Контактная информация:

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

Сообщение Liv »

Maximka_18 писал(а):кто может прокомментировать код на Си?


Много магических чисел. Что такое 40? А 200? Нужно определить константы типа MIN_SPEED и т.д.
Ну и очень круто написано вот это "0x000000001 << scan_idx" :) Почему не "1 << scan_idx"?
Maximka_18
Открыл глаза
Сообщения: 50
Зарегистрирован: Пт ноя 26, 2010 23:12:18

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

Сообщение Maximka_18 »

Liv писал(а):
Maximka_18 писал(а):кто может прокомментировать код на Си?


Много магических чисел. Что такое 40? А 200? Нужно определить константы типа MIN_SPEED и т.д.
Ну и очень круто написано вот это "0x000000001 << scan_idx" :) Почему не "1 << scan_idx"?


вот поэтому я и жду комментариев, чтобы понять что лишнее.
Спасибо)
:wink:
Maximka_18
Открыл глаза
Сообщения: 50
Зарегистрирован: Пт ноя 26, 2010 23:12:18

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

Сообщение Maximka_18 »

Liv писал(а):
Maximka_18 писал(а):кто может прокомментировать код на Си?


Много магических чисел. Что такое 40? А 200? Нужно определить константы типа MIN_SPEED и т.д.
Ну и очень круто написано вот это "0x000000001 << scan_idx" :) Почему не "1 << scan_idx"?


вот поэтому я и жду комментариев, чтобы понять что лишнее.
Спасибо)
:wink:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

если подключаете interrupt.h, то signal.h подключать не надо. более того, макрос SIGNAL "снаят с производства" и рекомендуется использовние макроса ISR. все "сигналы" - устаревшее, сохранено только для совместимости со старыми проектами
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

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

Сообщение shurikss123 »

Люди помогите плиз, нужно вот что

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


uint8_t New; //есть переменная
uint8_t Data;
New = PINB & 0x03; //известно что будут приниматься байты 0х01, 0х10,0х11,0х00
   for (i=0;i<=3;i++)
   {
          Data = ? ; //как зделать так чтоб значение data было в таком виде 0b01101100 или в 0x6C
        }
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

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

Сообщение lix »

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

Data = 0x6C


%) не понятно, что надо
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

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

Сообщение shurikss123 »

ой спутался,
из четырех 0х01, 0х02,0х03,0х00
преврвтить волшебным образом одно одно 01101100 - 0x6C
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

shurikss123 писал(а):ой спутался,
из четырех 0х01, 0х02,0х03,0х00
преврвтить волшебным образом одно одно 01101100 - 0x6C

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

Data = 0;
for(uint8_t i=0; i<4; i++){
   New = PINB & 0x03;
   Data <<= 2;
   Data |= New;
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

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

Сообщение shurikss123 »

ARV писал(а):
shurikss123 писал(а):ой спутался,
из четырех 0х01, 0х02,0х03,0х00
преврвтить волшебным образом одно одно 01101100 - 0x6C

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

Data = 0;
for(uint8_t i=0; i<4; i++){
   New = PINB & 0x03;
   Data <<= 2;
   Data |= New;
}


ой спасибо а то я чета чайник на сегодня перегрел чтением, книг
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

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

Сообщение shurikss123 »

Всех с наступившим новым годом.

подскажите пожл. как мне конвертировать HEX 0x08e6 в DEC 2278.

пробывал всякие bcd2dec bin2dec, результат не тот
а вообще я радио мучу там формула такая

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

           
ra=0x08e6;//dec-2278
temp=ra;
temp=temp*50;//dec-113900
temp=(temp-10700);//dec-103200-103,2 fm

все работает, ток вот на дисплей нормально инфу ввывести не могу
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
xVekx
Встал на лапы
Сообщения: 125
Зарегистрирован: Вс мар 01, 2009 20:41:19

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

Сообщение xVekx »

Народ кто работал с http://www.roland-riegel.de/sd-reader/index.html отзовитесь
Начал портировать данные исходники на XMEGA128A3 в IAR.

C sd_raw разобрался все норма карточка пашет =).

Что делать с ?????
Fatal Error[Pe035]: #error directive: "Endianess undefined! Please define LITTLE_ENDIAN=1 or BIG_ENDIAN=1." S:\WORK\MicroSD_FAT_XMEGA128A3_USART_CP2102_USB\MSDFXUCU_002_port_sd_raw\byteordering.h 69.

(про прямой и обратный порядок данных я понял).
ТАК КАКОЙ выбрать LITTLE_ENDIAN=1 or BIG_ENDIAN=1??

shurikss123
Тип переменой какой ????
Если int32 вам читать про LITTLE_ENDIAN=1 or BIG_ENDIAN=1.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

shurikss123 писал(а):Всех с наступившим новым годом.

подскажите пожл. как мне конвертировать HEX 0x08e6 в DEC 2278.

пробывал всякие bcd2dec bin2dec, результат не тот
а вообще я радио мучу там формула такая

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

           
ra=0x08e6;//dec-2278
temp=ra;
temp=temp*50;//dec-113900
temp=(temp-10700);//dec-103200-103,2 fm

все работает, ток вот на дисплей нормально инфу ввывести не могу

например, так:

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

printf("%d",ra);
:)))
вы не путайте присваивание значения в шестнадцатеричном формате с самим числом...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

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