Вопросы по С/С++ (СИ)
O-LED: у Вас на аватаре сегменты для цифры "0" - ровненькие, а для остальных цифр какие-то кривые. С чем это связано?
- Реклама
- Сообщения: 1800
- Зарегистрирован: Вт окт 05, 2010 01:08:57
korr_den см личку
KIT
Вероятно, всё-таки знаковыми, а не беззнаковыми.O-LED писал(а):ага. переменные int прекрасно работали беззнаковыми переменными без всяких signed
"просто" int — это предусмотренная стандартом сокращённая запись для signed int
short — штатное сокращение для signed short int
long — для signed long int
Всё честно.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
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 на дисплее.. почему?
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 на дисплее.. почему?
Потому что вы не пробовали писать программу с комментариями???V2oD2o писал(а):почему?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
то есть вы считаете, что за 0,5 миллисекунды, пока у вас 1 на пине, x увеличится только на 1? у вас же все это дело в цикле, т.е. получается, пока 1 на пине, у вас может бог знает сколько раз цикл провернуться!V2oD2o писал(а):на PINB.0 генератор 1000Гц, программа выдает 2020..2022 на дисплее.. почему?Код: Выделить всё
while(1) { if (PINB.0) { sprintf(s, "%d ", x); x=x+1; } }
кстати, в прерываниях не рекомендуется заниматься выводом на дисплей. вообще не рекомендуется использовать функции, особенно когда неизвестно, сколько времени они занимают.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Спасибо за ответ!
пытаюсь разобраться далее:
все четко считает.. но только до 2800 Гц.. далее занижает - чем дальше тем больше, видимо где то у меня слишком много времени занимает просчет
есть идеи ?
пытаюсь разобраться далее:
Код: Выделить всё
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 к частоте, циклим такт
}
}
есть идеи ?
Сколько времени, по-вашему, занимает функция sprintf?V2oD2o писал(а):видимо где то у меня слишком много времени занимает просчетесть идеи ?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
вот примерный вариант без комментов 
- Вложения
-
- avrfreq.c
- частотомер на avr. нету комментов в коде.
- (1.44 КБ) 442 скачивания
всем привет. как в си коде для авр напрямую обратиться к ячейке памяти озу ?
на ассемблере пример видел. а на си - нет.
на ассемблере пример видел. а на си - нет.
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
Кислый писал(а):всем привет. как в си коде для авр напрямую обратиться к ячейке памяти озу ?
на ассемблере пример видел. а на си - нет.
Код: Выделить всё
unsigned char *ptr;
ptr = (void*)123; // будем обращаться к ячейке с адресом 123
*ptr = 0; // обнулили эту ячейку
*ptr = 20; // записали туда 20
ptr++; // теперь будем работать со 124-й ячейкой
*ptr *= 2; // удвоим содержимое ячейки с адресом 124если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
в си это не надо. тебе зачем?Кислый писал(а):всем привет. как в си коде для авр напрямую обратиться к ячейке памяти озу ?
на ассемблере пример видел. а на си - нет.
Код: Выделить всё
// тут был код, но ARV опередил...ARV,
т.е. мы в любом случае должны выделить место для указателя ? но при этом не контролируем куда он запишется.. замечательно ))
Lix,
время требует си, а душа ассемблера ))
т.е. мы в любом случае должны выделить место для указателя ? но при этом не контролируем куда он запишется.. замечательно ))
Lix,
бесит меня неконтроллируемое распределение памяти при написании кода на си. была мысль обращаться так ( по адресам ) к РОН, РВВ и ОЗУ.тебе зачем?
время требует си, а душа ассемблера ))
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
или ну его нафиг и да здраствует Алгоритм Билдер ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
вы, когда по телефону звоните, тоже не контролируете по каким парам в кабеле сигнал идет, какими релюхами коммутируется... но это ведь не мешает вам говорить?Кислый писал(а):ARV,
т.е. мы в любом случае должны выделить место для указателя ? но при этом не контролируем куда он запишется.. замечательно ))
распределение памяти четко регламентировано типом переменной. а много ли вам будет счастья от того, что вы будете знать адрес переменной?! он вам нужен? если да - вот вам указатель, а если нет - ну и нафига?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
аналогия интересная. но! в ассемблере мы заранее знаем куда и что записываем. В си мы сначала записывам, потом только узнаем куда.. соответственно по аналогии с телефонным разговором : на телефонном аппарате кнопка "позвонить КОТУ". нажимаем, звоним, разговариваем (разговариваем с котом о_0) . он при этом только у самого кота узнаем что он в африке.. и мы попали на денюшку (( нафиг
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
кстати не уверен. читал, просто порядком обьявления переменных разных типов можно выиграть некоторое количество памяти.. ибо стандарт с не требует от компилятора беспросветного размещения переменных в памяти. если сохранил - напишу.распределение памяти четко регламентировано типом переменной
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
не читайте перед ужином большевистских газетКислый писал(а):кстати не уверен. читал, просто порядком обьявления переменных разных типов можно выиграть некоторое количество памяти.. ибо стандарт с не требует от компилятора беспросветного размещения переменных в памяти. если сохранил - напишу.распределение памяти четко регламентировано типом переменной
во-первых, ваша аналогия со звонком - не верна. правильная аналогия, не знать не КОМУ звоним, а КАК звоним. Си гарантирует, что в переменной будет сохранено то, что вы туда положили до тех пор, пока эта переменная существует. назначение переменной - ХРАНИТЬ данные. ГДЕ и КАК - это уже второстепенно и не сильно вас должно заботить. если генерал будет думать о действиях каждого рядового - он битвы не выиграет. поэтому, когда ассемблер давет вам возможность контролировать каждый бат памяти, надо подумать - а помогает ли это победе в битве или только отнимает мозговые силы?
во-вторых, если стандарт чего-то не требует, это не означает, что компилятор должен поступать по-идиотски. особенно компилятор для малоресурсных моделей МК.
наконец, в-третьих (уже повторяюсь), оставит в памяти компилятор дыры или нет - вам оно надо? главное, что все будет работать
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Это называется «выравнивание» и оно «четко регламентировано типом переменной». Но 8-битников это не касается вообще. У них единица выравнивания — байт и дыр быть не может.Кислый писал(а):кстати не уверен. читал, просто порядком обьявления переменных разных типов можно выиграть некоторое количество памяти..распределение памяти четко регламентировано типом переменной
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Не советую. Получите объединение недостатков.Кислый писал(а):бесит меня неконтроллируемое распределение памяти при написании кода на си. была мысль обращаться так ( по адресам ) к РОН, РВВ и ОЗУ.
время требует си, а душа ассемблера ))
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


