본문 바로가기
코스웨어/14년 스마트컨트롤러

2014.05.02 교육보고 (20. 이경진)

by 알 수 없는 사용자 2014. 5. 6.
728x90
반응형

 늦어서 죄송합니다~ 모두 남은 휴일 즐겁게 보내시고 수업시간에 뵙겠습니다 :-D

 

- ATMEGA 수업-

: ADC

 

 

static void ADC_Init(unsigned char ucCh)
{
 ADMUX   = (0<<REFS1)|(0<<REFS0)|(0<<ADLAR)|( ucCh & MASK_MUX );

 

 ADCSRA   = (1<<ADEN)|(0<<ADSC)|(0<<ADFR)|(0<<ADIF)

|(0<<ADIE)|(0<<ADPS2)|(0<<ADPS1)|(0<<ADPS0); 

}

 

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)를 준다.

이때 (ADCH<<8) 은 정렬 해줄 때 값을 밀어주는 용도이다!!!!1-1.5 그림 참고! << 추가분

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;
}

 

 

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

 

 

 

- C 수업-

:가변인자, 도서관리 I

 

1. 가변인자

 

printf의 기본형 :int Printf (const char* Format, ...)

 

첫번째 인자인 문자열에 존재하는 서식문자의 수만큼 전달인자의 수도 늘어난다.

예를 들어

printf("[%d] is [%d] " , ...);

에서  ... 부분은 서식문자가 2개 (%d%d ) 인자도 2개가 되어아 한다.

그리고 그 수는 제한이 없다. 이러한 호출이 가능한 함수를 [가변인자 함수] 라고 부른다.

 

 

일단 맨앞의 수는 무조건!! 있어야 한다.

위의 경우에 맨앞에 있는 정수가 정수의 갯수를 나타내는데, 맨앞 정수의 수만큼만 읽는다.

만약 앞의 정수이상의 수를 넣으면! 그 뒤의 수는 무시한다.

#include <stdio.h>
int sum(int n, ...); // ... 이 없으면 단순히 n을 출력
int main ()
{
  sum(2,1,2);
  sum(3,1,2,3);
  sum(4,1,2,3,4); 

  return 0;  
}

int sum(int n, ...)
{
  printf(" n =[%d]\n",n);
  return 0;
}

 

=[2]

=[3]

=[4]

 

 

 

1-2. 추출의 단계

 

 

va_list     :[참조선언] char * 로 정의되어, 이 포인터가 각 인자의 시작주소를 가리킴.

va_start   :[사용선언] 가변인자 중 첫 번째 인자의 주소를 가르쳐주는 매크로.

va_arg     :[인자 추출] 특정 가변인자를 가리키고 있는 va_list의 포인터를

   다음 가변인자로 이동시켜 주는 매크로

va_end     : [함수종료]가변인자를 끝내는 역할.

   단순히 모양을 보면 NULL 포인터로 돌려주는 매크로인데, 프로그램상 어떤 경우가   생길 지 모르니까 놓치지 말고 써주도록 합시다!

#include <stdio.h>
#include <stdarg.h>
int Sum (int n,...);

int main ()
{
  printf ("1+2 =%d \n",Sum(2,1,2));
  printf ("1+2+3 =%d \n",Sum(3,1,2,3));
  printf ("1+2+3+4 =%d \n",Sum(4,1,2,3,4,5,6));
  // 뒤의 5,6 은 첫인자(4)보다 많은수이므로 무시 됨.

  return 0;
}

int Sum(int n , ...)
{
  int Sum = 0;
  int i;
  va_list vlist;

  va_start(vlist,n);
  for (i=0; i<n;i++)

  {
    Sum= Sum+va_arg(vlist,int);
  }
  va_end(vlist);

  return Sum;

}

 

1+2=3

1+2+3=6

1+2+3+4=10


 

 

 

 

2. Linked List -> 도서관리 프로그램 I

 

2-1. 헤드파일 재설정.

#ifndef _Linked_List
#define _Liked_List

#include <stdio.h>
#include <stdlib.h>

 

//구조체 재설정!

  typedef struct _book {
  char               caTitle[31];
  unsigned int       uiPrice ;
  char               caAuthor[31];
  char               caType[21];
  struct _book * next;
}book;

void BOOK_STDIN(book * stddata);
void BOOK_STDOUT(book* stddata);
void BOOK_free(book * Head);
    
#endif 
//_Linked_List

 

 

2-2. 함수 재설정 (입력/출력)

#include "LinkedList.h"
//키보드에서 책 정보 입력 받는거

void BOOK_STDIN(book * stddata)
{
//동적할당 받아 왔심

//책이름 저장
printf (" Insert Book's title [~ 30] : ");
scanf("%s",stddata-> caTitle);
//책 가격 저장
printf (" Insert Book's Price : ");
scanf("%d",&stddata-> uiPrice);
//책 저자 저장
printf (" Insert Book's Author [~ 30] : ");
scanf("%s",stddata-> caAuthor);
//책 분류 저장
printf (" Insert Book's Type [~ 30] : ");
scanf("%s",stddata-> caType);

}

void BOOK_STDOUT(book*stddata)
{
printf("\n\n\n");

//책이름 출력
printf (" Insert Book's title :  [%s] \n",stddata->caTitle);
//책 가격 출력
printf (" Insert Book's Price : [%d]\n ",stddata->uiPrice);
//책 저자 출력
 printf (" Insert Book's Author : [%s]\n",stddata->caAuthor);
//책 분류 출력
printf (" Insert Book's Type : [%s]\n",stddata->caType);

}

 

2-3. main 함수

 

#include "LinkedList.h"

int main()
{
  book * Head=0;

 

  Head=malloc(sizeof(book));
  BOOK_STDIN(Head);
  BOOK_STDOUT(Head);
  free(Head);
 
  return 0;
}

728x90