Hallo ich habe einen Servomotor(hängt an PINB1), der per Tastendruck über einen ATMega 8 in die beiden Extrempositionen gesteuert werden soll. Da ich momentan nur einen Taster (hängt an PIND) habe will ich zwischen 1-mal drücken und 2-mal drücken unterscheiden. Mein Programm sieht momentan so aus: #define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> int mode; int schleife; int schleife2; int schleife3; int main(void) { DDRD = 0x00; DDRB = (1<<PB1); PORTD = 0x00; while(1) { //mode=0; if (PIND & (1<<2)) { _delay_ms(1); }// end if else { mode++; _delay_ms(1500); for(schleife=0;schleife<1000;schleife++) { if (PIND & (1<<2)) { _delay_ms(3); } else { mode++; _delay_ms(500); } } } if(mode==1) { for(schleife2=0;schleife2<1000;schleife2++) { PORTB |= (1<<PB1); _delay_us( 2000 ); PORTB &= ~(1<<PB1); _delay_ms(18); } } if(mode==2) { for(schleife3=0;schleife3<1000;schleife3++) { PORTB |= (1<<PB1); _delay_us( 1000); PORTB &= ~(1<<PB1); _delay_ms(18); } } if(mode==0) { PORTB |= (1<<PB1); _delay_us( 1500 ); PORTB &= ~(1<<PB1); _delay_ms(18); } } return 1; } Ich weiß mein Programm ist noch ziemlich einfach gestrickt, weil ich erst vor Kurzem mit µC-Programmierung angefangen hat. Aber trotzdem müsste es doch so eig funktionieren oder übersehe ich da ein Fehler. Der Servo geht zwar in die Ausgangspostion, aber bei Tastendruck zuckt er immer nur kurz. Der Moduswechsel an sich funktioniert eigentlich, da ich ihn isoloert mit Led-Blinken getestet habe. Ich bin grad echt ratlos und würde mich über jeden Tipp sehr freuen :)
Wenn du deinen Code etwas dokumentiert hättest, müsste man sich nicht in deine Gedankengänge versetzen. Eine Schaltung wäre zum besseren Verständnis auch nicht schlecht.
OK, alles klar. Ja die Schaltung is noch groß kompliziert. Hab n Starter-Kit, bei dem der Button schon integriert ist. Der ist über PIND angeschlossen. Und dann hängt eben noch der Servo an PINB1. Aber die Schaltung dürfte eigentlich nicht das Problem sein, da die mit anderen Programmen funktioniert. Zur Logik des Programms: mit if (PIND & (1<<2)) frag ich den Tastendruck ab. Wird er nicht gedruckt, passiert nichts. Sobald er gedrückt wird wird die mode-Variable hochgezählt, die nachher den Modus(linke oder rechte Position) bestimmt. Danach hab ich kurze Wartezeiten um den Taster zu "entprellen". Die folgende for-scheife: for(schleife=0;schleife<1000;schleife++) { ... wartet noch eine kurze Zeit auf den nächsten Tastendruck. 1. Kommt der wird mode nochmal hochgezählt. 2. Kommt er nicht bleibt mode eben auf 1. Damit ist die Festlegung des Modus beendet(bis hierhin hats mit LED blinken lassen nach Modus auch funktioniert). Mit den folgenden if-Schleifen: if(mode==1){..} usw. soll dann eben je nach Modus eine Position angefahren werden. In den if-schleifen lass ich das PWM-Signal 1000 mal wiederholen, da am Anfang der while-TRUE mode=0 gestzt wird, sodass nach Anfahren der Extrempositionen der Servo wieder die Ausgangsstellung einnimmt. Ich hoffe das war soweit verständlich und es wäre sehr nett, wenn sich jemand die Zeit nimmt mein Programm durchzudenken :)
Wenn es ein Starter-Kit ist, dann ist es eher ungewöhnlich das der Taster nach + geht. Daher meine Frage nach der Schaltung.
Ich denke der vernünftigste Tipp den ich dir geben kann, ist dich erst mal nach einer vernünftigen Tastenentprellung und erkennung umzusehen. Die ist das Um und Auf, wenn irgendwo Tasten im Spiel sind Entprellung Nimmst du die PeDa Lösung ganz unten, dann wird deine Hauptschleife ganz einfach
1 | ...
|
2 | |
3 | int main() |
4 | {
|
5 | ...
|
6 | |
7 | mode = 0; |
8 | |
9 | while( 1 ) { |
10 | |
11 | if( get_keypress( 1 << KEY0 ) ) |
12 | mode = 1 - mode; |
13 | |
14 | if( mode == 0 ) { |
15 | PORTB |= (1<<PB1); |
16 | _delay_us( 1000); |
17 | PORTB &= ~(1<<PB1); |
18 | _delay_ms(18); |
19 | }
|
20 | |
21 | else if( mode == 1 ) { |
22 | PORTB |= (1<<PB1); |
23 | _delay_us( 2000); |
24 | PORTB &= ~(1<<PB1); |
25 | _delay_ms(18); |
26 | }
|
27 | }
|
28 | }
|
Ja da hast du natürlich Recht mit der Entprellung. Und ich werde mich in den Ferien auch hinhocken und das Tutorial durcharbeiten, aber ich würde gern davor dieses eine Projekt erfolgreich beenden. Und meine provisorische Entprellung funktioniert ja eig auch sogar ganz gut bei den LEDs. Deine Lösung für den Moduswechsel ist natürlich genial ;) Da wär ich jetzt nich drauf gekommen, aber ich hab ja gewissermaßen 3 Zustände. DIe beiden Extrempositionen und die Mittelstellung in die er immer wieder zurückkehren soll. Wie könnte man das lösen?
Mal ne andere Frage: Funktioniert mein Programm eigentlich auch mit einem Analog-Servo? WEil ich benutzt grad nen digitalen und bräuchte aber nen Stärkeren. Preislich sind da analoge viel billiger. Funktioniert die Ansteuerung gleich? MfG Brummer
Cool, danke :) Jetzt hab ich noch eine kleine Frage. Sry, dass ich hier jetzt immer weiter schreib, aber n neuer Post würde sich nicht lohnen. Ich würde gern für oben genannte Schaltung noch einen 2. Taster kaufen. Allerdings stolper ich bei CONRAD über die Schaltspannung. Die liegt da bei allen Tastern um die 200V. Mein Mikrocontroller läuft doch mit 6V... Funktionieren solche Taster an meinem AVR? Ist das der obere Grenzwert oder was für Taster sind für ein AVR geeignet? MfG Brummer
Brummer schrieb: > Ich würde gern für oben genannte Schaltung noch einen 2. Taster kaufen. > Allerdings stolper ich bei CONRAD über die Schaltspannung. Die liegt da > bei allen Tastern um die 200V. Ein Taster sind im Prinzip 2 Drähte in einem Gehäuse, die aufeinander gedrückt werden. Der Taster KANN 200V noch schalten, ohne dass ihm der Lichtbogen kurz vor dem endgültigen Kontakt den Garaus macht. Aber das heißt nicht, dass er 200V schalten muss! Dein Autotacho ist auch mit 180km/h angeschrieben. Das heißt aber auch nicht, dass du immer 180 fahren musst.
Jetzt hätte ich nochmal eine Frage zur Funkübertragung, da ich den Servo per Funk steuern möchte. Für euch wirken mein Fragen bestimmt zusammenhangslos, aber ihr helft mir echt genial und ich habe bei meinem Projekt schon große Fortschritte gemacht :) Also ich habe mir jetzt ein Sender-/Empfängermodul-Set gekauft, um die Zustände des Tasters an den Servo zu schicken. Ich finde nur überhaupot kein Beispielprogramm zur Funkübertragung und kann mir auch nicht wirklich vorstellen, wie das auszusehen hat... Kann ich einfach Strom durch den PIN, der mit dem Sender verbunden ist, schicken und dann beim Empfänger abfragen, ob Strom fließt? Oder gibts da genauere Befehle zum Senden? MfG Brummer
Also ich habe jetzt gelesen, dass dieses spezielle Modul von Conrad eine Manchester-Codierung verlangt. Allederdings ist Manchester ja eig dazu da komplexe Datenpakete zu versenden und ich komm gar nich dahinter wie ich Manchester programmieren soll. Ich muss ja aber auch nur 2 Zustände übertragen(Taster gedrückt oder nicht). Hat da jmd Erfahrung, ob das dann evtl einfacher geht?
du könntest einfach schaltbare Steckdosen umbauen... Da gibts fernbedieung und 3 Empfänger oft für einen 10er. Innen wird 5V erzeugt im Empfänger, da kann man dann ansetzen... M.
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.