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.