«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

ITGenerations

[AVR]LED 2개중 하나가 더빠르게 (2배 빠르게)/LED 속도제어/OCRn 숫자 변경방법 본문

Univ/AVR atmega128

[AVR]LED 2개중 하나가 더빠르게 (2배 빠르게)/LED 속도제어/OCRn 숫자 변경방법

ITGenerations 2017. 12. 10. 17:57

// source 21

// LED 2개중 하나가 더빠르게 (2배 빠르게)

// LED 속도제어

// OCRn 숫자 변경방법 


#include <avr/io.h>

#include <avr/interrupt.h>

ISR(TIMER0_COMP_vect)

{

static int led=0;

static char n_enter=0;


n_enter++;


if(n_enter == 50) // 50*10 = 500ms

{

n_enter = 0;

if (led)

led = 0;

PORTA |= 0x01;

}

else 

{

led = 1;

PORTA &=  ~(0x01);

}

}


}



ISR(TIMER2_COMP_vect)

{

static int led=0;

static char n_enter=0;

//TCNT2 = 0x4E ;

n_enter++;



// n_enter ==25로 하는 이유: 카운트가 0~25 /0~50보다  2배 적으므로 2배 빠름.

// 속도 변경 방법 1

// 다른 속도 변경방법은 아래 int main() 함수 참고 

if(n_enter == 50) // 50*10 = 500ms

{

n_enter = 0;

if (led)

led = 0;

PORTA |= 0x02;

}

else 

{

led = 1;

PORTA &=  ~(0x02);

}

}


}



int main()

{

DDRA=0xFF;

PORTA=0xFF;


// 타이머를 하나 추가했으므로 

// 타이머 0은 00 이런식으로 작성

// 타이머 2는 20 이런식으로 작성

// 타이머 0,2 둘다 00으로 해도 정상 작동 

TCCR0 = (1<<WGM01)|(0<<WGM00)|(0<<COM01)|(0<<COM00)|(1<<CS02)|(1<<CS01)|(1<<CS00);

TCCR2 = (1<<WGM21)|(0<<WGM20)|(0<<COM21)|(0<<COM20)|(1<<CS22)|(0<<CS21)|(1<<CS20);


// OCR0 시정수 

// (1/16M) * 분주비(1024) * OCR0 = 10ms --> OCR0 = 156.25 = 약156



// 속도 변경 방법2

//  OCRn 숫자를 변경 , 숫자를 절반으로 변경 (78)


// TCNn 0부터 카운트

TCNT0 = 0x00;

// ORCn 156 까지 카운트 

OCR0 = 0x9C;//156

// 0 == 0x00

// 156 == 0x9c

// 이 숫자는 같으므로 어느걸 써도 무방 

TCNT2 = 0x4E ;

OCR2 =  0x9c;//156


TIMSK = (1<<OCIE0)|(1<<OCIE2); // Output Compare Interrupt Enable 0

sei();

while(1);


}


*/


// source 22




// source 23

// 세븐세그먼트, 트랜지스터 사용 x

/*

#include <avr/io.h>

#include <util/delay.h>


static unsigned char SegTable[17] = 

{0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,

0x7F, 0x6F, 0x77, 0x7C, 0x58, 0x5E, 0x79, 0x71,

0x00};


int main()

{

unsigned char cnumber[2] = {4,3}; // 34 출력, 원래 코드

//unsigned char cnumber[2] = {3,4}; // 변경코드 -> 34가 아니라 43이나온다. 

int j=0;


DDRA  = 0xFF; // 포트 A를 출력으로 설정

DDRD |= 0xF0; // 포트 D의 상위니블을 출력으로 설정

//DDRD |= 0xFF; // FF로 해도 똑같은 결과 

while(1)

{

for(j=0; j<2; j++)

{

// PORTD =~( 0x10<<j); //  ~()를 하면 34가 아니라 43이 출력 된다. 

// 34가 아니라 43이 출력된다.

// portd 6,8핀 위치를 서로 바꿔도 34가 아니라 43이 출력 된다.

//portd 4->8 , portd 5->6

PORTD = 0x10<<j; // j-번째 세그먼트를 켠다.



PORTA = ~SegTable[cnumber[j]];

_delay_ms(5); // 5msec 시간지연

}

}

}


*/