프로테우스로 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;
}
진도를 더 나가고 싶긴한데, 책을 두고와서 더 나갈수가 없다 ;;
내일 타이머랑 통신으로 넘어가야지
'컴퓨터과학 > 임베디드' 카테고리의 다른 글
조금씩 정리하는 임베디드 - 2. 개발 프로세스와 임베디드 프로세서 1 (0) | 2022.06.19 |
---|---|
proteus_atmega - 4. LCD 제어하기(포기!) (0) | 2022.06.19 |
조금씩 정리하는 임베디드 - 1. 임베디드 개요 (0) | 2022.06.16 |
proteus_atmega - 3. 아날로그 비교기, USART 송수신, USART 프레임 (0) | 2022.06.15 |
proteus_atmega - 1. 아두이노 시뮬레이션(lcd, 초음파, 모터 등) (0) | 2022.06.13 |