반응형

Atmega를 컴파일하는 Atmel Studio는 우리가 흔이 알고있는 Microsoft Visual Studio와 다른 자료형 사이즈 크기를 지니고 있다.

 

아트메가는 8 bit MCU 이다.

 

Atmel에서 컴파일 되는 아래 사이즈 크기이다.

int크기, char크기, float크기 등등

bit 1bit 0,1
char 8bit -128~127
unsigned char 8bit 0~255
signed char 8bit -128~127
int 16bit -32768~32767
unsigned int 16bit 0~65535
signed int 16bit -32768~32767
long 32bit -2147483648~2147483647
unsigned long 32bit 0~4294967295
signed long 32bit -2147483648~2147483647
float 32bit -3.402e38~3.402e38 (정확도: ±1.175e-38)
double 32bit -3.402e38~3.402e38 (정확도: ±1.175e-38)

(출처: https://riyenas.tistory.com/43)

 

 

반응형
반응형

별거 아니지만 삽질할 수 있는 요소이다...

필자는 Atmel Studio 7을 사용하면서 정말 별거 아닌데 작동하지 않아 고생을 했다.

 

 

void 으로 함수를 만들 때, input 인자에 void를 넣지않고 비워두면 컴파일이 제대로 작동하지 않는다...

반응형

 

아래와 같이 이런식으로 함수를 작성하면, 작동을 하지 않았다..

혹시나 Atmel Studio 7으로 코드를 만드는데 함수가 동작하지 않으면 이점 유의하도록 한다.

 

 

반응형
반응형

Atmega128에서 지원하는 외부인터럽트중 RESET 다음으로 가장 우선순위가 높은 인터럽트가 있다.

바로 외부인터럽트이다. 그 순위로는 INT0 ~ INT7까지이다.

RESET보다는 우선순위가 낮지만, 그 외 타이머 인터럽트보다는 높다.

더 자세한 인터럽트 순위에 관해 궁금하다면 아래 참고.

https://ansan-survivor.tistory.com/1221

 

[Atmega 128] 아트메가 128 인터럽트 벡터 표 (interrupt vector table)

아트메가128에 인터럽트 기능을 사용하기 전에 아트메가의 인터럽트 벡터 테이블을 알아야 한다. 인터럽트란? 아래 참고. https://ansan-survivor.tistory.com/1220 MCU의 인터럽트(Interrupt) vs 폴링(Polling)..

ansan-survivor.tistory.com

 

이제 이 외부인터럽트에 스위치를 달아서 동작을 시켜본다.

사용할 PCB는 직접제작한 아래 PCB이다. (Atmega128과 최소한의 동작기능만 장착)

https://ansan-survivor.tistory.com/1144

 

[PCB제작] OrCAD로 설계한 데이터를 JLCPCB를 통해 SMT 주문하기 ! (설계부터 PCB 주문 생산 까지)

PCB제조업체는 중국에 홍콩 업체 JLCPCB를 이용했다. 이번에는 한번 SMT를 이용해서 기계 납땜을 이용해보았다. Atmega128을 이용해서 최소한의 구동과 ISP를 통해 다운로드가 가능하도록 만든 회로이

ansan-survivor.tistory.com

 

반응형

 

먼저 외부인터럽트를 사용하기전에 아래 항목의 레지스터를 알아야 한다.

 - SREG

 - EMISK

 - EICRA

 - EICRB

 

 

< SREG 레지스터 >

 - 외부인터럽트가 발생하려면 무조건 7번 비트가 1으로 Set되어야 한다.

 - 그래서 보통 코드 마지막에 SREG |= 0x80; 으로 자주 사용

 

 

 

< EMISK 레지스터 >

 - INT0 부터 INT7 까지 사용할 외부인터럽트를 Set하면 된다.

 - 여기 예제에서는 INT7 과 INT6을 사용함으로 1100 0000 (=0xC0) 으로 Set하면 됨.

 

 

< EICRA, EICRB 레지스터 >

 - 외부인터럽트 INT0 ~ INT3 을 사용할 때 트리거방식 설정

 - 외부인터럽트 INT4 ~ INT7 을 사용할 때 트리거방식 설정

 - 2개 비트 마다 각각 INTn의 기능 설정

 - EICRA는 INT0 ~ INT3 의 동작 방식을 정할 수 있음

 - EICRB는 INT7 ~ INT4 의 동작 방식을 정할 수 있음

 

 

 

* PE0 출력포트 설정, LED장착 (저항 생략)

* PE6, PE7 스위치 입력포트 설정, 내부 Pull-up 모드 설정 (DDRn을 입력 설정 후 PORTn을 Set하면 내부 Pullup 사용)

예제 코드)

PE6과 PE7의 외부 인터럽트가 들어오면 (스위치의 하강 엣찌) LED가 토글

EICRB = 0xA0; 넣은 이유, INT6과 INT7을 하강엣지로 사용

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


// 외부인터럽스6 (INT6레지스터) 서비스 루틴
// 인터럽트가 들어오면 동작
ISR(INT6_vect)
{
	PORTE &= 0xFE;  // 0b11111110   PE0번 비트가 클리어되고 (clear = 0)
}

// 외부인터럽스7 (INT7레지스터) 서비스 루틴
ISR(INT7_vect)
{
	PORTE |= 0x01;  // 0b00000001   PE0번 비트가 셋됨(set = 1)
}

int main(void)
{
	// 0x00111111 으로 PE6, PE7을 입력세팅,  나머지 PE0 ~ PE5 출력 세팅
	DDRE = 0x3F;
	// PE6, PE7을 Pull-up으로 하기위해 AND마스크 (DDRn을 입력설정 후 PORTn을 Set하면 내부 Pullup 사용)
	PORTE &= 0xC0;
	
	
	// 사용할 외부인터럽트 bit를 Set해줌. INT6, INT7 사용하므로 0b11000000 으로 세팅
	EIMSK = 0xC0; // INT6, 7 Interrupt Enable
	
	
	// 인터럽트 동작 방식 설정
	EICRA = 0x00;
	EICRB = 0xA0; // INT6, 7 Falling Edge에 동작 [1010 0000]
	
	
	// 인터럽트 발생시 필요, 7번 bit를 Set해주어야 함
	SREG |= 0x80; // Global Interrupt Enable

	while(1){
		
	}

	return 0;
}

 

 

 

 

 

 

 

 

 

 

반응형
반응형

일반적으로 DC모터를 제어할 때 자주 사용되는 방식이 PWM제어이다.

디지털 Pulse 파형을 일으켜 주기의 Duty Cycle으로 모터의 속도와 방향을 제어할 수 있다.

 

Atmega128 의 Datasheet에서 PWM으로 사용되는 핀은 아래와 같다.

PWM은 타이머 인터럽트를 사용하는데, Atmega128에서는 총 4개의 Timer Interrupt 가 존재한다.

 - Timer 0  (OC0) : PB4

 - Timer 1  (OC1A~C) : PB5 ~ PB7

 - Timer 2  (OC2) : PB7

 - Timer 3  (OC3A~C) : PE3 ~ PE5

반응형

 

 

 

반응형
반응형

 

Atemga128에 LCD를 연결해 구동시키기 위한 참고 회로이다.

LCD는 핀이 보통 14개로 구성되어있고, 배경의 LED화면 밝기(백라이트)를 조종하는 LED+와 LED-가 있는 16개의 핀이 있는 것도 있다.

16개 핀 LCD (출처: https://www.electronicwings.com/avr-atmega/interfacing-lcd-16x2-in-4-bit-mode-with-atmega-16-32-)

위의 LCD의 일반적인 연결 방법. (자세한 연결 방법은 각 제조사의 Datasheet를 참고해야 한다)

반응형

이를 Atemga128의 LCD에 연결한 회로도를 만들어보면 아래와 같다고 할 수 있다. (단 LED기능이 없는 14핀)

핀을 연결하는 방법도 D0 ~ D7 을 모두 병렬로 연결하는 방법이 있고, 4개만 병렬로 연결해서 직렬처럼 기능을 사용하는 방법이 있다.

 

 

반응형
반응형

아트메가128에 인터럽트 기능을 사용하기 전에 아트메가의 인터럽트 벡터 테이블을 알아야 한다.

인터럽트란? 아래 참고.

https://ansan-survivor.tistory.com/1220

 

MCU의 인터럽트(Interrupt) vs 폴링(Polling) 방식 차이

MCU에서 입력을 받아들이는 방법은 대표적으로 폴링(Polling)과 인터럽트(Interrupt)가 있다. 폴링방식 : polling (투표, 여론조사). 뜻 그대로 계속 입력핀의 상태를 여론조사 하듯이 확인하는 것이다.

ansan-survivor.tistory.com

 

아트메가128은 총 35개의 인터럽트 벡터가 있다. 데이터 시트를 보면 아래와 같은 페이지가 있다.

이를 한글로 보면 아래와 같다.

 <대표 인터럽트>

RESET (리셋) - 1개 (가장 최우선의 인터럽트로 다른것보다 우선순위가 높다)

INT0 ~ INT7 (외부인터럽트) - 8개

TIMER (타이머 인터럽트) - 8개

USART0 (UART 통신 인터럽트) - 3개 / USART1 (UART 통신 인터럽트) - 3개

ADC (아날로그 to 디지털 컨버터) - 1개

SPI ( SPI통신 ) - 1개

~

반응형

 

 

* 특징

 - 값이 낮은 인터럽트일 수록 우선순위가 높다!

 - 0x0000 RESET은 그 어떤 인터럽트보다 최고의 우선순위를 갖으므로, 발동시 모든것이 중단되고 리셋된다.

 - 0x0002 외부인터럽트0 (INT0) 는 두번째로 높은 우선순위로 발동시 리셋을 제외하고 바로 작동된다.

 - 외부인터럽트 뒤로 순위가 높은것은 타이머 인터럽트

 

 

반응형
반응형

스위치를 클릭할때마다 한 비트씩 이동하여 LED의 켜짐 위치가 바뀌게 된다.

그리고 0x80 (마지막 스위치)에서 비트가 넘어가면 다시 처음 LED가 켜지도록 한다.

비트연산으로 LED를 켜는 방법은 아래에 있다.

https://ansan-survivor.tistory.com/1207

 

[Atmega128] 아트메가 비트연산으로 LED한칸씩 옮기기

(아래 직접 제작한 Atmega128 모듈으로 테스트를 진행했다.) https://ansan-survivor.tistory.com/1144 [PCB제작] OrCAD로 설계한 데이터를 JLCPCB를 통해 SMT 주문하기 ! (설계부터 PCB 주문 생산 까지) PCB제조..

ansan-survivor.tistory.com



1. 입력 출력 단자 구성하기

LED에 저항은 달기 귀찮아서 생략~

 - 출력핀 사용(LED 8개): PA0 ~ PA7

 - 입력핀 사용(스위치): PC0

    입력 SW Pull up 으로 사용. (아래 참고)

https://ansan-survivor.tistory.com/1213

 

풀업(pull up)과 풀다운(pull down) 원리, 시뮬레이션. 스위치 회로 (입력핀 스위치 구성)

아두이노나 Atmega128을 이용해 스위치를 이용한 입력회로를 구성할 때 Pull-up과 Pull-down 스위치 원리를 알고 구성해야 한다. 풀업, 풀다운을 하는 이유는? 만약 스위치를 아래와 같이 구성했다. 입

ansan-survivor.tistory.com

 

3. SW입력받아 LED 비트를 한칸 씩 옮기는 코드

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

int main()
{
	char LED = 0x01; // LED변수 초기값
	char SW = 0x01;  // SW변수 초기값
	char state = 0;	// 상태값 초기화 - 스위치
	
	// (DDRn 은 입출력 설정 레지스터)
	DDRC = 0x00;  // PCn입력설정 
	DDRA = 0xFF;  // PAn출력설정
	
	PORTC = SW; // PC0번 포트 스위치로 사용
	
	while(1)
	{
		PORTA = LED; // LED 초기상태 PC0만 켜짐.

		// 스위치를 땐상태에서는 state가 0, 입력단자 PC0 SW가 눌리면 0x01이 되어 true가 됨.
		if((PINC & 0x01) == 0x00 && state == 0)
		{
			// 스위치가 눌린 상태, 비트 옮기기
			state = 1;
			if(LED == 0x80)
				LED = 0x01;
			else
				LED <<= 1;
		}
		// 바로 state를 0으로 변경하여 LED를 클릭당 1번만 옮기도록 설정.
		if ((PINC & 0x01) != 0x00 && state == 1)
		{
			state = 0;
		}
	}
	
	return 0;
}

 

그러나 스위치의 채터링(여러번클릭되는 현상)이 일어 날 수 있다.

 

 

 

 

 

반응형
반응형

비트연산으로 LED를 켜는 방법은 아래에 있다.

https://ansan-survivor.tistory.com/1207

 

[Atmega128] 아트메가 비트연산으로 LED한칸씩 옮기기

(아래 직접 제작한 Atmega128 모듈으로 테스트를 진행했다.) https://ansan-survivor.tistory.com/1144 [PCB제작] OrCAD로 설계한 데이터를 JLCPCB를 통해 SMT 주문하기 ! (설계부터 PCB 주문 생산 까지) PCB제조..

ansan-survivor.tistory.com

 

여기에서는 Atmega128의 출력설정으로 LED를 나오게 하고 입력설정으로 스위치를 설정하여 스위치를 때고 있을 때와, 누르고 있을 때 토글하는 방법을 작성.

 

아래와 같이 버튼을 클릭하면 LED가 서로 왔다갔다 토글한다.

 

1. 출력 단자 구성하기

 - 출력핀 사용(LED 2개): PB0, PB2 

저항은 달기 귀찮아서 생략~

 

2. 입력 단자 구성하기

 - 입력핀 사용(스위치): PC0

 - Pull up 으로 사용. (아래 참고)

https://ansan-survivor.tistory.com/1213

 

풀업(pull up)과 풀다운(pull down) 원리, 시뮬레이션. 스위치 회로 (입력핀 스위치 구성)

아두이노나 Atmega128을 이용해 스위치를 이용한 입력회로를 구성할 때 Pull-up과 Pull-down 스위치 원리를 알고 구성해야 한다. 풀업, 풀다운을 하는 이유는? 만약 스위치를 아래와 같이 구성했다. 입

ansan-survivor.tistory.com

 

3. 간단한 토글 코드

반응형
#include <avr/io.h>
#include <util/delay.h>

int main()
{
	char LED = 0x01; // LED변수 초기값
	char SW = 0x01;  // SW변수 초기값
	
	DDRC = 0x00;  // PBn입력설정 (DDRn 은 입출력 레지스터)
	DDRB = 0xFF;  // PCn출력설정
	
	PORTC = SW; // PC0번 포트 사용 (스위치 입력으로 사용설정)
	
	while(1)
	{

		if ((PINC & SW) == 0x01)	
			PORTB = LED;			// Default 상태
		else
			PORTB = ~LED;			// 스위치를 누르면 작동. NOT Mask로 간단하게 토글
	}
	
	return 0;
}

 

단 이 코드는 스위치를 땔때와 누를때 두가지 경우의 토글이다.

 

 

 

 

 

반응형
12

+ Recent posts