Hallo ich möchte über ein ganz einfache Schaltung ein Unipolares Schrittmotor über 2 Taster ansteuern so dass z.B. Taster 1 gedruckt dann dreht der Motor in eine Richtung, Taster 2 gedruckt dann dreht in der andere Richtung. Mein Problem: Ich habe die zwei Taster am Port D0 und D1 des Atmegas angeschlossen (Aktiv Low). Wenn ich die Taster 1 drucke (Port D0) passiert nichts. Wenn ich Taster 2 drucke dann dreht der Motor wie gewünscht! Nehme statt PD0 für Taster 1 z.B PD4 dann funktionieren beide Richtungen wie gewünscht warum das?? Gruß Martin
PD0 ist auch RxD. Hast Du in deinem Programm die serielle Schnittstelle initialisiert? Sonst brauchen wir wohl den Quelltext...
hp-freund schrieb: > PD0 ist auch RxD. Hast Du in deinem Programm die serielle Schnittstelle > initialisiert? Nein eingentlich nicht! Quelltext ganz primitiv:
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include <util/delay.h> |
4 | #include "lcd-routines.h" |
5 | |
6 | #define NEGRO _BV(PC0)
|
7 | #define AMARILLO _BV(PC1)
|
8 | #define GRIS _BV(PC2)
|
9 | #define NARANJA _BV(PC3)
|
10 | |
11 | #define DELAY 4
|
12 | #define DELAY2 6
|
13 | |
14 | |
15 | //const uint8_t rechts[] = {NARANJA, GRIS, AMARILLO, NEGRO}; // rückfahrt
|
16 | //const uint8_t links[] = {NEGRO, AMARILLO, GRIS, NARANJA};
|
17 | |
18 | //uint8_t i;
|
19 | |
20 | void rueck_vor_fahrt (void) |
21 | {
|
22 | while(1) |
23 | |
24 | {
|
25 | if ( PIND & (1<<PIND1)) { |
26 | PORTC = NARANJA; |
27 | _delay_ms(DELAY); |
28 | PORTC = GRIS; |
29 | _delay_ms(DELAY); |
30 | PORTC = AMARILLO; |
31 | _delay_ms(DELAY); |
32 | PORTC = NEGRO; |
33 | _delay_ms(DELAY); |
34 | }
|
35 | |
36 | if ( PIND & (1<<PIND4)) { |
37 | PORTC = NEGRO; |
38 | _delay_ms(DELAY); |
39 | PORTC = AMARILLO; |
40 | _delay_ms(DELAY); |
41 | PORTC = GRIS; |
42 | _delay_ms(DELAY); |
43 | PORTC = NARANJA; |
44 | _delay_ms(DELAY); |
45 | }
|
46 | |
47 | else { |
48 | PORTC = 0x00; |
49 | break; |
50 | }
|
51 | }
|
52 | }
|
53 | |
54 | //---------------------- 1. versucht ok!
|
55 | |
56 | |
57 | int main(void) |
58 | |
59 | {
|
60 | DDRC = 0xff; |
61 | PORTC = 0x00; |
62 | DDRD = 0x00; |
63 | |
64 | while(1) |
65 | {
|
66 | rueck_vor_fahrt(); |
67 | |
68 | }
|
69 | }
|
PullUp an PortD aktivieren oder externe PullUp verwenden. Ausserdem fragst du auf 1 ab.
Ich fürchte Du musst deine Funktion noch mal überarbeiten. Zur Zeit reagiert die if Abfrage auf H am Eingang, also Taste nicht gedrückt. Dann gibt es für 2 mal if nur ein else? Delay ist auch recht klein. Schau mal hier: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Tasten_und_Schalter
Ich verwende externe PullUp also 10k pro Taster
Hubert G.:
> Ausserdem fragst du auf 1 ab.
Sorry habe ich mich vertipp, Taster sind "HIGH-Aktiv"
Also Pull-UPs und High aktive Taster ?
so, für etwas Klarheit Taster sind so wie im Bild
hp-freund schrieb:
> Dann gibt es für 2 mal if nur ein else? Delay ist auch recht klein.
Was hat Delay damit zu tun? damit dreht er der Motor schnell oder
langsam.
Habe das probiert. Funktioniert bei meinem ATmega 8 an PD0 mit 10K Pull-down auch nicht. Offensichtlich ist der Atmega8 nicht in der Lage diesen Pin mit 10K weit genug runter zu ziehen. man lernt nie aus !! Mit 1K8 gehts. besser ist: Interner pullup und Taster gegen Ground - geht immer Gruß peter
Tobi schrieb: > Was hat Delay damit zu tun? damit dreht er der Motor schnell oder > langsam. So lange die Taste noch prellt auch mehrfach mit Pause zwischendurch ;)
Nun habe ich einen anderen MEGA8 versucht. Und siehe da bei dem gehts. Offensichtlich haben diese Bastlerdinge so grosse Exemplarstreuungen. Gruß peter
Hallo Petrov, vielen Dank für das Testen, ich hätte nicht darauf gekommen. @hp-freund verstehe nicht ganz was du meins. Was Tobi sagt ist genau was ich mache, gebe ich z.B 10 an der Delay dann dreht der Motor natürlich Langsamer. Gruß Martin
Wenn Du gute Taster so wie hier hast: http://de.wikipedia.org/wiki/Prellen ist nach 16ms der Zustand natürlich schon stabil. Wenn sie nicht so gut sind, kann es sein das Du bei der if Abfrage mal H und mal L erwischst solange die Taste gedrückt ist/prellt.
Nachtrag: Das wirst Du nicht sehen, sondern nur messen können...
Ok kapiert, normallerweise benutze ich das Routine von Peter Danneger zum Entprellen, hier kommt auf alle Fälle auch. Gruß Martin
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.