블로그 이미지
안녕1999

카테고리

전체 (3067)
자바스크립트 (20)
안드로이드 (14)
WebGL (4)
변비 (17)
정치,경제 (35)
C언어,ARM (162)
컴퓨터(PC, Note Book, 윈.. (41)
전자회로, PCB (27)
유머,안웃긴,GIF,동영상 (118)
국부론60 (71)
모듈(PCB) (3)
건강 (2)
FreeCAD (25)
PADS (43)
퇴직,퇴사,구직,취업 활동 (3)
C# (86)
엑셀 (8)
워드 (0)
LabView (6)
레고 (30)
FPGA (0)
Total
Today
Yesterday

달력

« » 2025.5
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

공지사항

최근에 올라온 글

error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
문제가 있을 수 도 있다는 경고.

경고 무시하도록함.
#pragma warning(disable : 4996)

Posted by 안녕1999
, |

PC의 ip얻기

C언어,ARM / 2020. 3. 21. 23:00

 

char *GetMyIPstr(int i,char *buf)
{
	char name[128];struct hostent *phe;

	*buf=0;
	if(gethostname(name,sizeof(name))==0)
	{
		phe=gethostbyname(name);
		if(phe!=NULL)
		{
			struct in_addr *pin;int j;
			for(j=0;j<=i;j++)
			{
				pin=(struct in_addr *)phe->h_addr_list[j];
				if(pin==0)break;
				if(i==j)
				{
					strcpy(buf,inet_ntoa(*pin));
					return buf;
				}
			}
		}
	}
	else
	{
		int err=GetLastError();//10093 WSANOTINITIALISED
		if(err==10093)
		{
			WSAStartup();
			return GetMyIPstr(i,buf);
		}
	}
	return 0;
}
wchar_t *GetMyIPstr(int i,wchar_t *buf)
{
	char b[32];
	GetMyIPstr(i,b);
	strcpy(buf,b);
	return buf;
}
Posted by 안녕1999
, |


ATMega128등의 마이컴, CPU등으로 제작된 장비에 한글을 저장해야하는 경우가 종종 있습니다.
대부분의 프로그래머들은 한글이 저장이 안된다고 알고 있습니다.
그래서, 영문으로 저장하거나, 아예 글자를 저장하지 않는 경우도 종종 있습니다.
예) 예약방송 데이터에서 제목은 PC에만 저장되고, 장비에는 시간, 동작데이터만 저장합니다.

그러나, 한글도 장비에 저장이 가능합니다.
영문은 1바이트 문자이고, 한글은 2바이트 문자일뿐입니다.
프로그래머들도 알고 있는데도, "한글은 저장이 안된다"고 말합니다.
귀찮아서 그러는걸까요?

Posted by 안녕1999
, |

용량별로 주소도 틀리고, 페이지 크기도 달라, 코드가 많이 들어간다.

느린 속도를 감수한다면, 1바이트씩 읽고 쓰는 함수로 간단하게 처리가능하다.
인터넷에 있는 소스들중 제대로 된건 못본듯 하다. 동작은 하지만, 문제가 발생할 수 있다.

데이터 쓰기할때마다 약 5msec delay시켜줘야 잘 동작한다.
(완표체크 기능은 잘 동작하지 않았다)

Posted by 안녕1999
, |

--------------------Configuration: win32_compile - Win32 Debug--------------------
'C:\My\Project'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다.
Error executing c:\windows\system32\cmd.exe.

a.hex - 1 error(s), 0 warning(s)

 

원인 : 경로명에 ()나 '-'문자가 포함된 경우
해결 : 소스파일의 경로명에 있는 '-'나 ()괄호를 모두 제거함.

'C언어,ARM' 카테고리의 다른 글

장비에 한글 데이터 저장  (0) 2020.03.14
i2c - EEPROM 소스코드 간략하게 할 수 있는 방법  (0) 2020.02.29
ST-LINK 사용자 메뉴얼  (0) 2020.02.15
bitbuf  (0) 2020.02.15
i2c - AT24C16  (0) 2020.02.15
Posted by 안녕1999
, |
Posted by 안녕1999
, |

bitbuf

C언어,ARM / 2020. 2. 15. 23:50
int bitbuf_get_1_cnt(byte4 *p,int n)
{
	int cnt=0,i;
	for(i=0;i>5;//j=i/32;
		k=i&0x1F;//k=i-j*32;
		if(gbi(p[j],k)==0)
		{
			sbi(p[j],k);
			return 1;
		}
	}
	return 0;
}
int bitbuf_cbi(byte4 *p,int n,int i)
{
	int j,k;
	if(0<=i)if(i<(n*32))
	{
		j=i>>5;//j=i/32;
		k=i&0x1F;//k=i-j*32;
		if(gbi(p[j],k))
		{
			cbi(p[j],k);
			return 1;
		}
	}
	return 0;
}
int bitbuf_gbi(byte4 *p,int n,int i)
{
	int j,k;
	if(0<=i)if(i<(n*32))
	{
		j=i>>5;//j=i/32;
		k=i&0x1F;//k=i-j*32;
		return gbi(p[j],k);
	}
	return 0;
}
int bitbuf_next1_loop(byte4 *pArray,int n,int i)//i부터, 다음 '1'비트의 인덱스 찾기.ret=-1(not found)
{
	int size,m=32*n;
	size=m;
	if(i<0)i=0;
	while(m)
	{
		m--;
		if(i>=size)i=0;
		if(bitbuf_gbi(pArray,n,i))
		{
			return i;
		}
		i++;
	}
	return -1;
}
#ifdef _DEBUG
	void DEBUG_bitbuf_next1_loop_test()
	{
		byte4 a[2];int n=countof(a),i,m=sizeof(a)*8;
		//----------------
		a[0]=0;
		a[1]=0;
		i=bitbuf_next1_loop(a,n,-1);
		DEBUG_if_err(i!=-1);
		i=bitbuf_next1_loop(a,n,0);
		DEBUG_if_err(i!=-1);
		i=bitbuf_next1_loop(a,n,1);
		DEBUG_if_err(i!=-1);
		i=bitbuf_next1_loop(a,n,m);
		DEBUG_if_err(i!=-1);
		i=bitbuf_next1_loop(a,n,m+1);
		DEBUG_if_err(i!=-1);
		//----------------
		a[0]=1;
		a[1]=0;
		i=bitbuf_next1_loop(a,n,-1);
		DEBUG_if_err(i!=0);
		i=bitbuf_next1_loop(a,n,0);
		DEBUG_if_err(i!=0);
		i=bitbuf_next1_loop(a,n,1);
		DEBUG_if_err(i!=0);
		i=bitbuf_next1_loop(a,n,m);
		DEBUG_if_err(i!=0);
		i=bitbuf_next1_loop(a,n,m+4);
		DEBUG_if_err(i!=0);
		//----------------
		a[0]=1<<5;
		a[1]=0;
		i=bitbuf_next1_loop(a,n,-1);
		DEBUG_if_err(i!=5);
		i=bitbuf_next1_loop(a,n,0);
		DEBUG_if_err(i!=5);
		i=bitbuf_next1_loop(a,n,1);
		DEBUG_if_err(i!=5);
		i=bitbuf_next1_loop(a,n,m);
		DEBUG_if_err(i!=5);
		i=bitbuf_next1_loop(a,n,m+4);
		DEBUG_if_err(i!=5);
		//----------------
		a[0]=0;
		a[1]=1;
		i=bitbuf_next1_loop(a,n,-1);
		DEBUG_if_err(i!=32);
		i=bitbuf_next1_loop(a,n,0);
		DEBUG_if_err(i!=32);
		i=bitbuf_next1_loop(a,n,1);
		DEBUG_if_err(i!=32);
		i=bitbuf_next1_loop(a,n,m);
		DEBUG_if_err(i!=32);
		i=bitbuf_next1_loop(a,n,m+1);
		DEBUG_if_err(i!=32);
		//----------------
		a[0]=0;
		a[1]=1<<31;
		i=bitbuf_next1_loop(a,n,-1);
		DEBUG_if_err(i!=63);
		i=bitbuf_next1_loop(a,n,0);
		DEBUG_if_err(i!=63);
		i=bitbuf_next1_loop(a,n,1);
		DEBUG_if_err(i!=63);
		i=bitbuf_next1_loop(a,n,m);
		DEBUG_if_err(i!=63);
		i=bitbuf_next1_loop(a,n,m+1);
		DEBUG_if_err(i!=63);
		//----------------
		a[0]=0;
		a[1]=1<<3;
		i=bitbuf_next1_loop(a,n,-1);
		DEBUG_if_err(i!=35);
		i=bitbuf_next1_loop(a,n,0);
		DEBUG_if_err(i!=35);
		i=bitbuf_next1_loop(a,n,2);
		DEBUG_if_err(i!=35);
		i=bitbuf_next1_loop(a,n,m);
		DEBUG_if_err(i!=35);
		i=bitbuf_next1_loop(a,n,m+1);
		DEBUG_if_err(i!=35);
		//----------------

		//----------------
		a[0]=1;
		a[1]=1;
		i=bitbuf_next1_loop(a,n,-1);
		DEBUG_if_err(i!=0);
		i=bitbuf_next1_loop(a,n,0);
		DEBUG_if_err(i!=0);
		i=bitbuf_next1_loop(a,n,1);
		DEBUG_if_err(i!=32);
		i=bitbuf_next1_loop(a,n,m);
		DEBUG_if_err(i!=0);
		i=bitbuf_next1_loop(a,n,m+1);
		DEBUG_if_err(i!=0);
		//----------------
		a[0]=0x11;
		a[1]=0x11;
		i=3;
		i=bitbuf_next1_loop(a,n,i);
		DEBUG_if_err(i!=4);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=32);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=36);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=0);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=4);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=32);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=36);
		//----------------
		a[0]=0x11;
		a[1]=0;
		i=10;
		i=bitbuf_next1_loop(a,n,i);
		DEBUG_if_err(i!=0);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=4);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=0);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=4);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=0);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=4);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=0);
		//----------------
		a[0]=0;
		a[1]=0x11;
		i=17;
		i=bitbuf_next1_loop(a,n,i);
		DEBUG_if_err(i!=32);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=36);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=32);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=36);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=32);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=36);
		i=bitbuf_next1_loop(a,n,i+1);
		DEBUG_if_err(i!=32);
		//----------------
	}
#endif
Posted by 안녕1999
, |

i2c - AT24C16

C언어,ARM / 2020. 2. 15. 23:33

 

 

#include "..\src\sI2C.h"
#include "..\src\cpu.h"
#ifndef I2C_MSB_first
	#define I2C_MSB_first
#endif

#ifdef I2C_MSB_first
	#define for_loop8(i)	for(i=7;i>=0;i--)
#else
	#define for_loop8(i)	for(i=0;i<=7;i++)
#endif

#ifndef SCL_H
	#define SCL_H()	I2C_CLK_H()
	#define SCL_L()	I2C_CLK_L()
#endif

#ifndef SDA_H
	#define SDA_H()	I2C_DATA_H()
	#define SDA_L()	I2C_DATA_L()
#endif


void SCL_set_IN(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;

	//GPIO-IN
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
	
	GPIO_InitStruct.Pin = GPIO_PIN_9;//I2C_CLK
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void SCL_set_OUT(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	//GPIO-OUT
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
	
	GPIO_InitStruct.Pin = GPIO_PIN_9;//I2C_CLK
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void SDA_set_IN(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;

	//GPIO-IN
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
	
	GPIO_InitStruct.Pin = GPIO_PIN_2;//I2C_DATA
	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void SDA_set_OUT(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;

	//GPIO-OUT
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
	
	GPIO_InitStruct.Pin = GPIO_PIN_2;//I2C_DATA
	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
extern void delay_us(int n);
extern void delay_nsec(byte1 n);

void I2C_delay(void)
{
	delay_nsec(1);
}
void sI2C_init(void)
{
	//DEBUG_UART_puts_rn("sI2C_init()");
	SCL_set_OUT();
	SDA_set_OUT();
	SCL_H();
	SDA_H();
	I2C_delay();
}
void sI2C_START(void)
{
	//DEBUG_puts("sI2C_START()");
	sI2C_init();

	SDA_L();
	I2C_delay();
	SCL_L();
	I2C_delay();
}
void sI2C_STOP(void)
{
	SDA_L();
	I2C_delay();
	SCL_H();
	I2C_delay();

	SDA_H();
	I2C_delay();
	//DEBUG_puts("sI2C_STOP()");
}
int sI2C_read_ACK(void)
{
	int bok;
	//DEBUG_puts("sI2C_read_ACK()");
	SDA_H();
	I2C_delay();
	SDA_set_IN();
		SCL_H();
			I2C_delay();
			bok=SDA_get();
		SCL_L();
		I2C_delay();
	SDA_set_OUT();
	SDA_H();
	//DEBUG_puts_int("ACK(0)/NACK(1)",bok);
	return bok;
}
void sI2C_SCL_H_L(void)
{
	//DEBUG_UART_puts_rn("sI2C_SCL_H_L()");
	SCL_H();
	I2C_delay();
	SCL_L();
	I2C_delay();
}
int sI2C_wait_ACK(void)
{
	//DEBUG_UART_puts_rn("DEBUG : sI2C_wait_ACK()=ACK");
	//return 0;//DEBUG 무조건 ACK
	
	int bok=0,n=0x0fff;
	//DEBUG_UART_puts_rn("sI2C_wait_ACK()");
	//DEBUG_printf(("sI2C_wait_ACK()"));
	SDA_H();
	//I2C_delay();
	SDA_set_IN();
		while(n--)
		{
			I2C_delay();
			bok=SDA_get();
			//bok=0;//DEBUG 무조건 ACK
			if(bok==0)
			{
				//ACK(OK)
				break;
			}
		}
		//_UART_HEX_puts(&n,sizeof(n),"sI2C_wait_ACK(n)");
		sI2C_SCL_H_L();
	SDA_set_OUT();
	SDA_H();
	//DEBUG_UART_puts_rn("sI2C_wait_ACK() END");
	//return 0;//DEBUG 무조건 ACK
	return bok;
}
void sI2C_write_1bit(int a)
{
	//DEBUG_UART_puts_rn("sI2C_write_1bit()");
	if(a)
	{
		SDA_H();
		//DEBUG_UART_puts_rn("SDA_H()");
	}
	else
	{
		SDA_L();
		//DEBUG_UART_puts_rn("SDA_L()");
	}
	I2C_delay();
	sI2C_SCL_H_L();
	
	//SDA 기본상태는 L
	I2C_delay();
	SDA_L();
}
#define write_ACK(psI2C)	sI2C_write_1bit(0)
#define write_NACK(psI2C)	sI2C_write_1bit(1)

byte1 sI2C_read_byte(int ack)
{
	int i;
	byte1 a=0;
	//DEBUG_UART_puts_rn("sI2C_read_byte()");
	//DEBUG_printf(("sI2C_read_byte()"));
	SDA_H();
	SDA_set_IN();
		for_loop8(i)
		{
			I2C_delay();
			SCL_H();
			I2C_delay();
				a|=(SDA_get()<<i);
			SCL_L();
			I2C_delay();
		}
	SDA_set_OUT();
	sI2C_write_1bit(ack);
	//DEBUG_printf(("sI2C_read_byte()=%d(0x%X) ACK=%d\r\n",a,a,ack));
	//_UART_HEX_puts(&a,sizeof(a),"sI2C_read_byte()");
	//DEBUG_puts_int("sI2C_read_byte() END a",a);
	return a;
}
void sI2C_read(byte1 *pbuf,int len)
{
	int rlen=len;
	byte1 *p=pbuf;
	//DEBUG_UART_puts_rn("sI2C_read() START");
	while(len--)
	{
		*p=sI2C_read_byte(len==0);
		p++;
	}
	//UART3_send_value_HEX("sI2C_read",pbuf,rlen);//DEBUG
	//DEBUG_UART_puts_rn("sI2C_read() END");
	//DEBUG_HEX_puts("sI2C_read",pbuf,rlen);//DEBUG
}
void sI2C_write_byte(byte1 a)
{
	int i;
	//DEBUG_UART_puts_rn("sI2C_write_byte()");
	//_UART_HEX_puts(&a,sizeof(a),"sI2C_write_byte");
	//DEBUG_printf(("sI2C_write_byte=%d(0x%X)",a,a));
	for_loop8(i)
	{
		if(gbi(a,i))
		{
			SDA_H();
		}
		else
		{
			SDA_L();
		}
		I2C_delay();
		sI2C_SCL_H_L();
	}
}
int sI2C_write(byte1 *pbuf,int len)
{
	byte1 *p=pbuf;
	int wlen=0;
	//DEBUG_UART_puts_rn("sI2C_write()");
	//DEBUG_puts_int("len",len);
	//WDT_reset();//DEBUG
	while(len--)
	{
		sI2C_write_byte(*p);
		//ACK
		if(sI2C_wait_ACK())
		{
			//DEBUG_puts("ERR : sI2C_wait_ACK");//DEBUG
			break;//err
		}
		else
		{
			//ok
		}
		wlen++;
		p++;
	}
	//SDA_H();
	//UART3_send_value_HEX("sI2C_write()1",pbuf,wlen);//DEBUG
	//DEBUG_HEX_puts("sI2C_write",pbuf,wlen);//DEBUG
	return wlen;
}
int sI2C_write_START_device_addr1(byte1 device,byte1 addr1)
{
	//DEBUG_UART_puts_rn("sI2C_write_START_device_addr1()");
	sI2C_START();
		sI2C_write(&device,1);
		sI2C_write(&addr1,1);
	return 1;
}
int sI2C_write_START_device_addr1_STOP(byte1 device,byte1 addr1)
{
	int bok;
	//DEBUG_UART_puts_rn("sI2C_write_START_device_addr1_STOP()");
	bok=sI2C_write_START_device_addr1(device,addr1);
	sI2C_STOP();
	return bok;
}

'C언어,ARM' 카테고리의 다른 글

ST-LINK 사용자 메뉴얼  (0) 2020.02.15
bitbuf  (0) 2020.02.15
TRACE 긴 문장 출력시 에러  (0) 2020.02.15
Warning: hDC is NULL in ...  (0) 2020.02.08
stm32-외부 인터럽트  (0) 2020.02.08
Posted by 안녕1999
, |

TRACE를 사용할때, 너무 긴 문장은 에러가 발생한다.
긴 문장을 잘라서 출력해줌으로써, 에러를 피할 수 있다.
파라메터(인자) 사용불가. 문자열만 출력가능.
단, 문자열 s는 읽기/쓰기 가능한 버퍼여야한다. const 타입은 사용불가.

void TRACE_long(TCHAR *s)
	{
		int len=strlen(s);TCHAR a;
		while(len>256)
		{
			a=s[255];
			s[255]=0;
			TRACE(s);
			s[255]=a;
			s+=255;
			len-=255;
		}
		if(len)
		{
			TRACE(s);
		}
	}

'C언어,ARM' 카테고리의 다른 글

bitbuf  (0) 2020.02.15
i2c - AT24C16  (0) 2020.02.15
Warning: hDC is NULL in ...  (0) 2020.02.08
stm32-외부 인터럽트  (0) 2020.02.08
STM32 - GPIO togle  (0) 2020.01.31
Posted by 안녕1999
, |

Warning: hDC is NULL in CWnd::GrayCtlColor; WM_CTLCOLOR not processed.
Warning: Uncaught exception in WindowProc (returning 0).
First-chance exception in Scope.exe (KERNELBASE.DLL): 0xE06D7363: Microsoft C++ Exception.
증상 : 실행하고, 잠시후, 에러메세지가 계속나오다가 멈춤.

원인 : CreatePen()사용 후, DeleteObject()안해서 발생함.

'C언어,ARM' 카테고리의 다른 글

i2c - AT24C16  (0) 2020.02.15
TRACE 긴 문장 출력시 에러  (0) 2020.02.15
stm32-외부 인터럽트  (0) 2020.02.08
STM32 - GPIO togle  (0) 2020.01.31
GetTickCount, GetTickCount64 뭐가 다른가?  (1) 2020.01.19
Posted by 안녕1999
, |

최근에 달린 댓글

글 보관함