Страница 6 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт дек 14, 2010 22:46:53
Liv
O-LED: у Вас на аватаре сегменты для цифры "0" - ровненькие, а для остальных цифр какие-то кривые. С чем это связано?
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт дек 14, 2010 22:57:02
O-LED
korr_den см личку
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт дек 14, 2010 23:41:37
avreal
O-LED писал(а):ага. переменные int прекрасно работали беззнаковыми переменными без всяких signed
Вероятно, всё-таки знаковыми, а не беззнаковыми.
"просто"
int — это предусмотренная стандартом сокращённая запись для
signed int
short — штатное сокращение для
signed short int
long — для
signed long int
Всё честно.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср дек 15, 2010 10:59:41
V2oD2o
int x = 0;
char s[17];
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
lcd_gotoxy(0,0);
lcd_puts(s);
x=0;
TCNT1H = 0xE1;
TCNT1L = 0x7A;
}
void main(void)
{
lcd_init(16);
lcd_clear();
DDRB=0b10000000;
TCCR1B=0x05;
TIMSK=0x04;
ACSR=0x80;
TCNT1H = 0xE1;
TCNT1L = 0x7A;
#asm ("sei");
while(1) { if (PINB.0) { sprintf(s, "%d ", x); x=x+1; } }
}
расчет:
1/8Мгц = 125нс на такт
125*1024=128мс на таймере /1024
1c/125мс=7812 тактов на 1с
65535-7812=57722=E17A
на PINB.0 генератор 1000Гц, программа выдает 2020..2022 на дисплее.. почему?

Re: Вопросы по С/С++ (СИ)
Добавлено: Ср дек 15, 2010 11:14:13
Gudd-Head
V2oD2o писал(а):почему?
Потому что вы не пробовали писать программу с комментариями???
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср дек 15, 2010 11:54:06
ARV
V2oD2o писал(а):Код: Выделить всё
while(1) { if (PINB.0) { sprintf(s, "%d ", x); x=x+1; } }
на PINB.0 генератор 1000Гц, программа выдает 2020..2022 на дисплее.. почему?

то есть вы считаете, что за 0,5 миллисекунды, пока у вас 1 на пине, x увеличится только на 1? у вас же все это дело в цикле, т.е. получается, пока 1 на пине, у вас может бог знает сколько раз цикл провернуться!
кстати, в прерываниях не рекомендуется заниматься выводом на дисплей. вообще не рекомендуется использовать функции, особенно когда неизвестно, сколько времени они занимают.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср дек 15, 2010 12:58:50
V2oD2o
Спасибо за ответ!
пытаюсь разобраться далее:
Код: Выделить всё
int x, y = 0;
char s[17];
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
x=0; //обнуляем отсчет за 1с
y=1; //обновить дисплей?
TCNT1H = 0xE1; //ставим таймер на точку 57722
TCNT1L = 0x7A;
}
void main(void)
{
lcd_init(16); //LCD ini
lcd_clear();
DDRB=0b10000000; // первый бит PORTB - вход
TCCR1B=0x05; // делим таймер на 1024
TIMSK=0x04;
ACSR=0x80;
TCNT1H = 0xE1; // ставим стартовую точку 57722
TCNT1L = 0x7A;
#asm ("sei");
while(1) {
if (y==1) { lcd_gotoxy(0,0); lcd_puts(s); y=0; } // 1 - обновляем, 0 - пропускаем
if (PINB.0) { sprintf(s, "%d ", x); x++; while(PINB.0) {} } // PINC.0=1 - прибавляем 1 к частоте, циклим такт
}
}
все четко считает.. но только до 2800 Гц.. далее занижает - чем дальше тем больше, видимо где то у меня слишком много времени занимает просчет
есть идеи ?
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср дек 15, 2010 13:11:30
Gudd-Head
V2oD2o писал(а):видимо где то у меня слишком много времени занимает просчет

есть идеи ?
Сколько времени, по-вашему, занимает функция sprintf?
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср дек 15, 2010 14:04:02
lix
вот примерный вариант без комментов

Re: Вопросы по С/С++ (СИ)
Добавлено: Сб дек 18, 2010 18:08:19
Кислый
всем привет. как в си коде для авр напрямую обратиться к ячейке памяти озу ?
на ассемблере пример видел. а на си - нет.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб дек 18, 2010 18:19:18
ARV
Кислый писал(а):всем привет. как в си коде для авр напрямую обратиться к ячейке памяти озу ?
на ассемблере пример видел. а на си - нет.
Код: Выделить всё
unsigned char *ptr;
ptr = (void*)123; // будем обращаться к ячейке с адресом 123
*ptr = 0; // обнулили эту ячейку
*ptr = 20; // записали туда 20
ptr++; // теперь будем работать со 124-й ячейкой
*ptr *= 2; // удвоим содержимое ячейки с адресом 124
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб дек 18, 2010 18:21:18
lix
Кислый писал(а):всем привет. как в си коде для авр напрямую обратиться к ячейке памяти озу ?
на ассемблере пример видел. а на си - нет.
в си это не надо. тебе зачем?
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб дек 18, 2010 19:41:49
Кислый
ARV,
т.е. мы в любом случае должны выделить место для указателя ? но при этом не контролируем куда он запишется.. замечательно ))
Lix,
тебе зачем?
бесит меня неконтроллируемое распределение памяти при написании кода на си. была мысль обращаться так ( по адресам ) к РОН, РВВ и ОЗУ.
время требует си, а душа ассемблера ))
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб дек 18, 2010 19:47:17
Кислый
или ну его нафиг и да здраствует Алгоритм Билдер ?
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб дек 18, 2010 19:50:24
ARV
Кислый писал(а):ARV,
т.е. мы в любом случае должны выделить место для указателя ? но при этом не контролируем куда он запишется.. замечательно ))
вы, когда по телефону звоните, тоже не контролируете по каким парам в кабеле сигнал идет, какими релюхами коммутируется... но это ведь не мешает вам говорить?
распределение памяти четко регламентировано типом переменной. а много ли вам будет счастья от того, что вы будете знать адрес переменной?! он вам нужен? если да - вот вам указатель, а если нет - ну и нафига?!
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб дек 18, 2010 19:58:19
Кислый
аналогия интересная. но! в ассемблере мы заранее знаем куда и что записываем. В си мы сначала записывам, потом только узнаем куда.. соответственно по аналогии с телефонным разговором : на телефонном аппарате кнопка "позвонить КОТУ". нажимаем, звоним, разговариваем (разговариваем с котом о_0) . он при этом только у самого кота узнаем что он в африке.. и мы попали на денюшку (( нафиг
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб дек 18, 2010 20:11:50
Кислый
распределение памяти четко регламентировано типом переменной
кстати не уверен. читал, просто порядком обьявления переменных разных типов можно выиграть некоторое количество памяти.. ибо стандарт с не требует от компилятора беспросветного размещения переменных в памяти. если сохранил - напишу.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб дек 18, 2010 20:26:16
ARV
Кислый писал(а):распределение памяти четко регламентировано типом переменной
кстати не уверен. читал, просто порядком обьявления переменных разных типов можно выиграть некоторое количество памяти.. ибо стандарт с не требует от компилятора беспросветного размещения переменных в памяти. если сохранил - напишу.
не читайте перед ужином большевистских газет
во-первых, ваша аналогия со звонком - не верна. правильная аналогия, не знать не КОМУ звоним, а КАК звоним. Си гарантирует, что в переменной будет сохранено то, что вы туда положили до тех пор, пока эта переменная существует. назначение переменной - ХРАНИТЬ данные. ГДЕ и КАК - это уже второстепенно и не сильно вас должно заботить. если генерал будет думать о действиях каждого рядового - он битвы не выиграет. поэтому, когда ассемблер давет вам возможность контролировать каждый бат памяти, надо подумать - а помогает ли это победе в битве или только отнимает мозговые силы?
во-вторых, если стандарт чего-то не требует, это не означает, что компилятор должен поступать по-идиотски. особенно компилятор для малоресурсных моделей МК.
наконец, в-третьих (уже повторяюсь), оставит в памяти компилятор дыры или нет - вам оно надо? главное, что все будет работать

Re: Вопросы по С/С++ (СИ)
Добавлено: Сб дек 18, 2010 21:46:35
avreal
Кислый писал(а):распределение памяти четко регламентировано типом переменной
кстати не уверен. читал, просто порядком обьявления переменных разных типов можно выиграть некоторое количество памяти..
Это называется «выравнивание» и оно «четко регламентировано типом переменной». Но 8-битников это не касается вообще. У них единица выравнивания — байт и дыр быть не может.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб дек 18, 2010 21:51:11
avreal
Кислый писал(а):бесит меня неконтроллируемое распределение памяти при написании кода на си. была мысль обращаться так ( по адресам ) к РОН, РВВ и ОЗУ.
время требует си, а душа ассемблера ))
Не советую. Получите объединение
недостатков.