1 | ISR(PCINT0_vect)
|
2 | {
|
3 | uint8_t pinNow = PINB;
|
4 | uint8_t diff = pinNow ^ pinOld;
|
5 |
|
6 | if (diff & (1<<PB0)) //Pin B0 hat ausgelöst
|
7 | intZaehler++; //Die LS wurde durchschnitten
|
8 |
|
9 | if (diff & (1<<PB1)) //oder / UND(!) Pin B1 hat ausgelöst
|
10 | {
|
11 | flDruck++; //Der Drucksensor hat zu einer Flanke geführt
|
12 | }
|
13 | pinOld = pinNow; //Merken der aktuallen Pinlevel, um die nächste Unterscheidung durchzuführen
|
14 | }
|
15 |
|
16 | /*
|
17 | Der Compare Interrupt Handler wird aufgerufen, wenn
|
18 | TCNT0 = OCR0A = 125-1 ist (125 Schritte), d.h. genau alle 1 ms
|
19 | */
|
20 | ISR (TIMER0_COMPA_vect)
|
21 | {
|
22 | millisekunden++;
|
23 | if (millisekunden % 50 == 0)
|
24 | {
|
25 | SwitchA = true;
|
26 | }
|
27 |
|
28 | if(millisekunden == 1000)
|
29 | {
|
30 | sekunde++;
|
31 | millisekunden = 0;
|
32 |
|
33 | /*Flags setzen, um Berechnung zu starten*/
|
34 | blComputeDruck = true;
|
35 | blComputeDZ = true;
|
36 |
|
37 | //Alle 3 Sekunden Abgleich starten
|
38 | /*if (sekunde % 3 == 0)
|
39 | {
|
40 | blCompareSollIst = true;
|
41 | }*/
|
42 |
|
43 | if(sekunde == 60)
|
44 | {
|
45 | minute++;
|
46 | sekunde = 0;
|
47 | }
|
48 | if(minute == 60)
|
49 | {
|
50 | stunde++;
|
51 | minute = 0;
|
52 | }
|
53 | if(stunde == 24)
|
54 | {
|
55 | stunde = 0;
|
56 | }
|
57 | }
|
58 | }
|
59 |
|
60 | int main(void)
|
61 | {
|
62 | dblVsoll = 0;
|
63 |
|
64 | /*Zählerwert, bis zu dem der PWM-Zähler zählt*/
|
65 | ICR1 = 2000; //1 MHz Clock-Time, kein Prescaler, 500 Hz = 2000 Schritte
|
66 |
|
67 | /*Schwelle des Zählerwertes, bei dem der Ausgang geschalten wird*/
|
68 | /*Also auch Stellschraube für das Tastverhältnis*/
|
69 | OCR1A = 0; //Initialisierungswert
|
70 |
|
71 |
|
72 | /*Setzen der nötigen Reister, vgl. Datenblatt 136-189*/
|
73 | /*Hier wird auch bestimmt, ob es sich um eine invertierte oder nicht-invertierte PWM handelt*/
|
74 | TCCR1A = (1 << COM1A1) | (1 << WGM11);
|
75 | TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10);
|
76 |
|
77 | /* Hier Definition der PWM*/
|
78 | DDRB = (1 << PB5); //Ausgangspin in PWM Modus setzen
|
79 | PORTB = (0 << PB5); //Abschalten des PWM-Pins bis zur vollständigen Initialisierung
|
80 |
|
81 | /* Hier Definition der ISR */
|
82 | PCICR |= (1 << PCIE0); //Enable Pin Change Interrupt Pin (0 = PinB0)
|
83 | PCMSK0 |= (1 << PCINT0); //Enable Pin Change Interrupt handling on PinB0
|
84 | PCMSK0 |= (1 << PCINT1); //Enable Pin Change Interrupt handling on PinB1
|
85 |
|
86 |
|
87 | /*Hier wird der Timer-Interrupt definiert*/
|
88 | TCCR0A = (1<<WGM01); //CTC Modus
|
89 | TCCR0B |= (1<<CS01); //Prescaler 8
|
90 | OCR0A = 125-1; //1 MHz ist die interne Clock-Source, ohne dass die Fuses verstellt werden, Wie viele Schritte soll gezählt werden?
|
91 |
|
92 | TIMSK0 |= (1<<OCIE0A); // Compare Interrupt erlauben
|
93 |
|
94 | /*************************************/
|
95 |
|
96 | DDRA = 0xff; /*Port A als Ausgangsport definieren*/
|
97 | DDRC = 0xff; /*Port C als Ausgangsport definieren, um mit LEDs hoch zu zählen*/
|
98 | DDRD = 0x00; /*Port D als Eingangsport definieren*/
|
99 |
|
100 | minDruck = 1000; //für Maximalwertbetrachtung später
|
101 |
|
102 | //Flags mit false initialisieren
|
103 | blCompareSollIst = false;
|
104 | blComputeDruck = false;
|
105 | blComputeDZ = false;
|
106 |
|
107 | intTilgerDZSOLL = 1000;
|
108 |
|
109 | /*Programm-Routine*/
|
110 | while(1)
|
111 | {
|
112 | sei(); //Enable Interrupts
|
113 |
|
114 | /*Drehzahlberechnung durchführen, wenn das entsprechende Flag gesetzt ist*/
|
115 | //Drehzahlbestimmung: Ist-Wert Bestimmung des Tilgers
|
116 | if (blComputeDZ==true)
|
117 | {
|
118 |
|
119 | TilgerDZ = (int)(intZaehler*7.5);
|
120 | intDruckLED = TilgerDZ;
|
121 | intZaehler = 0; //Rücksetzen des Zählers
|
122 | blComputeDZ =false; //Rücksetzen des Flag
|
123 | }
|
124 |
|
125 | /*Berechnung der Frequenz des Drucksensors, wenn das entsprechende Flag gesetzt ist*/
|
126 | if (blComputeDruck == true)
|
127 | {
|
128 | cli(); //Unterdrückung der Interrupts, um die Variablen während der Berechnung nicht zu manipulieren
|
129 | flwatchDruck = flDruck; //Zwischenspeichern in Variable
|
130 | ComputeDruck = flwatchDruck/2; //Doppelte Flankenbewertung in ISR --> /2 für Takt
|
131 | flDruck =0; //Rücksetzen des Zählers
|
132 | sei(); //Interrupts wieder zulassen
|
133 |
|
134 | if (ComputeDruck > 0)
|
135 | {
|
136 |
|
137 | }
|
138 | if (ComputeDruck == 0) }
|
139 | {
|
140 |
|
141 | }
|
142 | //Bestimmung der Extremwerte
|
143 | if (ComputeDruck > maxDruck)
|
144 | {
|
145 | maxDruck = ComputeDruck;
|
146 | }
|
147 | if (ComputeDruck < minDruck)
|
148 | {
|
149 | minDruck = ComputeDruck;
|
150 | }
|
151 | intDruckLED = (int)(ComputeDruck);
|
152 |
|
153 | //Zeit für Berechnungnen neu starten
|
154 | blComputeDruck = false;
|
155 | PORTC = intDruckLED;
|
156 | }
|
157 | //Anpassung der Spannung
|
158 |
|
159 | /* if (blCompareSollIst == true)
|
160 | {
|
161 | if (TilgerDZ < intTilgerDZSOLL)
|
162 | {
|
163 | if (dblVsoll < 4000)
|
164 | {
|
165 | dblVsoll = dblVsoll+50; //Sollspannung um 50 mV erhöhen
|
166 | }
|
167 |
|
168 | dbltein = (((dblVsoll-0.8)/3.28)/dblVaus)*ICR1; //Berechnung der anzulegenden PWM-Einschaltzeit
|
169 | intSchritte = (int)(dbltein); //Rundung auf ganzzahlige Integer zur Bestimmung PWM-Schrittweite
|
170 | OCR1A = intSchritte;
|
171 | }
|
172 | if (TilgerDZ > intTilgerDZSOLL)
|
173 | {
|
174 | if (dblVsoll > 900)
|
175 | {
|
176 | dblVsoll = dblVsoll-100; //Sollspannung um 100 mV verringern
|
177 | }
|
178 |
|
179 | dbltein = (((dblVsoll-0.8)/3.28)/dblVaus)*ICR1; //Berechnung der anzulegenden PWM-Einschaltzeit
|
180 | intSchritte = (int)(dbltein); //Rundung auf ganzzahlige Integer zur Bestimmung PWM-Schrittweite
|
181 | OCR1A = intSchritte;
|
182 | }
|
183 | blCompareSollIst = false; //Flag zurücksetzen
|
184 | }*/
|
185 | if (SwitchA == true)
|
186 | {
|
187 | if (PORTA == 0b10000000)
|
188 | {
|
189 | PORTA = 0b00000000;
|
190 | }
|
191 | else
|
192 | {
|
193 | PORTA = 0b10000000;
|
194 | }
|
195 | SwitchA = false;
|
196 | }
|
197 | }
|
198 | }
|