www.mikrocontroller.net

Forum: Compiler & IDEs Dauer eines Tastendrucks messen


Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verzweifel gerade.
Ich suche einen in C geschriebenen code, mit dem ich die dauer (bis 3s) 
eines Tastendrucks ermitteln kann ohne dabei den ganzen uC zu 
Blockieren.

Gibt es da nicht irgendeinen Zähler wie z.B. einen Prozesscouter, anhand 
dessen ich feststellen kann wieviele Takte von Flanke zu Flanke vergehn?

Eine while-Schleife blockt ja den ganzen uC und bei jedem 
Programmdurchlauf einen Zähler um 1 zu erhöhen funktioniert ja auch 
nicht zuverlässig, da die dauer eines Programmdurchlaufs nicht definiert 
ist.

Wie wird denn sowas normalerweise gelöst?

Autor: Björn R. (sushi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guck mal im AVR-GCC-Tutorial unter "Timer" - das sollte dein Problem 
lösen...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans Wurst wrote:
> Ich suche einen in C geschriebenen code, mit dem ich die dauer (bis 3s)
> eines Tastendrucks ermitteln kann ohne dabei den ganzen uC zu
> Blockieren.
> Wie wird denn sowas normalerweise gelöst?

Garnicht.
Die Länge eines Tastendruckes interessiert normaler Weise nicht.

Will man aber nur kurz/lang unterscheiden, gehts am einfachsten so:

Beitrag "Universelle Tastenabfrage"


Peter

Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke da hilft beides schon Arg weiter... mit dem Tutorial da hätte ich 
drauf kommen können sorry.

Aber zur 2. Antwort.
Da hat schonmal jemand nach der Zeile
>TCNT0 = (u8)(s16)-(XTAL / 1024 * 10e-3 + 0.5);  // preload for 10ms
gefragt.
aber die antwort ist mir nicht ganz klar.
und zwar genauer (u8) schneidet das High-byte ab.
Grundsätzliche bedeutung ist klar, aber ist jetz High-byte = die ersten 
8 oder die 2. 8 Byte von den 16 Bytes?
Und was hat das Minus-Zeichen direkt dahinter zu bedeuten?

Und nochmas: Wo gibts infos über (s16) (u8) (u16)?? (s8)??
Meine Suchresultate landen da immer bei Audi(s8) oder sowas ähnlichem.
Oder auf seiten die mehr Fragen als antworten bereit haben.


Ja und Danke, dass ihr einem so unwissendem Anfänger wie mir noch helft.
Danke.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans Wurst wrote:
> und zwar genauer (u8) schneidet das High-byte ab.

da muß man schauen, wie "u8" definiert ist und findet:
typedef unsigned char  u8;
typedef signed short  s16;

D.h. es wird zu "unsigned char" und das ist in der Regel 8Bit.
Es werden also nur die unteren 8Bit verwendet, was bei einer Zuweisung 
zu einem 8Bit-Timer zwar eh der Fall ist, aber damit werden dann 
Compilerwarnungen unterdrückt.

> Und was hat das Minus-Zeichen direkt dahinter zu bedeuten?

-2 ist besser lesbar als 254. Man will ja 2 Takte zählen bis zum 
Überlauf, also: -2 -> -1 -> 0 (Überlauf: auf -2 setzen) usw.


> Und nochmas: Wo gibts infos über (s16) (u8) (u16)?? (s8)??

Meistens wird versucht die Beispiele compilierfähig zu posten, d.h. 
Ausdrücke, die nicht standard C sind werden entweder zu Anfang oder in 
einem includierten Headerfile definiert.
Hier handelt es sich konkret um abgekürzte Typdefinitionen wegen 
Schreibfaulheit.


> Ja und Danke, dass ihr einem so unwissendem Anfänger wie mir noch helft.

Hauptsache, die Frage ist eindeutig und verständlich formuliert und die 
Antwort nicht offensichtlich zu ergooglen.


Peter

Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger wrote:
> Hans Wurst wrote:
>> und zwar genauer (u8) schneidet das High-byte ab.
>
> da muß man schauen, wie "u8" definiert ist und findet:
>
> typedef unsigned char  u8;
> typedef signed short  s16;
> 
Ah so?!... ja das gibt natürlich Sinn. Danke

>> Und was hat das Minus-Zeichen direkt dahinter zu bedeuten?
>
> -2 ist besser lesbar als 254. Man will ja 2 Takte zählen bis zum
> Überlauf, also: -2 -> -1 -> 0 (Überlauf: auf -2 setzen) usw.
minus 2 in einem unsigned char (u8)?
da müsste doch der compiler wieder warnen oder fehler melden?
oder nicht?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans Wurst wrote:
> minus 2 in einem unsigned char (u8)?
> da müsste doch der compiler wieder warnen oder fehler melden?
> oder nicht?
Nö. Du castest eine -2 zu unsigned char. D.h., dass schlicht und 
ergreifend das Bitmuster für "-2" (short, also 1111 1111 1111 1110) als 
unsigned interpretiert wird. Dabei wird (nach den im C-Standard 
festgelegten Regeln für Typkonversionen) einfach das Low-Byte 
übernommen, und das lautet nunmal 1111 1110. Eine Warnung würdest Du nur 
dann bekommen, wenn Du den Cast weglässt. Denn dann weiß der Compiler 
nicht, ob das Abschneiden des High-Bytes tatsächlich gewollt ist. Mit 
dem expliziten Cast nach u8 (also unsigned char) sagst Du lediglich dem 
Compiler "ich weiß was ich tu (zumindest glaube ich das)" und der 
Compiler macht es einfach.

Explizite Typkonversionen zwischen eigentlich inkompatiblen Typen sind 
hauptsächlich dazu da, eben solche Warnmeldungen zu unterdrücken. Du 
könntest den Cast in dem Fall genauso gut weglassen. Dann bekämst Du 
eine Warnmeldung, von der Du annehmen würdest, dass Du sie ignorieren 
kannst, weil der "Informationsverlust" schließlich beabsichtigt ist. Das 
ist allerdings unschön, zumal es dazu verleitet, auch andere 
(berechtigte) Warnmeldungen zu ignorieren. Generell sollte Code so 
geschrieben sein, dass er keine Warnmeldungen generiert.

Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielan Dank.

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.