Страница 8 из 386

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

Добавлено: Ср дек 22, 2010 21:45:07
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;
}

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

Добавлено: Ср дек 22, 2010 22:06:22
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);
    }
Да, не всегда нужно аж такое, но программируемую ширину поля вывода я иногда использую :-)

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

Добавлено: Чт дек 23, 2010 16:45:19
Maximka_18
А мне кто нить поможет? :? :cry:

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

Добавлено: Чт дек 23, 2010 16:51:14
Gudd-Head
Maximka_18 писал(а):А мне кто нить поможет?
А зачем?

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

Добавлено: Чт дек 23, 2010 16:53:01
lix
Gudd-Head писал(а):
Maximka_18 писал(а):А мне кто нить поможет?
А зачем?
а за что? :)))

это вывод на сообщения на светодиодную матрицу, да. :)

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

Добавлено: Чт дек 23, 2010 17:21:40
Maximka_18
:dont_know:

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

Добавлено: Чт дек 23, 2010 21:15:32
asteroid7
Комментирую:

Код приведён не полностью. Стиль хороший, читабельный. Прерывание по переполнению таймера задействовано. Присутствует излишество в описании типов переменных, но это не портит общее восприятие программы.

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

Добавлено: Пт дек 24, 2010 21:39:50
ibiza11
:))) :))) :)))
молодца, Asteroid!

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

Добавлено: Сб дек 25, 2010 18:33:46
Liv
Maximka_18 писал(а):кто может прокомментировать код на Си?
Много магических чисел. Что такое 40? А 200? Нужно определить константы типа MIN_SPEED и т.д.
Ну и очень круто написано вот это "0x000000001 << scan_idx" :) Почему не "1 << scan_idx"?

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

Добавлено: Сб дек 25, 2010 21:18:40
Maximka_18
Liv писал(а):
Maximka_18 писал(а):кто может прокомментировать код на Си?
Много магических чисел. Что такое 40? А 200? Нужно определить константы типа MIN_SPEED и т.д.
Ну и очень круто написано вот это "0x000000001 << scan_idx" :) Почему не "1 << scan_idx"?
вот поэтому я и жду комментариев, чтобы понять что лишнее.
Спасибо)
:wink:

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

Добавлено: Сб дек 25, 2010 21:18:40
Maximka_18
Liv писал(а):
Maximka_18 писал(а):кто может прокомментировать код на Си?
Много магических чисел. Что такое 40? А 200? Нужно определить константы типа MIN_SPEED и т.д.
Ну и очень круто написано вот это "0x000000001 << scan_idx" :) Почему не "1 << scan_idx"?
вот поэтому я и жду комментариев, чтобы понять что лишнее.
Спасибо)
:wink:

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

Добавлено: Сб дек 25, 2010 21:56:04
ARV
если подключаете interrupt.h, то signal.h подключать не надо. более того, макрос SIGNAL "снаят с производства" и рекомендуется использовние макроса ISR. все "сигналы" - устаревшее, сохранено только для совместимости со старыми проектами

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

Добавлено: Пн дек 27, 2010 20:45:45
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
        }

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

Добавлено: Пн дек 27, 2010 20:59:48
lix

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

Data = 0x6C
%) не понятно, что надо

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

Добавлено: Пн дек 27, 2010 21:05:42
shurikss123
ой спутался,
из четырех 0х01, 0х02,0х03,0х00
преврвтить волшебным образом одно одно 01101100 - 0x6C

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

Добавлено: Пн дек 27, 2010 21:27:07
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;
}

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

Добавлено: Пн дек 27, 2010 21:31:22
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;
}
ой спасибо а то я чета чайник на сегодня перегрел чтением, книг

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

Добавлено: Сб янв 01, 2011 22:07:02
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
все работает, ток вот на дисплей нормально инфу ввывести не могу

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

Добавлено: Сб янв 01, 2011 23:51:08
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.

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

Добавлено: Вс янв 02, 2011 00:14:15
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);
:)))
вы не путайте присваивание значения в шестнадцатеричном формате с самим числом...