Busan IT/AVR 컨트롤러2015. 4. 7. 13:38

AVR 컨트롤러 - 7 Segment 카운트다운

 

학습목표 - ATmega25607 Segment를 활용하여 카운트 다운을 만들 수 있다.

 

 

ATmega2560을 활용하여 7 segmet에 숫자를 넣는 코딩을 해보자.

 

전압은 common anode sync 타입으로 한다.

 

평소에 pull-up이기 때문에 0V가 인가되어야 해당 LED에 불이 들어오는 방식을 취한다.

 

0부터 9까지 다 띄워보자!


소스

#include "SMART.h"


int main(void)
{
  volatile unsigned int uiCnt;
  unsigned int uiCnum;
  
  unsigned char FND[] = {0x100x000x580x020x120x190x300x240x790x40};

  DDRA = 0xFF;
  
  while(1)  

  {
    for(uiCnum = 0; uiCnum <= 10; ++uiCnum)
    {
      PORTA=FND[uiCnum];
      Delay(dNum3);

    }

  }

      
  

  return 0;

}




 

 

반응형
Posted by newind2000
Busan IT/AVR 컨트롤러2015. 4. 3. 13:53

ATmega2560 LCD 사용을 위한 코딩

 

SMART.h

#ifndef __SMART_H__
#define __SMART_H__

/**** General Purpose Register A - L ****/

#define  PORTA (*((volatile unsigned char*)0x22))
#define   DDRA  (*((volatile unsigned char*)0x21))
#define   PINA  (*((volatile unsigned char*)0x20))

#define  PORTB (*((volatile unsigned char*)0x25))
#define   DDRB  (*((volatile unsigned char*)0x24))
#define   PINB  (*((volatile unsigned char*)0x23))

#define  PORTC (*((volatile unsigned char*)0x28))
#define   DDRC  (*((volatile unsigned char*)0x27))
#define   PINC  (*((volatile unsigned char*)0x26))

#define  PORTD (*((volatile unsigned char*)0x2B))
#define   DDRD  (*((volatile unsigned char*)0x2A))
#define   PIND  (*((volatile unsigned char*)0x29))

#define  PORTE (*((volatile unsigned char*)0x2E))
#define   DDRE  (*((volatile unsigned char*)0x2D))
#define   PINE  (*((volatile unsigned char*)0x2C))

#define  PORTF (*((volatile unsigned char*)0x31))
#define   DDRF  (*((volatile unsigned char*)0x30))
#define   PINF  (*((volatile unsigned char*)0x2F))

#define  PORTG (*((volatile unsigned char*)0x34))
#define   DDRG  (*((volatile unsigned char*)0x33))
#define   PING  (*((volatile unsigned char*)0x32))

#define  PORTH (*((volatile unsigned char*)0x102))
#define   DDRH  (*((volatile unsigned char*)0x101))
#define   PINH  (*((volatile unsigned char*)0x100))

#define  PORTJ (*((volatile unsigned char*)0x105))
#define   DDRJ  (*((volatile unsigned char*)0x104))
#define   PINJ  (*((volatile unsigned char*)0x103))

#define  PORTK (*((volatile unsigned char*)0x108))
#define   DDRK  (*((volatile unsigned char*)0x107))
#define   PINK  (*((volatile unsigned char*)0x106))

#define  PORTL (*((volatile unsigned char*)0x10B))
#define   DDRL  (*((volatile unsigned char*)0x10A))
#define   PINL  (*((volatile unsigned char*)0x109))

/* PORT 사용별 이름 지정 */

#define  LCD_CTL      PORTG
#define  LCD_BUS    PORTA  

#define  LCD_CTL_DDR  DDRG
#define  LCD_BUS_DDR  DDRA




/* LCD PIN */

#define  LCD_RS  0
#define  LCD_RW  1
#define  LCD_EN  2




/* CPU 동작시간을 맞춰주기 위한 Dealy문과 값 지정 */

#define  Delay(x)  for(uiCnt = 0; uiCnt < (dNum); ++uiCnt)

#define  dNum1 = 500;
#define  dNum2 = 3000;
#define  dNum3 = 3500;

/* LCD 제어 명령어 */

#define  LCD_CLR   0x01;  //화면 지우기, 커서홈 -0B 0000 0001
#define  LCD_HOME   0x02;  //커서 처음 위치로 이동 - OB 0000 001
#define  LCD_ENR   0x06;  //어드레스 자동증가/감소(I/D) = 1(증가), 표시 쉬프트(s)=1(표시) - 0B 0000 0111
#define  LCD_DSP   0x0F;  //디스플레이(D)=1(표시), 커서(C)=1(표시), 깜빡임(B) on/off=1(on) - 0B 0000 1111
#define  LCD_CUR   0x14;  //표시=1(표시), 커서 이동=1(오른쪽으로 쉬프트) - OB 0001 11--
#define  LCD_FUNC   0x38;  //인터페이스(DL) = 1(8비트), 라인수(N)=1(2라인), 문자폰트(F)=0(5*8) - OB 0011 10--



/* LCD Write mode 초기화 설정 */
// RS : High = data register, Low = Instruction Register
// R/W : High = read, Low = write

void LCD_Inst(unsigned char ucInst)
{
  LCD_BUS = ucInst;
  
  Delay(dNum1);  //초기 전압 인가시  지연
  
  LCD_CTL=(0<<LCD_RS)|(0<<LCD_RW)|(0<<LCD_EN); //  DC 영역
  Delay(dNum1);  //40ns 지연

  LCD_CTL=(0<<LCD_RS)|(0<<LCD_RW)|(1<<LCD_EN); //  enable 입력
  Delay(dNum2);  //enable 후 230ns 지연

  LCD_CTL=(0<<LCD_RS)|(0<<LCD_RW)|(0<<LCD_EN); //  
  Delay(dNum3);  //Tc(500) - Tw(230) = 270ns 지연

}

void LCD_AVR_Pin_Init(void)
{
  LCD_CTL_DDR = 0xFF;  //모든 입력값 열어줌(8개)
  LCD_BUS_DDR = 0x07;  //모든 입력값 열어줌(3개)

}

void LCD_Init(void)
{

  volatile unsigned int uiCnt;

  LCD_AVR_Pin_Init();

  Delay(dNum1);

  LCD_Inst(LCD_FUNC);
  
  
}


#endif //__SMART_H__

 

Main.c

#include "SMART.h"



{

  volatile unsigned int uiCnt;  

  /***** 다이오드에 불 깜빡거리게 만들기 *****/
  DDRA = 0xFF; //PORTA 값이 전부 입력가능하도록 DDRA를 다 열어줌
  DDRB = 0xFF; //PORTA 값이 전부 입력가능하도록 DDRA를 다 열어줌

  while(1)
  {

    Delay(dNum);
    /* PORTA on & PORTB off*/
    PORTA = 0x01;
    PORTB = 0x00;
    
    Delay(dNum);
    /* PORTB off & PORTA on*/
    PORTA = 0x00;
    PORTB = 0x01;    

  }      
  

  return 0;

}


반응형

'Busan IT > AVR 컨트롤러' 카테고리의 다른 글

7 semgemnt 카운터  (0) 2015.04.09
Linux 무선 네트워크 설정  (0) 2015.04.08
7 Segment를 활용한 숫자 이동 및 카운터  (0) 2015.04.08
7 Segment 카운트다운  (0) 2015.04.07
ATmega2560 사용환경 설정  (0) 2015.04.02
Posted by newind2000

str(n)cpy, str(n)cat, str(n)cmp, 변환 함수와 구조체

 

학습목표

 

- string과 관련된 함수들을 이해하고 알고리즘을 만들 수 있다.

- 변환함수의 종류와 문법을 이해하고 사용할 수 있다.

- 구조체의 이해하고 문법을 익힌 후 사용할 수 있다.

 

str(n)cat

 

char * strcat(char * dest, const char * src);

char * strncat(char * dest, const char * src, size_t);

 

해당 함수를 알고리즘을 통해 구현해 보자!

 

 

문자열을 비교하는 함수들

int strcmp(const char * s1, const char * s2);

int strncmp(const char * s1, const char *2, size_t n);

 

변환 함수들

 

ASCII 코드를 int형으로 변환해주는 함수

int atoi(const char * str);



해당 함수를 구현하는 것은 맞았으나 main함수에서 실수가 있었다.

Case2에서 이미 str3에 값이 바뀌었는데 이것에 겹쳐 써서 에러가 난 것이다.

그 외 변환 함수들.

 

long atoi(const char * str); 문자열의 내용을 int형으로 변환

double atof(const char * str); 문자열의 내용을 double형으로 변환

 

 

Chap 22. 구조체와 사용자 정의 자료형

 

구조체를 다른 말로 사용자 정의형이라고 한다. 즉 프로그래머가 직접 만들어 쓰는 타입이다.

 

구조체의 문법은

struct ‘사용자가 원하는 자료형의 이름

{

};

ex)

 

struct smart

{

int A;

int B;

};

 

-> 8byte짜리 struct "smart", 변수형을 정의한다고 이해하면 쉽다.

 

 

//struct자리에 class를 집어 넣으면 객체지향

 

struct를 함수 내부에 적으면 지역 변수로써 다른 함수에서는 사용 할 수 없다. 때문에 전역변수로 사용해야 한다.

struct는 원형만 만들어서는 사용할 수 없고 선언을 해야 사용가능하다.

 

//C++에서는 변수선언 시 struct를 선언하지 않아도 사용 가능하다.

구조체는 사용자가 원하는 변수형의 모듬을 생성하여 사용하는 것과 같다.

이것은 붕어빵틀을 만드는 것과 같은데 붕어빵 틀, struct안에 변수,3개 선언했다고 가정하면 해당 structure를 하나 만드는 경우 해당 변수 3개가 있는 자료형이 만들어졌다고 생각하면 된다.












 

반응형
Posted by newind2000
Busan IT/AVR 컨트롤러2015. 4. 2. 13:37

AVR 컨트롤러 - ATmega2560 사용환경 설정

 

학습목표

 

ATmega2560 사용을 위한 환경을 만들 수 있다.

- 데이터시트

- 컴파일러

 

MCU를 가지고 처음 작업하게 되면 해당제품에 대한 정보를 먼저 찾아보아야 한다.

하나 하나 뜯어 살펴보자.

 

Atmel사의 Atmega2560의 데이터시트를 받아보자.

 

 

 

하드웨어의 기본정보를 볼 때 가장 먼저 봐야 할 것은 작동 전압이다.

 

 

AVR을 사용할 때는 쓰는 컴파일러는 총 3종류가 있다.

- AVR Studio(무료)

- Code Vision(유료)

- IAR(유료)

 

I. AVR Studio

 

무료로 제공되는 컴파일러는 대부분 gcc기반이라고 할 수 있다. 컴파일 명령어는 ‘make’로써 해당 명령어를 입력하면 makefile이 생성된다.

 

//GCC: GNU Compiler Collection, 무료로 제공되는 컴파일러의 이름

 

제대로 작동하는지 확인해 보자.

 

AVRstudio를 활용하여 간단한 코딩을 해본다.

 

우선 makefile에서 MCUatmega2560으로 바꿔준다.

makefile에 문제가 있어 간단한 코딩이 먹히지 않는다!




반응형

'Busan IT > AVR 컨트롤러' 카테고리의 다른 글

7 semgemnt 카운터  (0) 2015.04.09
Linux 무선 네트워크 설정  (0) 2015.04.08
7 Segment를 활용한 숫자 이동 및 카운터  (0) 2015.04.08
7 Segment 카운트다운  (0) 2015.04.07
ATmega2560 LCD 사용을 위한 코딩  (0) 2015.04.03
Posted by newind2000

typedef, str(n)cpy의 함수

 

학습목표

- typedef의 사용과 문법에 대해여 이해하고 활용할 수 있다.

- strcpystrncpy의 사용과 문법에 대하여 이해하고 활용할 수 있다.

 

typedef에 대해서 알아보자.

 

변수를 선언할 때 unsigned과 같이 긴 변수명을 사용자 편의에 맞게 지정하여 사용할 수 있다. 또한 사용자가 변수명을 보고 변수의 의미를 이해할 수 있도록 해주기도 한다.

 

strlen명령어는 전달된 문자열의 길이를 반환해주되, 널 문자는 길이에 포함하지 않는다.

C에서 제공하는 함수를 많이 알고 쓰는 방법을 많이 알고 있을수록 프로그래밍을 빠르고 효율적으로 할 수 있다. C언어를 사용할 때 스스로 함수를 만드는 것보다 가능한한 C라이브러리에서 제공하는 함수를 사용해야 한다.

strcpy, strncpy 함수에 대하여 알아보자!

 

strcpy는 반환형이 char *이고 인자가 1. char * dest, 2. const char * src 인 함수이다. strcpy의 함수 같은 경우 복사할 값이 넣을 파일의 크기보다 큰 경우 내용을 그대로 다 복수할 수 없는 문제가 생긴다. 때문에 이를 보완하고자 복사할 수 있는 문자의 개수를 넣어주는 함수가 strncpy이다.

 

strcpy와 비슷하나 인자가 하나 더 추가되어 복사할 인자의 수를 넣는다.

strcpystrncpy의 함수 코드의 차이는 종료 조건으로 마지막으로 넣는 인자 즉 출력 개수의 유무이다.










 

반응형
Posted by newind2000
Busan IT/디지털 제어2015. 4. 1. 12:48

디지털 제어 - 시험

 

반가산기, 전가산기 회로를 OrCAD로 작성하여 제출.



















 

 

 

 

반응형
Posted by newind2000

스마트 컨트롤러 - 문자와 문자열 관련 함수

 

학습목표

 

getcharputchar의 함수 원형에 대해 안다.

scanfprintf의 함수 원형을 이해한다.

ASCII code를 숫자로, 숫자를 ASCII코드로 바꿀 수 있다.

 

getcharputchar의 함수 원형을 살펴 보았다.

 

우리가 자주 쓰는 printf의 원형인 fprint 또한 함수 형식으로 만들 수 있지만 가변인자가 사용 되기 때문에 stack구조에 대한 이해가 필요하다.

 

가변인자를 지금 언급하기는 기초지식 부족하여 설명이 어렵지만 기본적으로 가변인자를 만들기 위해 가장 우측에는 가변 인자를 나타내는 ‘...’넣어주어야 하고 적어도 좌측에 1개 이상의 인자가 있어야 한다.

 

putchargetchar의 반환형은 int형이지만 함수를 사용하고 나서도 반환 값은 따로 출력되지 않는다.

 

getchar는 한글자만을 입력 받고 ASCII코드로 저장한다.

 

//EOF = End of File

p/421 21-3. 문자열 단위 입출력 함수

 

우리가 지금까지 printf에서 출력하던 문자열은 상수들이 나열되고 끝이 ‘null'이 입력된 것을 문자열로 출력한 것이다. 따라서 “ ”안에 적힌 값은 const char *이다.

printfscanf가 없이 ASCII codecpu가 인지할 수 있는 숫자로 변경하거나 그 반대의 경우(숫자를 ASCII code)로 입력하기 위해 변환하는 작업을 해 보겠다!



 

버퍼는 자원의 효율적인 관리를 위해 사용한다. 버퍼는 데이터가 정해진 용량에 차 있을 때 해당 정보를 CPU에 보내는데 해당 데이터가 다 차지 않아도 데이터를 보내는 명령어가 엔터이다.

 

윈도우 DOS체제에서는 개행 문자(\n)을 쓰지 않아도 입력 값이 출력이 되지만 다른 운영체제에서는 개행 문자 없이는 데이터가 출력되지 않으니 개행 문자를 넣는 습관을 들여야 한다.

 

//fflush는 파일 내부에 있는 버퍼를 비우는 명령어이다.

//ex) fflush(stdin); - 키보드 버퍼에 있는 데이터를 지워라.

 

출력버퍼가 비워진다는 것은 출력버퍼에 저장된 데이터가 버퍼를 떠나서 목적지로 이동됨을 뜻한다.

 

입력버퍼가 비워진다는 것은 데이터의 소멸을 의미한다.

 


반응형
Posted by newind2000
Busan IT/디지털 제어2015. 3. 31. 11:56

디지털 제어 - 4/1 시험대비 공부

 

<학습목표> 

- 반가산기, 전가산기를 OrCAD로 만들 수 있다.

- 반가산기, 전가산기의 회로를 만들 수 있다.


|(--^--)/

반응형
Posted by newind2000

LCD에 이름 띄우기 도움말, 그림 파일에 대한 기본 이해, 스트림과 데이터의 이동

 

학습목표

 

- LCD 메모리에 특수문자를 만들어 본인의 이름을 집어넣기 위한 작업으로 excel파일을 활용하여 해당 dot의 값을 도출해낼 수 있다.

- 그림 파일에 대한 기초적인 구조와 용량에 대해 알 수 있다.

- Stream이 무엇인지 이해하고, API를 사용하여 함수의 원형을 어떻게 사용하는지 알 수 있다.

 





동영상은 1초에 24 frame이다. 2.25MB 24개가 있어야 동영상이 만들어진다. 소리 파일이 없이 그림만으로도 1분에 3.24GB가 된다. 압축기술 없이는 우리는 야구 동영상을 보기 힘들어진다.

 

C언어

 

p/501 Ch. 24 파일 입출력

 

스트림(stream) - 정해지지 않은 데이터를 연속적으로 전송하는 것. 정해진 양의 파일을 받는 것은 스트림이 아니다. ex) 컴퓨터 입장에서의 사용자의 문자입력.

 

//스트림을 일종의 데이터가 넘나드는 다리라고 생각하면 이해가 쉽다.

 

스트림의 경로를 열고(OPEN) 닫는(CLOSE) 명령어가 있다.

 

운영체제에서 PC에 전원이 인가될 때 자동으로 자주 사용하는 입출력을 열어주는데 이 때 자동으로 열어주는 입출력을 표준입출력(Standard I/O)이라고 한다.

 

fprintfprintf를 수행하면 실제로 출력 명령을 실행하는 명령어이다.

 

printfscanf앞에 f를 붙이게 되면 해당 명령어의 형식이 무엇인지 설정해주어야 한다.


 

프로그래머가 불러서 사용하는 함수를 API(Application Programming Interface)라고 한다.

하드웨어의 구조의 이해 없이 해당 장치를 조작할 수 있는 명령어들을 API라고 한다.

 



CPU 입장에서는 뭐든 장치는 file로 인식한다. 해당 장치를 사용하려면 그에 대한 정보를 가지고 있어야 하고 그 해당 장치를 조작해야 하기 때문이다. 프로그래머는 API를 통해 함수의 원형을 실행시켜 원하는 바대로 파일이나 장치를 조작한다.

 



 

 

반응형
Posted by newind2000
Busan IT/디지털 제어2015. 3. 30. 13:20

디지털 제어 - PIC16F917 코딩(quiz buzzer)

 

학습목표 - 부저(buzzer) 시스템 코딩을 할 수 있다.

 

퀴즈쇼처럼 부저(buzzer) 기능처럼 한 명이 버튼을 눌렀을 때 켜지고 한 명의 부저가 켜 져있을 때는 다른 사람이 눌러도 동작하지 않고 리셋을 눌렀을 때 다시 불이 초기화되는 코딩을 해보자!

 






반응형

'Busan IT > 디지털 제어' 카테고리의 다른 글

시험  (0) 2015.04.01
4/1 시험대비 공부  (0) 2015.03.31
PIC16F917를 활용한 코딩(카운트, 부저)  (0) 2015.03.27
PIC16F917을 활용한 LED 불 켜기  (0) 2015.03.25
가산기 실습 대비 및 회로도 연습  (0) 2015.03.24
Posted by newind2000