Страница 29 из 386

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

Добавлено: Сб июн 18, 2011 21:16:24
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

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

Добавлено: Чт июн 30, 2011 05:51:14
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));

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

Добавлено: Вс июл 03, 2011 13:01:51
Лютик
Либо меня глючит, либо компилятор. В общем пишу код для 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:

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

Добавлено: Вс июл 03, 2011 22:02:06
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?

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

Добавлено: Вс июл 03, 2011 22:11:33
Лютик
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, лучше сразу перед компиляцией преобразовать массив.
потому что сначала планировалось использование индикатора с ОК, а потом планы поменялись и с помощью данного преобразования можно использовать индиатор с ОА

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

Добавлено: Вс июл 03, 2011 22:16:27
IfoR
Понятно. Но всё же, есть ли у вас хидер util/delay.h ? Может лучше эти вайлы заменить на delay_ms ?

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

Добавлено: Вс июл 03, 2011 22:50:34
Лютик
IfoR писал(а):Понятно. Но всё же, есть ли у вас хидер util/delay.h ? Может лучше эти вайлы заменить на delay_ms ?
там функия, в хедиере, как правило, с аналогичным циклом, только с учетом частоты генератора, не пробовал, но думаю что не сработает

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

Добавлено: Ср июл 06, 2011 17:29:18
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 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--;
//}
}

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

Добавлено: Пт июл 08, 2011 07:56:37
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 в вашем случае?

Ошибок в записи вроде бы нет. С пиками не работал, но вполне вероятно что это проделки включенной оптимизации.

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

Добавлено: Пт июл 08, 2011 12:45:39
IfoR
А ещё можно переменную цикла объявить с модификатором volatile .

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

Добавлено: Пт июл 08, 2011 14:53:10
boobonick
Подскажите, пожалуйста, как разделить программу в си на части, правильно ли я понимаю, что

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

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

include<lcd.c> 

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


}  


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


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

#include lcd.h  

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


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


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

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


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


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


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

Добавлено: Пт июл 08, 2011 15:02:02
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();
}

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

Добавлено: Пт июл 08, 2011 15:16:09
boobonick
ARV, спасибо!

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

Добавлено: Пт июл 08, 2011 20:03:16
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 писал(а):
Ошибок в записи вроде бы нет. С пиками не работал, но вполне вероятно что это проделки включенной оптимизации.

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

Добавлено: Сб июл 09, 2011 00:22:58
Лютик
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) - безрезультатно

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

Добавлено: Вс июл 10, 2011 22:30:44
Hispanus
Как можно нарисовать линию в си?

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

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

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

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

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

Добавлено: Пн июл 11, 2011 05:49:52
BerZerK-ku
Лютик писал(а):volatile не помог...
пс пробывал while(waitT-- != 0); и void wait(volatile unsigned int hm) - безрезультатно
А как проверяете что не работает именно задержка? В железе смотрите мультиметром или используете осциллограф?
В симуляторе пробовали прогонять программу?
Использование volatile дает гарантию, что компилятор не выкинет задержку из кода.

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

Добавлено: Пн июл 11, 2011 12:07:57
Ghost in shell
Вопрос по операциям отношения: хочу код

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

volatile bit sec1 = 0;
...
if (sec1 == 0)
	{		
	T0IE = 1;		
	}
заменить на

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

volatile bit sec1 = 0;
...
T0IE = (sec1 != 1);
так правильно?