AVR으로 LED ON/OFF 전체 포트 제어하기 - AVR 연습하기

2012.12.30 17:23




현재 군 복무중인 상태입니다.



연습 하드웨어 회로는?




CodeVisionAVR 사용법 설명할 때 한번 등장했고 앞으로도 자주 등장 할 회로도입니다.^

간단하게 모듈에서 PB0 부터 PB7 을 브레드보드 점프선으로 뽑아서 330옴 저항을 거친뒤LED랑 연결되어 있습니다. 제어 하는데 2가지 레지스터 DDRB와 PORTB가 사용되고 새로 delay.h 헤더파일이 추가되고 delay는 PORTB에 값을 주고 값을 준 상태를 일정시간 동안 지연시키는데 사용되고, 코드비전에서는 delay_ms()와 delay_us(), AVR Studio에서는 앞에 언더바를 붙여 사용하고, 각각 밀리초, 마이크로초 값을 괄호안에 입력하고 세미콜론을 찍습니다.

그럼 소스코드를 볼까요!


CodeVisionAVR용 소스코드


#include <tiny2313.h>    // tiny2313 입출력 설정 헤더파일을 포함합니다.

#include <delay.h>    // delay 지연용 헤더파일을 포함합니다.


void main(void)    // main() 함수를 호출합니다.

{

PORTB=0x00;    // 포트B의 초기값은 0 입니다.

DDRB=0xFF;    // 포트B의 모든포트를 출력으로 사용합니다.

                   

while (1)    // 아래 구문을 무한 반복 합니다.

      {

        PORTB=0xFF;    // 포트B의 모든포트에 5V를 출력합니다.

        delay_ms(500);    // 0.5초 대기합니다.

        PORTB=0x00;    // 포트B의 모든포트에 0V를 출력합니다.

        delay_ms(500);    // 0.5초 대기합니다.

      }

}



AVR Studio용 소스코드


#include <avr/io.h>    // AVR 입출력 설정 헤더파일을 포함합니다.

#define F_CPU 8000000UL  // 사용중인 크리스탈 값을 상수로 설정합니다.

#include <util/delay.h>    // delay 지연용 헤더파일을 포함합니다.


int main()    // main()함수를 호출합니다.

{

PORTB=0x00;    // 포트B의 초기값은 0 입니다.

DDRB=0xFF;    // 포트B의 모든포트를 출력으로 사용합니다.

while(1)    // 아래구문을 무한반복합니다.

{

PORTB=0xFF;    // 포트B의 모든포트에 5V를 출력합니다.

_delay_ms(500);    // 0.5초 대기합니다.

PORTB=0x00;    // 포트B의 모든포트에 0V를 출력합니다.

_delay_ms(500);    // 0.5초 대기합니다.

}


return 0;    //main함수에 0을 리턴합니다.

}


프로그래밍 후 동작




동영상처럼 깜박이는 동작을 합니다.




BinGoon AVR/AVR 연습, Tutorial , , , , , , ,

  1. Blog Icon
    Mr도리

    C언어하면 Hello부터 하듯이 ...MCU를 공부하는 학생이 제일 먼저 입출력을 배우는 LED점등..ㅎ
    잘봤습니다^^

  2. AVR 처음시작 할 때 LED키는 걸로도 기분이 좋았죠.!
    지금은 더 큰걸 만들어보고 싶어요 ㅋ

  3. Blog Icon
    [Adios]

    안녕하세요! AVR 무작정 따라하는 중인 대학생인데요
    이상하게 제가 만들어보니 LED점등이 되지 않더라고요
    멀티미터로 포트에 연결해보니.. Vcc와 GND에 갖다대면 5V전압이 나오는데, 포트의 다른 부분을 연결하면 전압이 훨씬 떨어지면서... LED가 켜지지 않을 정도의 미세전압만 검출되네요.
    이런경우 소스코드에 문제가 있는 걸까요?

  4. 질문해 주셔서 감사드립니다.^
    LED가 점등되지 않는 부분에 대해서 질문 주셨는데요, 회로가 모두 정상이라면, 사용하신 포트가 몇번 포트인지 확인 후 DDRx레지스터를 모두 출력(0xFF)로 설정해 주시고, PORTx초기값은 꺼짐(0x00) 상태로 주시기 바랍니다. 그리고 while(1)문에서 PORTx값에 (0xFF)값을 주시면 x의 모든 포트에 VCC와 GND의 입력전압에 근접하게 출력되는 것이 정상입니다.

    첫번째 문제를 소스코드에서 찾자면 DDRx레지스터에 문제가 있을 가능성이 있어보입니다. 웬만하면 AVR 칩 전체가 파손되는 일은 없으니 점검 부탁드립니다. 부족한 댓글이지만 도움이 되시기를 바랍니다.^

  5. Blog Icon
    [Adios]

    소스코드에서는 문제가 없나봅니다. DDRx레지스터를 0xFF로 설정하고 PORTx초기값을 0x00 상태로 줬거든요. while(1)에다가 전체가 깜빡이게 0.5초의 delay를 줬는데도 되지가 않네요...
    제가 대학생이라서 조원들과 함께 각각의 파트를 맡아서 만들어보고 있다보니... 회로부분에 이상이 있는건지 정확하게 모르겠어요.

    회로에 이상이 있는건가?! 허허허허헣

  6. 개발환경은 AVR Studio이고, MCU는 Atmega128쓰시나요?
    AVR 고장은 아닐것 같아요, VCC랑 GND 반대로 연결해도 버텼는데....
    회로에 이상이 있을 가능성이... 있을까요?
    혹시 부논리로 동작하는 회로로 설계하지는 않았겠지요?
    (x는 사용하시는 포트입니다. A,B,D 등등...)
    역시 글로만 설명하기는 매우 힘드네요..문제해결에 성공하셨길 바랍니다.

  7. Blog Icon
    [Adios]

    해결되었어요! 회로구성팀에서 저항값이 너무 큰 걸 연결해서 불이 안들어왔었다네요 -_-; 정상작동되었습니당!

  8. 회로구성에 문제가 있었나 보네요.^ 해결이 되어서 다행입니다.^
    별로 도움이 된 것은 없네요...○_○
    그래도 아는 선에서 필요하면 계속 도움 드리겠습니다.^
    앞으로도 자주 찾아주세요.^

  9. Blog Icon
    [Adios]

    네 ㅎㅎ 자주 들를게요!

  10. 제가 atmega128a 개발용 키트를 사용하는데요 led를 킬려면 빵판에 led다리 한쪽이 0v여야 하잖아요? 그 0v값이 나오는데가 따로 있는건가요?

  11. 안녕하세요.^^
    바로 답글 드리겠습니다. 회로도 마다 표시가 조금씩 다를수 있는데요, 일반적으로 복잡하지 않은 회로의 경우에 GND = 0V = AGND = GROUND 식으로 표시되어 있습니다. 따라서 Atmega128a 보드에 GND라고 표시되어 있는 부분을 0V로 사용하시면 됩니다.

    참고로 0V라는게 내가 -전극을 0V로 잡았을 때 +부분이 5V띄면 5V인 것이고, 12V일 경우에 12V를 띈다는 의미로 기준전압을 의미합니다. 사실 +전극이 2.5V이고 -전극이 -2.5V여도 +2.5 - (-2.5V)이므로 두 전극의 전위의 차는 5V이므로, 5V이기 때문에 계산이 복잡해 지므로, 0V로 잡고 +를 5V로 보는것이죠.

    따라서 0V라기 보다는 GND로 보시는게 맞습니다.^^ , 사실 저도 상세하게는 모르구, 배운걸 말씀드려요.~~ ㅎㅎ, 덧글 감사드립니다.

  12. 해더파일이 자체적인거인가요?
    아니면 다운받아야 하는건가요

  13. 해결했어요 ㅎ

  14. 해결했어요 ㅎ

  15. 해결했어요 ㅎ

  16. 해결했어요 ㅎ

티스토리 툴바