- 12V Akku mit 280 Ah bauen         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Menü mit Drehgeber

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.02.2006
    Ort
    München
    Alter
    35
    Beiträge
    161

    Menü mit Drehgeber

    Hallo Forum!

    Ich möchte mir gerne ein Drehgebergesteuertes Menü für meinen Robo mit ATMega32 programmieren. Die Ausgabe erfolgt dann auf einem 4x27-LCD.

    Das Auslesen des Encoders hat mit dieser Methode schon so einigermaßen geklappt - nur hat sich der Encoder öfters in der Drehrichtung verhaspelt. Allerdings habe ich das Auslesen des Drehgebers in einer Endlosschleife übernommen. Vielleicht liegt es also auch daran.
    Wie sollte man diese Dinger abfragen? Im Polling-Verfahren? Oder Hardware-Interrupts?
    Mein Drehgeber hat auch einen eingebauten Drucktaster, mit dem ich dann Eingaben bestätigen möchte.

    Dazu dachte ich mir folgendes: Der Drucktaster liegt auf einem Hardware-Interrupt-Pin und bei Druck auf den Selben gelangt man in das Hauptmenü. Durch dieses scrollt man dann bis zu seinem gewünschten Menüpunkt und wählt ihn mit einem weiteren Druck aus. Jetzt kommt man in ein Submenu, in welchem man eine Einstellung (z.B. einen Zahlenwert durch Drehen des Gebers auswählen) tätigen kann und mit einem letzten Druck bestätigt sowie wieder ins übergeordnete Menü kommt.

    Sowas hat doch bestimmt schon mal jemand von Euch gemacht, oder?! Über Anregungen und Lösungsvorschläge würde ich mich freuen.

    Schönes Wochenende, Manni

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.09.2005
    Ort
    Osnabrücker Land
    Alter
    62
    Beiträge
    534
    Hallo!
    Glaube nicht, daß eine Endlosschleife die richtige Wahl ist

    Ich nutze zwei Drehgeber in meiner Steuerung. Sinnvoll ist es, einen Interrupt und eben zwei weitere Ports zu belegen. Du solltest Dir darüber gedanken machen, wie Du diese - am besten über einen Timer entprellst - da Du sicher mechanische verwendest. Ich hab mir das erspart und präzise, optische genommen (Fa. Megatron, ca. 18 EUr pro Stück inkl. Fingermuldendrehknopf).

    Bei einem weiteren Projekt, verwende ich jetzt auch mechanische, weils auf den Preis ankommt. Ich werde jedoch keine mit Taster mehr verwenden, da der Ottonormaluser damit nicht gut umgehen kann ... .

    Noch was, Taster frägst Du am besten immer über einen Timer -Job ab, dann klapps auch mit dem Entprellen.

    Viel Erfolg,
    Vajk
    Ich kann mir keine Signatur leisten - bin selbständig!

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Für diesen Zweck setze ich einen Pin des Gebers auf einen Ext. Interrupt Eingang und den zweiten auf einen beliebigen anderen.
    In der ISR mußt Du nur nachschauen ob der zweite Eingang gesetzt ist, oder nicht, je nachdem hast Du dann in die eine, oder andere Richtung gedreht.

    Zu entprellen schalte ich je einen 100 nF Kondensator zwischen Pin und GND, funktioniert bis jetzt sehr gut.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.02.2006
    Ort
    München
    Alter
    35
    Beiträge
    161
    Zitat Zitat von vajk
    Hallo!
    Glaube nicht, daß eine Endlosschleife die richtige Wahl ist
    Das war auch nur ein schneller Testaufbau um mal zu sehen, ob's grundsätzlich funktionieren würde

    Zitat Zitat von vajk
    Ich hab mir das erspart und präzise, optische genommen (Fa. Megatron, ca. 18 EUr pro Stück inkl. Fingermuldendrehknopf).
    Ich hab optische für zwei Euro das Stück (mir-Elektronik sei dank ^^). Hab extra nochmal im DB nachgeschaut, als ich gesehen hab, dass Du das neunfache bezahlt hast.

    @Izaseba: DAS ist mal noch ne Idee die mir noch gar nicht gekommen ist mit einem Ausgang auf den ext. Interrupt. Das werde ich jetzt mal noch ausprobieren.

    Danke, Manni

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.09.2005
    Ort
    Osnabrücker Land
    Alter
    62
    Beiträge
    534
    das mit dem Int hab ich doch auch geschrieben
    > Sinnvoll ist es, einen Interrupt und eben zwei weitere Ports zu belegen
    (Zwei Ports für 2.Signal und Taster)

    Dein Schnäppchen war wohl ein Sonderposten .. oder ?

    Im Datenblatt zu meinen, oder den mechnischen von Reichelt ist beschrieben, wie man die auswertet ...

    Viel Spaß noch,
    Vajk
    Ich kann mir keine Signatur leisten - bin selbständig!

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.02.2006
    Ort
    München
    Alter
    35
    Beiträge
    161
    @vajk: Sorry, ist mir im Nachhinein auch gekommen, dass du das selbe meintest. Ich wollte Dich auf keinen Fall "unter den Tisch kehren"

    Sonderposten? Hmmm, also als ich vor ~5 Monaten oder so das letzte Mal da war hatten sie noch ne rieeeeesige Kiste voll mit denen. Ich hab das DB mal angehängt. Das Bitmuster steht da natürlich auch drin. Steht in deinem Datenblatt noch was spezielles zur Auswertung mit µCs drin? BTW ich wusste gar nicht, dass Reichelt auch Drehgeber im Sortiment hat?!

    Ich bin dann mal weiter am Testen,
    Manni
    Angehängte Dateien Angehängte Dateien

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.11.2004
    Ort
    München
    Alter
    36
    Beiträge
    447
    Halllo,
    Ich nutze auch einen Mechanischen Drehencoder.
    Meiner kommt aus dem Conrad und ist mit Kondensatoren entprellt.
    Am besten suchst du mal im Conrad nach dem Datenblatt.
    Darin stand auch ein Ablauf-Diagramm für Software.
    Nach dem habe ich den code gemacht:

    Code:
    void CheckEncoder() {
    	encoder.state = readEncoder(); // gibt zwei bits zurück z.b.: 0b10, je nach Status der Encoder-Kanäle
    	
    	uint8_t yy = (encoder.state ^ encoder.state_last);
    
    	if (((encoder.state & 0b10)>>1) == (encoder.state & 0b01)) {
    		if (yy == 0b01) {
    			//cw
    			encoder.position++;
    		} else if (yy == 0b10) {
    			//ccw
    			encoder.position--;
    		}
    	} else {
    		if (yy == 0b10) {
    			//cw
    			encoder.position++;
    		} else if (yy == 0b01) {
    			//ccw
    			encoder.position--;
    		}
    	}
    	encoder.changed = 1;
    	encoder.state_last = encoder.state;	
    }
    Am Besten pollst du die Methode.

    MfG Alex

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.09.2005
    Ort
    Osnabrücker Land
    Alter
    62
    Beiträge
    534

    ssssssssss

    Danke fürs Datenblatt!! auch eine Kiste haben will!!!!
    Ich kann mir keine Signatur leisten - bin selbständig!

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.02.2006
    Ort
    München
    Alter
    35
    Beiträge
    161
    Ich versuche mich jetzt hiermit das erste Mal an Interrupts und habe nach fleißigem Studieren der Register den folgenden Code ausgearbeitet. Ich möchte nur eine LED an Portb.2 ein- und ausknipsen, sobald ein Low an INT0 anliegt. Der Interrupt-Pin liegt mittels dem Taster des Encoders auf Masse (oder eben auch nicht, wenn er nicht gedrückt ist). Das ganze funktioniert leider noch nicht. Wo liegt mein Fehler?

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    
    
    void ioinit( void )
    {
    	DDRB |= 0xff;
    	DDRD |= 0x00;
    }
    
    
    int main( void )
    {
    	ioinit();
    	
    	GIMSK |= ( 1 << INT0 );
    	MCUCR |= ( 1 << ISC01 );
    
    	sei(); 
    	
    	for( ;; )
    	{
    		
    	}
    	
    	return 0;
    }
    
    SIGNAL( SIG_INTERRUPT0 )
    {
    	PORTB ^= ( 1 << PB2 );
    }

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo,
    Hast Du externe Pullups?
    Ich habe mein Programm schnell überflogen, es ist für M8, ich weiß zwar nicht welchen µC Du hast aber um den Interrupt zu aktivieren habe ich INT0 im Register GICR gesetzt, vielleicht liegt es daran.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress