Target: Sainsmart 2560 Board ich will (ohne bestimmte Zeit) einen 16-bit Timer/Counter herannehmen und steigende (oder fallende) Flanken zahlenmässig damit erfassen! Die Einstellungen für den Timer/Counter hab ich so gewählt-> TCNT3=0; //Preloader auf 0 TCCR3B|=(1<<CS32)|(1<<CS31)|(1<<CS30); //hier steigende Flanke im Datenblatt steht generell -> "External clock source on Tn pin. Clock on falling edge" Tn ist also hier T3....bedeutet dann PE6 oder Pin 8 am Prozessor.... nur ist der lt. PIN Mapping nicht vorgegeben...also müsst ich direkt am 2560er Controller meine Quelle (TTL) anlöten....ist mir zu "heiss" kann man auf eine andere Weise in den TCNT3 reinzählen..... vl GENAUE Vorgangsweise! danke
Rene T. schrieb: > kann man auf eine andere Weise in den TCNT3 reinzählen..... Du hast ja im Datenblatt die Clocking-Options gesehen, die es gibt. Mehr gibt es nicht. Wenn dein µC nicht über hellseherische Fähigkeiten verfügt, wirst du wohl oder übel dir einen Draht an den IC-Pin löten müssen, wenn es da keine Leiterbahn gibt.
Rene T. schrieb: > kann man auf eine andere Weise in den TCNT3 reinzählen..... Nein. Aber der 2560 hat ja noch ein paar Timer mehr. Wenn ich es richtig sehe, ist T5 auf Leitung 47 rausgeführt. mfg.
Dankeschön! wohl oder übel -> löten!! leider ist T5 bereits in Verwendung und ich benötige T1/T3/T4
Rene T. schrieb: > leider ist T5 bereits in Verwendung und ich benötige T1/T3/T4 Und warum nimmst du dafür keinen anderen Timer? mfg.
ich brauche 3 Timer/Counter mit 16bit, wo ich reinzählen kann und mit einem 8-bit Timer lege ich eine Zeit fest, wo dann die TCNTs abgerufen werden!
Wobei sich auch noch die Frage ergibt, wie schnell denn die Pulse sind, die gezählt werden müssen. Wenn das noch moderat ist, kann man das ja auch 'händisch' zählen.
Rene T. schrieb: > ich brauche 3 Timer/Counter mit 16bit, wo ich reinzählen kann > und mit einem 8-bit Timer lege ich eine Zeit fest, wo dann die TCNTs > abgerufen werden! Na gut. Dann musst du wohl den Lötkolben aufheizen. Oder du erzählst, was da genau, wie schnell gezählt werden soll. mfg.
also, die Zählfrequenz ist zwischen 0 und 1500Hz da ich nicht unbedingt das Hauptprogramm ausbremsen will, wollte ich es in "parallel" laufende Timer/Counter ablegen! und ein Interrupt löst in bestimmten Zeitfenstern aus und fragt den Zählerstand der TCNTs ab und setzt sie dann auf 0 zurück die eingelesenen Werte lege ich dann in anderen Variablen ab und mach was damit !
Rene T. schrieb: > also, die Zählfrequenz ist zwischen 0 und 1500Hz Gähn. Das macht dein µC mit links nebenher. > da ich nicht unbedingt das Hauptprogramm ausbremsen will Na na. VOn ausbremsen kann keine Rede sein. VOn digitalread sollte man vielleicht Abstand nehmen, dann lässt sich das in ein paar Taktzyklen erledigen.
1 | loop() |
2 | {
|
3 | now = digitalRead( Pin ); |
4 | |
5 | if( last != now ) { |
6 | if( now == HIGH ) |
7 | counter++; |
8 | last = now |
9 | }
|
10 | |
11 | ....
|
wieviele Zähler sollten es noch mal sein? 10, 50, 100? Bei 500 könnte es dann schon ein wenig eng werden.
Rene T. schrieb: > also, die Zählfrequenz ist zwischen 0 und 1500Hz Das geht bequem mit einem externen Interrupt (hatte ich ja schonmal gesagt). Wobei 0Hz unmöglich ist, setze eine sinnvolle untere Grenze fest. Warum machst Du ständig einen neuen Thread auf?
Peter Dannegger schrieb: > Warum machst Du ständig einen neuen Thread auf? ..und das stört Dich? Tip: Antworte nicht erneut darauf, denn Zitat: >"Das geht bequem mit einem externen Interrupt (hatte ich ja schonmal >gesagt)."
Karl Heinz schrieb: > Rene T. schrieb: >> also, die Zählfrequenz ist zwischen 0 und 1500Hz > > Gähn. > Das macht dein µC mit links nebenher. > >> da ich nicht unbedingt das Hauptprogramm ausbremsen will > > Na na. > VOn ausbremsen kann keine Rede sein. VOn digitalread sollte man > vielleicht Abstand nehmen, dann lässt sich das in ein paar Taktzyklen > erledigen.loop() > { > now = digitalRead( Pin ); > > if( last != now ) { > if( now == HIGH ) > counter++; > last = now > } > > .... > > wieviele Zähler sollten es noch mal sein? 10, 50, 100? Bei 500 könnte es > dann schon ein wenig eng werden. ok...da ich so etwas schon gehabt habe und das nicht sooooo toll funktioniert, dachte ich an ein Reinzählen in einen Timer/Counter! ich probier den Kot...äh Code natürlich nochmal aus...denn es hat sich was geändert!
SO! wieder bissl rumgespielt....aber funktioniert immer noch nicht! Frage: der Compiler gibt keinen Fehler aus, aber ich mische da etwas die Syntax von ATMEL Studio mit rein in die Arduino-Software bei der ISR-Definition...vl ein Grund, dass es "ignoriert" wird?! z.B. zuerst cli(); dann Register setzen für einen internen Interrupt sei(); danach externen Interrupt einschalten attachInterrupt(Nr ,machwas ,FALLING); dann ganz unten mach ich einfach die void machwas() für den Interrupt ich habe eine ISR, die alle 0,01s bei OVF auslöst, nach 10 dieser ISR wird eine Bedingung erfüllt und dann werden die "Counts" der void machwas() in eine andere Variable schreibt und die "alten" Countvariablen auf 0 setzt! in der Loop frag ich lediglich ab, welche Infopage am Display angezeigt werden soll und setz in eine Zeile diesen Wert ein... in Betrieb allerdings kommt NIX von dem Wert!! selbst mein Lehrer ist der Meinung, dass der Code so funktionieren sollte! ...und nach wie vor geht es um das Frequenz zählen von 3 TTL-Signalen (Radumdrehungen), die zwischen 0 und 1500Hz sein können, aber sagen wir mal 50Hz ist Startwert..drunter nicht nötig!
Bist du wirklich der Meinung, dass mit diesem Text irgendjemand etwas anfangen kann? Poste dein ganzes Programm, wenn dir jemand helfen soll. mfg.
//Bibliotheken #include <Servo.h> #include <LiquidCrystal.h> //Display-Ansteuerung LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //7=RS, 6=EN, 5=D4, 4=D5, 3=D6, 2=D7 //GLOBALE VARIABLEN (Eingänge-Ausgang) const int poti=A8; //PWM ~30-150, abhängig vom Drehwinkel const int stear=A9; //nicht benutzt const int engine_temp=A10; const int g_x=A11; //3-Achs-Beschleunigungsmessung Analog 0,5V/g const int g_y=A12; const int g_z=A13; const int brake=22; //Bremstaster Öffner const int switch_AS=24; //Taster für Display Infopage Switchen const int switch_BS=26; //zum Deaktivieren des Programms const int switch_UP=28; //Programmwirksamkeit erhöhen const int switch_DN=30; //Programmwirksamkeit senken unsigned int sensor_wheel_l_f=20; //ABS-Sensorsignal vorne links unsigned int sensor_wheel_r_f=18; //ABS-Sensorsignal vorne rechts unsigned int sensor_rear_axle=19; //ABS-Sensorsignal Hinterachse //Initialisieren der Schaltzustände der Eingänge int brake_state=0; //Merker für Bremstaster int switch_AS_state=0; //Merker für Taste AS int switch_BS_state=0; //Merker für Taste BS unsigned int throttle_value=0; int sensorMin=1023; int sensorMax=0; Servo myservo; // Gasservo heisst "myservo" int pos = 0; // Servo Position int x=0; float value_g_x=0; //Kraftsensor-Variablen float value_g_y=0; float value_g_z=0; volatile unsigned int Measure_l_f_result=0; volatile unsigned int Measure_r_f_result=0; volatile unsigned int Measure_rear_result=0; volatile unsigned int count_result_l_f; //Zählervariable, die im Interrupt verwendet wird (für links vorn) volatile unsigned int count_result_r_f; volatile unsigned int count_result_rear; volatile int measure=0; //verwendet als Multiplikator in der Interrupt Service Routine void setup() { delay (20); //Definieren der Pins als Ein- oder Ausgänge pinMode (brake, INPUT); // Alternativ kann statt "brake" auch der Eingang geschrieben werden -> hier "22" pinMode (switch_AS, INPUT); pinMode (switch_BS, INPUT); pinMode (switch_UP, INPUT); pinMode (switch_DN, INPUT); pinMode (sensor_wheel_l_f, INPUT); pinMode (sensor_wheel_r_f, INPUT); pinMode (sensor_rear_axle, INPUT); cli(); //alle globalen Interrupts ausschalten TCCR0A=0; //Timer 0 für Setzen der Ausleseperiode (8 bit) TCCR0B=0; TCNT0=99 ; //Match-Wert einsetzen für exakt 0,01sec-Interruptauslösung TCCR0B|=(1<<CS01)|(1<<CS00); //Prescaler auf 1/64 gestellt TIMSK0|=(1<<TOIE0); //Auslösen bei Overflow sei(); //Globale Interrupts einschalten attachInterrupt(1,Zaehler_li_vo,FALLING); //DIGITAL PIN 20 (int.3?) attachInterrupt(3,Zaehler_re_vo,FALLING); //DIGITAL PIN 18 (int.4?) attachInterrupt(2,Zaehler_hinten,FALLING); //DIGITAL PIN 19 (int.5?) myservo.attach(11); //Anschluß Gasservo auf PIN11 lcd.begin(20,4); //Display initialisieren ---> 16 Zeichen, 2 Zeilen...."2" steht für die OBERE Zeile lcd.setCursor(0,0); lcd.print(" rt-fidelity"); //ohne Zuweisung automatisch Beginn links oben lcd.setCursor(0,1); lcd.print(" initiate..."); delay(350); lcd.setCursor(0,3); lcd.print("calibrate gas-pedal"); pinMode (13, OUTPUT); //On-Board-LED während Einmessung EIN digitalWrite (13, HIGH); while (millis()<4000) //4sec lang werden Werte vom Gaspoti (10-bit analog) ausgelesen und in eine 8-bit Map (PWM)geschrieben { throttle_value=analogRead(poti); if(throttle_value>sensorMax) {sensorMax=throttle_value;} if (throttle_value<sensorMin) {sensorMin=throttle_value;} } lcd.setCursor(0,3); lcd.print(" done "); delay(350); digitalWrite(13,LOW); //Status-LED aus !!! lcd.clear(); // 1.Infopage in der Initialisierung lcd.setCursor(1,0); lcd.print("speed:"); lcd.setCursor(16,0); lcd.print("km/h"); lcd.setCursor(1,1); lcd.print("thr."); lcd.setCursor(16,1); lcd.print("PWM"); lcd.setCursor(1,2); lcd.print("brakes:"); lcd.setCursor(1,3); lcd.print("ETC-On count:"); } void loop() { value_g_x=((analogRead(g_x)-164.0)/50.0); //Umrechnung und Nullung der Kraftsensorachsen (500mV/g...max. 3g) value_g_y=((analogRead(g_y)-164.0)/50.0); value_g_z=((analogRead(g_z)-172.0)/50.0); throttle_value=analogRead(poti); //Einlesen des Aktualwertes vom Gaspoti brake_state=digitalRead(brake); //Einlesen vom Bremstaster throttle_value=map(throttle_value, sensorMin, sensorMax,150,30); //PWM mit Futaba 9350 Servo (Digital) zwischen 30 und 150...ggf. korrigieren oder umdrehen myservo.write(throttle_value); if (digitalRead(switch_AS)==LOW) //Aktionen für Tastendruck auf Taste AS { switch_AS_state++; lcd.clear();delay(50); } switch(switch_AS_state%3) {case 1: Display_B();break; case 0: Display_A();break; case 2: Display_C();break;} if (digitalRead(switch_BS)==LOW) //Aktionen für Tastendruck auf Taste BS { switch_BS_state++; } switch(switch_BS_state%2) //Aktionen (UNVOLLSTÄNDIG) für Tastendruck auf Taste BS - Soll System ausser Kraft setzen { case 1: if (switch_AS_state%2==1){lcd.setCursor(1,5); lcd.print("SYSTEM OFF");} ;break; case 0: if (switch_AS_state%2==1){lcd.setCursor(1,3); lcd.print("ETC-on count:");} ;break; } } void Display_A() // 1.Infopage { lcd.setCursor(1,0); lcd.print("speed"); lcd.setCursor(16,0); lcd.print("km/h"); lcd.setCursor(1,1); lcd.print("thr."); x=throttle_value; if (x<100) {lcd.setCursor(9,1);lcd.print("0"); lcd.setCursor(10,1); lcd.print(x);} if (x>100) {lcd.setCursor(9,1);lcd.print(x);} lcd.setCursor(16,1); lcd.print("PWM"); lcd.setCursor(1,2); lcd.print("brakes:"); if (brake_state==LOW) // Bremstaster Abfrage (wichtig für Betrieb) { lcd.setCursor(10,2); lcd.print("ON"); } else { lcd.setCursor(10,2); lcd.print(" "); } lcd.setCursor(1,3); lcd.print("ETC-On count:"); } void Display_B() // 2.Infopage { lcd.setCursor(1,0); lcd.print(" G-Force "); lcd.setCursor(1,1); lcd.print("g-x:"); lcd.setCursor(10,1); lcd.print(value_g_x); lcd.setCursor(1,2); lcd.print("g-y:"); lcd.setCursor(10,2); lcd.print(value_g_y); lcd.setCursor(1,3); lcd.print("g-z:"); lcd.setCursor(10,3); lcd.print(value_g_z); } void Display_C() // 3.Infopage { lcd.setCursor(1,0); lcd.print(" wheel-frequency: "); lcd.setCursor(1,1); lcd.print("f <-:"); lcd.setCursor(11,1);lcd.print(Measure_l_f_result); lcd.setCursor(1,2); lcd.print("f ->:"); lcd.setCursor(11,1);lcd.print(Measure_r_f_result); lcd.setCursor(1,3); lcd.print("rear:"); lcd.setCursor(11,1);lcd.print(Measure_rear_result); } ISR(TIMER0_OFV_vect) //mache alle 0,01sec Interrupt, geht aber erst nach 10Interrupts=0,1sec in die if-Bedingungen, um counts zu liefern! { TCNT0=99; //Preload-Wert erneut setzen measure++; //Multiplikator für Zeit erhöhen if(measure==10) { Measure_l_f_result=count_result_l_f; count_result_l_f=0; Measure_r_f_result=count_result_r_f; count_result_r_f=0; Measure_rear_result=count_result_rear; count_result_rear=0; measure=0; } } void Zaehler_li_vo() { count_result_l_f++; } void Zaehler_re_vo() { count_result_r_f++; } void Zaehler_hinten() { count_result_rear++; }
Bitte die Code-Umgebung nutzen!
1 | //Bibliotheken
|
2 | #include <Servo.h> |
3 | #include <LiquidCrystal.h> |
4 | |
5 | //Display-Ansteuerung
|
6 | LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //7=RS, |
7 | 6=EN, 5=D4, 4=D5, 3=D6, 2=D7 |
8 | |
9 | //GLOBALE VARIABLEN (Eingänge-Ausgang)
|
10 | |
11 | const int poti=A8; //PWM |
12 | ~30-150, abhängig vom Drehwinkel |
13 | const int stear=A9; //nicht |
14 | benutzt
|
15 | const int engine_temp=A10; |
16 | |
17 | const int g_x=A11; |
18 | //3-Achs-Beschleunigungsmessung Analog 0,5V/g
|
19 | const int g_y=A12; |
20 | const int g_z=A13; |
21 | |
22 | const int brake=22; |
23 | //Bremstaster Öffner
|
24 | const int switch_AS=24; //Taster für |
25 | Display Infopage Switchen |
26 | const int switch_BS=26; //zum |
27 | Deaktivieren des Programms |
28 | const int switch_UP=28; |
29 | //Programmwirksamkeit erhöhen
|
30 | const int switch_DN=30; |
31 | //Programmwirksamkeit senken
|
32 | |
33 | unsigned int sensor_wheel_l_f=20; |
34 | //ABS-Sensorsignal vorne links
|
35 | unsigned int sensor_wheel_r_f=18; |
36 | //ABS-Sensorsignal vorne rechts
|
37 | unsigned int sensor_rear_axle=19; |
38 | //ABS-Sensorsignal Hinterachse
|
39 | |
40 | //Initialisieren der Schaltzustände der Eingänge
|
41 | int brake_state=0; //Merker für |
42 | Bremstaster
|
43 | int switch_AS_state=0; //Merker für |
44 | Taste AS |
45 | int switch_BS_state=0; //Merker für |
46 | Taste BS |
47 | |
48 | unsigned int throttle_value=0; |
49 | int sensorMin=1023; |
50 | int sensorMax=0; |
51 | Servo myservo; // Gasservo |
52 | heisst "myservo" |
53 | int pos = 0; // Servo |
54 | Position
|
55 | int x=0; |
56 | |
57 | float value_g_x=0; |
58 | //Kraftsensor-Variablen
|
59 | float value_g_y=0; |
60 | float value_g_z=0; |
61 | |
62 | volatile unsigned int Measure_l_f_result=0; |
63 | volatile unsigned int Measure_r_f_result=0; |
64 | volatile unsigned int Measure_rear_result=0; |
65 | |
66 | volatile unsigned int count_result_l_f; |
67 | //Zählervariable, die im Interrupt verwendet wird (für links vorn)
|
68 | volatile unsigned int count_result_r_f; |
69 | volatile unsigned int count_result_rear; |
70 | |
71 | volatile int measure=0; //verwendet |
72 | als Multiplikator in der Interrupt Service Routine |
73 | |
74 | void setup() |
75 | {
|
76 | delay (20); |
77 | |
78 | //Definieren der Pins als Ein- oder Ausgänge
|
79 | pinMode (brake, INPUT); // |
80 | Alternativ kann statt "brake" auch der Eingang geschrieben werden -> |
81 | hier "22" |
82 | pinMode (switch_AS, INPUT); |
83 | pinMode (switch_BS, INPUT); |
84 | pinMode (switch_UP, INPUT); |
85 | pinMode (switch_DN, INPUT); |
86 | |
87 | pinMode (sensor_wheel_l_f, INPUT); |
88 | pinMode (sensor_wheel_r_f, INPUT); |
89 | pinMode (sensor_rear_axle, INPUT); |
90 | |
91 | cli(); //alle |
92 | globalen Interrupts ausschalten |
93 | |
94 | TCCR0A=0; //Timer 0 |
95 | für Setzen der Ausleseperiode (8 bit) |
96 | TCCR0B=0; |
97 | TCNT0=99 ; |
98 | //Match-Wert einsetzen für exakt 0,01sec-Interruptauslösung
|
99 | TCCR0B|=(1<<CS01)|(1<<CS00); //Prescaler |
100 | auf 1/64 gestellt |
101 | TIMSK0|=(1<<TOIE0); //Auslösen |
102 | bei Overflow |
103 | |
104 | sei(); //Globale |
105 | Interrupts einschalten |
106 | |
107 | attachInterrupt(1,Zaehler_li_vo,FALLING); //DIGITAL |
108 | PIN 20 (int.3?) |
109 | attachInterrupt(3,Zaehler_re_vo,FALLING); //DIGITAL |
110 | PIN 18 (int.4?) |
111 | attachInterrupt(2,Zaehler_hinten,FALLING); //DIGITAL |
112 | PIN 19 (int.5?) |
113 | |
114 | myservo.attach(11); //Anschluß |
115 | Gasservo auf PIN11 |
116 | |
117 | |
118 | |
119 | lcd.begin(20,4); //Display |
120 | initialisieren ---> 16 Zeichen, 2 Zeilen...."2" steht für die OBERE |
121 | Zeile
|
122 | lcd.setCursor(0,0); |
123 | lcd.print(" rt-fidelity"); //ohne |
124 | Zuweisung automatisch Beginn links oben |
125 | lcd.setCursor(0,1); |
126 | lcd.print(" initiate..."); |
127 | delay(350); |
128 | lcd.setCursor(0,3); |
129 | lcd.print("calibrate gas-pedal"); |
130 | |
131 | |
132 | pinMode (13, OUTPUT); |
133 | //On-Board-LED während Einmessung EIN
|
134 | digitalWrite (13, HIGH); |
135 | while (millis()<4000) //4sec lang |
136 | werden Werte vom Gaspoti (10-bit analog) ausgelesen und in eine 8-bit |
137 | Map (PWM)geschrieben |
138 | {
|
139 | throttle_value=analogRead(poti); |
140 | if(throttle_value>sensorMax) |
141 | {sensorMax=throttle_value;} |
142 | if (throttle_value<sensorMin) |
143 | {sensorMin=throttle_value;} |
144 | }
|
145 | |
146 | lcd.setCursor(0,3); |
147 | lcd.print(" done "); |
148 | delay(350); |
149 | digitalWrite(13,LOW); //Status-LED |
150 | aus !!! |
151 | |
152 | lcd.clear(); // |
153 | 1.Infopage in der Initialisierung |
154 | lcd.setCursor(1,0); |
155 | lcd.print("speed:"); |
156 | lcd.setCursor(16,0); |
157 | lcd.print("km/h"); |
158 | lcd.setCursor(1,1); |
159 | lcd.print("thr."); |
160 | lcd.setCursor(16,1); |
161 | lcd.print("PWM"); |
162 | lcd.setCursor(1,2); |
163 | lcd.print("brakes:"); |
164 | lcd.setCursor(1,3); |
165 | lcd.print("ETC-On count:"); |
166 | }
|
167 | |
168 | |
169 | |
170 | void loop() |
171 | {
|
172 | |
173 | value_g_x=((analogRead(g_x)-164.0)/50.0); |
174 | //Umrechnung und Nullung der Kraftsensorachsen (500mV/g...max. 3g)
|
175 | value_g_y=((analogRead(g_y)-164.0)/50.0); |
176 | value_g_z=((analogRead(g_z)-172.0)/50.0); |
177 | |
178 | |
179 | throttle_value=analogRead(poti); |
180 | //Einlesen des Aktualwertes vom Gaspoti
|
181 | brake_state=digitalRead(brake); |
182 | //Einlesen vom Bremstaster
|
183 | |
184 | throttle_value=map(throttle_value, sensorMin, sensorMax,150,30); |
185 | //PWM mit Futaba 9350 Servo (Digital) zwischen 30 und 150...ggf.
|
186 | korrigieren oder umdrehen |
187 | myservo.write(throttle_value); |
188 | |
189 | if (digitalRead(switch_AS)==LOW) |
190 | //Aktionen für Tastendruck auf Taste AS
|
191 | {
|
192 | switch_AS_state++; |
193 | lcd.clear();delay(50); |
194 | }
|
195 | |
196 | switch(switch_AS_state%3) |
197 | {case 1: Display_B();break; |
198 | case 0: Display_A();break; |
199 | case 2: Display_C();break;} |
200 | |
201 | if (digitalRead(switch_BS)==LOW) |
202 | //Aktionen für Tastendruck auf Taste BS
|
203 | {
|
204 | switch_BS_state++; |
205 | }
|
206 | |
207 | switch(switch_BS_state%2) |
208 | //Aktionen (UNVOLLSTÄNDIG) für Tastendruck auf Taste BS - Soll System
|
209 | ausser Kraft setzen |
210 | {
|
211 | case 1: if (switch_AS_state%2==1){lcd.setCursor(1,5); |
212 | lcd.print("SYSTEM OFF");} ;break; |
213 | case 0: if (switch_AS_state%2==1){lcd.setCursor(1,3); |
214 | lcd.print("ETC-on count:");} ;break; |
215 | }
|
216 | |
217 | }
|
218 | void Display_A() |
219 | // 1.Infopage
|
220 | {
|
221 | |
222 | lcd.setCursor(1,0); |
223 | lcd.print("speed"); |
224 | lcd.setCursor(16,0); |
225 | lcd.print("km/h"); |
226 | |
227 | |
228 | |
229 | lcd.setCursor(1,1); |
230 | lcd.print("thr."); |
231 | x=throttle_value; |
232 | if (x<100) |
233 | {lcd.setCursor(9,1);lcd.print("0"); |
234 | lcd.setCursor(10,1); |
235 | lcd.print(x);} |
236 | if (x>100) |
237 | {lcd.setCursor(9,1);lcd.print(x);} |
238 | lcd.setCursor(16,1); |
239 | lcd.print("PWM"); |
240 | lcd.setCursor(1,2); |
241 | lcd.print("brakes:"); |
242 | if (brake_state==LOW) |
243 | // Bremstaster Abfrage (wichtig für Betrieb)
|
244 | {
|
245 | lcd.setCursor(10,2); |
246 | lcd.print("ON"); |
247 | }
|
248 | else
|
249 | {
|
250 | lcd.setCursor(10,2); |
251 | lcd.print(" "); |
252 | }
|
253 | lcd.setCursor(1,3); |
254 | lcd.print("ETC-On count:"); |
255 | }
|
256 | |
257 | |
258 | void Display_B() |
259 | // 2.Infopage
|
260 | {
|
261 | |
262 | lcd.setCursor(1,0); |
263 | lcd.print(" G-Force "); |
264 | lcd.setCursor(1,1); |
265 | lcd.print("g-x:"); |
266 | lcd.setCursor(10,1); lcd.print(value_g_x); |
267 | lcd.setCursor(1,2); |
268 | lcd.print("g-y:"); |
269 | lcd.setCursor(10,2); lcd.print(value_g_y); |
270 | lcd.setCursor(1,3); |
271 | lcd.print("g-z:"); |
272 | lcd.setCursor(10,3); lcd.print(value_g_z); |
273 | }
|
274 | |
275 | void Display_C() // |
276 | 3.Infopage |
277 | {
|
278 | lcd.setCursor(1,0); |
279 | lcd.print(" wheel-frequency: "); |
280 | lcd.setCursor(1,1); |
281 | lcd.print("f <-:"); |
282 | lcd.setCursor(11,1);lcd.print(Measure_l_f_result); |
283 | lcd.setCursor(1,2); |
284 | lcd.print("f ->:"); |
285 | lcd.setCursor(11,1);lcd.print(Measure_r_f_result); |
286 | lcd.setCursor(1,3); |
287 | lcd.print("rear:"); |
288 | lcd.setCursor(11,1);lcd.print(Measure_rear_result); |
289 | |
290 | }
|
291 | |
292 | ISR(TIMER0_OFV_vect) |
293 | //mache alle 0,01sec Interrupt, geht aber erst nach 10Interrupts=0,1sec
|
294 | in die if-Bedingungen, um counts zu liefern! |
295 | {
|
296 | TCNT0=99; |
297 | //Preload-Wert erneut setzen
|
298 | measure++; |
299 | //Multiplikator für Zeit erhöhen
|
300 | |
301 | if(measure==10) |
302 | {
|
303 | Measure_l_f_result=count_result_l_f; |
304 | count_result_l_f=0; |
305 | |
306 | Measure_r_f_result=count_result_r_f; |
307 | count_result_r_f=0; |
308 | |
309 | Measure_rear_result=count_result_rear; |
310 | count_result_rear=0; |
311 | |
312 | measure=0; |
313 | }
|
314 | }
|
315 | |
316 | void Zaehler_li_vo() |
317 | {
|
318 | count_result_l_f++; |
319 | }
|
320 | |
321 | void Zaehler_re_vo() |
322 | {
|
323 | count_result_r_f++; |
324 | }
|
325 | |
326 | void Zaehler_hinten() |
327 | {
|
328 | count_result_rear++; |
329 | }
|
Gruß Max
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.