Forum: Mikrocontroller und Digitale Elektronik Timer/Counter Eingang am Board


von Rene T. (hifi-freak)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Rene T. (hifi-freak)


Lesenswert?

Dankeschön!

wohl oder übel -> löten!!

leider ist T5 bereits in Verwendung und ich benötige T1/T3/T4

von Thomas E. (thomase)


Lesenswert?

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.

von Rene T. (hifi-freak)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Rene T. (hifi-freak)


Lesenswert?

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 !

von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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?

von Unter die Nase Reibender (Gast)


Lesenswert?

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)."

von Rene T. (Gast)


Lesenswert?

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!

von Rene T. (hifi-freak)


Lesenswert?

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!

von Thomas E. (thomase)


Lesenswert?

Bist du wirklich der Meinung, dass mit diesem Text irgendjemand etwas 
anfangen kann? Poste dein ganzes Programm, wenn dir jemand helfen soll.

mfg.

von Rene T. (hifi-freak)


Lesenswert?

//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++;
  }

von Max B. (theeye)


Lesenswert?

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
Noch kein Account? Hier anmelden.