Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Germany
- FujiFilm GFX50s
- Kodak T-Max 100
- N80/4
- 2019 유럽여행
- SONY A7
- Leica M7
- GRD2
- kodak t-max 400
- Mamiya 7
- 2018 미국출장
- Hasselblad 500cm
- Nikon 28Ti
- Kentmere 400
- G28/2.8
- cs50/2.5
- FujiFilm C200
- Rollei35s
- Kodak 5222
- Kodak 400TX
- Kodak Ektar 100
- fujifilm velvia 50
- Contax G2
- Minolta CLE
- Minolta TC-1
- cf80/2.8
- cf50/4 fle
- M-Rokkor 40/2
- ZeissIkon ZI
- 4870
Archives
- Today
- Total
J 창고
[Atmega128] 8bit Timer/Counter Interrupt를 이용한 FND 카운팅 본문
상위 2digit은 sec, 하위 2digit 은 microsec로
FND 카운트가 60.00 sec 가 넘어가면 리셋되는 방식으로
(분 카운트도 하고 싶지만 74HC595가 부족해서... ㅠㅠ)
시계 구현..
이제 Externel Interrupt 를 이용해서 스탑워치를 셋팅 예정.
Prescaler = 64
OCR0 = 249
16Mhz / 64 / (1+249) = 1000Hz
1000Hz => 1ms
1ms 단위로 인터럽트 발생하고
발생할 때마다 count++ 하고
count = 10 이 초시계 msec++ 하여 초시계 작동
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | /* * StopWatch.c * * Created: 2015-01-04 오후 1:46:41 * Author: user * DATA DS <-----> PORTA.0 CLOCK SHCP <-----> PORTA.2 LATCH STCP <-----> PORTA.1 Digit 4,3 = Common Cathode Type FND Digit 2,1 = Common Anode Type FND */ #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> volatile unsigned char count = 1; volatile unsigned int msec = 0; void HC595write(unsigned char); void HC595write_4byte(unsigned int); ISR(TIMER0_COMP_vect){ count --; if (count == 0){ HC595write_4byte(msec++); if(msec >= 6000) msec = 0; count=10; PORTD = ~PORTD; } } void HC595write(unsigned char udata){ unsigned char i; i = 0; while(i<=7){ PORTA = ( udata >> i) & 0x01; // DATA PORTA |= 0b00000100; // SHIFT 1 PORTA &= 0b11111011; // SHIFT 0 i++; } } void HC595write_4byte(unsigned int udata){ unsigned char digit_common_cathode[10] = { 0b11111100, //0 0b01100000, //1 0b11011010, //2 0b11110010, //3 0b01100110, //4 0b10110110, //5 0b00111110, //6 0b11100100, //7 0b11111110, //8 0b11100110 //9 }; PORTA &= 0b11111110; // DATA 0 PORTA &= 0b11111011; // SHIFT 0 PORTA &= 0b11111101; // LATCH 0 unsigned char d1000 = digit_common_cathode[udata/1000]; unsigned char d100 = digit_common_cathode[(udata%1000)/100]; unsigned char d10 = digit_common_cathode[(udata%100)/10]; unsigned char d1 = digit_common_cathode[udata%10]; HC595write(d1000); HC595write(d100); HC595write(~d10); HC595write(~d1); PORTA |= 0b00000010; // LATCH 0 PORTA &= 0b11111101; // LATCH 1 } int main(void){ DDRA = 0xFF; DDRD = 0x01; PORTA = 0x00; PORTD = 0x01; TCCR0 = (1<<WGM01) | (1<<CS02); OCR0 = 0xF9; // OCR0 = 249 TIMSK |= 0x02; sei(); while(1){ } } | cs |
Comments