1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.
판매자 | 치토스 | 판매 납포인트 | 무료 | 평점 | 0점 / 총 0명 참여 |
---|
#include <avr/io.h>
/************** sbi cbi명령어를 사용하기 위한 정의 ********************/
//인터넷에서 발췌. 해석은 안됩니다 죄송 원본자의 양해를 구함-
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define inb(sfr) _SFR_BYTE(sfr)
#define outb(sfr, val) (_SFR_BYTE(sfr) = (val))
#define inw(sfr) _SFR_WORD(sfr)
#define outw(sfr, val) (_SFR_WORD(sfr) = (val))
#define outp(val, sfr) outb(sfr, val)
#define inp(sfr) inb(sfr)
#define BV(bit) _BV(bit)
/********* sbi cbi 명령어와 비슷한 정의 단지 정의를 만들어서 사용 *****/
#define sbit(x,y) (x|=(1<<y))
#define cbit(x,y) (x&=~(1<<y))
/******** 함수 원형 선언********/
void delay_us(unsigned char time_us);
void delay_ms(unsigned int time_ms);
int main()
{
DDRB=0XFF;
/********* CBI,SBI 테스트 *********/
/*
sbi (PORTB,7); //PB7에 HIGH
delay_ms(1000); //1초 지연
sbi (PORTB,6); //PB6에 HIGH
delay_ms(1000); //1초 지연
cbi (PORTB,6); //PB6에 LOW
*/
/********* CBIT SBIT 테스트 ********/
sbit (PORTB,7); // PORTB|= (1<<7); 동일한의미
delay_ms(1000);
sbit (PORTB,6);
delay_ms(1000);
cbit (PORTB,6);
}
/*********************** 딜레이 함수***************************
딜레이함수는 당근이의 AVR갖고 놀기에서 발췌 주석은 제가 보강함*/
void delay_us(unsigned char time_us) { // time delay(us)
register unsigned char i;
for(i = 0; i < time_us; i++) { // 4 cycle
asm volatile("PUSH R0 "); // + 2 cycle
asm volatile("POP R0 "); // + 2 cycle R0에 있는 값을 메모리에서 빼옴
asm volatile("PUSH R0 "); // + 2 cycle R0에 있는 값을 메모리에 넣음
asm volatile("POP R0 "); // + 2 cycle
asm volatile("PUSH R0 "); // + 2 cycle
asm volatile("POP R0 "); // + 2 cycle
}
}
/*
16 cycle * 62.5 ns = 1000 ns = 1 us at 16.000MHZ
위의 싸이클을 전부 더하면 16싸이클입니다 avr에서 1cycle이 62.5ns 이고
16싸이클*62.5ns = 1000ns =(avr16Mhz환경에서 1us입니다)
-->데이터시트에 보면 PUSH명령이 2clock(sysle)이라고 적혀있습니다(instruction set summury부분)
즉, push라는 명령어수행주기가 2클럭(싸이클)입니다
즉 위와같이 어셈블러인 POP과 PUSH와 레지스터 변수를 쓰는 이유는 이 명령어가 수행되는 싸이클이
아주 정확하기 때문에 의미없는 명령이지만 이 싸이클을 더해서 딜레이함수를 만들기 위해서 입니다
그리고 for(i = 0; i < time_us; i++) 이건 4cycle인데
계산하면 i=0; (명령어수행주기1clock) i<time_us;(2clock) i++(1clock)이라는군요
delay_us(100); //100us
*/
void delay_ms(unsigned int time_ms) { // time delay(ms)
register unsigned int i;
for(i = 0; i < time_ms; i++) {
delay_us(250);
delay_us(250);
delay_us(250);
delay_us(250);
}
}
// delay_ms(1000); //1초