MICOM:AVR

구차니의 잡동사니 위키
이동: 둘러보기, 찾기

목차

개요

AVR은 ATMEL 사의 8bit 마이크로 프로세서이다.

intel의 8051 시리즈와는 다른 하버드 아키텍쳐를 도입하였으며, 1MIPS/1MHz의 성능을 보여주며

대개 16~20MHz 의 최고 클럭을 지닌다.

오픈 소스 컴파일러로는 winavr이 있으며 무료로 사용가능한 ATMEL AVR Studio IDE가 존재한다.

홈페이지

컴파일러

IDE

  • AVR studio
  • eclipse

기타

내부링크

하드웨어

전 시리즈 기본적으로 플래시 메모리와 SRAM을 제외하면 거의 동일한 성능을 지니며 모델에 따라 사용가능한 클럭의 차이가 존재한다.

일반적으로 16 MHz / 20 MHz 까지 사용이 가능한 스펙을 지닌다.

또한, 사양에 따라 플래시 메모리와 SRAM의 용량이 달라지며 모델명의 숫자는 플래시 메모리의 용량이고

대용량 모델은 일반적으로 핀수도 많고 더 많은 주변장치 인터페이스를 내장한다.

Fuse bit / Lock bit

마이컴의 클럭소스나 부팅시간 그리고 다시는 프로그래밍을 하지 못하게 하는 보안 기능등을 설정하는 메모리이다.

퓨즈비트가 잘못 설정되면 클럭소스 문제로 MCU가 가동하지 않게 된다.

인공호흡

일반적으로 16Mhz 정도의 오실레이터를 외부클럭으로 이용하여 MCU에 클럭을 주입할 수 있고, MCU가 부팅되어 퓨즈비트를 수정할 수 있게 된다.

항상 살아나는 것은 아니므로 주의가 필요하다.

UART / USART

ADC

TWI

GPIO

alternative function을 사용하지 않으면 기본적으로 GPIO로 작동하며

DDRx 레지스터를 통해 입력/출력을 지정하고 PORTx로 출력 데이터를 PINx으로 입력 데이터를 읽고/쓸수 있다.

8051은 엄격하게 입출력 레지스터가 분리되어 있지만 PORTx나 PINx나 동일하게 사용해도 큰 문제는 없다.

pull-up

기본적으로 GPIO에는 풀업저항이 달려있으며, 20mA의 전류를 흘릴수 있어 LED 정도는 저항없이 사용이 가능하다.

통신시에는 값이 변화가 있을시 전위가 끌려 다녀야 하므로 DDR=0(input), PORT=1(High), PUD=0 으로 두어야 한다.

EEPROM

설정내용을 저장하기 위한 NVRAM으로 일반적으로 SRAM과 동일한 사이즈의 EEPROM이 존재한다.


소프트웨어

WINAVR 변수 크기

char 1
short 2
int 2
long 4
float 4
double 4


코드 템플릿

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

/************************************/
#include <stdio.h>

static int uart_putchar(char c, FILE *stream)
{
	if (c == '\n') uart_putchar('\r', stream);
	loop_until_bit_is_set(UCSR0A, UDRE);
	UDR0 = c;

	return 0;
}
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);

/************************************/
ISR(TIMER0_OVF_vect)
{
    TCNT0 = 255 - 160; // 10usec
}


/************************************/
inline void init_uart()
{
	UBRR0H = 0;
	UBRR0L = 8; // 115k with U2X = 0
	UCSR0A = 0x00; // U2X = 0;
	UCSR0B = 0xD8;
	UCSR0C = 0x06; //Asyncronous - no parity - 1bits(stop) - 8bits(data)
}

inline void init_port()
{
	DDRA = 0x00;
	PORTA = 0xFF;
}

inline void init_timer0()
{
	TCCR0 = 1;// no scaling
	TCNT0 = 255 - 160; // 10usec
	TIMSK = 0x01;     // 오버플로우 인터럽트 허용
}

/************************************/
void main()
{
	init_port();
	init_uart();
	init_timer0();
	stdout = &mystdout;

	sei();

	while(1)
	{
		;
	}
}
개인 도구
이름공간

변수
행위
둘러보기
도구모음