프로테우스로 ATmega128 개발 키트 KUT-128 구현

- 인터럽트 처리를 위한 스위치, LED, FND 4개 정도만 일단 구현함

기본 블링크 예제

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


int main()
{
	DDRC = 0xff;
	while(1){
		PORTC = 0xf0;
		_delay_ms(500);
		PORTC = 0x0f;
		_delay_ms(500);
	}
}

 

 

기본 FND 예제

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

int main()
{ 
   char i, val;

   DDRB = 0xff;
   DDRF = 0xf0;
   PORTF = 0b11100000;
   
   while(1){
      val = 0b00000001;
      for(i = 0; i < 7;i++){
	 PORTB = val;
	 _delay_ms(500);
	 val = val << 1;
      }
   }
   
   return 0;
}

 

 

 

 

FND 9999 시뮬레이션 실패?

- FND 4개로 9999찍으려 했지만 _delay_ms를 낮게 설정해서 real time으로 동작되지 않는다.

- 거기다 실제 하드웨어처럼 잔상이 남지 않아 4개의 수가 동시에 나오지 않는다.

 

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

char seg_pat[16] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
		  0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

void seg4_out(int);
		  
int main()
{ 
	int num = 0;
	
	DDRB = 0xff;
	DDRF = 0b11110000;
	while(1){
		seg4_out(num);
		num++;
		if (num > 9999)
			num = 0;
	}
}

void seg4_out(int num){
	int i, N1000, N100, N10, N1, buf;
	
	N1000 = num / 1000;
	buf = num % 1000;
	N100 = buf / 100;
	buf = buf % 100;
	N10 = buf / 10;
	N1 = buf % 10;
	
	for(i=0;i < 10;i++){
		PORTF = 0b11100000;
		PORTB = seg_pat[N1];
		_delay_ms(10);
		
		PORTF = 0b11010000;
		PORTB = seg_pat[N10];
		_delay_ms(10);
		
		PORTF = 0b10110000;
		PORTB = seg_pat[N100];
		_delay_ms(10);
		
		PORTF = 0b01110000;
		PORTB = seg_pat[N1000];
		_delay_ms(10);
	}
}

 

fnd 2개도 제대로 안된다. 인터럽트랑 같이 쓰고싶었는데

 

 

 

FND, INT 예제

- FND 2개도 못쓰니 그냥 FND 여러개 달린걸 써야할거같긴한데 그러면 원래 KUT-128 보드를 바꾸는거라 어떻게 할지 고민이다.

- 대신 외부 인터럽트로 FND 1개의 숫자 올리는 예제를 구현했다.

- 근데 mega128.h가 아닌 avr/interrupt.h를 사용해서 기존 보던 책과는 조금 다르게 ISR(INT4_ vect)로 인터럽트 정의한다.

- 근데 전역 변수 N1을 선언하고 썻는데 제대로 인터럽트 동작이 안되더라.

 => 아래의 링크를 보니 전역 변수에 volatile을 줬더니 문제없이 동작한다. 찾아보니 최적화 과정에서 지워졌나보다.

https://exploreembedded.com/wiki/AVR_External_Interrupts

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

char seg_pat[16] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
		  0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

volatile int N1 = 0;
		  
int main()
{
	DDRB = 0xff;
	DDRC = 0xff;
	DDRF = 0b11110000;
	
	EICRB = 0b00000010;
	EIMSK = 0b00010000;
	SREG = 0x80;
	PORTF = 0b11100000;
	
	while(1){
		PORTB = seg_pat[N1];
		PORTC = 0xff;
		_delay_ms(1000);
	}
}

ISR(INT4_vect){
	N1 = (N1 + 1) % 10;
}

 

진도를 더 나가고 싶긴한데, 책을 두고와서 더 나갈수가 없다 ;;

내일 타이머랑 통신으로 넘어가야지

+ Recent posts