1 | /****************************************************************************/
|
2 | /* Datei: ICP_Measure.c */
|
3 | /* Funktion: Pulsdauermessung via ICP - Pin */
|
4 | /* Autor: 5CHELI / Lukas Zopf */
|
5 | /* Datum: 11.2010 */
|
6 | /* Version: V1.0 */
|
7 | /****************************************************************************/
|
8 |
|
9 | // ----------------------------------------------------------------------------
|
10 | // INCLUDES
|
11 | // ----------------------------------------------------------------------------
|
12 |
|
13 | #include <avr/io.h>
|
14 | #include <avr/interrupt.h>
|
15 | #include <util/delay.h>
|
16 | #include <inttypes.h>
|
17 |
|
18 | // ----------------------------------------------------------------------------
|
19 | // DEFINES
|
20 | // ----------------------------------------------------------------------------
|
21 |
|
22 | #define ICP_PIN PD6 //Pin des Input Captures PD6=ICP
|
23 |
|
24 |
|
25 |
|
26 | // ----------------------------------------------------------------------------
|
27 | // Funktionsdeklarationen
|
28 | // ----------------------------------------------------------------------------
|
29 |
|
30 |
|
31 |
|
32 | // ----------------------------------------------------------------------------
|
33 | // globale Variablen die durch Interrupts verändert werden
|
34 | // ----------------------------------------------------------------------------
|
35 |
|
36 |
|
37 |
|
38 |
|
39 | volatile unsigned char NrOverflowsTC1 = 0; //gibt die Anzahl der Overflows des 16-bit Timers an
|
40 | //pro Sekunde läuft der 16-bit Timer knapp 2mal über
|
41 | //-->NROverflow läuft nach ca. 134s über
|
42 |
|
43 | volatile unsigned int StartTime = 0; //TCNT1-Wert bei der 1.Low-Flanke speichern
|
44 | volatile unsigned int EndTime = 0; //TCNT1-Wert bei der 2.Low-Flanke speichern
|
45 | volatile unsigned int Pulsdauer = 0;
|
46 |
|
47 | volatile unsigned char Messung_vollstaendig = 0;//JobFlag, das Timer Interrupt 2x vollständig richtig durchlaufen wurde,
|
48 | //hat die Variable den Wert 2, erst dann wird im Hauptprogramm die Drehzahl berechnet werden
|
49 |
|
50 |
|
51 |
|
52 |
|
53 | // ----------------------------------------------------------------------------
|
54 | // globale Variablen des Programms
|
55 | // ----------------------------------------------------------------------------
|
56 |
|
57 |
|
58 |
|
59 |
|
60 | //Timer1 (16-Bit) Capture Interrupt Service Routine
|
61 |
|
62 | ISR( TIMER1_CAPT_vect )
|
63 | {
|
64 |
|
65 | if (TCCR1B & (1<<ICES1)) // ICP - Pin reagiert auf steigende Flanke
|
66 | {
|
67 |
|
68 | StartTime = ICR1; // Timerwert wird in StartTime gesichert
|
69 | TCCR1B &= ~(1 << ICES1 ); // ICP - Pin reagiert auf fallende Flanke
|
70 | TIFR |= (1 << ICF1 ); // Interrupt Flag löschen
|
71 |
|
72 | PORTA |= (1<< PA0) ; // Port A setzen ... Oszi anschluss
|
73 | }
|
74 |
|
75 | else //Interrupt Caputre reagiert fallende Flanke
|
76 | {
|
77 |
|
78 | EndTime = ICR1; //End Wert sicehrn
|
79 | TCCR1B |= ( 1 << ICES1 ); //Schreibt bit für steigende Flanke
|
80 | TIFR |= ( 1 << ICF1 ); /*Nachdem ein Flankenwechsel gesetzt wird, muss das Interrupt Flag von der Software gelöscht werden dies geschieht durch Schreiben einer logischen 1 in das ICF1 Register*/
|
81 |
|
82 | PORTA &= ~(1<< PA0) ; // Port aA Löschen ... Oszi anschluss
|
83 |
|
84 | }
|
85 |
|
86 |
|
87 | }
|
88 |
|
89 |
|
90 | //Timer1 (16-Bit) Overflow Interrupt Service Routine
|
91 |
|
92 |
|
93 | ISR (TIMER1_OVF_vect)
|
94 | {
|
95 | //TIMSK |= (1<<TOV1);
|
96 | NrOverflowsTC1++;
|
97 | }
|
98 |
|
99 |
|
100 | //Hauptprogramm
|
101 | int main()
|
102 | {
|
103 |
|
104 |
|
105 | DDRD = 0x00; //Datenrichtungsregister zunächst alle Eingang
|
106 | DDRA = 0xff; //PA0 als Testausgang
|
107 | PORTD |= (1 << ICP_PIN); //Input Capture Pin als Eingang
|
108 |
|
109 | // ========================================================================
|
110 | // 16-bit Timer1 initialisieren (dient zum zählen der Flankendauer)
|
111 | // ========================================================================
|
112 |
|
113 | //Timer für die Input Capture Funktion, zählt dies Zeiten zwischen zwei steigenden Flanken, Prescaler
|
114 | TCCR1B |= (1 << CS10); // Prescaler 8
|
115 | TCCR1B |=(1<<ICES1); // Interrupt Capture wird zunächst auf fallende Flanke eingestellt
|
116 | TIMSK |= (1<<TICIE1) | (1<<TOIE1); // Aktiviert Input Capture Interrupt und Timer1 Overflow Interrupt
|
117 |
|
118 | //=========================================================================
|
119 | // Sonstiges
|
120 | //=========================================================================
|
121 | sei(); //setzt globales Interrupt enable
|
122 |
|
123 | while(1){
|
124 | // hier soll dann die Frequenz ausgewertet werden
|
125 | }
|
126 |
|
127 | }
|