ITGenerations
[AVR]LED 2개중 하나가 더빠르게 (2배 빠르게)/LED 속도제어/OCRn 숫자 변경방법 본문
[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 시간지연
}
}
}
*/
'Univ > AVR atmega128' 카테고리의 다른 글
[AVR] 내부 풀업저항, 외부 풀업저항 을 사용하는 이유 (0) | 2017.12.13 |
---|---|
[AVR] Atmega128 오류 줄이는법 (0) | 2017.12.13 |
[AVR] LED 깜빡이기 속도 제어/LED 2개중 하나가 더빠르게 (2배 빠르게) (0) | 2017.12.10 |
[AVR] LED 2개 동시에 켜기[깜빡이기] (0) | 2017.12.10 |
[AVR] LED 3개 전원 제어 타이머 0 CTC모드 (0) | 2017.12.10 |