타이머 인터럽트를 사용하려고 하는데요,
시간이 안 맞네요,
크리스탈은 14.7456 사용하구요,
UBRRL = 0x0F
TCCR0 = 0x03
TCNT0 = 242
사실 설정하는 방법도 모르고;;
적당히 데이터시트랑 자료같은거 보면서
따라했는데, 아무래도 제대로 이해를 못 한 것 같아요..
잘 몰라서 그런지 질문도 어떻게 해야할지 모르겠네요 ㅠ
타이머 인터럽트가 몇초(몇 us?) 에 한번씩 불러지는 건지..
어떻게 계산하는 건지 좀 가르쳐주세요...^^;;
아래와 같이 계산한 값이 실제 카운팅 되야 하는 수치입니다.
비교모드냐 오버플로우 모드냐에 따라서 , Up 모드냐, Down모드냐에 따라서
이 값을 TCNT0에 넣어야할 수 도 있고 OC0에 넣어야할 수도 있습니다.
이건 데이터 쉬트를 참고하시면 될테구요..
AVR한지가 오래되서 레지스터명은 가물가물하네요.. 요새 한참 쓰고 계시는 분들이 답변 많이 달아줄꺼에요..ㅋㅋ
PS. 분주비를 어떻게 선택하느냐에 따라 타이머의 최대 카운팅 숫자를 넘을수도 있으므로 선택을 잘 하셔야합니다.
8비트 타이머 사용하는데 값이 255가 넘게 나온다면 분주비를 바꺼야겠지요^^;
근데 여기서 또 궁금한게요 -- 위의 식에서 말하는 "분주비" 라는 것이,
위 그림에서의 숫자를 말하는게 맞나요 ? (제가 TCCR0 레지스터에 0x03이라는 값을 주었기 때문..)
그리고, "만들고자 하는 주기" 라는 것은 타이머 카운터를 실행시키고 싶은 시간을 말하는게 맞는건가요 ?
제 생각대로 계산했더니 -0.7695...어쩌고 하고 나오네요 -0-
너무 원초적인 질문이라 죄송합니다..ㅠㅋㅋ
만들고자 하는 주기는 초단위입니다. sec단위이므로 변환이 필요하겠지요
1ms마다 인터럽트가 발생하게 한다면
0.001을 (1/14745600)x64 값으로 나눠주면 됩니다.
결과값은 230.40000000000000000000000000004 이 나오는데 229 넣어주면 되겠네요..
님께서 -가 나오고 소수점이 나온것은... 너무 큰 주기를 잡으셨거나 분주비를 잘 못선택하신겁니다.
100ms머 이러케는 큰 시간은 만들수가 없어요..세미나에서 말했듯이 이런 경우에는 1ms를 100번 카운팅하는 방법들을 이용해야합니다.
ㅎㅎ 그런가보네요 ㅎ
1us 단위로 하고 싶었거든요 ^^;;
1ms 단위로 해도 상관없는 거니깐..적당히..
이제 저 계산방법 만큼은 확실히 알겠네요 ㅎ
근데 -0- 여전히 시간이 엉망..ㅠ
1ms단위가 정확하게 나오다가 안나오다가 하네요 중간중간 한번씩 더 짧게 쳐준다는..
휴휴 내일 또 여쭤볼께요. 기대하세요 -0- ㅋㅋ
타이머 함수내에서 연산과정이 1ms를 넘어가거나 다른 함수를 호출한다거나 어셈블리로 nop명령을 실행하는지 확인하세요.
1us로 하고 싶으시면 분주비를 1로 하시고 하시면 되겠네요..ㅋㅋ 계산은 안해봐서...ㅋㅋ
기대는 안하겠습니다.ㅋㅋ
계산식은 저는 저렇게 보는게 제일 편해서 저렇게 그냥 외우고 사용합니다.ㅋㅋ
빨리 이것저것 해 봐야 하는데 다른 일들이 생겨서 어제 그 자리에서 일시정지 중이예요 ^^;;
테스트 장비도 다 뺏기고 -0-
내일은 또 출장이라 다음주나 되야 다시 해볼 수 있겠네요 ㅠㅠ
그럼, 다음주에 뜨거운 관심 부탁드리겠습니다. ㅋㅋ
수고하세요 ^^
머리가 딸려서
http://cafe.naver.com/ArticleRead.nhn?clubid=10750951&menuid=139&boardtype=I&page=2&specialmenutype=&articleid=1083여기 타이머 참조하세요