Страница 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');
Я уже не говорю про
которое означает приблизительно
Код: Выделить всё
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
А мне кто нить поможет?

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
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт дек 23, 2010 21:15:32
asteroid7
Комментирую:
Код приведён не полностью. Стиль хороший, читабельный. Прерывание по переполнению таймера задействовано. Присутствует излишество в описании типов переменных, но это не портит общее восприятие программы.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт дек 24, 2010 21:39:50
ibiza11
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"?
вот поэтому я и жду комментариев, чтобы понять что лишнее.
Спасибо)

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

Почему не "1 << scan_idx"?
вот поэтому я и жду комментариев, чтобы понять что лишнее.
Спасибо)

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
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
все работает, ток вот на дисплей нормально инфу ввывести не могу
например, так:

вы не путайте присваивание значения в шестнадцатеричном формате с самим числом...