www.mikrocontroller.net

Forum: Compiler & IDEs Zeit zwischen Tastendrücken messen


Autor: Philipp Horenz. (phil_phil)
Datum:

Bewertung
0 lesenswert
nicht 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.
uint8_t z1=0, z2=0;

main(){
while(1){
 if (debounce(x,y)){
 zeit = z2 * 8ms; //zähler z2 wird alle 8ms in ISR inkrementiert
 zähler = 0;
 }
}

}
ISR (OVF Timer1){ // alle 8E6/256
if(z1==255) z2++; // z1 ist der zähler 1
z1++
}

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

Autor: Philipp Horenz. (phil_phil)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs jetzt folgendermaßen gelöst:
volatile uint16_t count_time = 0;
volatile uint16_t btn_time = 0; // Zeit zwischen Tastendrücken

int main(void)
{ 
  uint8_t flag_set = 0;

  while(1)
  {
  // Modus verstellen 
  if ( debounce( PINB, SWITCH_PIN )) {
  btn_time = count_time * 8;
  count_time = 0;
  if (flag_set)mach_was();
  else flag_set = 1; // Initialmessung gestartet
  }

ISR (SIG_OVERFLOW0) // alle 8E6/256
{  cnt++;
  if (cnt==0){
  if (count_time>=625)
    count_time = 625;
  else count_time++; // alle 8ms
  }
} 

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Philipp Horenz. (phil_phil)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ui.

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

Wieder was dazu gelernt. Danke

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest Dir auch util/atomic.h anschauen.
http://www.nongnu.org/avr-libc/user-manual/group__...

Autor: Nachmacher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.