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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

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

Сообщение md5sum »

IfoR писал(а):Понял что требуется только с третьего раза.
У меня вопрос, зачем это?

Я так понимаю, что 0x37 это в BCD.
2 Волосатый :

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

unsigned char bcd2uchar(unsigned char a) {
    return (((a&0xf0)>>4)*10+a&0xf);
} //0x37 -> 37

unsigned char uchar2bcd(unsigned char a) {
    return ((a/10)<<4)+(a % 10);
} // 37 -> 0x37
— Не говорите мне что делать и я не скажу куда Вам идти...
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

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

Сообщение BerZerK-ku »

stas00n писал(а):Друзья, подскажите, как избавиться от варнингов: Warning [752] conversion to shorter data type ?
Компилятор PICC так ругается, когда я присваиваю переменной константое выражение содержащее операции сдвига, например:

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

/* Definitions for T1CON register */
#define   _TMR1ON      0
#define   _TMR1CS      1
#define   _T1SYNC      2
#define   _T1OSCEN   3
#define   _T1CKPS0   4
#define   _T1CKPS1   5
.......
T1CON = (1<<_TMR1ON|1<<_T1OSCEN|1<<_TMR1CS|1<<_T1SYNC);


Используйте явное приведение типов.
T1CON = (char) ((1<<_TMR1ON)|(1<<_T1OSCEN)|(1<<_TMR1CS)|(1<<_T1SYNC));
Лютик
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вт мар 25, 2008 22:10:23
Откуда: Минск

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

Сообщение Лютик »

Либо меня глючит, либо компилятор. В общем пишу код для 16f628a для отображения чего-нибудь на четырехразрядном семисигментном индикаторе:
в оновном цикле:

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

drawLCD(0,1,2,3,5,2);

где

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

void drawLCD(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4,unsigned int waitT,unsigned int repeat){
unsigned int wait;
wait=waitT;
//while(repeat){
   //RA0=0;RA1=0;RA2=0;RA3=0;
   //waitT=wait;
   draw(x1);
   RA0=1;
   while(waitT){waitT--;}
   RA0=0;

   waitT=wait;
   draw(x2);
   RA1=1;
   while(waitT){waitT--;}
   RA1=0;

   waitT=wait;
   draw(x3);
   RA2=1;
   while(waitT){waitT--;}
   RA2=0;

   waitT=wait;
   draw(x4);
   RA3=1;
   while(waitT){waitT--;}
   RA3=0;

   //repeat--;
//}
}

и

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

void draw(unsigned char x){
PORTB=0b01111111-arr_seg[x];
}

arr_seg[x]- массив с кодом для 7сигментника.

В результате отображается только первый ноль. Если же делать все без функции и записать напрямую в тело основного цикла:

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

   waitT=5;
   draw(11);
   RA0=1;
   while(waitT){waitT--;}
   RA0=0;
   waitT=5;
   draw(12);
   RA1=1;
   while(waitT){waitT--;}
   RA1=0;
   waitT=5;
   draw(0);
   RA2=1;
   while(waitT){waitT--;}
   RA2=0;
   waitT=5;
   draw(13);
   RA3=1;
   while(waitT){waitT--;}
   RA3=0;

то все 4 разряда высвечиваются, только с яркостью процентов 40-50%, несмотря на то, что цепи общего анода подключаю через транзистор(индикатор с ОА).

итак 1ый вопрос с кодом - почему без функции работает,а с нет и 2ой чуть чуть мимо кассы, но создавать отдельную тему не буду - в чем дело с яркостью

ps компилятор hi-tech picc

В ходе эксперимента было выявлено, что контроллер не может выйти из цикла:

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

   waitT=5;
   draw(11);
   RA0=1;
   while(waitT){waitT--;}<----  выхода нет
   RA0=0;


что за чушь? пытался и проект заново создавать, менял вайл на for(i=0;i<waitT;i++), итог один и тот же. в чем дело, почему не могу выйти из цикла??? :cry:
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

А почему у вас функции передаются числа вида: 0,1,2,3, а в главной функции вида: 0, 11, 12, 13?
Могу предположить, что в массиве просто не определены числа 1,2,3,... (все сегменты выключены)

И ещё почему у вас в функции draw происходит дополнительное преобразование? IMHO, лучше сразу перед компиляцией преобразовать массив.

Кстати, цикл

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

while(waitT){waitT--;}
можно написать так:

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

while(waitT--);
- модерн. Но тут уже может шибко умный компилятор схалтурить и заменить его просто на waitT=0 :)
А на счет того, что не выходит. У вас есть дебаггер? Посмотрите состояние переменных и что в них происходит. Есть мысль, конечно бредовая, учитывая, что у вас даже for не работает, но всё же:

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

while(waitT-- != 0);


Кстати, у вас там нету случаем в библиотеках функции типа delay_ms?
Последний раз редактировалось IfoR Вс июл 03, 2011 22:11:41, всего редактировалось 1 раз.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Лютик
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вт мар 25, 2008 22:10:23
Откуда: Минск

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

Сообщение Лютик »

IfoR писал(а):А почему у вас функции передаются числа вида: 0,1,2,3, а в главной функции вида: 0, 11, 12, 13?

это не имеет значение что писать, факт не работает

IfoR писал(а):Могу предположить, что в массиве просто не определены числа 1,2,3,... (все сегменты выключены)

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

static const unsigned char arr_seg[37]={ // начало массива
   0b00111111, // 0й элемент, символ «0»
   0b00000110, // 1й элемент, символ «1»
   0b01011011, // 2й элемент, символ «2»
   0b01001111, // 3й элемент, символ «3»
   0b01100110, // 4й элемент, символ «4»
   0b01101101, // 5й элемент, символ «5»
   0b01111101, // 6й элемент, символ «6»
   0b00000111, // 7й элемент, символ «7»
   0b01111111, // 8й элемент, символ «8»
   0b01101111, // 9й элемент, символ «9»
   0b00000000, // 10й элемент, символ «SPACE»
   0b01110111, // 11й элемент, символ «A»
   0b01111100, // 12й элемент, символ «b»
   0b01011000, // 13й элемент, символ «c»
   0b01011110, // 14й элемент, символ «d»
   0b01111001, // 15й элемент, символ «e»
   0b01110001, // 16й элемент, символ «F»
   0b01101111, // 17й элемент, символ «g»
   0b01110100, // 18й элемент, символ «h»
   0b00000100, // 19й элемент, символ «i»
   0b00001110, // 20й элемент, символ «J»
   0b00111000, // 21й элемент, символ «L»
   0b01010100, // 22й элемент, символ «n»
   0b01011100, // 23й элемент, символ «o»
   0b01110011, // 24й элемент, символ «p»
   0b01100111, // 25й элемент, символ «q»
   0b01010000, // 26й элемент, символ «r»
   0b01101101, // 27й элемент, символ «S»
   0b01111000, // 28й элемент, символ «t»
   0b00011100, // 29й элемент, символ «u»
   0b01101110, // 30й элемент, символ «y»
   0b01011011, // 31й элемент, символ «Z»
   0b01111101, // 32й элемент, символ «Б»
   0b00110001, // 33й элемент, символ «Г»
   0b01110110, // 34й элемент, символ «Н»
   0b01100110, // 35й элемент, символ «Ч»
   0b01001111, // 36й элемент, символ «Э»

};


IfoR писал(а):И ещё почему у вас в функции draw происходит дополнительное преобразование? IMHO, лучше сразу перед компиляцией преобразовать массив.


потому что сначала планировалось использование индикатора с ОК, а потом планы поменялись и с помощью данного преобразования можно использовать индиатор с ОА
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

Понятно. Но всё же, есть ли у вас хидер util/delay.h ? Может лучше эти вайлы заменить на delay_ms ?
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Лютик
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вт мар 25, 2008 22:10:23
Откуда: Минск

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

Сообщение Лютик »

IfoR писал(а):Понятно. Но всё же, есть ли у вас хидер util/delay.h ? Может лучше эти вайлы заменить на delay_ms ?

там функия, в хедиере, как правило, с аналогичным циклом, только с учетом частоты генератора, не пробовал, но думаю что не сработает
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Лютик писал(а):
IfoR писал(а):Понятно. Но всё же, есть ли у вас хидер util/delay.h ? Может лучше эти вайлы заменить на delay_ms ?

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

попробуйте так:

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

void Dumb_loop(uint waitT){
   wait=waitT;
   while(wait){waitT--;}
}


потом где нужно

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

Dumb_loop(6)



и еще непонятен ваш ход мыслей:
void drawLCD(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4,unsigned int [color=#0000BF]waitT,unsigned int repeat){
//в функцию передаем waitT
unsigned int wait;//создаем переменную
wait=waitT;//запоминаем в нее что было передано в функцию
//while(repeat){ //ля ля фигня какая то
//RA0=0;RA1=0;RA2=0;RA3=0;//ля ля фигня какая то
//waitT=wait;//ля ля фигня какая то
draw(x1);
RA0=1;

while(waitT){waitT--;} //тут почему то используем waitT
RA0=0;

И вообще по мне так проще получить число и потом с ним сравнивать
например

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

void drawLCD(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4,unsigned int waitT,unsigned int repeat){
unsigned int wait;
wait=waitT;

   draw(x1);
   RA0=1;
   for (i = 0; i < wait; i++)
   {}
   RA0=0;   
   
   draw(x2);
   RA1=1;
   for (i = 0; i < wait; i++)
   {}
   RA1=0;
   draw(x3);
   RA2=1;
   for (i = 0; i < wait; i++)
   {}
   RA2=0;   
   draw(x4);
   RA3=1;
  for (i = 0; i < wait; i++)
   {}
   RA3=0;

   //repeat--;
//}
}
В поисках истины человек развивается.
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

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

Сообщение BerZerK-ku »

vitalik_1984 писал(а):И вообще по мне так проще получить число и потом с ним сравнивать
например

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

void drawLCD(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4,unsigned int waitT,unsigned int repeat){
unsigned int wait;
wait=waitT;

   draw(x1);
   RA0=1;
   for (i = 0; i < wait; i++)
   {}
   RA0=0;   
   
    ...
//}
}


А где инициализация i ?
А зачем использовать на 1 переменную больше? Накой нужна переменная wait в вашем случае?

Ошибок в записи вроде бы нет. С пиками не работал, но вполне вероятно что это проделки включенной оптимизации.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

А ещё можно переменную цикла объявить с модификатором volatile .
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
boobonick
Встал на лапы
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

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

Сообщение boobonick »

Подскажите, пожалуйста, как разделить программу в си на части, правильно ли я понимаю, что

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

////////////Файл  main.c

include<lcd.c>

.................
main(){ extern func() // Это функция, которая объявлена в lcd.c





///////////////////// Конец  main.c


/////Файл lcd.c

#include lcd.h 

func(){ Олололо}


/////////////////


/////Заголовочный файл lcd.h

Здесь данные и прототипы функции


////////////


Так должно же быть?

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

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

Сообщение ARV »

boobonick писал(а):Так должно же быть?
нет, не так.
хидер не должен содержать данных (в смысле, переменных) - только типы, константы, прототипы функций и ссылки на данные (т.е. extern).
то есть так
хидер lcd.h

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

int lcd_ololo(void);

#define LCD_CONST   12;

typedef struct {
   int type;
   int rows;
   int cols;
}lcd_info;

файл lcd.c

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

#include "lcd.h"

int lcd_ololo(void){
   return 2*2 + LCD_CONST;
}

файл main.c

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

#include "lcd.h"

int main(void){
   int value;

   value = lcd_ololo();
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
boobonick
Встал на лапы
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

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

Сообщение boobonick »

ARV, спасибо!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

BerZerK-ku писал(а):
vitalik_1984 писал(а):И вообще по мне так проще получить число и потом с ним сравнивать
например

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

void drawLCD(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4,unsigned int waitT,unsigned int repeat){
unsigned int wait;
wait=waitT;

   draw(x1);
   RA0=1;
   for (i = 0; i < wait; i++)
   {}
   RA0=0;   
   
    ...
//}
}


А где инициализация i ?

Ну ладно придираться :)
BerZerK-ku писал(а):А зачем использовать на 1 переменную больше? Накой нужна переменная wait в вашем случае?
Ну вот тем более, если можно меньше, зачем больше? :))
BerZerK-ku писал(а):
Ошибок в записи вроде бы нет. С пиками не работал, но вполне вероятно что это проделки включенной оптимизации.
В поисках истины человек развивается.
Лютик
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вт мар 25, 2008 22:10:23
Откуда: Минск

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

Сообщение Лютик »

volatile не помог, писал так

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

void drawLCD(unsigned char X1,unsigned char X2,unsigned char X3,unsigned char X4,volatile unsigned int waitT,volatile unsigned int rpt){...}

отключил всю возможную оптимизацию кода - тоже не помогло
Изображение

конечный вид кода, который "почему-то" не работает:

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

#include   <pic.h>
//#include "header.h"


__CONFIG (HS & UNPROTECT & LVPDIS & WDTDIS & MCLRDIS & BORDIS);

void init (void); // подготовка МК
void wait(unsigned int hm);
void draw(unsigned char x);
void drawLCD(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4,unsigned int waitT,unsigned int rpt);

#define PERIOD 1500000   // (xtal 16Mhz)
#define PER_COUNTS ((PERIOD / 100) - 1)  // don't edit this!
#define PER_REMAINDER (PERIOD - (PER_COUNTS * 100))  // don't edit this! 

static const unsigned char arr_seg[37]={ // начало массива
   0b00111111, // 0й элемент, символ «0»
   0b00000110, // 1й элемент, символ «1»
   0b01011011, // 2й элемент, символ «2»
   0b01001111, // 3й элемент, символ «3»
   0b01100110, // 4й элемент, символ «4»
   0b01101101, // 5й элемент, символ «5»
   0b01111101, // 6й элемент, символ «6»
   0b00000111, // 7й элемент, символ «7»
   0b01111111, // 8й элемент, символ «8»
   0b01101111, // 9й элемент, символ «9»
   0b00000000, // 10й элемент, символ «SPACE»
   0b01110111, // 11й элемент, символ «A»
   0b01111100, // 12й элемент, символ «b»
   0b01011000, // 13й элемент, символ «c»
   0b01011110, // 14й элемент, символ «d»
   0b01111001, // 15й элемент, символ «e»
   0b01110001, // 16й элемент, символ «F»
   0b01101111, // 17й элемент, символ «g»
   0b01110100, // 18й элемент, символ «h»
   0b00000100, // 19й элемент, символ «i»
   0b00001110, // 20й элемент, символ «J»
   0b00111000, // 21й элемент, символ «L»
   0b01010100, // 22й элемент, символ «n»
   0b01011100, // 23й элемент, символ «o»
   0b01110011, // 24й элемент, символ «p»
   0b01100111, // 25й элемент, символ «q»
   0b01010000, // 26й элемент, символ «r»
   0b01101101, // 27й элемент, символ «S»
   0b01111000, // 28й элемент, символ «t»
   0b00011100, // 29й элемент, символ «u»
   0b01101110, // 30й элемент, символ «y»
   0b01011011, // 31й элемент, символ «Z»
   0b01111101, // 32й элемент, символ «Б»
   0b00110001, // 33й элемент, символ «Г»
   0b01110110, // 34й элемент, символ «Н»
   0b01100110, // 35й элемент, символ «Ч»
   0b01001111, // 36й элемент, символ «Э»

};

unsigned int pcount;
unsigned char halfsec=0,sec=0,min=10,hour=0;
char enableSB1=1;
unsigned char secEd=0;secDes=0;minEd=0;minDes=0;

void main(void)
{
unsigned char waitT,X1,X2,X3,X4,rpt=1,hm;
   init();

X1=33;X2=34;X3=35;X4=36;
   while(1){
   drawLCD(33,34,35,36,5,65000);
   do{drawLCD(10,23,16,16,20,1);}while(1);
   }
}

void init(void){
   CMCON = 0x07;
   OPTION = 0b00001000;    // TMR0 on, 1:1 prescale
   pcount = 0;
   INTCON = 0b10100000;  // GIE on, T0IE on (turn interrupt on)
   TRISB = 0b00000000; 
   RBPU=1;
   TRISA=0b00110000;
   //TRISA=0b00000000;
   PORTB = 0b01111111;
   RA0=0;
   RA1=0;
   RA2=0;
   RA3=0;
}


void draw(unsigned char x){
PORTB=0b01111111-arr_seg[x];
}

void drawLCD(unsigned char X1,unsigned char X2,unsigned char X3,unsigned char X4,unsigned int waitT, unsigned int rpt){
RA0=0;RA1=0;RA2=0;RA3=0;
while(rpt){
   draw(X1);
   RA0=1;
   wait(waitT);
   RA0=0;

   draw(X2);
   RA1=1;
   wait(waitT);
   RA1=0;

   draw(X3);
   RA2=1;
   wait(waitT);
   RA2=0;

   draw(X4);
   RA3=1;
   wait(waitT);
   RA3=0;

   rpt--;
}
}

void wait(unsigned int hm){
while(hm){hm--;}
}


сверхестественные силы шутят?

пс пробывал while(waitT-- != 0); и void wait(volatile unsigned int hm) - безрезультатно
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

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

Сообщение Hispanus »

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

[i]Лорд Кельвин, физик, 1899 г.[/i]
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

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

Сообщение Hispanus »

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

Вроде есть такая функция line(), которая рисует в дос...
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

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

Сообщение BerZerK-ku »

Лютик писал(а):volatile не помог...
пс пробывал while(waitT-- != 0); и void wait(volatile unsigned int hm) - безрезультатно


А как проверяете что не работает именно задержка? В железе смотрите мультиметром или используете осциллограф?
В симуляторе пробовали прогонять программу?
Использование volatile дает гарантию, что компилятор не выкинет задержку из кода.
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 931
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

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

Сообщение Ghost in shell »

Вопрос по операциям отношения: хочу код

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

volatile bit sec1 = 0;
...
if (sec1 == 0)
   {      
   T0IE = 1;      
   }

заменить на

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

volatile bit sec1 = 0;
...
T0IE = (sec1 != 1);

так правильно?
Кот гуляет сам по себе, но вблизи холодильника.
Ответить

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