[AVRStudio4]Printf 사용하기

AVR Studio 4.19기준 상부의 “Project”메뉴에서 “Configration Options”를 선택해 Project Option 진입 후 아래와 같은 절차로 설정해주면 Printf 함수를 사용할 수 있음.

1

libprintf_flt.a 를 Link with These에 추가

2

Link Options에 아래 옵션 추가

-Wl,-u,vfprintf

-lprintf_flt

-lm

 

[Codevision]송수신 인터럽트를 이용한 RS485 제어

RS485를 제어하려면 Receive, Drive Enable Pin을 제어해야 합니다. Polling 방식이나 제어주기에 제약이 없는 상황에서는 문제가 없지만 능동적인 제어일때는 여러가지 문제가 발생합니다 따라서 인터럽트를 이용해 송수신을 하면  delay함수를 쓰지 않고도 제어할 수 있어 효율적인  송,수신을 할 수 있습니다.

※ 485 드라이버를 2개 사용해서 송 수신 라인이 다르게 설계했다면 해당 내용은 유효하지 않습니다.

예제는 USART3으로 되어있으니 참고하시기 바랍니다.

 

[Codevision] printf 함수 usart0, 1, 2, 3 으로 임의 변경해서 쓰기.

printf() 함수는 디버깅에 아주 유용하게 쓰이고 있다.  하지만 기존설정은 USART0에 고정되어 있어 제약이 생겨 이를 변경할 경우가 생기는데 이 때 유용한 방법이다.

“CodeVisionAVR User Manual”에 해당내용이 있어 발췌해 왔다.

#define _ALTERNATE_PUTCHAR_
#define _ALTERNATE_GETCHAR_

기존 printf에서 사용하는 putchar(),getchar()함수 기능을 교체하는것이 핵심이다. 따라서. putchar(),getchar() 함수를 다시 지정하여 USARTx에 사용 가능하도록 하는 것이다.

1

USART1에 사용하도록 설정한 예제니 참고하기 바란다.

 

[ETC]Sys Tick

SysTick?

STM32F051R8T6은 다양한 기능을 가진 타이머가 8개가 존재하며 이것들은 서로 독립적으로 동작을 한다.

일단 FND 제어때 쓰려고 하는 것인 만큼  설명이 필요한 타이머에 대한 포스팅은 일단 나중에 하기로 하고

간단하게 사용할 수 있는 24비트 타이머를 알아보자.

 

SysTick 타이머의 장점은 STK_RVR(SysTick_LOAD, 0xE000E014)에 클럭 소스를 입력 하면 STK_CVR(SysTick_VAL, 0xE000E018)이 다운카운터로 동작하고 “0”이되면 STK_CSR.B16(STK_CTRL 의 16비트 자리, 0x00010000)가 “1”이 되며 인터럽트 서비스 루틴으로 호출된다.

이때 STK_CVR은  STK_RVR로 리로드 되어   초기화등 신경을 크게 안써도 되어 비교적 간단히 타이머를 구현할 수 있다.

SysTick Timer 사용법

1.SysTick Interrupt를 Enable

2. STK_RVR Register에 클럭 소스 입력

3.STK_CVR Register “0”으로 초기화

4.STK_CSR.B0

             0=SysTick Timer Disable

             1=SysTick Timer Enable 

5.STK_CSR.B1

              0=STK_CVR이 0일 때 인터럽트를  루틴을 실행하지 않는다.

              1=STK_CVR이 0일 때 인터럽트를  루틴을 실행한다.

6.STK_CSR.B2

               0=클럭 소스를 외부

               1=STK_CVR이 0일 때 인터럽트를  루틴을 실행한다.

이정도만 설정하면 클럭 소스로 입력한 수치가 다운카운터가 되어 “0”이되면

STK_CSR.B16(SysTick Interrupt Flag)이 세트되면서 SysTick 인터럽트로 진입하고  STK_RVR값이 리로드되며 위 과정을 반복하는 구조다.

클럭소스는 다음과 같다.

value = fclock [Mhz] * desired_period [s]

80000 = 8000000 * 0.01

STM32f051 Discovery라면 시스템클럭이 8Mhz * 10ms하면 80000이 된다 이를 STK_RVR로 설정하면 10ms마다 인터럽트 루틴이 호출된다.

[FND제어]Chapter 1

FND (Flexible Numberic Display) 는 보통 Dynamic Display 방법으로 제어한다. 착시현상을 이용한 것인데 이 부분을 동영상으로 설명했으니 동영상을 먼저 확인하고 다음 설명으로 넘어가겠다.

동영상에서 관찰되는 것 처럼 FND 제어에서 Dinamic 방식의 핵심은 바로 시간차다.

1000의자리를 먼저 출력하고 1ms 후에 100의자리 표시, 또 1ms 후 10의 자리 표시, 또 1ms 후 1의 자리 총 5ms 이내의  빠른 시간 내  출력하는 것을 반복하면 마치 네 자리가 동시에 켜져있는 듯한 착시현상이 일어난다. 보통 사람의 경우 30ms 이하의 빠른 속도는  감별하지 못한다 한다.

아래는 해당 실습에 사용된 코드며, FND 동작을 살펴보기 위해 작성된 코드라 앞으로 쓰일 일이 없는 코드다.   동영상 처럼 숫자 표시가 느려졌다, 빨라졌다 하는 부분은 delay_ms()함수에 지연시간을 길게, 짧게 조정함으로 써 차이가 발생하였다.

간단한 표시는 상기 코드로도 충분하지만 코드 길이가 길고 피치못하게 delay 함수를 써야 한다면 해당 제어로를 사용하게 되면 많은 문제가 발생하게된다 이런 문제를 극복하기 위해서 타이머를 이용한 방법도 있으니 이 방법은 다음에 살펴보기로 하자.

[LED제어]Chapter 5

 

 

 

 

 

 

[LED제어]Chapter 4

 

 

 

 

 

[LED제어]Chapter 3

Chapter 2에서 GPIO_Digitial_Output() 함수에 대해서 간단히 설명을 했는데 Chapter 2는  논리합 연산으로 사용하고 싶은 Port를 선택할 수 있었다. 이번엔 16비트 중 하위 8bit를 Out Port로 지정하는 방법으로 설정하였다.

반대로 상위 8bit롤 Out Port로 지정하기 위해서는 _GPIO_PINMAS_HIGH, 전부 Out Port로 사용하기 위해서는  _GPIO_PINMAS_ALL  이런식의 지정하여 사용할 수 있다.

해당 소스를 Downloader 하면 LED의 교차동작을 확인할 수 있다.