레이블이 mcu인 게시물을 표시합니다. 모든 게시물 표시
레이블이 mcu인 게시물을 표시합니다. 모든 게시물 표시

2017년 4월 29일 토요일

(E)Silicon Labs C8051 LED Blinky Example Explained(C8051 chip 기본동작 LED 예제로 설명하기)

Purpose
for newbie(software engineer) to understand basic concept of embedded programming.
line by line explanation.

Preparation
board: C8051F560 Development Kit
part(Chip): C8051F568-ACK06Z
datasheet: C8051F55x/56x/57x
development kit document: C8051F560 DEVELOPMENT KIT USER ’S GUIDE
development Tool: Simplicity Studio v4
silicon labs debugger
PC(notebook)

Prerequisite
install simplicity studio v4
connect PC-board-debugger

Create (example) project
simplicity IDE - File - New - Project - Silicon Labs MCU Project
select board
select part
select project type:example
select f55x-57x Blinky
copy contents

Explanation
1. Program Description:
  This program flashes the green LED on the C8051F560 target board about
  five times a second using the interrupt handler for Timer2.

2. How To Test:
  1) Download code to the 'F560 target board
  2) Ensure that the P1.3 pins are shorted together on the J19 header
  3) Run the program.  If the LED flashes, the program is working
  J19: Side A: Connects P1.3_A LED and P1.4_A Switch to MCU port pins


3. Code:
  // Includes
  // Global CONSTANTS -> set system clock speed, and select pin to connect to LED
  // Function PROTOTYPES
  //// OSCILLATOR_Init -> set oscillator speed
  //// PORT_Init -> set pin to manipulate LED
  //// TIMER2_Init -> set timer speed, init(&reload) value, enable interrupt and start timer
  // Interrupt Service Routines
  //// Timer2_ISR -> set interrupt service routine function when timer executed
  // MAIN Routine -> initialize and execute while not to exit firmware.

4. line by line code explanation.
    1) Total 175 line of Code
        - 93 lines of Comments
        - 16 lines of new line
        - 66 line of (meaningful) code
    2) will be continued

37: #include <SI_C8051F550_Defs.h>
-> SFR(Special Function Register) address
-> (IRN) Interrupt Request Numbers

38: #include <SI_C8051F550_Register_Enums.h>
-> Register Names

44: #define SYSCLK       24000000/8        // SYSCLK frequency in Hz
SYSCLK : System  Clock
Processor Clock: Chip Clock
-> more explanation needed
reference: Link

46: SBIT (LED, SFR_P1, 3);                 // LED='1' means ON
LED is variable to connect SFR_P1(port 1), pin 3 with rear LED.
so LED=1 make LED light on

52: void OSCILLATOR_Init (void);
initialize oscillator for oscillation of the crystal

53: void PORT_Init (void);
set pin to execute the chip for purpose
in this case LED pin

54: void TIMER2_Init (U16 counts);
configuration timer 2 to execute chip.
configure consists Interrupt Service Routine, Auto-reload, Timer base

59 ~ 75: Main
explained later

88 ~ 96: OSCILLATOR_Init function
88: void OSCILLATOR_Init (void)
89: {
90:    U8 SFRPAGE_save = SFRPAGE;
To read or modifying the SFR value, we need to contact the register.
the steps are
1. Select the appropriate SFR page number using the SFRPAGE register.
2. Use direct accessing mode to read or write the special function register (MOV instruction).

SFR has pages, for C8051F55x/56x/57x family of devices utilizes three SFR pages: 0x00, 0x0C, and 0x0F (ref: datasheet 12.1. SFR Paging)

91:    SFRPAGE = CONFIG_PAGE;
CONFIG_PAGE is 0x0F, and to modify OSCICN register this address should be accessed
92:
93:    OSCICN = 0xC4;                      // Set oscillator divide to /8
OSCICN: Internal Oscillator Control
0xC4 saids 100: SYSCLK derived from Internal Oscillator divided by 8.
datasheet saids SFR Address = 0xA1; SFR Page = 0x0F
so this makes system clock to 24000000(default) / 8 (line 44)
94:
95:    SFRPAGE = SFRPAGE_save;
return pre-sfrpage
96: }

111: void PORT_Init (void)
112: {
113:    U8 SFRPAGE_save = SFRPAGE;
114:    SFRPAGE = CONFIG_PAGE;
115:
116:    P1MDOUT |= 0x08;                 // Enable LED as a push-pull output
P1MDOUT was declared as
SFR (P1MDOUT,     0xA5); ///< Port 1 Output Mode
0xA5 address's value is assigned to P1MDOUT
to configure P1MDOUT(Port 1 mode Out)
it can be done with config2.exe
0x08 is 00001000 as binary and this means port 1 pin 3 is push-pull output
117:    P1SKIP  |= 0x08;                    // Skip the LED pin on the crossbar
skip port 1 pin 3 not to connect any peripheral
119:    XBR2     = 0x40;                    // Enable crossbar and weak pull-ups
see ref1 below
121:    SFRPAGE = SFRPAGE_save;
122: }

137: void TIMER2_Init (U16 counts)
138: {
139:    U8 SFRPAGE_save = SFRPAGE;
140:    SFRPAGE = LEGACY_PAGE;

142:   TMR2CN  = 0x00;                  // Stop Timer2; Clear TF2;
                                                 // use SYSCLK/12 as timebase
144:   CKCON  &= ~0x60;               // Timer2 clocked based on T2XCLK; <- same as above comment(SYSCLK/12 as timebase)

146:   TMR2RL  = -counts;              // Init reload values
timebase is 250,000 hz(250,000 cycles in 1 second)
counts value is 25,000(number, cycles) so
25,000 times takes 25,000 / 250,000 * 1seconds = 1/10 seconds.
this means 10hz frequency
147:   TMR2    = 0xFFFF;                // Set to reload immediately
148:   IE_ET2  = 1;                        // Enable Timer2 interrupts
149:   TMR2CN_TR2 = 1;               // Start Timer2

151:   SFRPAGE = SFRPAGE_save;
152:}

Timer 2
-> check the block diagram related to each register
-> understand datasheet register definition


166: INTERRUPT(TIMER2_ISR, TIMER2_IRQn)
when timer2 interrupt occurs(TIMER2_IRQn, 5 as constant) this TIMER2_ISR function(interrupt service routine) executed
167: {
168:    TMR2CN_TF2H = 0;               // Clear Timer2 interrupt flag
clear flag for next interrupt, because this function already executed.
169:    LED = !LED;                         // Change state of LED
LED represents LED pin
toggle means once on and once off when this interrupt service routine occurs
170: }

ref1: Link
Basically, it gives the designer the flexibility to chose which pins the desired peripheral is routed to. Let's say you have a UART devices that needs to connect to pins P1.0 and P1.1. The crossbar allows you to bring that signal out to that pin or a different supported pin in another design. Think of it as a multiplexer. Each physical pin is an output and all the peripherals are the inputs.

Hope that helps. Every micro controller has this sort of functionality, though usually a pin is limited to a few peripherals it can connect to. This is generally called "pin muxing".

2016년 3월 13일 일요일

(E,K) MCU 이해 - Understanding MCU

Which micro controller could I learn about in order to have directly marketable embedded skills
어떤 마이컴을 선택해야 내 실력을 월등히 높힐 수 있나요?

This chapter will provide such people with some idea why the newbie question can't be answered in any simple way, and some useful recommendations as to which platforms you might choose for experimentation and learning purposes
이 챕터에서는 처음 공부하는 사람이 질문하는 것들이 왜 간단하게 대답될 수 없는지를 설명하면서, 어떤 마이컴을 선택하는 것이 유용할 지에 대해서도 이야기 한다.

in any case, the short answer to the "which micro should I learn for fortune and glory"
question is that learning how to work with any one particular micro-controller won't lead you directly to a job.
어떤 경우에, "어떤 마이컴을 선택하는게 가장 효율적일까요?" 에 대한 짧은 대답은 특정 하나의 마이컴을 공부한다고 해서 직업을 얻을 수는 없을 것이라는 것이다.

when you come to a new job, you're going to find a certain body of legacy technology implemented on some micro or other(probably some hoary old device you would never choose in your wild-est nightmare),
새로운 직업을 잡게 되면, 그 회사에서 기존에 개발되어 있던 예전 코드들로 일하게 될 것이다.(아마 당신이라면 절대 선택하지 않을 마이컴일 수 도 있다.)
and perhaps a newer generation based on a different family of micros and when you start working on your own completely new designs, you may choose a different family yet again.
그리고 공부했던 것과는 다른 전혀 새로운 마이컴들을 가지고 일할 수도 잇다.

on a related note: In this chapter, I mention several specific vendors and products by name, and I quite some approximate price.
이 챕터에서는 몇가지 벤더의 제품들을 이야기할 것이다.

I'm including a discussion of the 8051 in this book for two reasons and one minor reason.
인털의 8051시리즈를 언급하는 것에는 큰 2가지 이유와 작은 한가지 이유가 있다.

1. It pops up in all sorts of apparently unrelated applications - many application - specific standard products(ASSPs), for instance, have an 8051 core.
The chance that you'll run across an 8051 variant in your career is this very good indeed.
Being family with the core's capabilities, if nothing else, will help you decide how to part together your design.
2. If you can work efficiently with the 8051, you can work with anything, so it's not a terrible architecture to learn on.
3. (Minor reason) - the 8051 happens to be very efficient at task. You may find this fact useful, since the 8051 is also very cheap

1. 어디선가 8051 버전의 변형을 만날 확률이 높다.
2. 8051을 효율적으로 사용하면 어떤 것들로도 일할 수 있어진다.
3. (마이너한 것) - 실제 효율적이며, 싸다.

1st level of Understanding of MCU as SW Engineer(My Idea)
    Memory Configuration
      -> Memory address
        RAM(DRAM, SRAM)
        ROM(MASK ROM, PROM, EPROM, EEPROM)

SW 엔지니어로서 MCU 에 대해 1차로 이해해야 하는 것(내 생각)
    Memory 구성
      -> 메모리 주소
        RAM(DRAM, SRAM)
ROM(MASK ROM, PROM, EPROM, EEPROM)
    Port의 종류와 역할
        지원 통신의 종류
    사용가능 인터럽트
    그 외 자세한 기능


참조: 임베디드 엔지니어가 되고 싶다고
Reference: So You Wanna Be an Embedded Engineer, 1st Edition

2016년 3월 10일 목요일

(K)디지털 통신의 2차 분류(동기-비동기, synchronous-asynchronous)

동기와 비동기에 대한 이해가 쉽지가 않아서 웹을 돌아다니다가 좋은 글을 만나서 기록해 둡니다.
가장 좋은건 비슷한 질문과 그에 대한 답변을 발견하는 것

---


질문
    동기와 비동기 통신은 어떻게 동작하는 것인가요?

답변
    동기는 전화 통화를 하는 것
        - 전화를 걸때: 걸고 전화를 받을 때 까지 기다린다. 전화를 받으면 이야기 한다. 끊을 때도 끊자고 이야기 하고 알았다고 하면 끊는다.
    비동기는 편지를 주고 받는 것
        - 편지를 쓴다. 그리고 편지가 상대방에게 가는 도중에 나는 다른일을 한다.

동기와 비동기에 대한 의미는 이해를 하였으나, 실제 디지털 통신에서 RS232 와 SPI 의 차이점에 대해서는 아직 이해하지 못하였다.
추후 정리가 필요.

참조: http://stackoverflow.com/questions/10102580/how-does-synchronous-and-asynchronous-communication-work-exactly


(K)디지털 통신의 1차 분류(Serial-Parellel, 직렬-병렬)

디지털 통신 시스템에서는 두 가지의 데이터 전송 방식이 있다:병렬 과 직렬. 병렬 연결은 여러개의 선이 병렬로(동시에) 동작하는 거시고. 시리얼은, 반대로, 하나의 선으로 데이터를 하나씩 전송하는 것이다.

병렬 데이터
컴퓨터에 있는 병렬 포트가 예시이다. 병렬 포트의 경우 8개의 데이터 선들이 있고, 그라운드선과, 제어선이 있다. 그리고 IDE 하드디스크 커넥터와 PCI 확장포트도 좋은 예이다.

직렬 데이터
컴퓨터의 직렬 포트가 예시이다. 하나의 선으로 연결이 되어 있거나 하나의 차동증폭기로 되어 있고, 기본 선 외에 그라운드나 컨트롤 선이 있는 것이다. USB, FireWire, SATA 와 PCI Express 가 좋은 예이다.


참조: https://en.wikibooks.org/wiki/Communication_Networks/Parallel_vs_Serial
    

2016년 2월 20일 토요일

MCU(Micro Controller Unit, ex>arduino, 아두이노) 이해를 위한 Post - 1

요약
    4가지 질문으로 MCU를 이해


1. 무엇을 말하는가?
    MCU: Micro Controller Unit
            특정 제어장치에 적용하기 위해 만들어진 소형 컴퓨터 칩
            (MCU, Embeded, ECU 는 결국 컴퓨터 이지만 성능의 차이로 구별이 된다.)

2. 어디에 사용되는가?
    TV, 냉장고, 전화기 등 소형 전자제품을 제어할 때 사용
    
3. 무엇으로 구성 되어 있는가?
    CPU + ROM + RAM + TIMER + PORT + 통신(UART, SPI, I2C ..)
    컴퓨터가 동작을 하기 위해서 필요한 것들이 하나의 칩에 모여 있는 것
    1) 실제 동작을 위한 명령(기계어 코드) - 보통 외부에서 통신을 통해 메모리로 Loading
    2) 기계어 코드가 저장되어 있을 메모리
    3) 기계어 하나하나를 실행시켜 줄 CPU
    4) 위 3개를 연결시켜 줄 IO
    
4. 어떻게 실행 되는가?
    1) 필요한 프로그램을 MCU 상의 메모리에 올려 실행
        a. PBL: 주변 기기와 연결을 해 주며, ROM에 있는Main Program을 올리는 역할을 하는 SBL을 RAM에 올려주는 역할
        b. SBL: Main Program을 RAM에 올려주는 역할
        c. Main Program: RAM에서 Loop를 돌며 MCU의 동작 수행
    2) MCU 동작 수행
        - Main Program은 각 각 통신 방법으로 약속된 통신 메시지를 주고 받으며 동작 

관련 단어
    Boot Loader
    PBL(Primary Boot Loader)
    SBL(Secondary Boot Loader)
    CPU(central processing unit)
    ROM(Read-Only Memory)
    RAM(Random Access Memory)
    TIMER
    PORT
    UART(Universal asynchronous receiver/transmitter)
    SPI(Serial Peripheral Interface)
    I2C(Inter Integrated Circuit)

메모
    MCU 관련 Software 개발을 시작하게 되었는데 MCU 제어를 해보지 않아 관련 정보 찾아 보았습니다.
    MCU 의 가장 유명한 예시인 ARDUINO(아두이노) 도 구매해서 실천적인 경험도 가지고 있는 중
    
참조