ADC로 조도 센서에 따른 값의 변화


저항은 전기의 흐름을 방해한다.CDS(빛 센서) 빛을 받으면 저항값이 변함.

 

 

위의 그림은 조도 센서 실물이다. 어둡고 밝기에 따라 저항값이 달라진다.

 

 

ADC.cADC.hLCD.cLCD.hmain.csmart.hUSART.cUSART.h

 

 

vcc 에서는 1023

GND 에서는 0000

조도 센스를 손으로 막으면 다른 값이 나온다.

참...이거 설명이 안되네요..;;

 

 

가변인자 함수에 대한 이해


printf함수와 scanf함수의 사용 방법을 생각해 보면

첫 번째 전달인자인 문자열에 존재하는 서식문자의 수만큼 전달인자의 수도 증가한다.

printf, scanf 함수는 전달인자의 수가 제한되어 있지 않다는 특징이 있다.

num = Sum(4, 1, 2, 3, 4);                1, 2, 3, 4의 합

Sum과 같은 형태의 호출이 가능한 함수를 가변인자 함수라 한다. 이 함수의 모든 헤더파일은 stdarg.h에 선언되어 있다. 



가변인자 매개변수의 선언방법


main.c



전달된 인자들 추출해내는 방법

1단계 : 가변인자를 가리킬 수 있는 참조자를 선언한다.

2단계 : 참조자가 가변인자를 실제로 참조할 수 있도록 한다.

3단계 : 참조자를 통해 전달된 정보를 추출한다.

4단계 : 참조자가 더 이상 가변인자를 가리키지 않도록 해제한다.

1단계 : va_list

2단계 : va_start

3단계 : va_arg

4단계 : va_end



main1.c




연결리스트 : 도서관리


제목 - char[31]            |    caTitle

가격 - unsigned int       |    uiPrice

저자 - char                  |    caAuthor   

분류 - char                  |    caType

LinkedList.c

LinkedList.h

main.c


ListList.h에서는 Book구조체를 typedef형으로 선언 및 정의하고 있다.

LinkedList.c에서 Book_Stdin함수로 책 제목, 가격, 저자, 장르 등을 입력받고,

Book_Stdout으로 구조체 Book의 주소를 가지는 std가 가리키는 각각의 제목, 가격, 저자, 장르를

출력해낸다.

main.c에서 Book의 주소를 가지는 head에 Book 크기의 동적할당을 받고

Book_Stdin함수를 호출하여 인자로 head를 넘기고, Book_Stdout도 같이 호출하여 전과 동일하게 head를 인자로 넘겨준다. 


20140502 - ADC 초기화 실습

ATMega128 2014. 5. 2. 14:40 Posted by Owen.K

ADIF는 한 conversion이 끝나면 변환하게 된다.

• Bit 4 – ADIF: ADC Interrupt Flag

This bit is set when an ADC conversion completes and the data registers are updated.

이 비트가 셋이면 ADC 변환이 완료되었을 때와 데이터레지스터가 업데이트 되었을 때이다.

 

1-1. ADMUX 설정하기.

 

 

 

7 , 6  : 전압 선택 bit // 0 0

* 기본적으로 전압이 vcc5v, gnd-5v 라면 총 10v 인 셈이다. 그러므로 0 5v 로 하기 위해

중간점을 2.5(2.56)v 로 조정해 주기도 한다 ( 1, 1 을 넣음)

 

 

 

5     : 오른쪽 / 왼쪽 정렬  // 오른쪽 0

 

 

4~0 pin 설정

 우리는 single Ended Input 을 활용한다. 그러려면, 입력받는 unsigned char ucCh 는

00111 (0x7)을 넘기지 말아야 한다. 

그걸 막기 위해, ucCh & MASK_MUX 를 설정한다.

 

 

 

 

1-2. ADCSRA 설정하기

 

 

 

 

 

 

7        : 활성화 비트//스위치 같은 기능을 함. 이게 1 이 되어야 작동을 시작한다./ 0

       :             /0

       : FREE mode 의 on / off 설정 /0

4 ,3     : 인터렙트 설정 /0

 

인터렙트 

폴링 

이상이 있을 시, CPU 의 개입이 있음.

CPU가 다른 일을 멀티로 할 수 있다. 

정해진 시각마다 CPU가 개입 함.

CPU의 멀티 기능이 떨어 짐. 

 

ADC_RUN 함수에서 다시 활용된다!!! (뒤에 다시 설명) 

2,1,0    : 주파수 설정 // 0 0 0

 *주파수 설정은 상황과 용도에 맞게 설정해 준다. 작은 일에 많은 주파수를 주는건 낭비다.

 

 

 

unsigned int ADC_Run(void)
{
  ADCSRA   = ADCSRA|(1<<ADSC);
  while(0 == (ADCSRA&(1<<ADIF)));
  return ((ADCH<<8)|ADCL);
}

while 문으로 계속 돌려준단건 일일이 체크하는 '폴링방식'을 채용한것임.

반환값으로 ((ADCH<<8)|ADCL)를 준다.

 

1-3. ETC

void ADC_Init_0CH(void)
{
  ADC_Init(0);
}

unsigned int ADC_Convert(void)
{
  ADC_Init_0CH();

  return ADC_Run();
}

 

1-4.main에서 0000 하이텔/LCD로 보내기!

int main(void)
{
  char cString[] = "0000\n\r";
  unsigned int uiRet;

  USART_Init();
  LCD_Init();

  while(1)
  {
    uiRet = ADC_Convert();

    cString[0= '0' + (uiRet/1000)%10;
    cString[1= '0' + (uiRet/100)%10;
    cString[2= '0' + (uiRet/10)%10;
    cString[3= '0' + (uiRet/1)%10;
    
    USART_Str(cString);

    LCD_Str(cString);


  }

  while(1);
  return 0;
}

 

 

숫자를 넣을 땐, 아스키 코드 추출하는 식으로 보내야 한다.

20140502 - 0429일 오전시간 복습!!!

study!!! 2014. 5. 2. 09:16 Posted by Owen.K



unsigned char USART_RX()

{

while(0==(UCSR0A & (1<<RXC))); //읽을 값이 있을 때 까지 1이 될때까지

return UDR0;

//기능성 레지스터이고 

//cpu register 0~31까지의 주소 중 하나에 저장된다.

  //뭔가가 수신 버퍼 안에 들어있으면 while문 탈출 및 UDR0가 반환된다.

}

UCSR0A는 USART 주소값의 A레지스터 부분이고, RXC는 데이터의 수신이 완료되면 완료 되었다는 신호를 보내기 위해 1의 값을 돌려주는 비트이다. ReadOnly라서 프로그래머가 건들 수 없다.

USRAT_RX로 입력 받은 것을 LCD_Data로 출력!! 하이퍼 터미널에서 글자를 입력하면 하이퍼터미널을 통해서 LCD에 글자가 전송된다.


실행결과



LCD폰트 

Character Generater Rom - CGROM을 활용한 폰트 입력



엑셀에서 폰트를 만들기 위해 원래는 8bit(가로) * 8bit(세로)이지만 안쓰는 비트 3개(가로) 64byte로

이루어져있다. 위 처럼 폰트를 만들고 해당 칸에 1을 넣어 비트로 계산해서 16진수로 만들면 

폰트 셋팅이 끝난다.   




우선 배열로 폰트자체를 담아준다. 하지만 아까도 말했듯이 배열크기는 64를 넘을 수 없다.

한 칸에 64byte이며 최대 8칸 까지 가능하다. ATMega(CGRAM)의 한계

반복문을 이용해 CGRAM에 폰트 위치들을 담고, LCD_Data를 이용해서 폰토 내용을 넣어준다.

LCD_Inst를 이용해 LCD화면 출력 위치 주소를 정해준다.

LCD는 2(줄)*16(칸)으로 구성되어 있는데

1줄은 0x80~0x8f까지 2줄은 0xc0~0xcf로 구성되어 있다.

CGRAM을 활성화 시켜서 담을 위치에 폰트들을 담는다.



실행결과


'study!!!' 카테고리의 다른 글

20140519 - make파일이란?  (0) 2014.05.19

매크로 함수의 단점


정의하기가 정말 까다롭다.

디버깅하기가 쉽지 않다.

하지만 c++에서는 이런 단점을 보완할 만할 매크로가 존재한다.

inline이라는 함수인데 나중에 차차 배워 나가게 될 것이다.

위와는 관련 없지만 커맨드 창에서도 -D라는 것을 이용해서 매크로 정의를 할 수 있다.

main.c

위그림과 같이 소스 내에서 #define을 쓸 수 있는 방법도 있지만, 커맨드 창이나 linux환경에서 

-D를 사용해서 define을 할 수 있다.



파일의 분할


컴파일러는 파일 단위로 컴파일을 진행한다. 다른 파일의 정보를 참조하여 컴파일을 진행하지 않는다.



외부에 선언 및 정의되었다고 컴파일러에게 알려줘야한다.

extern int num;     //int 형 변수 num이 외부에 선언되어 있다.

extern은 int 형 변수 num이 외부에 선언되었음을 컴파일러에게 알릴 때 사용.



main2.c

test.c

extern은 위 그림과 같이 선언된 변수가 main파일에 없고 다른 곳에 존재함을 의미한다.

하지만, extern을 이용해서 main.c와 test.c파일에서 iNum이라는 하나의 변수를 공유할 수 있다.



다른 파일에서 접근을 못하게 하고 싶다면 static!

static선언은 다음의 의미를 가진다. 이 변수는 외부 파일에서의 접근을 허용하지 않는다.

접근범위는 파일 내부로 제한한다.

c언어에서 유일한 보안방법


main2.c

test.c

위 그림처럼 static은 전역으로는 쓸 수 있지만, 파일 내에서만 가능하기 때문에 main2.c와 test.c     두 개의 파일을 각각 따로 컴파일하면 잘 되지만, 두 파일을 함께 실행하면 에러가 발생한다.

c언어에서 유일한 보안방법이다. 이 방법은 함수에서도 통한다. 


ADC, DAC, 샘플링이란?





위 그래프에서 세로축은 전압, 가로축은 진동수 이다.

ADC(Analog Digital Converter) : 아날로그 값을 디지털 값으로 변경 해주는 장치.

DAC(Digital Analog Converter) : 디지털 값을 아날로그 값으로 변경 해주는 장치.

위 그래프의 샘플링은 3bit이다.

세로축에 점으로 표현가능한 자리수가 총 8개 이기 때문

예를 들면, 샘플링 10bit라고 하면 2^10승 이기 때문에 1024개의 점으로 표현이 가능하다.

(샘플링을 촘촘하게 할수록 아날로그 데이터에 가까워 진다. 하지만 완변하게 아날로그 데이터를 복사 할 수는 없다.)

 

ADC 스펙, 약도, 설명

 

 

 (ADC의 채널)

 

– 8-channel, 10-bit ADC

아날로그를 디지털로 바꿔주는 8개의 다리를 8-channel이다.

샘플링 비트(주파수)를 분해능력이라 한다.

 

 ADC 블록 스키마

 

ADC Prescaler의 설명

 

 

 ADC 정의


ADC.c

ADC.h



서식에 따른 데이터 입출력 : fprintf, fscanf








임의 접근을 위한 '파일 위치 지시자'의 이동


파일 위치 지시자의 이동 : fseek - 파일포인터

#include <stdio.h>

int fseek(FILE * stream, long offset, int wherefrom);

->성공 시 0, 실패 시 0이 아닌 값을 반환


제일 앞을 기준으로 잡을 때 SEEK_SET(0)(왼쪽 기준)

현재 위치 기준으로 잡을 때 SEEK_CUR(1)(현재 위치)

파일 끝을 기준으로 잡을 때 SEEK_END(2)(오른쪽 기준)


현재 파일 위치 지시자의 위치는 : ftell

#include <stdio.h>

long ftell(FILE * stream);

-> 파일 위치 지시자의 위치 정보 반환


파일 위치 지시자의위치 정보를 반환하는데, 파일 위치 지시자가 첫 번째 바이트를 가리킬 경우 0을 반환하고, 세 번째 바이트를 가리킬 경우 2를 반환한다. 가장 앞 부분의 바이트 위치를 0으로 간주한다는 점에 주의.











ch25.메모리 관리와 메모리의 동적 할당

p.549 

malloc 함수의 사촌 뻘 되는 calloc 함수

#incluse <stdlib.h>

void * calloc(size_t elt_count, size_t elt_size);

-> 성공 시 할당된 메모리의 주소 값, 실패 시 NULL 반환


USART_RX통신으로 LCD에 키보드 입력받기


USART.c부터 살펴보면

반복문을 이용해 UCSR0A->RegisterA와 1을 RXC만큼 왼쪽으로 이동시킨게 &연산을 하여 

0과 같으면 반복인데 이 말은 입력값이 있을 때 까지..1이 될 때까지 반복된다는 말이다.

기능성 레지스터이고, cpu register : 0~31까지의 주소 중 하나에 저장된다.  


Main.c에서 LCD_Init과 USART_Init을 이용해 각각 초기화 시켜준 다음에

LCD_Data(USART_RX)를 하면 키보드에 치는 대로 LCD에 출력이 가능해진다.




폰트따서 이름 LCD출력하기



위 그림처럼 엑셀로 폰트를 딴다. 빨간 색 표시가 있는곳에 하나하나 모두 

저런식으로 넣어주면 1로 표시되어있는 곳을 비트단위로 계산하여 16진수로 바꿔준다.



인자값을 이용해 파일복사하기

 

a.cb.cmain1.c

 

des.txt main2.csrc.txt


바이너리 데이터의 입출력 : fread, fwrite

바이너리 데이터의 입출력을 진행하는 함수이다.

size_t fread(void *buffer, size_t size, size_t count, FILE * stream);

->성공 시 전달인자 count, 실패 또는 파일의 끝 도달 시 count보다 작은 값 반환

fread((void *)buf, sizeof(int), 12, fp);    fp는 FILE 구조체 포인터

sizeof(int)크기의 데이터 12개를 fp로부터 읽어 들여 배열 buf에 저장해라.

fread 함수는 두 번째 전달인자와 세 번째 전달인자의 곱 바이트 크기만큼 데이터를 읽어 들이는 함수이다. 따라서 위의 fread함수호출을 통해서 int형 데이터 12개를 fp로부터 읽어서 배열 buf에 저장하게 된다.

이 함수는 실제로 읽어 들인 데이터의 갯수를 반환하는데(읽어 들인 바이트 수가 아니라 갯수이다.), sizeof(int) 크기의 데이터를 12개 읽어 들이는 경우이다. 함수의 호출이 성공을 하고 요청한 분량의 데이터가 모두 읽혀지면 12가 반환된다.

함수의 호출이 성공을 했지만 파일의 끝에 도달을 해서 12개를 모두 읽어 들이지 못했거나 오류가 발생하는 경우에는 12보다 작은 값이 반환된다.

size_t fwrite(const void * buffer, size_t size, size_t count, FILE * stream);

->성공 시 전달인자 count, 실패 시 count보다 작은 값 반환

int buf[7]={1, 2, 3, 4, 5, 6, 7};

fwrit((void*)buf, sizeof(int), 7, fp);

sizeof(int)크기의 데이터 7개를 buf로부터 읽어서 fp에 저장하라.

 

AA.binmain3.c



문제 ch24-1

 

ch24quiz1.c

 

ch24quiz2.c

 ch24quiz3.c


USCR Register의 RegisterC












USART 통신하여 문자 출력해내기





USART 통신을 위한 소스이다. 우선 USART.c에 USART_TX 함수를 선언 및 정의 해준다.

한 글자씩 출력해 낼 수 있게 구현한다.

main함수에서는 USART_TX함수를 호출하여 한 글자씩 찍어낼 수 있게 한다.

커맨드 창에서 make로 컴파일을 시켜준다.

그리고 프로그램을 인식시키기 위해서는 우선 AVR Studio를 이용하여 프로그램을 칩에 넣어준다.



프로그램을 칩에 인식시키고 나면 인식할 때 썼던 칩을 완전히 뽑아버리고 USB선을 USART보드에 꽂아준다.

통신을 위한 [시작]->[보조프로그램]->[통신]->[하이퍼터미널] 실행 후에 위와 같이 설정해준다.

컴퓨터 마다 틀리지만 포트를 보고 그에 맞게 선택하여 3번 처럼 설정 후에 적용한다.

마지막으로 ATMega 보드의 리셋버튼을 누르면 위 그림과 같이 뜬다.


USART 통신 문자열 나타내기



위 그림처럼 소스를 코딩해주면 통신하여 Hello를 찍어준다.