Страница 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х знаков.

Может кто знает как можно сделать эти пункты? А то совсем уже голову сломал :oops:

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. Если взять индикатор поддерживающий точно такую, то и таблицы не надо. Что послал, то и увидел )


код в студию :)