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

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

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

Сообщение 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 )) ) {......}
Последний раз редактировалось O-LED Пт янв 21, 2011 02:59:45, всего редактировалось 2 раза.
KIT
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Кислый писал(а):кхе кхе.. может кто поделится кодом работы с LPT ( линухоподобный ) ?
...
ругается на outb.
На мой взгляд, вопрос откровенно не для темы С/С++.
Это где-то в "интриги с ПК" надо тему "Линукс и LPT" создавать.

Конкретно по вопросу
  • outb и компания прописаны в <sys/io.h> (это не то же самое, что просто <io.h> ! )
  • Через /dev/io не работал. Не уверен, что в нынешних линуксах такое "устройство" вообще живёт.
  • Для прямой работы с портами получаю права не через открытие /dev/io, а запросом ioperm().
  • Именно с LPT можно работать честнее и без рутовых привилегий через /dev/parport, но это немного медленнее.

Если интересно продолжение разговора, то, может, пойдём таки в "Интеграция с ПК"?
Или прямо у меня на сайте в комментариях к avreal and LPT in Linux спрашивайте, поделюсь кусками кода :)
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

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

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

и то верно.
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

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

Сообщение lix »

lcd на lpt. пример.
Вложения
main.c
(2.26 КБ) 406 скачиваний
skader
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 23, 2010 19:40:47

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

Сообщение 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) ;
}
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

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

Сообщение 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);
}
Последний раз редактировалось stas00n Пт янв 21, 2011 17:25:38, всего редактировалось 1 раз.
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

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

Сообщение stas00n »

PS приведенный код для компилятора ht PICC.
skader
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 23, 2010 19:40:47

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

Сообщение skader »

спасибо, помогло!
skader
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 23, 2010 19:40:47

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

Сообщение skader »

Cпасибо, помогло!

И еще вопрос: стоит ли на время обработки прерывания отключать обработку прерываний (IOCB = 0), чтоб не было прерывания из прерывания?
egride
Открыл глаза
Сообщения: 48
Зарегистрирован: Пн окт 05, 2009 15:18:29

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

Сообщение egride »

Подскажите, может кто-то в курсе:
Делаю для тренировки простой вольтметр на меге8 и 16*2 ЖКИ.
И возник большой вопрос с выводом переведенных данных АЦП (от 0 до 1024).
Формула элементарная. Получается дробное число (2.78324923049203....). Если поставить ему тип "Float" на дисплее начинается полная ахинея. Начинают прыгать совершенно несвязанные числа как положительные так и отрицательные. Пытался что-то найти про это. Пишут, что при обработке таких громоздких чисел, как Float стек начинает накладываться на память МК и выходит глюк. Если ставить тип "INT" все выводится хорошо, но с точностью до 1 вольта :))
Напрашивается 2 варианта:
1) Разделить на целую и дробную часть. и выводить отдельно 3 части одного числа. Например так: 3 , 2768
2) Ограничить дробную часть после деления, например до 3х знаков.

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

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

Сообщение ARV »

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

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

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

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

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

Я выше спрашивал, 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
KIT
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

O-LED, у вас в коде тавтология:
if(a & (1<< b) == (1 << b)) содержит явно избыточную операцию проверки на равенство. достаточно написать
if(a & (1 << b)) - результат будет тот же самый
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

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

есть вопросец. я вот озадачился.

допусти есть екоторый абстрактный код

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

    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 или на ЖК ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

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

Сообщение stas00n »

skader писал(а): стоит ли на время обработки прерывания отключать обработку прерываний (IOCB = 0), чтоб не было прерывания из прерывания?

В PIC16 вектор прерывания всего один, а приоритеты прерываний не существуют как класс, поэтому "прерывание из прерывания" возникнуть не может никак. В вашей задаче ничего запрещать не надо.
Аватара пользователя
asteroid7
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

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

Сообщение 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[i], "%.d", i);

На символьных ЖК дисплеях 16х2, если они не поддерживают кодировку компилятора, так же через таблицы преобразовывают.
К примеру, IAR для Win имеет кодировку CP1251. Если взять индикатор поддерживающий точно такую, то и таблицы не надо. Что послал, то и увидел )
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

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

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

:))) не втёр :)))
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
skader
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 23, 2010 19:40:47

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

Сообщение skader »

Плз, помогрите найти описание команд и процедур mikroC для pic-ов, надоело методом тыка по примерам и гуглем.
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

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

Сообщение stas00n »

skader Установите лучше MPLAB, там в комплекте идет hi-tech PICC с мануалом и примерами. PRO версия включается бесплатно на месяц пробы, потом если понравится, можно и лекарство найти.
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

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

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

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[i], "%.d", i);

На символьных ЖК дисплеях 16х2, если они не поддерживают кодировку компилятора, так же через таблицы преобразовывают.
К примеру, IAR для Win имеет кодировку CP1251. Если взять индикатор поддерживающий точно такую, то и таблицы не надо. Что послал, то и увидел )


код в студию :)
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Ответить

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