'Study'에 해당되는 글 31건

Study/AVR ATmega128 Easy Processor Kit

8. AVR의 GPIO 특성 이해

안녕하세요~~!!! 오랜만에 찾아뵙네요 ㅎㅎ 2학기 시작하고 시간이 부족해서 블로그 신경을 못쓰고 있었답니다 ㅠㅠ


이제 겨울방학이고 해서 다시 새마음 새뜻으로 차근차근 AVR 관련 공부한 것을 포스팅 하려구 해요!! ^^


다시 힘을 내서!! 시작해보도록 하죠. 저번에 Easy Processor Kit에 있는 ATmega128의 외부 LED 제어를 해보았는데요


이번 시간에는 간략하게 AVR GPIO의 특성에 대해서 공부해보도록 할게요.


 - AVR GPIO 특성


 ATmega128 모두 6개의 8비트 양방향 병렬 I/O 포트(PORTA~F)1개의 5비트 양방향 병렬 I/O 포트(PORTG)를 가지고 있어요. 포트 A~E는 범용 I/O 포트로 사용될 경우 기능적으로 모두 read-modify-wirte 동작이 가능합니다!!

 그림과 같이 각 I/O 핀에는 보호용 다이오드가 붙어있으며, 스위치 작동시 내부 풀업저항의 사용 여부를 선택적으로 설정할 수도 있답니다.


 그렇다면 과연 풀업저항이란 뭘까요??

그림과 같이 스위치가 OFF일 때는 +5v라는 High 값이 A로 가게 되며, 스위치가 ON일 때는 대부분의 전류가 Ground로 빠지게 되어 A에는 Low값이 입력되는 회로에서 저항의 명칭을 말하죠.

 그럼 이것을 쓰는 이유는 무엇이냐? 바로 플로팅 상태를 해결하기 위해서 쓰이는 것입니다. 플로팅 상태는 보통 스위치 off 상태에서 나타나게 되는 현상으로 HIGH인지 LOW인지 입력 상태를 알 수 없는 상태를 말합니다.


 그럼 이러한 포트들을 제어해주는 레지스터들은 무엇이냐? Easy Processor Kit에서는 외부 메모리 사용시 CPLD라는 외부 메모리 디코더가 있어 필요 없지만 ATmega128 보드나 아두이노 보드 사용시 반드시 포트들을 초기화 해주어하는 레지스터들이에요. 알아두시는게 유용할 겁니다!


 

빨강 : DDxn, 파랑 : PORTxn, 초록 : PINxn

 각 포트에는 3개의 I/O 레지스터 영역을 가지고 있는데, 입출력의 방향을 설정하는 DDRx 레지스터, 데이터 출력에 해당하는 PORTx 레지스터, 포트 입력 핀에 해당하는 PINx 레지스터 등이 있습니다!!

 좀 더 자세히 이 레지스터들을 알아보면 DDxn은 방향설정 레지스터 DDRx의 각 비트로서 이것을 1로 주면 이 핀은 출력핀으로 설정되고, 0으로 주면 입력핀으로 설정되요. 그리고 PORTxn은 출력으로 설정된 포트에 데이터를 출력하는 레지스터 비트이며, PINxn 레지스터 비트는 그 포트 핀을 읽어들이는 것입니다^^


 그 외에도 각 포트들은 부수적인 기능을 1~2가지씩 가지고 있어요. 대략적으로 요약해 보자면 다음과 같습니다.


 

 - 포트 A : 외부 메모리를 인터페이스하기 위하여 시분할다중화된 데이터 버스 및 어드레스 버스의 하위 바이트로 동작합니다.(ALE 신호 사용) 밑의 그림과 같이 외부 메모리와 연결 시 상위 8비트(포트 C)는 그대로 연결되지만, 하위 8비트(포트 A)ALE에 의해 시간차로 어드레스 버스로 갈 건지, 데이터 버스로 갈 건지 결정하게 되요. 이 부분들이 우리가 사용하는 Kit에서는 MCUCR이라는 레지스터와 함께 CPLD를 통해 연결이 다 되어 있기 때문에 우리가 편하게 사용할 수 있는 겁니다.

 - 포트 B : 타이머/카운터나 SPI 기능을 위한 신호들로 동작합니다.

 - 포트 C : 외부 메모리를 인터페이스하기 위한 어드레스 버스의 상위 바이트로 동작합니다.(포트 A 참조)

 - 포트 D : 타이머/카운터나 외부 인터럽트 또는 USART1,TWI 직렬통신 포트 기능을 위한 신호들로 동작합니다.

 - 포트 E : 타이머/카운터나 외부 인터럽트 또는 USART0 직렬 통신 포트, 아날로그 비교기, ISP 기능을 위한 신호들로 동작합니다.

 - 포트 F : A/D 컨버터나 JTAG 인터페이스 기능을 위한 신호들로 동작합니다.

 - 포트 G : 메모리 인터페이스나 타이머/카운터 기능을 위한 신호들로 동작합니다.


이러한 기능들이 있다는 것만 알아두세요 ㅎㅎ 각 기능들의 명칭들은 ATmega128 보드를 구입하신 분이나 아두이노를 구입하신 분들은 해당 포트가 어떤 용도로 이용되는지 명칭들과 함께 적혀있으니 그에 따라 사용하시면 되요.


자 이제 GPIO의 특성에 대해서 대략적으로 이해하셨나요?? 이해하셨다면 이제 실험을 해보러 가죠!! 다음 시간에는 Easy Processor Kit 외부 Dip Switch를 가지고 실험해 보겠습니다.



,
Study/Raspberry Pi2

[라즈베리파이] 시간 확인 및 시간 변경하기(ntpdate,date)



이번에는 라즈베리파이 시간 확인 및 시간 변경을 하는 법에 대해 정리해보았어요.

데이터베이스 연동이 제대로 되는지, 정해진 시간에 업데이트가 되는지 확인하기 위해서

시스템 시간을 변경할 필요가 있어서 찾아보게 되었네요.


주요 키워드는 date 와 ntpdate 가 있었어요.


cal 명령어

이건 간단하게 달력 보는거...

현재 시스템 시간에 맞는 달력을 보여줘요.


cal 2015 라고 입력하면 2015년 달련 전체가 출력되요.


date 명령어

date를 입력하면 현재 시스템 시간이 나타나요.

현재 시간은 2015년 8월 24일 13시 55분 35초!


또한 date 명령어를 통해 시스템의 시간을 변경할 수 있었는데요.

date 월일시분년.초 를 입력하면 입력한 값으로 시간이 변경되요.


date 0824235915.30

직역하면 8월24일 23시59분 2015년 30초...

2015년 8월 24일 23시 59분 30초로 변경되었네요.


이렇게 마음대로 시간을 바꾼 뒤에 다시 원래대로 동기화를 시켜야 하는데...

일일히 시간 바꿔주자니 뭔가 안맞는듯한 기분...?

그래서 사용하는게 ntpdate 라는 명령어에요.

물론 rdate 라는 명령어를 통해서도 가능하다고 하지만 ntpdate가 조금 더 정확하다는 설이 있네요.


우선 ntpdate를 사용하기 위해서는 apt-get install ntpdate 라는 명령어를 통해 설치를 해주어야해요.



설치가 다 되었다면 사용법에 대해 알아봐야할텐데요.

결론만 말하자면 ntpdate -u 서버이름 을 입력하면 되요.

이러면 자동으로 시간이 동기화되고, date 명령어로 확인해보면 제대로 바뀐걸 알수있어요.



http://support.ntp.org/bin/view/Servers/NTPPoolServers

위 링크를 통해 이동하면 아래와 같은 페이지가 나오는데요.

http://www.pool.ntp.org/ko/ 로 이동하셔도 되요.

빨간 네모박스 안에 있는 것 중에 원하시는 걸 고르시면 되는데요.

한국시간을 찾으려면 Asia 를 클릭.




그리고 Korea를 클릭하면 되요.



이렇게 3개 정도의 서버 주소가 나오는데요.

앞의 server는 떼고, 3.kr.pool.ntp.org 와 같은 주소 부분만 ntpdate -u 뒤에 입력하시면 되요.



,
Study/AVR ATmega128 Easy Processor Kit

7. Easy Processor Kit 외부 LED 제어하기

지난번 시간에 이어 이번에도 LED를 제어 해보려 합니다.


하지만 이 LED는 ATmega128 모듈에 붙어있는 것이 아니라 외부적으로 연결되어 있는 LED를 말합니다!!


이처럼 대부분의 마이크로프로세서를 이용한 시스템에는 CPU외에 ROM, RAM, 7Segment, LCD, LED, I/O 등의 주변 소자들이 연결 되어있는 경우가 있어요.


이런 공통 버스들이 충돌되지 않게 하기 위해서는 어드레스 디코딩을 통해 선택신호를 만들게 되는데, 이때 사용되는 레지스터가 MCUCR 입니다!!


 - MCUCR


8bit로 구성되어 있는 MCUCR 레지스터는 MCU의 전체적인 시스템 기능을 설정하는 레지스터에요!


현재 저희는 여기서 맨 앞부분인 8번째 bit인 SRE로 어드레스 디코딩하여 외부 메모리 영역에 접근하게 되는것 입니다!


즉, SRE bit가 1로 셋팅이 되어 있으면 외부메모리 공간을 이용할 수 있는 것이죠.


반대로 0이 되어있으면, 기본 기능인 병렬 I/O 포트(GPIO)로 동작합니다. 


나머지 비트들은 뭐... 쓰일때 있으면 찾도록 하죠!ㅎㅎ 지금은 딱히 쓰일일은 별로 없어보입니다.


외부 메모리 공간에서 주소지정을 하는 어드레스 디코더 역할은 Easy Processor Kit에서 CPLD를 이용하여 구성합니다.


 - CPLD


CPLD는 복합 프로그래밍 논리적 소자인데... 말 그대로 프로그래밍이 가능한 소자인 것 같습니다... ㅎㅎㅎ.. 일단 이쪽으로 공부할 것이 아니고 이것을 이용하는 것이니 외부 메모리 공간에서 주소를 지정하는 어드레스 디코더 역할은 한다고만 알아둡시다!!


위의 회로도를 보게 되면 LED, KEY, LCD, DOT, FND 등등 여러개가 있는데 차근차근 하도록 하죠.


저희가 이용할 외부 LED는 LED_CS라고 적인 31번 I/O네요!!



위 표를 보게 되면 LED_CS는 0x4800에 저장되는 것을 알 수 있습니다!!


 - 외부 LED 회로도


이제 저장되는 것도 알았고 프로그래밍 하기전에 외부 LED 회로도를 살펴 볼까요?



우선 LED가 정방향이므로 이전시간에 배운것과는 반대로 1일때 ON이 된다는 사실을 알 수 있고요~


흠... SN74HC574라는 칩을 통과하네요..


이러한 칩은 무슨 역할을 하는지 알아볼까요??


 - SN74HC574 칩



칩의 블락도 및 테이블을 한번 살펴보죠~


OE에 Low 신호가 입력되면 버퍼에 1의 값이 입력되고, 상승에지일때 D 플립플롭 값이 출력된다. 그럼 플립플롭이란 것을 알 수 있습니다!!

즉 이러한 칩을 이용하기 때문에 마지막 값이 저장되어 있을 수 있는 것이죠. Kit을 껐다 켜도 다시 되는 이유가 이러한 칩 때문입니다~~


그렇다면 이제 0x4800에 데이터를 넣어서 외부 LED를 제어할 수 있겠죠???


 - 실습


AVR Studio 4를 켜 봅시당~



참참!! 외부 LED 위치는 Kit의 중앙쪽에 위의 사진처럼 저렇게 초록색으로 된 LED에요. 그래픽 LCD 밑에 있네요ㅎㅎ



#include <avr/io.h>

#define LED_CS (*(volatile unsigned char *)0x4800) // 외부 LED 메모리 주소값 0x4800 정의


int main()

{

MCUCR = 0x80; // 외부 메모리를 사용하기 위해 MCUCR 레지스터 1000 0000으로 설정

unsigned char data =0x00; // 부호 없는 1Byte data 변수 0x00 초기화

while(1)

{

data = 0x55; // 0x55 data에 지정

LED_CS = data; // 외부 LED 메모리에 0x55 0101 0101 들어가게 되어 LED 작동

}

}


위의 소스코드는 아시겠져?? 0b01010101 이 0x4800 외부 메모리에 들어가서 LED가 아래 사진과 같이 나오게 되는 것입니다!!


이제 컴파일 하시고 USB 연결 후 장비 ON!!


이제 HEX파일 실험장비에 넣어서 프로그램 눌러주시면 아래와 같은 결과가 나오게 됩니다~~!



이렇게 외부 LED 제어를 하게 되었네요~!! 다음시간에는 AVR GPIO 특성들에 대해서 알아보겠습니다.!!


감사합니다~~!!

,
Study/Raspberry Pi2

[라즈베리파이] mysql 사용하기 및 mysql 명령어



Mysql은 기존에 제가 배웠던 oracle 11g의 사용법과 약간 다르더라구요.

그래서 한번 정리를 해보려고 해요.


※ Mysql 명령어 ※

보기 쿼리문

show databases : 전체 데이터베이스 리스트 조회

show tables : 현재 보고있는 데이터베이스 내부 테이블 리스트 조회

select * from [테이블명] : 테이블 내부 전체 컬럼값 조회

select [필드명1],[필드명2].... from [테이블명] : 테이블에 있는 선택한 필드만 추출하여 조회

desc [테이블명] : 테이블 스키마 조회


생성 쿼리문

create database [DB명] : 데이터베이스 생성

create table [테이블명](필드명1 자료형, 필드명2 자료형....) : 테이블 생성

insert into [테이블명] values(값1,값2,값3....) : 테이블에 컬럼 추가

insert into [테이블명](필드명1,필드명2,필드명3....) values(값1,값2,값3....) : 테이블의 선택한 필드에만 값을 가진 컬럼 추가


변경 쿼리문

use [DB명] : 데이터베이스 선택

update [테이블명] set [필드명1]=[수정값1], [필드명2]=[수정값2] .... where [조건] : 해당 조건을 가진 컬럼의 필드 값 수정

alter table [테이블명] modify [필드명1] [자료형] : 테이블의 필드의 타입을 변경

alter table [테이블명] change [기존필드] [변경할이름] [변경할타입] : 테이블의 필드 이름, 타입을 변경

alter table [테이블명] drop [필드명] : 테이블의 필드를 삭제


삭제 쿼리문

drop database [DB명] : 데이터베이스 삭제

drop table [테이블명] : 테이블 삭제

delete from [테이블명] where [조건] : 조건에 맞는 컬럼 삭제


mysql 명령어에 대해 간단히 알아보았는데요.

이렇게만 보면 잘 모르겠다.. 생각되서 한번 간단하게 사용하는법에 대해 알아볼까해요.



mysql 을 실행시키고 나서 show databases를 입력하면 데이터베이스 목록이 나와요.



원하는 데이터베이스가 없으니 만들어보죠. 

create datase [db명];



다시 DB목록을 보면 만든 db가 보이네요.

use [db명]을 입력해서 선택해줍시다.



show tables 를 이용하여 DB 내부에 테이블을 보면 아무것도 없네요.

create table ~을 이용하여 테이블을 생성해보도록 하죠.

위 사진에 있는것 처럼 2가지 방법이 있는데,

한줄로 명령어를 주르륵 입력해도 되고,

필드별로 줄을 나눠서 구분해도 되요.



테이블을 만들었으니 값도 넣어봐야죠.

insert into ~ 를 통해 테이블에 컬럼을 추가해줄 수 있어요.

그리고 select * from ~ 으로 테이블 내의 데이터를 모두 확인할 수 있구요.

사진엔 없지만 앞서 2개의 컬럼을 추가해둔 상태이기 때문에 총 3개의 컬럼이 나오네요.


이런식으로 사용하다보면 익숙하게 사용할 수 있게 되겠죠?

아직까지는 많이 사용할 일이 없어서 기본적인 방법만 익혔어요.

앞으론 얼마나 더 쓰게 될지 ㅋㅋ....

,
Study/AVR ATmega128 Easy Processor Kit

6. Easy Processor Kit의 ATmega128 모듈의 LED 제어

자!! 이제 실험할 준비를 다 마쳤으니 실험을 해보도록 해볼께요~~!


오늘은 Easy Processor Kit에 ATmega128 모듈에 있는 LED들을 제어해 보도록 할거에요!!


아래 그림과 같이 Easy Processor Kit의 왼쪽편에 빨간 네모부분에 보시게되면 ATmega128 모듈이 있을겁니다. 밑의 사진은 Cortex-M3인데 해당 위치에 ATmega128 모듈이 있을거에요!


 - LED 켜기


모듈에서 오른쪽에 보시게되면 PE2,3 PD4,5 PWM0,1,2,3 이라고 적힌 작은 LED가 보이죠?ㅎㅎ


아래사진에서 오른편입니다!! 이제 이 LED를 켜보도록 하죠!!



그럼 PE PD PWM은 어디있느냐??

ATmega128 핀 회로도를 한번 봅시다!!




초록색 네모상자들이 보이시나요~~? 눈치가 빠르신 분들은 알텐데 이제 이부분을 저희가 통제해주게 된다면 LED에 불이 들어오게 되는것입니다!!!


easy-pro-kit-base-v12.pdf


ATmega128_V1.1.pdf


혹시 필요하신분 있을까봐 Easy Processor Kit의 여러 소자 회로도들을 첨부해 드릴게요.


ATmega128 회로도들을 통해 알았는데 LED회로도도 옆에 있네요!! 그런데 잠깐?? 다이오드 방향이 반대네요!! 아하!! 그렇다면 저희가 LED를 ON 시키려면 0의 값인 Low 값을 주어야한다는 사실을 알게 되었군요!! ㅎㅎ


자 이제 AVR Studio4를 실행하여 소스코드를 짜도록 합시다!


#include <avr/io.h>

 

int main(void)

{

    DDRE = 0xFF;

    PORTE = 0xFF;

    DDRD = 0xFF;

    PORTD = 0xFF;

    DDRB = 0xFF;

    PORTB = 0xFF; // 포트 E, D, B 각각 출력용으로 설정 후 초기값 설정

 

    while(1)

    {

        PORTE = 0x00;

        PORTB = 0x00;

        PORTD = 0x00; // 각 포트들을 LOW로 입력하여 LED를 킴 끌 때는 0xFF로 설정

    }

}


이렇게 간단히 짜면 됩니다!! ㅎㅎ


불 잘들어 오죠?ㅎㅎ



 - LED 반복점멸


이제 응용해서 LED 반복점멸을 해보도록 할까요??


위의 소스에서 딜레이만 넣어주면 되겠죠??ㅎㅎ


AVR 코딩에서 util에 delay가 있어요 ㅎㅎ delay를 편히 쓰기위해 전처리기 해놓은것이죠.


이것을 헤더에 추가해 주십다!!


#include <avr/io.h>

#include <util/delay.h> // delay를 쓰기위한 전처리기

 

int main(void)

{

    DDRE = 0xFF;

    PORTE = 0xFF;

    DDRD = 0xFF;

    PORTD = 0xFF;

    DDRB = 0xFF;

    PORTB = 0xFF; // 포트 E, D, B를 출력용으로 설정 및 초기값 설정

     

    while(1)

    {

        PORTE = 0x00;

        PORTB = 0x00;

        PORTD = 0x00;

        _delay_ms(5000); // 5초동안 LED를 킴

 

        PORTE = 0xFF;

        PORTB = 0xFF;

        PORTD = 0xFF;

        _delay_ms(5000); // 5초동안 LED를 끔

    }

}


이러면 간단하쥬??ㅎㅎ



 - LED 순차점등


자 이번엔 LED를 순차로 점등시켜 볼까요??


이번에도 딜레이와 PORTE, D B를 잘 활용해주면 되겠죠?ㅎㅎ 코드에 답은 없으니 여러분은 여러분 손을 믿고 머리를 믿고 짜시면 되요 ㅎㅎ 저같은 경우는 이렇게 짰네요~~ 참고만 하세요!!


#include <avr/io.h>

#include <util/delay.h>

 

int main(void)

{

    DDRE = 0xFF;

    PORTE = 0xFF;

    DDRD = 0xFF;

    PORTD = 0xFF;

    DDRB = 0xFF;

    PORTB = 0xFF; // 포트 B, D, E 출력용으로 설정 및 초기값 0xFF로 지정

 

    while(1)

    {

        PORTE = 0x08; // 포트 E 제일 위의 LED 켜기위해 0000 1000 지정

        PORTB = 0xFF; // 포트 B는 다 끔

        PORTD = 0xF0; // 포트 D는 다 끔

        _delay_ms(2000); // 위에서부터 1개의 LED 켜진 상태로 2초간 지연

     

        PORTE = 0x00; // 포트 E LED 다 킴

        PORTB = 0xFF;

        PORTD = 0xF0;

        _delay_ms(2000); // 위에서부터 2개의 LED 켜진 상태로 2초간 지연

     

        PORTE = 0x00;

        PORTB = 0xFF;

        PORTD = 0x20; // 포트 D 제일 위의 LED 켜기 위해 0010 0000 지정

        _delay_ms(2000); // 위에서부터 3개의 LED 켜진 상태로 2초간 지연

 

        PORTE = 0x00;

        PORTB = 0xFF;

        PORTD = 0x00; // 포트 D 다 킴

        _delay_ms(2000); // 위에서부터 4개의 LED 켜진 상태로 2초간 지연

 

        PORTE = 0x00;

        PORTB = 0xEF; // 포트 B 제일 위에 LED 켜기 위해 1110 1111 지정

        PORTD = 0x00;

        _delay_ms(2000); // 위에서부터 5개의 LED 켜진 상태로 2초간 지연

 

        PORTE = 0x00;

        PORTB = 0xCF; // 포트 B 위에서부터 2개의 LED 켜기 위해 1100 1111 지정

        PORTD = 0x00;

        _delay_ms(2000); // 위에서부터 6개의 LED 켜진 상태로 2초간 지연

 

        PORTE = 0x00;

        PORTB = 0x8F; // 포트 B 위에서부터 3개의 LED 켜기 위해 1000 1111 지정

        PORTD = 0x00;

        _delay_ms(2000); // 위에서부터 7개의 LED 켜진 상태로 2초간 지연

 

        PORTE = 0x00;

        PORTB = 0x00; // 포트 B 다 킴

        PORTD = 0x00;

        _delay_ms(2000); // 모든 LED 켜진 상태로 2초간 지연

 

        PORTE = 0xFF;

        PORTB = 0xFF;

        PORTD = 0xFF;

        _delay_ms(2000); // 모든 LED 다 끈 상태로 2초간 지연

    }

}



저 사진은6개까지 불이 들어온 상태입니다~ 잘 되쥬??ㅎㅎ


이상 ATmega128 모듈에 있는 LED 제어였습니다!!


다음시간에는 외부 LED를 컨트롤 해보겠습니다.

,
 [ 1 ]  [ 2 ]  [ 3 ]  [ 4 ]  [ 5 ]  [ ··· ]  [ 7 ] 

최근 댓글

최근 트랙백

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

링크

Yuria

카운터

Today :
Yesterday :
Total :