Servus Leute! Nach langer Suche in diesem Forum bin ich leider immer noch nicht auf die Lösung gekommen, wie ich denn nun meinen Taster richtig einlese! Da ich ebenso noch Neuling auf diesem Gebiet bin, verstehe ich meist die Codes, welche von echten "Profis" erstellt wurde, nicht. VOn AVR GCC wurde ich ebenso wenig schlau! Eventuell gibt es ja jemanden, der mir meinen Fehler erläutern könnte, dafür wäre ich sehr dankbar! Code: #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> #define SET(x,y) x |= (1 << y) #define CLEAR(x,y) x &= ~(1 << y) #define BUT1 9 // BUtton 1 (PB1) int main(void) { //Eingaenge und Ausgaenge definieren (0 = Eingang , 1 = Ausgang) DDRD = 0b11111111; DDRB = 0x00; //Taster als Eingang SET(DDRB,0); //Pullup aktivieren CLEAR(PORTB, BUT1); while (1) { //Variable i deklarieren int i; //Wenn Taster gedrückt - "Lichterspiel" if (PINC & (1<<BUT1)) { for (i=0 ; i<8 ; i++) { SET(PORTD,i); _delay_ms(100); CLEAR(PORTD,i); } } else { PORTD = 0x00; } } } Vielen lieben Dank! Grüße, Manuel
Hallo Manuel, so ein Byte hat nur 8 Bit, die man von 9 bis 7 nummeriert. Das BUT1 = 9 ist also falsch. Taster werden mit der Peter Dannegger Methode alle ~10ms und erst bei 4 gleichen Zuständen wird ein Taster Event generiert. Das kann u.a. sein Taster gedrückt oder auch losgelassen. https://www.mikrocontroller.net/articles/Entprellung#Timer-Verfahren_.28nach_Peter_Dannegger.29
Sorry Schreibfehler: "die man von 0 bis 7 nummeriert."
Manuel H. schrieb: > if (PINC & (1<<BUT1)) BUT1 ist mit PB1 definiert, du nimmst aber PINC. Das wird so nicht funktionieren. EDITH meint: Ups, verlesen. Lass doch die 9 weg (woher hast du die eigentlich?) und schreib define BUT1 PB1
:
Bearbeitet durch User
Hallo! Alles nun geändert, leider wird der Tasterklick immer noch nicht erkannt. Bin leider nun echt mit meinem Latein am Ende!
Was hast du konkret geändert? Wie sieht der Code jetzt aus?
#define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> #define SET(x,y) x |= (1 << y) #define CLEAR(x,y) x &= ~(1 << y) #define BUT1 PB1 // BUtton 1 (PB1) int main(void) { //Eingaenge und Ausgaenge definieren (0 = Eingang , 1 = Ausgang) DDRD = 0b11111111; DDRB = 0x00; //Taster als Eingang SET(DDRB,0); //Pullup aktivieren CLEAR(PORTB, BUT1); while (1) { //Variable i deklarieren int i; //Wenn Taster gedrückt - "Lichterspiel" if (PINB & (1<<BUT1)) { for (i=0 ; i<8 ; i++) { SET(PORTD,i); _delay_ms(100); CLEAR(PORTD,i); } } else { PORTD = 0x00; } } }
Manuel H. schrieb: > Alles nun geändert, leider wird der Tasterklick immer noch nicht > erkannt. Bin leider nun echt mit meinem Latein am Ende! Dann zeig mal das geänderte Programm, und am besten auch gleich die Schaltung: - wie und wo hast Du hast Du die Taste angeschlossen? - wie genau erkennst Du den Tastendruck?
Port D ist dein Eingang, du liest aber von PINC. Port B ist dein Ausgang, du schreibst aber auf PORTD. Zeige deinen Schaltplan. Was ist wie wo angeschlossen?
Hier die Schaltung. Piezo und Display wurden noch nicht angeschlossen - zuerst sollten die Basics laufen!
1 | for (i=0 ; i<8 ; i++) { |
2 | SET(PORTD,i); |
3 | _delay_ms(100); |
4 | CLEAR(PORTD,i); } |
5 | }
|
Dieser Abschnitt sieht aus, als ob da eine Klammer hinter CLEAR zu viel sei. Und danach fällt auf, dass darunter ein "else" scheinbar auf "for" folgt, was keinen Sinn ergibt. Solche Lesefehler vermeidest du durch korrektes Einrücken. Hinter CLEAR fehlt noch ein Delay. Die LED wird sonst so schnell wieder eingeschaltet, dass man davon nichts sehen kann.
Hallo Manuel, Siehe Stefan Us, was die Portpins angeht, aber wirklich hast Du am Algorithmus nichts geändert. Damit wird es auch nicht funktionieren können! Taster prellen, Taster schalten beim drücken nach Masse und prellen (wackeln) dann zwischen Vcc (i.a. +5V) und Masse (0V). Also baue die Peter Dannegger Funktionalität (Tastenentprellen) ein und dann geht alles wie von selbst.
Manuel H. schrieb: > Hier die Schaltung. Nun das ist der Aufbau, aber kein Schaltplan! Damit kann man nur sehr wenig anfangen!
> Hier die Schaltung. Pläne sind wohl nicht mehr nötig. Nur doof, wenn man seinen eigenen Aufbau nicht durchblickt. Dein Taster zieht den Eingang auf Low, du fragst im Quelltext aber ab, ob er HIGH ist. Die LED's hängen auf jeden Fall alle an Port D und leuchten bei HIGH Pegel. Korrigiere deinen Quelltext dementsprechend. Dein Taster hängt an PB0. Korrigiere deinen Quelltext dementsprechend. Und in Zukunft: Zeichne einen Schaltplan, der die Port-Nummern enthält (nicht diese Arduino Nummern, die du nicht gebrauchen kannst).
Hallo! Erstmals vielen Dank! Wollte das Ganze zuerst mit den internen PullUP Widerständen, wie in der ARDUINO Programmierumgebung lösen, leider vergeblich! Werde es nun nach der Peter Dannegger Funktionalität versuchen, das Programm erfolgreich zu lösen! Grüße
> Also baue die Peter Dannegger Funktionalität (Tastenentprellen) ein
Lieber nicht, dieses Level hat er noch nicht erreicht. Was nicht böse
gemeint ist.
Lass den TO erst einmal herausfinden, das ein Taster prellt, dann
versteht er den Sinn der Entprellung besser. In dieser Schaltung wird er
es wahrscheinlich noch nicht bemerken. Aber das kommt sicher bald.
Falls ich das Ganze aber negiere (mit einem Ausrufezeichen vor der Bedingung), dann leuchten die PINS logischerweise auch ohne entsprechendem Tasterdruck...
> Wollte das Ganze zuerst mit den internen PullUP Widerständen, > wie in der ARDUINO Programmierumgebung lösen Deine Leitungen sind hier kurz genug, dass das auch geht. Nur musst du sie auch einschalten und dann im Programmcode berücksichtigen, welcher Logik-Pegel dann den gedrückten Taster repräsentiert.
Was eine Entprellung ist und für was das Ganze gut sie sollte, habe ich begriffen, danke. DIe Entprellung wollte ich durch den PULLUP Widerstand lösen, sollte doch funktionieren?
Hallo Stefan Us, ja ist möglich, solange ihm der Umgang mit den Ports, die Benennung der Portpins und deren ansprechen Probleme macht, sollte man sich erst diesen Teil des Basiswissens erarbeiten. Stefan U. schrieb: > Stefan Us Stefan U. schrieb: >> Also baue die Peter Dannegger Funktionalität (Tastenentprellen) > ein > > Lieber nicht, dieses Level hat er noch nicht erreicht. Was nicht böse > gemeint ist. > > Lass den TO erst einmal herausfinden, das ein Taster prellt, dann > versteht er den Sinn der Entprellung besser. In dieser Schaltung wird er > es wahrscheinlich noch nicht bemerken. Aber das kommt sicher bald.
Ich glaube, mein Buch wird für Dich hilfreich sein: http://stefanfrings.de/mikrocontroller_buch/index.html Da wird ein ATTiny13 verwendet, aber alles was dort gemacht wird, geht ebenso mit deinem Arduino Board. > Die Entprellung wollte ich durch den PULLUP Widerstand > lösen, sollte doch funktionieren? Nein. Du hast weder den Widerstand noch den Begriff "Prellen" verstanden. Gib nicht auf, lese mehr zu dem Thema und probiere weiter. So lernt man das am schnellsten.
Manuel H. schrieb: > Was eine Entprellung ist und für was das Ganze gut sie sollte, habe ich > begriffen, danke. DIe Entprellung wollte ich durch den PULLUP Widerstand > lösen, sollte doch funktionieren? Nein, das hat nichts mit Entprellen zu tun. Sondern damit, das Eingänge einen definierten Zustand haben müssen, also nicht einfach "offen" sein dürfen. Man kann natürlich auch einen, z.B. 10k Widerstand nach Vcc und an einen Eingang schalten, dann ist es ein externen Pulllup-Widerstand.
Manuel H. schrieb: > //Pullup aktivieren > CLEAR(PORTB, BUT1); Entweder ist der Code falsch, oder der Kommentar! Denn: (Pullup aktivieren) != (Pullup deaktivieren)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.