1 | /**************************************************************
|
2 | SI 16.04.2011
|
3 | Capture_Timer3_test At90USB647
|
4 |
|
5 | 1kHz PWM Signal am InputCapturePIN=PC7 erfassen
|
6 | v1,0
|
7 | **************************************************************/
|
8 | // http://www.mikrocontroller.net/attachment/highlight/312
|
9 | // PORTC |= (1<<PC2); //PC2 SETZEN ungefaehr gleich mit: PORTC = 8;
|
10 | // PORTC &= ~(1<<PC1);//PC1 LoeSCHEN
|
11 |
|
12 | #include <avr/io.h>
|
13 | #include <avr/interrupt.h>
|
14 | #include <util/atomic.h>
|
15 |
|
16 |
|
17 | int main(){
|
18 |
|
19 | /* ClockPrescaller auf 1 setzen: */
|
20 | CLKPR = 128; // S.47: Write the Clock Prescaler Change Enable (CLKPCE) bit to one
|
21 | //and all other bits in CLKPR to zero.
|
22 | CLKPR = 0; // S.47: Within four cycles, write the desired value to CLKPS while
|
23 | //writing a zero to CLKPCE.
|
24 | //Interrupts must be disabled when changing prescaler setting
|
25 | //to make sure the write procedure is not interrupted.
|
26 | /* ClockPrescaller auf 1 setzen: ^^ "fertig"*/
|
27 |
|
28 |
|
29 | // PWM :
|
30 | DDRB = 255; // ausgang wegen PWM als Ausgang
|
31 |
|
32 | TCCR0B |= 0x03; // Clock Select /64: 16MHz/64->250kHz : 250kHz/256 zaehlschritte = 976,5625 Hz
|
33 | TCCR0A |= 0x03; // Fast PWM , BOTTOM(0x00)-TOP(0xFF) //ohne OCR0A, mit OCR0A: WGM02=true, OCR0A=TOP=0x00-0xFF
|
34 | TCCR0A |= 0x20; // PD0:NON-Inverted PWM; BOTTOM-Compare=>PortD0=high, Compare-TOP=>PortD0=low!!!
|
35 | TCCR0A |= 0x80; // PB7:NON-Inverted PWM; BOTTOM-Compare=>PortD0=high, Compare-TOP=>PortD0=low!!!
|
36 |
|
37 | OCR0A = 50; //Compüare register fuer Pin-B7
|
38 |
|
39 |
|
40 | DDRC = 0; // PC7 (A15/IC.3/CLKO) InputCapture=PC7
|
41 | PORTC = 0;
|
42 |
|
43 | DDRD = 255; // Highbyte des Input Capture Wertes zum Anzeigen
|
44 | PORTD=0;
|
45 | DDRA = 255; // Lowbyte des Input Capture Wertes zum Anzeigen
|
46 | PORTA = 0;
|
47 |
|
48 | DDRF = 255; //test
|
49 | PORTF =0; //test
|
50 | DDRE = 255; //test
|
51 | PORTE = 0; //test
|
52 |
|
53 |
|
54 | TCCR1B &= ~(1<<WGM13); // normale MODE // WGM13 bit wird geloescht
|
55 |
|
56 | TCCR3B |= 0x02; // Clock Select /8: 16MHz/8->2MHz : bei 2MHz ist eine Periode 0,5microSek,
|
57 | // also bei 1kHz(P=1ms) waeren es dann 2000 Schritte um die komplette Periodevon1kHz zu erfassen
|
58 |
|
59 | TCCR3B |= 0x80; // Noise Canceller einschalten!!! es verzoegert die Zeiterfassung um 4 Zyklen
|
60 |
|
61 | TCCR3B |= 0x40; // EdgeSelect auf steigende Flanke einstellen!!!
|
62 |
|
63 | SREG |= 0x80; // Global Interrupt enable
|
64 | TIMSK3 = 0x20; // enable Input Capture Interrupt Timer3
|
65 |
|
66 | PRR1 &= 0xF7; // ViiV | enable Timer/Counter 3 module
|
67 |
|
68 |
|
69 | while(1);
|
70 | return 0;}
|
71 |
|
72 |
|
73 | ISR(TIMER3_CAPT_vect) // Flanke an ICP pin
|
74 | {
|
75 |
|
76 | if( TCCR3B &= 0x40 )
|
77 | {
|
78 | TCCR3B &= ~0x40;// und auf die fallende Flanke warten
|
79 |
|
80 | TCNT3H = 0; // bei steigender Flanke den T3-Zaehler auf 0 setzen
|
81 | TCNT3L = 0;
|
82 | PORTF++;//test nur um zu sehen ob der CODE auch hier durchlaeft
|
83 | }
|
84 | else
|
85 | {
|
86 | PORTA = ICR3L; // bei fallender Flanke die Zeitspanne kopieren
|
87 | PORTD = ICR3H;
|
88 |
|
89 | TCCR3B |= 0x40; // und auf die steigende Flanke warten
|
90 |
|
91 | PORTE ++;//test nur um zu sehen ob der CODE auch hier durchlaeft
|
92 | }
|
93 | }
|