Forum: Compiler & IDEs Zeit zwischen Tastendrücken messen


von Philipp H. (phil_phil)


Lesenswert?

Hallo Freunde,

ich habe mal eine Frage zu folgendem Thema.

Ich möchte kontinuierlich(!) die Zeit zwischen Zwei Tastendrücken 
messen.

Jeder Tastendruck ist durch das Entprellmakro von Peter Dannegger 
entprellt.

Meine Überlegung ist jetzt wie ich das Programm aufbaue. Bisher hab ich 
mir folgendes überlegt:

In der main wird der Tastendruck abgefragt und entprellt. In einer ISR 
befindet sich ein Zähler, der zyklisch inkrementiert wird und beim 
zweiten Tastendruck die Zeit in ms berechnet.
1
uint8_t z1=0, z2=0;
2
3
main(){
4
while(1){
5
 if (debounce(x,y)){
6
 zeit = z2 * 8ms; //zähler z2 wird alle 8ms in ISR inkrementiert
7
 zähler = 0;
8
 }
9
}
10
11
}
12
ISR (OVF Timer1){ // alle 8E6/256
13
if(z1==255) z2++; // z1 ist der zähler 1
14
z1++
15
}

Ein Problem dass ich noch sehe ist die Initialmessung, die ich jetzt 
über nen flag starten lassen würde (sonst würde ja vor dem ersten 
Tastendruck der Zähler trotzdem inkrementiert werden und die Zeit 
zwischen nulltem und erstem Tastendruck gemessen werden).

Kann man das so machen?

Gibt es vielleicht allgemein Verbesserungsvorschläge?

Dankeeeee

von Philipp H. (phil_phil)


Lesenswert?

Habs jetzt folgendermaßen gelöst:
1
volatile uint16_t count_time = 0;
2
volatile uint16_t btn_time = 0; // Zeit zwischen Tastendrücken
3
4
int main(void)
5
{ 
6
  uint8_t flag_set = 0;
7
8
  while(1)
9
  {
10
  // Modus verstellen 
11
  if ( debounce( PINB, SWITCH_PIN )) {
12
  btn_time = count_time * 8;
13
  count_time = 0;
14
  if (flag_set)mach_was();
15
  else flag_set = 1; // Initialmessung gestartet
16
  }
17
18
ISR (SIG_OVERFLOW0) // alle 8E6/256
19
{  cnt++;
20
  if (cnt==0){
21
  if (count_time>=625)
22
    count_time = 625;
23
  else count_time++; // alle 8ms
24
  }
25
}

Wäre schön, wenn einer was hierzu schreiben könnte.. also irgendwelche 
Verbesserungsvorschläge.

von Karl H. (kbuchegg)


Lesenswert?

count_time ist bei dir jetzt eine 16 Bit Variable.
Das bedeutet, dass dein µC sie nicht in einem Rutsch lesen bzw. 
schreiben kann, sondern alles in 2 Etappen passieren muss.

Daher solltest du dir überlegen, was wohl alles passieren kann, wenn ein 
Interrupt an dieser Stelle

   btn_time = count_time * 8;

bzw. an dieser Stelle

   count_time = 0;

auftritt, wenn jeweils die erste Hälfte der 16 Bit schon geholt wurde, 
die 2.te Hälft aber noch nicht (sinngemäss umgekehrt beim Beschreiben 
der Variablen)

von Philipp H. (phil_phil)


Lesenswert?

Ui.

Da mach ich dann lieber cli() und danach wieder sei().

Wieder was dazu gelernt. Danke

von ... (Gast)


Lesenswert?

Du könntest Dir auch util/atomic.h anschauen.
http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html

von Nachmacher (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> count_time ist bei dir jetzt eine 16 Bit Variable.
> Das bedeutet, dass dein µC sie nicht in einem Rutsch lesen bzw.
> schreiben kann, sondern alles in 2 Etappen passieren muss.

Sofern der unbekannte Chip ein 8-bitter ist.

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.