늦어서 죄송합니다~ 모두 남은 휴일 즐겁게 보내시고 수업시간에 뵙겠습니다 :-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
6 : /0
5 : 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
{
ADC_Init(0);
}
unsigned int ADC_Convert(void)
{
ADC_Init_0CH();
return ADC_Run();
}
1-4.main에서 0000 하이텔/LCD로 보내기!
int main(void) LCD_Str(cString);
{
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);
}
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;
}
n =[2]
n =[3]
n =[4]
1-2. 추출의 단계
va_list :[참조선언] char * 로 정의되어, 이 포인터가 각 인자의 시작주소를 가리킴.
va_start :[사용선언] 가변인자 중 첫 번째 인자의 주소를 가르쳐주는 매크로.
va_arg :[인자 추출] 특정 가변인자를 가리키고 있는 va_list의 포인터를
다음 가변인자로 이동시켜 주는 매크로
va_end : [함수종료]가변인자를 끝내는 역할.
단순히 모양을 보면 NULL 포인터로 돌려주는 매크로인데, 프로그램상 어떤 경우가 생길 지 모르니까 놓치지 말고 써주도록 합시다!
#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;
}
'코스웨어 > 14년 스마트컨트롤러' 카테고리의 다른 글
개인 포트폴리오 가이드 문서 및 프로그램 (1) | 2014.05.08 |
---|---|
[업무일지]2014년05월07일 (15) | 2014.05.08 |
cds센서 김재성 (2) | 2014.05.08 |
2014.05.07 ADC (2) | 2014.05.07 |
2014.04.29 교육보고 <오영주 18번> (14) | 2014.04.30 |
2014.04.28 교육보고 <오두환 17번> (20) | 2014.04.28 |
2014년 4월 25일 양태영 [출석번호 16번] (13) | 2014.04.25 |
2014년 4월 24일 송근영 [출석번호 15번] (17) | 2014.04.25 |