개요

 sprintf와 printf는 비슷한 함수입니다. 둘다 서식화된(formatted) 문자열을 출력할 수 있는 함수입니다. 단 printf는 화면에 출력하는 반면 sprintf는 버퍼에 출력한다는 차이점이 있습니다.

 ARM은 printf를 사용할 수 없습니다. 기존에 ARM에 숫자를 출력할 때에는 정수형을 ASCII 문자열로 바꾸기 위해 직접 값을 나누고 나머지 들고오고 넣고... 너무 귀찮았기 때문에 sprintf를 ARM에 응용할 수 있을까? 싶어 테스트해 보았습니다.

 문자열 출력은 만들어 둔 캐릭터 LCD 구동소스를 응용하였습니다.


소스

 단순하게 임시 저장 버퍼와 임시 정수형 변수를 선언하고, LCD를 초기화해준 후 sprintf로 buff에 "test %d", uiNum을 집어넣고 문자열 출력 함수로 버퍼를 출력하였습니다.


결과 사진



아주 잘 되는군요 *^^*


만족만족


AVR(ATmega2560)보고서 - 조유진.hwp

AVR(ATmega2560)보고서 - 조유진.pdf


【목차】

1. 기본 설정

1-1. 설치해야 할 프로그램 및 파일

1-2. 프로그램 올리기

1-3. MAKEFILE

2. 캐릭터LCD(PORT)

3-1. 개요

3-2. 사용하는 레지스터

3-3. Source Code

3-4. 실습 사진

3. 타이머카운터 및 초음파 센서 활용(PORT, TIMER, EXT-INT)

5-1. 개요

5-2. 사용하는 레지스터

5-3. Source Code

5-4. 실습 사진

4. 시리얼 통신 및 센서 이용, EEPROM(UART, ADC, EEPROM)

6-1. 개요

6-2. 사용하는 레지스터

6-3. Source Code

6-4. 실습 사진


ARM(AT91SAM7S256)보고서 - 조유진.hwp


ARM(AT91SAM7S256)보고서 - 조유진.pdf


【목차】

1. 기본 설정

1-1. 설치해야 할 프로그램 및 파일

1-1-2. Cygwin 설치법

1-1-3. GNUARM 설치법

1-1-4. AT91SAM7S256 드라이버 설치 및 컴퓨터 연결

2. 문서 읽는 법

2-1. 개요

2-2. 회로도 읽기

2-3. 데이터시트 읽기

2-4. 타이밍차트 읽기

3. 캐릭터LCD(PIO)

3-1. 개요

3-2. 사용하는 레지스터

3-3. Source Code

3-4. 실습 사진

4. 온도센서 및 조도센서(ADC)

4-1. 개요

4-2. 사용하는 레지스터

4-3. Source Code

4-4. 실습 사진

5. LCD 및 초음파 센서 활용(PIO, AIC)

5-1. 개요

5-2. 사용하는 레지스터

5-3. Source Code

5-4. 실습 사진

6. DBGU 활용(LED,릴레이 On/Off)

6-1. 개요

6-2. 사용하는 레지스터

6-3. Source Code

6-4. 실습 사진

unsigned int ADC_Convert(int iCH)
{
  // 채널 설정, ADMUX 레지스터 사용
  // ADC 기능 활성화, ADC 분주비 64사용, ADCSRA 레지스터 사용
  // ADC Start Conversion : ADCSRA 레지스터 사용

  //Conversion 완료까지 대기, while문 사용, ADCSRA 레지스터 사용

  return ADC; // ADCH, ADCL를 한번에 리턴할 수 있는 ADC를 define 해 놓을 것!!
}



아직 덜씀

XOR로 역상도 만들었는데 영상을 안찍었나봄...그나마 찍은 영상도 ATmega로 찍었다;;;뭐 구조는 비슷하니깐...

보고서도 빨리 써야되는데;





영상은 ATmega에서의 영상;;

주변이 좀 시끄럽다 ㅋㅋ

void Timer0_Init(void)
{
// 타이머 카운터 0 사용을 위한 PMC 활성화
   
// 1.시작 : 타이머 클럭 비활성화 ------------------
// 타이머 클럭 비활성화(TC_CCR 설정)


// 2. 시작 : 타이머 인터럽트 비활성화 -------------
// 타이머 인터럽트 비활성화(TC_IDR 설정)
// 인터럽트 상태 정보 초기화(TC_SR 읽기)

// 분주비 1024, 비교 방식 레지스터 설정(TC_CMR, DIV5_CLOCK, AT91C_TC_CPCTRG)
// MCKR divided by 4096 => 12, 0.25us(TC_RC 설정)

// 타이머 카운터 0 인터럽트 비활성화(AIC_IDCR, AT91C_ID_TC0)

// 3. 시작 : 타이머 카운터 0 인터럽트 비활성화 ------
// 타이머 카운터 0 인터럽트 핸들러 등록(AIC_SVR[AT91C_ID_TC0], timer_handler)
// 타이머 카운터 0 인터럽트 모드 설정(AIC_SMR[AT91C_ID_TC0], AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, AT91C_AIC_PRIOR_LOWEST)
// 타이머 카운터 0 인터럽트 클리어(AIC_ICCR, AT91C_ID_TC0)

// TC_RC 값 비교 타이머 인터럽트 활성화(TC_IER, AT91C_TC_CPCS)

// 2. 끝 : 타이머 인터럽트 비활성화 ---------------

// 타이머 카운터 0 인터럽트 활성화(AIC_IECR, AT91C_ID_TC0)

// 3. 끝 : 타이머 카운터 0 인터럽트 비활성화 -------

// 타이머 클럭 활성화(TC_CCR, AT91C_TC_CLKEN)

// 1. 끝 : 타이머 클럭 비활성화 ------------------

// 타이머 시작(TC_CCR, AT91C_TC_SWTRG)

}



음...컴에서 프로그래밍 할 때는 펑펑 터뜨려도(런타임에러라던지그런거) 아무렇지 않은데

아무래도 회로는 내가 잘못하면 정말 문제가 생기니까 무섭당ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


(페어차일드 사의 7408 칩.)


7408(AND)칩을 브레드보드에 꽂고, ARM칩을 다른 곳에 꼽아 전원을 제공해 준다.

7408칩에 있는 U자형 홈을 왼쪽으로 두었을 때, 아래부터 반시계방향으로 1~14번까지 핀이 존재한다.

여기서, 14번 핀이 VCC이며 7번 핀이 GND이다. 이는 칩이나 제조사마다 차이가 있을 수 있으므로 데이터시트에서 제대로 VCC와 GND를 먼저 찾도록 한다.


제일 먼저, 제대로 신호가 들어가는지 알아보기 위해 발광 다이오드의 +극을 Y1(굳이 Y1아니라도 상관없으며 아무 출력 핀)에 연결하고, -극을 GND에 연결해 준다.

단, 이 때 전자기 유도현상에 의해 원래 폐회로가 되어야 정상인 회로에 전류가 흐르는(유도전류)현상이 일어날 수 있다.

그러므로 어느정도 값이 되는 저항을 GND와 각각의 핀을 연결해 달아주어 오작동을 막게 하는 게 일반적이다.(이를 어스시킨다 하는 모양)

저항을 달지 않더라도 참일 경우의 전류와 유도전류의 차이가 있으므로 티는 난다.

전기가 들어오는지 확인했다면, 정논리인지 부논리인지 체크한다.( 주로 정논리가 많이 쓰인다. 헷갈릴 수 있으므로 정논리만 )



테스트.



1번핀(A1, IN) 2번핀(B1, IN) 전부 VCC 5v와 연결해 주었다.

그리고 3번 핀(Y1, OUT)과 발광 다이오드의 +극을 서로 연결해 주고, -극은 GND에 연결해 준다.

유도전류를 어느정도 막아주기 위해 IN을 담당하는 핀들에 저항을 달았으나, 안타깝게도 아무거나 집어서 끼웠기 때문에 그다지 도움은 되지 못하였다.

이후 테스트를 위해 똑같이 둘다 VCC와 연결하되, 한 핀에는 스위치를 달아주었다.

ㅠㅠ 그래도 자세히 아주 자세히 보면 스위치를 누를 때 마다 조금이나마 밝아짐을 알 수 있다.


-추가- 지금보니 저항을 잘못달아줬어



어정쩡한 밝기차이에 나도 모르게 진짜 깨알같다...라고 한듯

...

+ Recent posts