ICP_Measure.c


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
}