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

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

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

Сообщение Liv »

O-LED: у Вас на аватаре сегменты для цифры "0" - ровненькие, а для остальных цифр какие-то кривые. С чем это связано?
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

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

Сообщение O-LED »

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

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

Сообщение avreal »

O-LED писал(а):ага. переменные int прекрасно работали беззнаковыми переменными без всяких signed
Вероятно, всё-таки знаковыми, а не беззнаковыми.

"просто" int — это предусмотренная стандартом сокращённая запись для signed int
short — штатное сокращение для signed short int
long — для signed long int

Всё честно.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
V2oD2o
Встал на лапы
Сообщения: 90
Зарегистрирован: Чт дек 09, 2010 12:03:08
Откуда: Зеленоград
Контактная информация:

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

Сообщение 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 на дисплее.. почему? :)
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

V2oD2o писал(а):почему?

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

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

Сообщение 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 на пине, у вас может бог знает сколько раз цикл провернуться!

кстати, в прерываниях не рекомендуется заниматься выводом на дисплей. вообще не рекомендуется использовать функции, особенно когда неизвестно, сколько времени они занимают.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
V2oD2o
Встал на лапы
Сообщения: 90
Зарегистрирован: Чт дек 09, 2010 12:03:08
Откуда: Зеленоград
Контактная информация:

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

Сообщение 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 Гц.. далее занижает - чем дальше тем больше, видимо где то у меня слишком много времени занимает просчет :?

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

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

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

V2oD2o писал(а):видимо где то у меня слишком много времени занимает просчет :? есть идеи ?

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

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

Сообщение lix »

вот примерный вариант без комментов :(
Вложения
avrfreq.c
частотомер на avr. нету комментов в коде.
(1.44 КБ) 438 скачиваний
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

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

Сообщение Кислый »

всем привет. как в си коде для авр напрямую обратиться к ячейке памяти озу ?
на ассемблере пример видел. а на си - нет.
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Кислый писал(а):всем привет. как в си коде для авр напрямую обратиться к ячейке памяти озу ?
на ассемблере пример видел. а на си - нет.

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

unsigned char *ptr;
ptr = (void*)123; // будем обращаться к ячейке с адресом 123
*ptr = 0; // обнулили эту ячейку
*ptr = 20; // записали туда 20
ptr++; // теперь будем работать со 124-й ячейкой
*ptr *= 2; // удвоим содержимое ячейки с адресом 124
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

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

Сообщение lix »

Кислый писал(а):всем привет. как в си коде для авр напрямую обратиться к ячейке памяти озу ?
на ассемблере пример видел. а на си - нет.


в си это не надо. тебе зачем?

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

// тут был код, но ARV опередил...
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

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

Сообщение Кислый »

ARV,
т.е. мы в любом случае должны выделить место для указателя ? но при этом не контролируем куда он запишется.. замечательно ))

Lix,
тебе зачем?

бесит меня неконтроллируемое распределение памяти при написании кода на си. была мысль обращаться так ( по адресам ) к РОН, РВВ и ОЗУ.
время требует си, а душа ассемблера ))
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

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

Сообщение Кислый »

или ну его нафиг и да здраствует Алгоритм Билдер ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Кислый писал(а):ARV,
т.е. мы в любом случае должны выделить место для указателя ? но при этом не контролируем куда он запишется.. замечательно ))
вы, когда по телефону звоните, тоже не контролируете по каким парам в кабеле сигнал идет, какими релюхами коммутируется... но это ведь не мешает вам говорить?
распределение памяти четко регламентировано типом переменной. а много ли вам будет счастья от того, что вы будете знать адрес переменной?! он вам нужен? если да - вот вам указатель, а если нет - ну и нафига?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

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

Сообщение Кислый »

аналогия интересная. но! в ассемблере мы заранее знаем куда и что записываем. В си мы сначала записывам, потом только узнаем куда.. соответственно по аналогии с телефонным разговором : на телефонном аппарате кнопка "позвонить КОТУ". нажимаем, звоним, разговариваем (разговариваем с котом о_0) . он при этом только у самого кота узнаем что он в африке.. и мы попали на денюшку (( нафиг
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

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

Сообщение Кислый »

распределение памяти четко регламентировано типом переменной

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

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

Сообщение ARV »

Кислый писал(а):
распределение памяти четко регламентировано типом переменной

кстати не уверен. читал, просто порядком обьявления переменных разных типов можно выиграть некоторое количество памяти.. ибо стандарт с не требует от компилятора беспросветного размещения переменных в памяти. если сохранил - напишу.
не читайте перед ужином большевистских газет :)

во-первых, ваша аналогия со звонком - не верна. правильная аналогия, не знать не КОМУ звоним, а КАК звоним. Си гарантирует, что в переменной будет сохранено то, что вы туда положили до тех пор, пока эта переменная существует. назначение переменной - ХРАНИТЬ данные. ГДЕ и КАК - это уже второстепенно и не сильно вас должно заботить. если генерал будет думать о действиях каждого рядового - он битвы не выиграет. поэтому, когда ассемблер давет вам возможность контролировать каждый бат памяти, надо подумать - а помогает ли это победе в битве или только отнимает мозговые силы?

во-вторых, если стандарт чего-то не требует, это не означает, что компилятор должен поступать по-идиотски. особенно компилятор для малоресурсных моделей МК.

наконец, в-третьих (уже повторяюсь), оставит в памяти компилятор дыры или нет - вам оно надо? главное, что все будет работать :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение avreal »

Кислый писал(а):
распределение памяти четко регламентировано типом переменной
кстати не уверен. читал, просто порядком обьявления переменных разных типов можно выиграть некоторое количество памяти..
Это называется «выравнивание» и оно «четко регламентировано типом переменной». Но 8-битников это не касается вообще. У них единица выравнивания — байт и дыр быть не может.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Кислый писал(а):бесит меня неконтроллируемое распределение памяти при написании кода на си. была мысль обращаться так ( по адресам ) к РОН, РВВ и ОЗУ.
время требует си, а душа ассемблера ))
Не советую. Получите объединение недостатков.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Ответить

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