1 | volatile unsigned int AN0; // 0 -> 65535
|
2 | volatile unsigned char AN0_offset = 185; // 0 -> 255 Offset wert immer nur minimal wert nehmen
|
3 | volatile unsigned int AN0_max = 876; // 0 -> 65535
|
4 | volatile unsigned short ERG; // 0 -> 65535 ANO entspricht DC
|
5 |
|
6 | volatile unsigned int DC_max = 1010; // 0 -> 65535
|
7 | volatile unsigned int DC_alt = 0; // 0 -> 65535
|
8 | volatile unsigned int DC_act = 0; // 0 -> 65535
|
9 | volatile unsigned char DC_speed = 20; // 0 -> 255
|
10 |
|
11 | volatile unsigned int SW_Z = 0; // 0 -> 65535 Zähler Intervall
|
12 | volatile unsigned int SW_Intervall = 290; // 0 -> 65535 Intervallwert 1/5000* Wert = Intervall
|
13 |
|
14 | volatile unsigned char Gas = 0; // 0 -> 255
|
15 |
|
16 | volatile unsigned float AN0_DC; // Kommazahl Umrechnung ANO zu Duty cycle
|
17 |
|
18 |
|
19 | //-----------------------------------------------------------------------------------------------------------------//
|
20 |
|
21 |
|
22 | LCD_ON = 1;
|
23 |
|
24 | Delay10KTCYx(100); // 0,2 s delay
|
25 |
|
26 | OpenXLCD(FOUR_BIT & LINES_5X7 );
|
27 | while( BusyXLCD() ) { }
|
28 |
|
29 | SetDDRamAddr((unsigned char) 0); // 1. Zeile im Display
|
30 |
|
31 | putrsXLCD(( char*)"Willkommen NIC");
|
32 |
|
33 | SetDDRamAddr((unsigned char) 40); // 2. Zeile im Display
|
34 |
|
35 | putrsXLCD(( char*)"E-Kart Version 1");
|
36 |
|
37 |
|
38 | Delay10KTCYx(250); // 0,5 s delay
|
39 |
|
40 |
|
41 | AN0_DC = (float) 1024/ (AN0_max - AN0_offset); //Schrittweite berechnen DC entspricht AN0
|
42 |
|
43 |
|
44 |
|
45 | while (1)
|
46 | {
|
47 |
|
48 | ClrWdt() // clear Watchdog
|
49 |
|
50 |
|
51 | SetChanADC( ADC_CH0); // Gaspedal Auswertung
|
52 | ConvertADC();
|
53 | while( BusyADC() ){}
|
54 | AN0 = ReadADC();
|
55 |
|
56 | if (AN0 == AN0_offset) // Nullrechnung vermeiden
|
57 | {
|
58 | ERG = (float)AN0_DC * (AN0 - AN0_offset + 3);
|
59 | }
|
60 | else
|
61 | {
|
62 | ERG = (float)AN0_DC * (AN0 - AN0_offset);
|
63 | }
|
64 |
|
65 |
|
66 |
|
67 | strcpypgm2ram(LCDdata1, " ");
|
68 | LCDdata1[0] = AN0 /1000+'0'; // Tausenderstelle
|
69 | LCDdata1[1] = (AN0 % 1000) / 100 + '0'; // Hunderterstelle
|
70 | LCDdata1[2] = (AN0 % 100) / 10 + '0'; // Zehnerstelle
|
71 | LCDdata1[3] = AN0 % 10 + '0'; // Einnerstelle
|
72 |
|
73 | // LED = !LED; // blinkt trotzdem bei Fehler
|
74 |
|
75 | LCDdata1[5] = DC_act /1000+'0'; // Tausenderstelle
|
76 | LCDdata1[6] = (DC_act % 1000) / 100 + '0'; // Hunderterstelle
|
77 | LCDdata1[7] = (DC_act % 100) / 10 + '0'; // Zehnerstelle
|
78 | LCDdata1[8] = DC_act % 10 + '0'; // Einnerstelle
|
79 |
|
80 | LCDdata1[11] = ERG /1000+'0'; // Tausenderstelle
|
81 | LCDdata1[12] = (ERG % 1000) / 100 + '0'; // Hunderterstelle
|
82 | LCDdata1[13] = (ERG % 100) / 10 + '0'; // Zehnerstelle
|
83 | LCDdata1[14] = ERG % 10 + '0'; // Einnerstelle
|
84 |
|
85 |
|
86 |
|
87 |
|
88 |
|
89 |
|
90 |
|
91 | SetDDRamAddr((unsigned char) 0); // 1. Zeile im Display
|
92 | putsXLCD( LCDdata1);
|
93 |
|
94 | LED = !LED; // blinkt trotzdem bei Fehler
|
95 |
|
96 | SetDDRamAddr((unsigned char) 40); // 2. Zeile im Display
|
97 | putrsXLCD(( char*)"AN0 Speed ERG ");
|
98 |
|
99 |
|
100 | }
|
101 |
|
102 | }
|
103 |
|
104 |
|
105 | //--------------------------------------------------------------------------------------------------------//
|
106 | // High priority interrupt vector
|
107 | #pragma code InterruptVectorHigh = 0x08
|
108 | void
|
109 | InterruptVectorHigh (void)
|
110 | {
|
111 | _asm
|
112 | goto InterruptHandlerHigh //jump to interrupt routine
|
113 | _endasm
|
114 | }
|
115 | //--------------------------------------------------------------------------------------------------------//
|
116 | // High priority interrupt routine 1 Hz
|
117 | #pragma code
|
118 | #pragma interrupt InterruptHandlerHigh
|
119 |
|
120 |
|
121 | void
|
122 | InterruptHandlerHigh ()
|
123 | {
|
124 |
|
125 | if (INTCONbits.TMR0IF) // Timer 0
|
126 |
|
127 | {
|
128 | INTCONbits.TMR0IF = 0; //clear interrupt flag
|
129 | INTCONbits.GIEH = 0; //disable interrupts
|
130 | // LED = !LED;
|
131 | WriteTimer0(26475); // war 80 , bei 3 h 2 sek zu schnell
|
132 | INTCONbits.GIEH = 1; //enable interrupts
|
133 |
|
134 | }
|
135 | }
|
136 |
|
137 |
|
138 | //--------------------------------------------------------------------------------------------------------//
|
139 | // Low priority interrupt vector
|
140 | #pragma code InterruptVectorLow = 0x18
|
141 | void
|
142 | InterruptVectorLow (void)
|
143 | {
|
144 | _asm
|
145 | goto InterruptHandlerLow //jump to interrupt routine
|
146 | _endasm
|
147 | }
|
148 | //--------------------------------------------------------------------------------------------------------//
|
149 | // Low priority interrupt routine
|
150 | #pragma code
|
151 | #pragma interrupt InterruptHandlerLow
|
152 |
|
153 |
|
154 | void
|
155 | InterruptHandlerLow ()
|
156 | {
|
157 |
|
158 | if (PIR1bits.TMR1IF)
|
159 | {
|
160 | PIR1bits.TMR1IF = 0; //clear interrupt flag Timer 1
|
161 | }
|
162 |
|
163 | if (PIR1bits.TMR2IF) //Timer 2 Interrupt 5 kHz aller 0,2 ms (200µs)
|
164 | {
|
165 | INTCONbits.GIEH = 0; //disable interrupts
|
166 | PIR1bits.TMR2IF = 0; //clear interrupt flag
|
167 | SW_Z ++;
|
168 |
|
169 |
|
170 | if (SW_Z == SW_Intervall)
|
171 | {
|
172 | SW_Z = 0; // Zähler zurück setzen
|
173 |
|
174 | // LED = !LED;
|
175 |
|
176 | if(ERG < 10) //kleiner
|
177 | {
|
178 | DC_act = 0;
|
179 | Gas =0;
|
180 | }
|
181 |
|
182 | if(ERG >= 10) //größer gleich
|
183 | {
|
184 | if( Gas == 0)
|
185 | {
|
186 | DC_act = 10;
|
187 | Gas =1;
|
188 | }
|
189 | else
|
190 | {
|
191 | DC_alt = DC_act;
|
192 | DC_act = (int) DC_alt + DC_speed;
|
193 | if(DC_act >= DC_max )
|
194 | {
|
195 | DC_act = DC_max;
|
196 | }
|
197 | }
|
198 | if (ERG < DC_act)
|
199 | {
|
200 | DC_act = ERG;
|
201 | }
|
202 |
|
203 | }
|
204 |
|
205 | SetDCPWM1(DC_act);
|
206 |
|
207 | }
|
208 |
|
209 |
|
210 |
|
211 |
|
212 |
|
213 |
|
214 |
|
215 | INTCONbits.GIEH = 1; //enable interrupts
|
216 | }
|
217 |
|
218 |
|
219 |
|
220 |
|
221 | if (INTCON3bits.INT1IF)
|
222 | {
|
223 | INTCON3bits.INT1IF = 0; //clear interrupt flag int_solar_dach
|
224 | }
|
225 |
|
226 |
|
227 |
|
228 | if (INTCON3bits.INT2IF)
|
229 | {
|
230 | INTCON3bits.INT2IF = 0; //clear interrupt flag int_puffer_wt
|
231 | }
|
232 |
|
233 | }
|