str(n)cpy, str(n)cat, str(n)cmp, 변환 함수와 구조체

 

학습목표

 

- string과 관련된 함수들을 이해하고 알고리즘을 만들 수 있다.

- 변환함수의 종류와 문법을 이해하고 사용할 수 있다.

- 구조체의 이해하고 문법을 익힌 후 사용할 수 있다.

 

str(n)cat

 

char * strcat(char * dest, const char * src);

char * strncat(char * dest, const char * src, size_t);

 

해당 함수를 알고리즘을 통해 구현해 보자!

 

 

문자열을 비교하는 함수들

int strcmp(const char * s1, const char * s2);

int strncmp(const char * s1, const char *2, size_t n);

 

변환 함수들

 

ASCII 코드를 int형으로 변환해주는 함수

int atoi(const char * str);



해당 함수를 구현하는 것은 맞았으나 main함수에서 실수가 있었다.

Case2에서 이미 str3에 값이 바뀌었는데 이것에 겹쳐 써서 에러가 난 것이다.

그 외 변환 함수들.

 

long atoi(const char * str); 문자열의 내용을 int형으로 변환

double atof(const char * str); 문자열의 내용을 double형으로 변환

 

 

Chap 22. 구조체와 사용자 정의 자료형

 

구조체를 다른 말로 사용자 정의형이라고 한다. 즉 프로그래머가 직접 만들어 쓰는 타입이다.

 

구조체의 문법은

struct ‘사용자가 원하는 자료형의 이름

{

};

ex)

 

struct smart

{

int A;

int B;

};

 

-> 8byte짜리 struct "smart", 변수형을 정의한다고 이해하면 쉽다.

 

 

//struct자리에 class를 집어 넣으면 객체지향

 

struct를 함수 내부에 적으면 지역 변수로써 다른 함수에서는 사용 할 수 없다. 때문에 전역변수로 사용해야 한다.

struct는 원형만 만들어서는 사용할 수 없고 선언을 해야 사용가능하다.

 

//C++에서는 변수선언 시 struct를 선언하지 않아도 사용 가능하다.

구조체는 사용자가 원하는 변수형의 모듬을 생성하여 사용하는 것과 같다.

이것은 붕어빵틀을 만드는 것과 같은데 붕어빵 틀, struct안에 변수,3개 선언했다고 가정하면 해당 structure를 하나 만드는 경우 해당 변수 3개가 있는 자료형이 만들어졌다고 생각하면 된다.












 

반응형
Posted by newind2000

typedef, str(n)cpy의 함수

 

학습목표

- typedef의 사용과 문법에 대해여 이해하고 활용할 수 있다.

- strcpystrncpy의 사용과 문법에 대하여 이해하고 활용할 수 있다.

 

typedef에 대해서 알아보자.

 

변수를 선언할 때 unsigned과 같이 긴 변수명을 사용자 편의에 맞게 지정하여 사용할 수 있다. 또한 사용자가 변수명을 보고 변수의 의미를 이해할 수 있도록 해주기도 한다.

 

strlen명령어는 전달된 문자열의 길이를 반환해주되, 널 문자는 길이에 포함하지 않는다.

C에서 제공하는 함수를 많이 알고 쓰는 방법을 많이 알고 있을수록 프로그래밍을 빠르고 효율적으로 할 수 있다. C언어를 사용할 때 스스로 함수를 만드는 것보다 가능한한 C라이브러리에서 제공하는 함수를 사용해야 한다.

strcpy, strncpy 함수에 대하여 알아보자!

 

strcpy는 반환형이 char *이고 인자가 1. char * dest, 2. const char * src 인 함수이다. strcpy의 함수 같은 경우 복사할 값이 넣을 파일의 크기보다 큰 경우 내용을 그대로 다 복수할 수 없는 문제가 생긴다. 때문에 이를 보완하고자 복사할 수 있는 문자의 개수를 넣어주는 함수가 strncpy이다.

 

strcpy와 비슷하나 인자가 하나 더 추가되어 복사할 인자의 수를 넣는다.

strcpystrncpy의 함수 코드의 차이는 종료 조건으로 마지막으로 넣는 인자 즉 출력 개수의 유무이다.










 

반응형
Posted by newind2000

스마트 컨트롤러 - 문자와 문자열 관련 함수

 

학습목표

 

getcharputchar의 함수 원형에 대해 안다.

scanfprintf의 함수 원형을 이해한다.

ASCII code를 숫자로, 숫자를 ASCII코드로 바꿀 수 있다.

 

getcharputchar의 함수 원형을 살펴 보았다.

 

우리가 자주 쓰는 printf의 원형인 fprint 또한 함수 형식으로 만들 수 있지만 가변인자가 사용 되기 때문에 stack구조에 대한 이해가 필요하다.

 

가변인자를 지금 언급하기는 기초지식 부족하여 설명이 어렵지만 기본적으로 가변인자를 만들기 위해 가장 우측에는 가변 인자를 나타내는 ‘...’넣어주어야 하고 적어도 좌측에 1개 이상의 인자가 있어야 한다.

 

putchargetchar의 반환형은 int형이지만 함수를 사용하고 나서도 반환 값은 따로 출력되지 않는다.

 

getchar는 한글자만을 입력 받고 ASCII코드로 저장한다.

 

//EOF = End of File

p/421 21-3. 문자열 단위 입출력 함수

 

우리가 지금까지 printf에서 출력하던 문자열은 상수들이 나열되고 끝이 ‘null'이 입력된 것을 문자열로 출력한 것이다. 따라서 “ ”안에 적힌 값은 const char *이다.

printfscanf가 없이 ASCII codecpu가 인지할 수 있는 숫자로 변경하거나 그 반대의 경우(숫자를 ASCII code)로 입력하기 위해 변환하는 작업을 해 보겠다!



 

버퍼는 자원의 효율적인 관리를 위해 사용한다. 버퍼는 데이터가 정해진 용량에 차 있을 때 해당 정보를 CPU에 보내는데 해당 데이터가 다 차지 않아도 데이터를 보내는 명령어가 엔터이다.

 

윈도우 DOS체제에서는 개행 문자(\n)을 쓰지 않아도 입력 값이 출력이 되지만 다른 운영체제에서는 개행 문자 없이는 데이터가 출력되지 않으니 개행 문자를 넣는 습관을 들여야 한다.

 

//fflush는 파일 내부에 있는 버퍼를 비우는 명령어이다.

//ex) fflush(stdin); - 키보드 버퍼에 있는 데이터를 지워라.

 

출력버퍼가 비워진다는 것은 출력버퍼에 저장된 데이터가 버퍼를 떠나서 목적지로 이동됨을 뜻한다.

 

입력버퍼가 비워진다는 것은 데이터의 소멸을 의미한다.

 


반응형
Posted by newind2000

LCD에 이름 띄우기 도움말, 그림 파일에 대한 기본 이해, 스트림과 데이터의 이동

 

학습목표

 

- LCD 메모리에 특수문자를 만들어 본인의 이름을 집어넣기 위한 작업으로 excel파일을 활용하여 해당 dot의 값을 도출해낼 수 있다.

- 그림 파일에 대한 기초적인 구조와 용량에 대해 알 수 있다.

- Stream이 무엇인지 이해하고, API를 사용하여 함수의 원형을 어떻게 사용하는지 알 수 있다.

 





동영상은 1초에 24 frame이다. 2.25MB 24개가 있어야 동영상이 만들어진다. 소리 파일이 없이 그림만으로도 1분에 3.24GB가 된다. 압축기술 없이는 우리는 야구 동영상을 보기 힘들어진다.

 

C언어

 

p/501 Ch. 24 파일 입출력

 

스트림(stream) - 정해지지 않은 데이터를 연속적으로 전송하는 것. 정해진 양의 파일을 받는 것은 스트림이 아니다. ex) 컴퓨터 입장에서의 사용자의 문자입력.

 

//스트림을 일종의 데이터가 넘나드는 다리라고 생각하면 이해가 쉽다.

 

스트림의 경로를 열고(OPEN) 닫는(CLOSE) 명령어가 있다.

 

운영체제에서 PC에 전원이 인가될 때 자동으로 자주 사용하는 입출력을 열어주는데 이 때 자동으로 열어주는 입출력을 표준입출력(Standard I/O)이라고 한다.

 

fprintfprintf를 수행하면 실제로 출력 명령을 실행하는 명령어이다.

 

printfscanf앞에 f를 붙이게 되면 해당 명령어의 형식이 무엇인지 설정해주어야 한다.


 

프로그래머가 불러서 사용하는 함수를 API(Application Programming Interface)라고 한다.

하드웨어의 구조의 이해 없이 해당 장치를 조작할 수 있는 명령어들을 API라고 한다.

 



CPU 입장에서는 뭐든 장치는 file로 인식한다. 해당 장치를 사용하려면 그에 대한 정보를 가지고 있어야 하고 그 해당 장치를 조작해야 하기 때문이다. 프로그래머는 API를 통해 함수의 원형을 실행시켜 원하는 바대로 파일이나 장치를 조작한다.

 



 

 

반응형
Posted by newind2000


20150327.zip

스마트 컨트롤러 - ATmega128a를 사용한 LCD 데이터 전송

 

학습목표 - ATmega128a를 활용한 시리얼 통신으로 입력한 값을 그대로 LCD창에 전송할 수 있다.

 

ATmega128a를 활용한 시리얼 통신

 

발신에 이어 송신도 설정해 보자.

 

수신이 완료될 때까지 while문을 반복시켜 register가 비어 있을 때 shift register를 활용하여 데이터를 전송해 준다.

 

//polling의 힘

 

 

LCD에 나타나는 코드의 윗줄과 아랫줄의 차이가 40byte이다. LCD의 윗줄 아랫줄을 손실없이 사용하기 위해서 커서의 위치를 지정해 주어야 한다.

 

SET CGRAM Address를 활용하여 남은 메모리 영역에 한글을 집어 넣어 보자. 폰트를 디자인하여 메모리에 입력한 뒤 LCD에 출력시키는 것까지.

//인터넷 검색을 활용하자.

 

다음주에는 C를 집중적으로 공부한다.


코드는 첨부한다!

반응형
Posted by newind2000

스마트 컨트롤러 - ATmega128a를 활용한 데이터 송신

 

학습목표 - ATmega128a를 활용하여 데이터를 PC로 송신할 수 있다.

 

void USART0_TX( unsigned char ucData )

{

// Wait for empty transmit buffer

while ( !( UCSR0A & (1<<UDRE)) );

// Put data into buffer, sends the data

UDRE= ucData;

}

 

Datasheet에 나와 있는 다음의 소스코드를 분석해 보자.

 

UDREn은 버퍼가 비어 있을 때 1이고, 버퍼가 차 있을 때 0이다.

 

위의 while문 안의 조건 UCSR0A0B00010011이고 1<<UDRE(5)0B00010000이다.

즉 버터가 차 있을 때 0을 전송하게 되면 위의 연산의 결과 값은 0이 된다. 여기에 '!'부정이 더해져 1이 되면 루프가 진행된다. 때문에 shift register에 데이터가 전송되지 않는다.

 

//Polling방식: CPU가 한 가지 명령어를 지속적으로 수행하여 다른 일은 할 수 없는 방식

LCD.c

LCD.h

Main.c

UART.c

 

 

UART.h

 

짜잔 결과값!





반응형
Posted by newind2000

디지털 제어 - PIC16F917 카운터 업&다운 코딩

 

학습목표 - PIC16F917의 데이터시트를 보고 카운트 업, 카운트 다운을 출력하는 코딩을 할 수 있다.

 

PIC16F917의 데이터시트 중 Memory 부분을 살펴보자.

 




위의 메모리 주소 값을 참조하여 A0를 누르는 동안 count up, A1을 누르는 동안 count down 사용하여 코딩해보자!




 

LM016L LCD를 활용하여 LCD에 숫자를 출력해 보자. To be continue...



반응형
Posted by newind2000

스마트 컨트롤러 - ATmega를 이용한 시리얼 통신 설정

 

<학습목표>

 

UCSR 레지스터 값을 ATmega128A의 데이터시트를 보고 설정할 수 있다.

ATmega를 이용한 시리얼 통신을 위한 초기화 함수를 만들 수 있다.

 

지난 시간에 봤던 UCSR 레지스터의 값을 설정해 주기 위한 코딩을 한다.

 

우선 Smart.h 파일에 define 해준다.

USCR 레지스터에 원하는 설정 값을 입력해준다.

 

<UCSRnA register>

 

7th bit - RX: 수신이 완료되면(자료를 다 받아들이면) 0 -> -

6th bit - TX: 전송이 완료되면 1 -> -

5th bit - EMPTY: shift register에 데이터가 없는 경우(전에 데이터를 다 보낸 경우) -> -

 

//5th bit에서 자료가 남아 있는 상태에서 TX로부터 자료를 받게 되면 덮어쓰게 되어 버리기 //때문에 shift register가 비어있는 것을 확인한 다음에 자료를 받아야 한다.

 

4th bit - FE: 자료 세트가 전송되는데 잡음 유무를 확인하는 bit 에러가 있으면 1 -> -

3rd bit - DOR: 기존에 있던 자료에 전송된 데이터를 엎어 쓰는 경우 1 -> -

2nd bit - UPE: 패리티에러가 있는 경우에 1 -> -

1st bit - U2X: 보통 속도 0 -> 0

Zero bit - MPCM: 1일 때 주소 정보를 가지고 있지 않은 정보는 모두 무시된다. 0으로 설정 -> 0

 

 

 

//비동기식 데이터 송신 방식에서 데이터와 head, tail을 합친 것을 프레임(frame)이라고 한다.

 

<UCSRnB 레지스터>

Bit 7 - RXCIE: 수신 interrupt 활성화 시 1 -> -

Bit 6 - TXCIE: 송신 interrupt 활성화 시 1 -> -

Bit 5 - RDRIE: 데이터 empty interrupt 활성화 시 1 -> -

Bit 4 - RXEN: USART 송신 활성화 시 1 -> 1

Bit 3 - TXEN: USART 수신 활성화 시 1 -> 1

Bit 2 - UCSZ: 글자 크기 -> 0

Bit 1 - RXB8n: 8비트 데이터 수신에서 추가 비트 사용(9bit) -> -

Bit 0 - TXB8n: 8비트 데이터 송신에서 추가 비트 사용(9bit) -> -

 

 

<UCSRnC 레지스터>

Bit 6 - UMSEL: Clock 사용 여부, 비동기식 0, 동기식 1 -> 0

Bit 5 - UPM1: 패리티 생성기와 체크기 활성화, 짝수 패리티 1 -> 1

Bit 4 - UPM0: 패리티 생성기와 체크기 활성화, 짝수 패리티 0 -> 0

Bit 3 - USBS: 스톱 bit 선택 1bit0, 2bits1 -> 0

Bit 2 - UCSZ1: 글자 크기 8bit1 -> 1

Bit 1 - UCSZ0: 글자 크기 8bit1 -> 1

Bit 0 - UCPOL: 클럭 양극화, 동기식만 사용 -> -

작성한 USART.cUSART.h의 코드를 보면,



main.c 파일로 가서 초기화시키는 INIT함수를 만들어보자.


반응형

'Busan IT > 스마트 컨트롤러' 카테고리의 다른 글

ATmega128a를 활용한 데이터 송신  (0) 2015.03.26
PIC16F917 카운터 업&다운 코딩  (0) 2015.03.26
시리얼 통신 UBRR register  (0) 2015.03.24
직/병렬 통신과 USART  (0) 2015.03.23
1  (0) 2015.03.20
Posted by newind2000

스마트 컨트롤러 - 시리얼 통신 UBRR register

 

학습목표

 

ATmega128A의 데이터시트를 보고 UBRR register의 값을 설정할 수 있다.

전처리언어로 UBRR register 값을 설정하는 내용을 코딩할 수 있다.

Clock을 건드릴 수 있는 레지스터는 UBRR이다. UBRRBaud Rate Generator을 조작하여 클럭 속도를 조절할 수 있다.

 

UDR은 전송할 정보를 입력하면 Transmit Shift Register에 해당 정보를 전달한다. Shift Register라고 칭하는 이유는 병렬식이 아닌 직렬식이기 때문에 데이터를 하나를 밀어서 전송하기 때문이다.

 

Shift Register는 보내고 받는 쪽에 하나씩 즉 쌍으로 필요하다.

 

데이터를 주고 받을 때 데이터 신호의 길이에 대한 기준이 필요하다. 이것을 제공해 주는 것이 Baud Rate Generator이다.

 

UDR의 주소는 같지만 TransmitReceive로 나뉜다. 송신과 수신에 따라 UDR은 명령어를 자동분류하여 명령어를 해석한다.

 

//ARM CPUUDR의 송수신 레지스터가 따로 분리되어 있다.

 

UCSRA, UCSRB, UCSRC를 추가시켜 보자.




 

UBRR값을 코딩하여 삽입해 보자.



 

 

UBRR register 표를 보면

앞에 4bit를 사용하지 않고 뒤에 12bit만 쓴다.

//이진수 bitflag로 비유하기도 한다.

//set = 1, clear = 0

 

7bit는 버퍼가 차 있는지 아닌지를 표시해준다.(전송시 1, 비전송시 0)











 

 

 

반응형

'Busan IT > 스마트 컨트롤러' 카테고리의 다른 글

PIC16F917 카운터 업&다운 코딩  (0) 2015.03.26
ATmega를 이용한 시리얼 통신 설정  (0) 2015.03.25
직/병렬 통신과 USART  (0) 2015.03.23
1  (0) 2015.03.20
LCD 기본 프로그래밍  (0) 2015.03.19
Posted by newind2000

/병렬 통신과 USART

 

학습목표

 

/병렬 통신에 대하여 이해한다.

USART에 대해서 이해하고 데이터 시트를 보고 ATmegaUSART에 대하여 파악할 수 있다.

모든 데이터가 선 하나를 통해 전송되는 방식을 시리얼(Serial) 방식이라고 한다.

 

여러 가지 선을 통해 데이터를 전송하는 방식은 병렬 방식이라고 한다.

 

병렬 방식이 선의 개수 배 만큼 시리얼 방식보다 빠르다. 따라서 속도가 중요시 되는 부분에는 병렬 방식을 사용한다.

 

직렬과 병렬을 절충한 고속 시리얼 방식이 있다.

 

통신 시 데이터 선들은 같은 GND를 사용해야 한다.

 

//장치 연결 시 가장 우선 되는 작업은 GND연결 작업이다.

 

시리얼 통신 시 보내는 선을 Tx, 받는 선을 Rx라고 한다. 기존적으로 GND를 포함하여 3줄이 필요하며, 고속 시리얼 방식에서는 CLK선이 포함되어 총 4줄이다.

 

//USB - Universal Serial Bus

RxTx를 교차하여 단 후 시리얼 통신을 해보자.

변조(modulation)와 복조(demodulation)을 통해 신호를 주고 받는다. 이를 합친 것을 모뎀(modem)이라고 한다.

 

ATmega128ADatasheet를 보자.

 

Ch. 20. USART(Universal Synchronous and Asynchronous serial Receiver and Transmitter)

 

- 전이중 방식

 

- 비동기 또는 동기식 //클럭(clock)선 연결 시 동기화까지 가능하다

 

- Baud Rate = BPS(Bit per Second)

 

- 한 번에 5 - 9 bit의 데이터를 전송, 1 - 2 stop bit

 

- /홀수 패리티(비트 수를 짝수 혹은 홀수로 지정하여 제대로 데이터가 전송되었는지 확인하는 방식)

 

- 데이터가 무리하게 전송되어 전에 데이터를 버리고 새 데이터를 받았는지 확인하는 기능

 

- 프레임 오류 감지기

 

- 3개로 분할된 인터럽트(interrupt)가 존재

 





 

반응형
Posted by newind2000