Страница 11 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт янв 20, 2011 23:03:39
O-LED
Друзья, подскажите в чем трабл
Вот так работает правильно
Код: Выделить всё
unsigned long int x;
if ( x & (0x00000001 << ( 26 ) )==(0x00000001 << ( 26 )) ) {......}
А вот так почему то условие всегда верно, и когда 26 бит=0 и когда =1
Код: Выделить всё
unsigned long int x;
unsigned char y;
y=26;
if ( x & (0x00000001 << ( y ) )==(0x00000001 << ( y )) ) {......}
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт янв 20, 2011 23:28:27
avreal
Кислый писал(а):кхе кхе.. может кто поделится кодом работы с LPT ( линухоподобный ) ?
...
ругается на outb.
На мой взгляд, вопрос откровенно не для темы С/С++.
Это где-то в
"интриги с ПК" надо тему "Линукс и LPT" создавать.
Конкретно по вопросу
- outb и компания прописаны в <sys/io.h> (это не то же самое, что просто <io.h> ! )
- Через /dev/io не работал. Не уверен, что в нынешних линуксах такое "устройство" вообще живёт.
- Для прямой работы с портами получаю права не через открытие /dev/io, а запросом ioperm().
- Именно с LPT можно работать честнее и без рутовых привилегий через /dev/parport, но это немного медленнее.
Если интересно продолжение разговора, то, может, пойдём таки в "Интеграция с ПК"?
Или прямо у меня на сайте в комментариях к
avreal and LPT in Linux спрашивайте, поделюсь кусками кода

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт янв 21, 2011 00:26:35
Кислый
и то верно.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт янв 21, 2011 07:50:24
lix
lcd на lpt. пример.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт янв 21, 2011 13:43:38
skader
Доброго времени суток.
Пытаюсь разобраться с прерыванями в контроллере pic16f631. Прерывание работает, но после него не происходит возврата в основную программу((. Если убрать прерывания, main работает.
В main светодиод на любой ножке порта С мигает медленно, при вызове прерывания по 7-ой ножка порта B несколько раз должен мигнуть быстро.
7-ая ножка порта B подтянута к +5 резистором 27к, при замыкании кнопки через резистор 1к подключается к земле.
Пробовал присваивать INTCON-у разные значения, безрезультатно(
компилятор МикроС 8.2.0.0.
Код: Выделить всё
unsigned char oldPortb;
void interrupt() {
if (Portb==0) { //
Delay_ms(5); // wait 5 mS
oldPortb=Portb;
PortC= 255;
Delay_ms(50);
PortC=0 ;
Delay_ms(80);
PortC= 255;
Delay_ms(100);
PortC=0 ;
Delay_ms(80);
PortC= 255;
Delay_ms(50);
PortC=0 ;
Delay_ms(80);
INTCON = 0x08; // clear RBIF, set RBIE
}
}
void main() {
PORTB = 0;
TRISB = 0b11110000;
WPUB= 0; // отключаем подтяжки В
IOCB=0b11110000; // разрешаем прерывания на изменения уровня на 4-7 ножках В
INTCON = 0x88; // Set GIE, RBIE разрешаем прерывания вообще и по изменению на порте В
ANSEL=0;
PORTC = 0; // Initialize PORTC
TRISC = 0; //С на выход.
do {
PortC= 255;
Delay_ms(400);
PortC=0 ;
Delay_ms(400);
} while(1) ;
}
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт янв 21, 2011 17:08:06
stas00n
skader, главная ошибка в неверной проверке нажатия кнопки
if (portb == 0){}
возможно, это условие никогда не наступает, а значит, тело if'a не выполняется, следовательно, флаг прерывания не сбрасывается, и после выхода из прерывания контроллер влетает в него снова. Надо вынести сброс флага из if'a. Что на входах RB4:RB6? Они ведь тоже могут инициировать прерывание RBIF...
Сделайте так:
Код: Выделить всё
void interrupt isr (void) {
if (!RB7){
//Ваш обработчик нажатия кнопки
}
RBIF = 0;
}
"do" в основном цикле не нужно, лучше так:
Код: Выделить всё
PORTC = 0;
while (1){
PORTC = ~PORTC ;
__delay_ms(400);
}
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт янв 21, 2011 17:24:48
stas00n
PS приведенный код для компилятора ht PICC.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт янв 21, 2011 18:22:06
skader
спасибо, помогло!
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт янв 21, 2011 20:03:07
skader
Cпасибо, помогло!
И еще вопрос: стоит ли на время обработки прерывания отключать обработку прерываний (IOCB = 0), чтоб не было прерывания из прерывания?
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт янв 21, 2011 23:23:58
egride
Подскажите, может кто-то в курсе:
Делаю для тренировки простой вольтметр на меге8 и 16*2 ЖКИ.
И возник большой вопрос с выводом переведенных данных АЦП (от 0 до 1024).
Формула элементарная. Получается дробное число (2.78324923049203....). Если поставить ему тип "Float" на дисплее начинается полная ахинея. Начинают прыгать совершенно несвязанные числа как положительные так и отрицательные. Пытался что-то найти про это. Пишут, что при обработке таких громоздких чисел, как Float стек начинает накладываться на память МК и выходит глюк. Если ставить тип "INT" все выводится хорошо, но с точностью до 1 вольта
Напрашивается 2 варианта:
1) Разделить на целую и дробную часть. и выводить отдельно 3 части одного числа. Например так: 3 , 2768
2) Ограничить дробную часть после деления, например до 3х знаков.
Может кто знает как можно сделать эти пункты? А то совсем уже голову сломал

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт янв 21, 2011 23:37:44
ARV
да чего там ломать-то? в вашу элементарную формулу добавьте умножение на 1000 и вычисляйте все в целых числах. а при выводе сначала запишите результат в строку, а потом вставьте десятичную точку в нужное место. вот вам и будет и вычисления в целых и ограничение до 3-го знака одновременно
правда ахинея у вас на дисплее наверняка не из-за
float, а из-за какой-то иной ошибки в программе... ибо с
float AVR хоть и медленно, но работает вполне нормально.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт янв 21, 2011 23:43:22
O-LED
Я выше спрашивал,
http://radiokot.ru/forum/viewtopic.php?p=691601#p691601 но никто не ответил. Отвечаю сам. нужно было "y" привести к одному типу с "х"
Код: Выделить всё
unsigned long int x;
unsigned char y;
y=26;
if ( x & (0x00000001 << ( (unsigned long int)y ) )==(0x00000001 << ( (unsigned long int)y )) ) {......}
Спасибо
Danko
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт янв 21, 2011 23:56:14
ARV
O-LED, у вас в коде тавтология:
if(a & (1<< b) == (1 << b)) содержит явно избыточную операцию проверки на равенство. достаточно написать
if(a & (1 << b)) - результат будет тот же самый
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб янв 22, 2011 00:13:26
Кислый
есть вопросец. я вот озадачился.
допусти есть екоторый абстрактный код
Код: Выделить всё
uint8_t i = 255;
char D[15] = {};
sprintf (D, "%.d", i);
пусть значение i появляется "вдруг" например приходит с usart ( вообще не важно ).
у нас приходит FF, мы преобразуем его в символьный вид, и выбрасываем на семисегментный индикатор условно бесконечной разрядности ( т.е. только Великий КОТ может нам сказать сколько разрядо в нем. может три, а может и 10..) .
Диапазон выбрасываемых символов:
0 1 2 3 4 5 6 7 8 9 A b c C d E F o P r L n _ -
т.е. eсли их загонять в индикатор через switch-case ( такой-то символ - такая-то комбинация на порте ), то с 22 символами еще можно играться.. но если их станет больше ? гораздо больше !?
вот тут я немножко не догоняю.. как справляются в этом случае на дисплеях 16х2 или на ЖК ?
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб янв 22, 2011 06:00:55
stas00n
skader писал(а): стоит ли на время обработки прерывания отключать обработку прерываний (IOCB = 0), чтоб не было прерывания из прерывания?
В PIC16 вектор прерывания всего один, а приоритеты прерываний не существуют как класс, поэтому "прерывание из прерывания" возникнуть не может никак. В вашей задаче ничего запрещать не надо.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб янв 22, 2011 09:09:54
asteroid7
Кислый писал(а):есть вопросец. я вот озадачился.
Проще преобразовывать приходящий байт в выводимому символу таблицей констант.
const char D[] = { коды соответствия символам 0..9 A b c C d E F o P r L n _ - };
switch-case станет не нужен. Для более 8-и бит соответственно
const int D[]...
Вывод
sprintf (D, "%.d", i);
На символьных ЖК дисплеях 16х2, если они не поддерживают кодировку компилятора, так же через таблицы преобразовывают.
К примеру, IAR для Win имеет кодировку CP1251. Если взять индикатор поддерживающий точно такую, то и таблицы не надо. Что послал, то и увидел )
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб янв 22, 2011 14:17:25
Кислый

не втёр

Re: Вопросы по С/С++ (СИ)
Добавлено: Сб янв 22, 2011 15:24:04
skader
Плз, помогрите найти описание команд и процедур mikroC для pic-ов, надоело методом тыка по примерам и гуглем.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб янв 22, 2011 15:51:54
stas00n
skader Установите лучше MPLAB, там в комплекте идет hi-tech PICC с мануалом и примерами. PRO версия включается бесплатно на месяц пробы, потом если понравится, можно и лекарство найти.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб янв 22, 2011 16:44:28
Кислый
asteroid7 писал(а):Кислый писал(а):есть вопросец. я вот озадачился.
Проще преобразовывать приходящий байт в выводимому символу таблицей констант.
const char D[] = { коды соответствия символам 0..9 A b c C d E F o P r L n _ - };
switch-case станет не нужен. Для более 8-и бит соответственно
const int D[]...
Вывод
sprintf (D, "%.d", i);
На символьных ЖК дисплеях 16х2, если они не поддерживают кодировку компилятора, так же через таблицы преобразовывают.
К примеру, IAR для Win имеет кодировку CP1251. Если взять индикатор поддерживающий точно такую, то и таблицы не надо. Что послал, то и увидел )
код в студию 