Hallo User,
ich versuche mich seit ein paar Tagen in die Welt der AVRs
einzuarbeiten, leider kann ich noch nicht wirklich viel in C. Habe mir
schon einige Toturials angesehen und ein kleines Erfolgserlebnis mit dem
ATtiny2313 gehabt.
Ich habe ein Programm geschrieben, welches einen Ausgang (PB7) schaltet
wenn Taster_1 (PD0) gedrückt wird und ihn löscht wenn Taster_2 (PD1)
gedrückt wird. Funktioniert soweit.
Nun hab ich das ganze erweitert um Taste_3 (PD2) diese schaltet ein, und
bein nächsten drücken wieder aus. Nun stehe ich aber vor dem Problem der
Tasten-Prellung. Ich habe mir die Code-Schnipsel hier von der Seite
"gemopst" weiß leider nicht wie ich diesen nun richtig in mein Programm
einbinde. Ich hoffe Ihr könnt mir weiter helfen...
1
#include<avr/io.h>
2
3
#include<util/delay.h>
4
#include<avr/delay.h>
5
6
7
#define F_CPU 8000000UL
8
9
10
11
// Einschalten
12
13
voidein(void)// "ein" ist eine freie Bezeichnung der Routine
14
15
{
16
PORTB=(1<<PB7);// Schaltet PB7 auf HIGH (5V)
17
return0;
18
}
19
20
21
// Ausschalten
22
23
voidaus(void)// "aus" ist eine freie Bezeichnung der Routine
Hol dir von hier
http://www.mikrocontroller.net/articles/Entprellung
zumindest das Debounce Makro vom Peter Danegger.
Noch besser funktionieren die Komfortroutinen weiter unten im Artikel.
Die machen so ziemlich alles, was das Herz begehrt.
Hallo Karl, und danke für die schnelle Antwort.
Auf der Seite hänge ich schon den halben Vormittag, ich weiß leider
nicht wie ich das in meinen Code einbinden muss. Wie gesagt ich bin
absoluter neuling in Sachen C. Deswegen habe ich mir erstmal für die
"void entprellung..." von dort entschieden.
[Zitat]
zumindest das Debounce Makro vom Peter Danegger.
Noch besser funktionieren die Komfortroutinen weiter unten im Artikel.
Die machen so ziemlich alles, was das Herz begehrt.
[Zitatende]
Das mag sein, nur kann ich damit noch weniger anfangen...
Was mir helfen würde ist eine kurze Erklärung wie ich was und wo in
meinen Code einbinden muss, damit ich es auch verstehe. Am liebsten wäre
es mir, wenn man mir erklärt ob und was am obigen Code falsch ist und
was man warum ändern muss.
Danke.
Kai S. schrieb:> Hallo Karl, und danke für die schnelle Antwort.>> Auf der Seite hänge ich schon den halben Vormittag, ich weiß leider> nicht wie ich das in meinen Code einbinden muss. Wie gesagt ich bin> absoluter neuling in Sachen C. Deswegen habe ich mir erstmal für die> "void entprellung..." von dort entschieden.
Dort ist doch ein komplettes Beispiel!
Machs doch anders rum:
Übernimm das Beispiel so wie es ist.
Passe die Pinbelegung auf deine an, kompilier es und bring es zum
laufen.
Und dann baust du deinen Code dort ein.
Deine 2 Funktionen und 3 Abfragen hast du doch in 0 komma nix dort
eingebaut. Für dich ist erst mal nur das interessant, was in den
Beispielen in der main() Funktion steht. Dort kann man sich ansehen, wie
das jeweils verwendet wird.
> [Zitat]> zumindest das Debounce Makro vom Peter Danegger.>> Noch besser funktionieren die Komfortroutinen weiter unten im Artikel.> Die machen so ziemlich alles, was das Herz begehrt.> [Zitatende]>> Das mag sein, nur kann ich damit noch weniger anfangen...
Die Routine ist so trickreich, dass es ok ist, wenn man nicht versteht
wie sie funktioniert. Das ist eine der wenigen Ausnahmen, bei denen ich
es als für in Ordnung befinden würde.
> Was mir helfen würde ist eine kurze Erklärung wie ich was und wo in> meinen Code einbinden muss, damit ich es auch verstehe.
Auch dort ist ein komplettes Beispiel.
> Am liebsten wäre> es mir, wenn man mir erklärt ob und was am obigen Code falsch ist und> was man warum ändern muss.
Dein Hauptproblem ist, dass dein Code für die ABfrage von PD2 nicht das
implementiert, was du haben willst.
Dein Code macht:
* wenn die Taste gedrückt IST, dann schalte den Eingang um
Du willst aber machen:
* wenn die Taste gedrückt WIRD, dann schalte um
Im ersten Fall detektierst du ob der Pegel des Tasteneingangs low ist,
und so eine gedrückte Taste anzeigt. Das ist: Wenn die Taste gedrückt
IST
Im zweiten Fall musst du aber feststellen, ob sich der Pegel des
Tasteneingangs verändert hat, gegenüber dem Zeitpunkt an dem du zuletzt
nachgesehen hast. Hat sich der Pegel nicht verändert, dann ist an der
Taste auch nichts passiert. Die Taste ist immer noch gedrückt oder nicht
gedrückt. Hat sich der Pegel aber verändert, dann ist die Taste entweder
gedrückt oder losgelassen worden.
Die Funktion entprellung macht das aber nicht. Die stellt nur sicher
(soll sicherstellen), dass der Pegel konstant ist. Was du dann mit dem
Pegel weiter machst, ist dein Bier.
Hallo Karl,
ich bekomme beim Compilieren immer folgende Meldung:
Build started 24.1.2011 at 12:44:24
avr-gcc -mmcu=attiny2313 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT
Entprellt2313.o -MF dep/Entprellt2313.o.d -c ../Entprellt2313.c
../Entprellt2313.c:18:2: warning: #warning kein F_CPU definiert
../Entprellt2313.c: In function 'main':
../Entprellt2313.c:119: error: 'TCCR0' undeclared (first use in this
function)
../Entprellt2313.c:119: error: (Each undeclared identifier is reported
only once
../Entprellt2313.c:119: error: for each function it appears in.)
make: *** [Entprellt2313.o] Error 1
Build failed with 3 errors and 1 warnings...
Woran kann das liegen?
Kai S. schrieb:> ich bekomme beim Compilieren immer folgende Meldung:
Ah. ok
An deinen Prozessor musst du die Registernamen schon anpassen.
> ../Entprellt2313.c:18:2: warning: #warning kein F_CPU definiert
Stell im AVR-Studio in den Project Options deine Taktfrequenz ein
> ../Entprellt2313.c: In function 'main':> ../Entprellt2313.c:119: error: 'TCCR0' undeclared (first use in this> function)
Das Konfigurationsregister für den Timer 0, in dem die Vorteilerbits
sind, heißt beim Tiny2313 TCCR0B.
Die Belegung und die Bedeutung der Bits ist aber identisch.
Siehe Datenblatt
Okay, das ganze geht soweit.
Nun werde ich mir mal den Code "verinnerlichen" damit ich auch kapiere
was da so passiert...
An dieser Stelle ersteinmal Vielen Dank für die Unterstützung!
Kai S. schrieb:> Okay, das ganze geht soweit.>> Nun werde ich mir mal den Code "verinnerlichen" damit ich auch kapiere> was da so passiert...
Im einfachsten fall brauchst du nur
get_key_press( 1<<KEY2 )
dann halt jeweils mit dem richtigen Key
if( get_key_press( 1<<KEY2 ) )
mach was
wird genau dann ausgeführt, wenn die Taste 1-mal gedrückt wird.
Fertig.
Einfacher gehts nicht
Kann ich denn in so einem Code alles was nach dem letzten
"#include" bzw. schon nach dem "#endif"
und vor
"int main void"
steht in eine Datei Namens xyz.c schreiben und diese dann ganz oben
aufrufen z.B. mit "#include <xyz.c>" oder geht das so nicht?
Wenn das ne echt dumme Frage ist, erschlag mich nicht gleich, ich
versuche nur zu verstehen wie das Programmieren in C so von statten
geht, was möglich ist und was nicht.
learning by doing
und wenn´s nicht geht freundlich Fragen ;-)
Kai S. schrieb:> ein(); // geh zur "ein" Schleife
das ist übrigens alles mögliche, eine Funktion, Unterprogramm, Prozedur,
aber auf keinen Fall eine Schleife
>Kai S. schrieb:>> ein(); // geh zur "ein" Schleife>das ist übrigens alles mögliche, eine Funktion, Unterprogramm, Prozedur,>aber auf keinen Fall eine Schleife
OK, Danke. Ich werd das mal in meinem Text abändern..