아두이노를 ISP(in-system Programing)로 사용하여 atmega328에 부트로더 올리는 방법입니다.

 

이미 MCU에 부트로더가 있다면 하기 내용은 진행할 필요가 없습니다.

 

아두이노CC 튜토리얼 원문을 보려면 링크를 눌러주세요.


※ 필요부품
- 16MHz 크리스탈 오실레이터 1ea

- 10KΩ 저항 1ea

- 18~22pF 세라믹 캐패시터 2ea

- 아두이노, ATmega328 및 브레드보드 외 jumper wire

 

※ 순서

 * 아두이노 개발환경 설치 및 아두이노 연결은 생략합니다.

 

1. 아두이노 보드에 ISP 스케치를 업로드 한다.

    파일 > 예제 > 11. ArduinoISP > ArduinoISP

 

2. 아두이노 보드와 마이크로 컨트롤러를 하기와 같이 연결한다.

 

 

3. 하기의 경로와 같이 보드선택에서 아두이노 우노를 선택한다.

   툴 > 보드 > Arduino / Genuino Uno

 

4. 하기의 경로를 통해 부트로더를 올리면 된다.

   툴 > 부트로더 굽기

 

5. 부트로더를 올린 MCU와 아두이노에 기 장착된 MCU를 교체 후 BLINK 예제를 실행한다.

    파일 > 예제 > 1.Basic > Blink

 

아두이노 13번 Pin과 연결된 LED가 정상적으로 점멸하면 부트로더 굽기는 성공입니다.

아두이노CC 링크를 따라가면 더 심플한 연결방법이 있으니 참조하세요.

 

'AVR' 카테고리의 다른 글

atmega uart통신시 printf 쓰는법  (2) 2016.04.20

atmega128  기준으로 adc는 10bit 분해능을 가지고있다

 

즉 atemga128은 5v기준으로 동작을하고 adc 핀에

 

5v 가 입력될경우 1023

0v 가 입력될경우 0 값이 내부에 저장된다 (adc핀을 다루는방법은 다른글에서 설명하겠다.)

 

 

꼭 최대값의 기준이 5v이여야 하는것은아니다

 

aref에 전압을 걸어주면 그 전압이 최대값기준이되는것이다.(단 5V를 넘을수없다)

 

AREF핀은 어떨 때 사용하는가?

 

1. 센서의값이 작을때

2. 차이가 미미할때

 

센서값이 작을경우(ex : 3.3v) 3.3v이상의 전압이 걸일 일이없다

 

그러므로 AREF핀에 3.3V를 걸어주면 0~3.3V까지의 전압만 측정을 하게된다

 

 

차이가미미할 경우는 예를 들어서 설명하겠다

(분해능이 높아서 차이가 알아보기힘들정도로 미미할경우는 별로없지만)

 

5V를 1024가지로 쪼개느냐

3.3V를 1024가지로 쪼개느냐

 

차이는 3.3v~5V를 측정할수없지만 0~3.3V 는 조금더 세밀하게 측정을 할수있다는 것이다.

 

 

byte graph[8][8] = {
{B00000,B00000,B00000,B00000,B00000,B00000,B00000,B00000},
{B00000,B00000,B00000,B00000,B00000,B00000,B00000,B00000},
{B00000,B00000,B00000,B00000,B00000,B00000,B00000,B00000},
{B00000,B00000,B00000,B00000,B00000,B00000,B00000,B00000},
{B00000,B00000,B00000,B00000,B00000,B00000,B00000,B00000},
{B00000,B00000,B00000,B00000,B00000,B00000,B00000,B00000},
{B00000,B00000,B00000,B00000,B00000,B00000,B00000,B00000},
{B00000,B00000,B00000,B00000,B00000,B00000,B00000,B00000}
};

배열에 데이터값을 저장하고

LiquidCrystal 라이브러리

lcd.createChar
lcd.setCursor
lcd.write 함수를 사용하여 그래프를 표현할수있다

static int putch_uart0(char message, FILE * stream)
{
   while((UCSR0A&0x20) == 0);
   UDR0 = message;
   if(message == '\n')
   putch_uart0('\r', stream);
   return 0;
}

 

라는 함수로 uart연결된 장비(ex: 블루투스 , serial)로 출력 한다

 

fdevopen(putch_uart0,0);를 init 부분에 넣어주면

 

printf와 putch_uart0 함수와 연결이 되면서 표준C에서 쓰는 것처럼 printf로 uart0 port 에 연결 된 장비에 출력 을 할수 있다

블루투스를 연결하여 LED제어

 

 

 

 

 

 

ex)

 

#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>

 


char rx_char(void) {
 while((UCSR0A&0x80) == 0); 
 return UDR0; }


void tx_char(char tx_data){
 while((UCSR0A&0x20) == 0); 
 UDR0 = tx_data; }

 

static int putch_uart0(char message, FILE * stream)
{
   while((UCSR0A&0x20) == 0);
   UDR0 = message;
   if(message == '\n')
   putch_uart0('\r', stream);
   return 0;
}

 

 


int main(void)
{

fdevopen(putch_uart0,0);
 char i, data;

 DDRB = 0xff;  PORTB = 0xFF;  PORTB=0x01;  
 UCSR0A = 0x00; 

 UCSR0B = 0x98;
 UCSR0C = 0x06;
 UBRR0H = 0x00;
 UBRR0L = 103;


while(1)
 {   
  data = rx_char();  

 tx_char(data);//받은데이터를 그대로 전송해줌으로인해서 데이터가 잘 도착했는지 확인한다

  if(data=='1')  {
   PORTB=0x01; 
  }
  if(data=='2')   {
   PORTB=0x00;
  }
  }
 }
return 0;
}

 

간단한 LED제어다

하지만 usb to serial(rs232) 모듈이 없고 까다로운 디버깅을 해야할때 유용하게 쓸수있다

 

'AVR' 카테고리의 다른 글

아트메가 328 부트로더  (0) 2016.07.20

블루투스를 연결하여 LED제어

 

#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>

 


char rx_char(void) {
 while((UCSR0A&0x80) == 0); 
 return UDR0; }


void tx_char(char tx_data){
 while((UCSR0A&0x20) == 0); 
 UDR0 = tx_data; }


int main(void)
{
 char i, data;

 DDRB = 0xff;  PORTB = 0xFF;  PORTB=0x01;  
 UCSR0A = 0x00; 

 UCSR0B = 0x98;
 UCSR0C = 0x06;
 UBRR0H = 0x00;
 UBRR0L = 103;


while(1)
 {   
  data = rx_char();  

 tx_char(data);//받은데이터를 그대로 전송해줌으로인해서 데이터가 잘 도착했는지 확인한다

  if(data=='1')  {
   PORTB=0x01; 
  }
  if(data=='2')   {
   PORTB=0x00;
  }
  }
 }
return 0;
}

 

간단한 LED제어다

하지만 usb to serial(rs232) 모듈이 없고 까다로운 디버깅을 해야할때 유용하게 쓸수있다

 












전자과 졸업작품 , 시제품 제작  임베디드 하드웨어 소프트웨어,어플 의뢰받습니다.

이메일 : itpac@naver.com



 뭐든지 문의주시면 대행해드립니다.

 

1.댓글 또는 이메일 남겨주시면 알람이 바로떠요 (연락처 남겨주세요)

2.인천에 미팅할공간이 있습니다.


 

#라이브러리활용 directX opengl OpenCV(영상처리, image tracking)

https://www.youtube.com/watch?v=WFhEIIiXWyQ

#웹서버 , 데이터 베이스 구축(apach2, php, mysql, IIS , node.js , mongoDB)

#각종언어 (파이썬 , C, C++, C#, java 등등)

#안드로이드, IOS 앱 개발

#윈도우 프로그래밍(각종 게임, 관리툴, 영상처리등등)

#제어(LCD, LED, 각종 모터, 각종 센서, 스피커)

#통신(Wifi, 블루투스, Uart, SPI I2C, Serial)구현

#리눅스(서버, 드라이버 개발)

#펌웨어개발

#임베디드 장비 개발

#사물인터넷 IOT(라즈베리파이, 아두이노, ATmega 등등)

-집에서 간단하게 쓸수있는것들(cctv, 도어락, 환풍, 온도조절 등등)

#FPGA (cyclone)

#다이나믹셀 (로보티즈)

#비콘 개발

임베디드 , S/W 과외합니다.

개인사업자입니다. 세금계산서 해드려요

 

 


※문의메일 양식 


ex)

이름 : 홍길동

번호 : 010-1234-1234

필요부품 : 서보모터 라즈베리파이, 카메라, Atmega 등등

제품명 : 얼굴추적

예산 : 80만

해당 개발제품에 대한 자세한 설명:(최대한 자세하고 상세하게 설명해주시기바랍니다)

이메일 : itpac@naver.com



Wiimote 를 활용한 전자칠판 




자동먹이공급시스템




볼벨런싱 




얼굴인식및 추적 


자유롭게 움직이는 실시간 카메라 스트리밍 RC카




충격감지해서 촬영하는 블랙박스  




짐을 들어올리고 내리는 라인트레이서  (사진을 클릭하시면 동작영상을 보실수있어요)





 

Analog to Digital Converter 에 대한 약자이다

아날로그 신호를 디지털값으로 바꿔주는 역할을 한다

ADC는 주로 센서(전압) 값을 읽을때 사용한다.

 

타겟보드는 Atmega128 !!

avrISP mk2에서 ISP 커넥터를 사용 했을 경우 나오는 증상이였습니다

 

 

Studio 6.2에서

Device Progamming에서 Tool항목에  AVRISP MK2 조차 뜨지않는경우

Studio 7설치

 

 

Studio 7 에서

AVRISP MK2 항목은 뜨지만 Unable to connect to toll AVRISP MkII 라는 오류가 뜰경우

 

해결방법

http://www.allkit.kr/shop/community/Community_view.php?t_id=board_20060911200705&category=&no=42&search_1=&search_2=&page=1

으로 해결 하였으나 해결이 되지않는경우

 

7에서는 해결이 안되는고 6.2 에서 해결이되어 6.2버전 사용중입니다.

 

해당 현상은 pc마다 다른것같고 os마다 다른것같으니 해결방안중 하나라고 보셔야 합니다.

 

 

IDE Cable

Programmer 장비로 MCU칩에 넣을때는 맞춰서 연결하면 된다.



---------------------------------------------------------------------------------------------------------------

유선통신의 대표적인 형태로는 I2C, SPI가 있다.

SPI (=Serial Peripheral Interface)



▲이 통신방식은 ISP통신이고 관련자료및 약자들의 의미는 여기링크에...

http://electronics.stackexchange.com/questions/55960/difference-between-miso-mosi-and-txd-rxd

(Note!!! : 글자위에 짝대기 or 글자뒤에 프라임이 붙으면 Active Low이다. 즉, GND값이 들어가면 동작)

SCK : Clock signal from master to slave

MOSI : Master Out Slave In

MISO : Master In Slave Out

SS : Slave Select signal selects salve devices. 

SPI is a bus and can have multiple devices on the bus. 

Because of a clock signal present, SPI can be operated faster than UART.

Master와 Slave가 통신하기 위해서는 양쪽의 SS비트가 모두 Low가 되야한다.

(관련자료 링크)

+ Recent posts