- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 20

Thema: ATTiny13A Schalter abfragen/entprellung mit Variablen

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    11.06.2014
    Beiträge
    9
    Anzeige

    E-Bike
    Vielen Dank erstmal für deine Bemühung!

    Leider ist das zweite Beispiel von dir weitaus zu kompliziert für meine C und uC Kenntnisse

    Daher werde ich erstmal versuchen mit dem davor weiter zu arbeiten und das irgendwie zum laufen zu bekommen

    Hab schon wieder ein wenig rumprobiert aber noch keine zufriedenstellende Lösung gefunden

    Gruß

  2. #12
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Na, dann will ich dich mal nicht im Regen stehen lassen.
    Ich kann's nicht testen, weil ich die Hardware nicht besitze, aber das hier könnte klappen:

    Code:
    // prg: check buttons for codes
    
    #define F_CPU 9000000UL
    #include <util/delay.h>
    #include <avr/io.h>
    typedef uint8_t byte;
    
    
    // button pins 
    // PINB3 is pin of button 1
    // PINB4 is pin of button 2
    // 0 means end of buttons
    byte buttons[] = {PINB3, PINB4, 0};
    // first 0 is for counting in function
    // 1,1,2,1 is code
    // last 0 is end of code 
    byte code1[]  = {0,      1, 2, 2, 1,         0};
    byte code2[]  = {0,      2, 1, 2, 2,         0};
    byte code3[]  = {0,      2, 1, 1, 2, 2,      0};
    byte* codes[] = {code1, code2, code3,        0};
    
    // prototypes
    byte isButtonPressed(byte pinNr);
    void resetInput();
    byte checkButtons(byte* button, byte* codes[], byte buttons[]);
    
    
    //	main
    int main (void) {
      DDRB		= 0x06;			// I/O ports PB1+PB2;
      PORTB		= 0x18;			// activate pull up  (PB3+PB4)
      byte btn;	                    	// if a button is pressed this variable will know
    
      while(1) {
    	byte code_nr = checkButtons(&btn, codes, buttons);
    	// codes switch LEDs  
    	if (code_nr == 1) {
    	  PORTB |=  (1 << PINB2);	// PB2 on
    	  PORTB &= ~(1 << PINB1);	// PB1 off
    	}
    	else if (code_nr == 2) {
    	  PORTB |=  (1<<PINB1);		// PB1 on
    	  PORTB &= ~(1<<PINB2);		// PB2 off
    	}
    	else if (code_nr == 3) {
    	  PORTB &= ~(1<<PINB1);		// PB1 off
    	  PORTB &= ~(1<<PINB2);		// PB2 off
    	}
      }
    }
    
    // functions
    
    byte isButtonPressed(byte pinNr) {
      byte pin = PINB;
      return (pin & (1 << pinNr)) || (pin & (1 << pinNr)) || (pin & (1 << pinNr));
    }
    
    void resetInput() {
      byte i = 0; while(codes[i]) { *codes[i++] = 0; }
    }
    
    byte checkButtons(byte* button, byte* codes[], byte buttons[]) {
      static byte last_pressed_button = 0;
      if (last_pressed_button) {                                 // was button pressed last time?
        if(isButtonPressed(buttons[last_pressed_button-1]))      // is button still pressed?    
          return 0;                                              //  -> return
        else {
          last_pressed_button = 0;                               // else: not pressed anymore -> go on
        }
      }
      *button = 0;
      byte button_iterator  = 0; // iterate over all buttons 
      byte code_iterator    = 0; // iterate over all codes
      while(buttons[button_iterator]) {
        if(isButtonPressed(buttons[button_iterator])) {                 // check buttons one after another
          *button = button_iterator + 1;                                // write pressed button number to external variable pressed_btn
          last_pressed_button = *button;                                // store pressed button number
          while(codes[code_iterator]) {                                 // check all codes one after another
            byte* code_pos_ptr = codes[code_iterator];                  // first byte of codes array is for current position
            if(codes[code_iterator][(*code_pos_ptr)+1] == button_iterator + 1) { // is the pressed button nr equal to next button nr in code?
              (*code_pos_ptr)++;                                        // -> next position
              if(!codes[code_iterator][(*code_pos_ptr)+1]) {            // code veryfied
                resetInput();                                           // reset all counters
                return code_iterator + 1;                               // returns number of detected code
              }
            }
            else { *code_pos_ptr = 0; }
            code_iterator++;
          }
          code_iterator = 0;   // prepare for next button check
        }
      button_iterator++;
      }
      return 0;  // 0 means no code veryfied
    }
    Geändert von Sisor (01.07.2014 um 12:31 Uhr) Grund: Code berichtigt (byte btn; statt byte* btn;)

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    11.06.2014
    Beiträge
    9
    Vielen Dank für deine Hilfe!

    Leider macht der uC nach dem Programmieren gar nichts.

    Außerdem kommt folgendes Warning:
    Code:
    Warning	1	passing argument 1 of 'checkButtons' from incompatible pointer type [enabled by default]	C:\Users\Dennis\Documents\GccApplication2\GccApplication2\GccApplication2.c	35	3	GccApplication2
    Message	2	expected 'byte *' but argument is of type 'byte **'	C:\Users\Dennis\Documents\GccApplication2\GccApplication2\GccApplication2.c	25	6	GccApplication2
    Kann es sein das ich die Buttons vllt. mit einem Interrupt abfragen muss da das Programm das sonst nicht rechtzeitig merkt? Oder das Programm gerade an einer "falschen" Stelle ist und daher einen Tastendruck nicht mitbekommt?

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Dann muß wohl die Zeile:
    byte checkButtons(byte* button, byte* codes[], byte buttons[]);
    in:
    byte checkButtons(byte*, byte**, byte*);
    geändert werden.

  5. #15
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Nein, die Funktion würde schon passen. Das Problem ist der Aufruf
    Code:
    byte* btn;
    byte code_nr = checkButtons(&btn, codes, buttons);
    btn ist bereits ein Pointer und kann ohne & übergeben werden. Hier wird ein Pointer auf einen Pointer übergeben!

    mfg

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    11.06.2014
    Beiträge
    9
    Zitat Zitat von Sisor Beitrag anzeigen
    Dann muß wohl die Zeile:
    byte checkButtons(byte* button, byte* codes[], byte buttons[]);
    in:
    byte checkButtons(byte*, byte**, byte*);
    geändert werden.
    Da bleiben beide Warnings identisch zu vorher.

    Wsk8

    Nein, die Funktion würde schon passen. Das Problem ist der Aufruf
    Code:

    byte* btn;
    byte code_nr = checkButtons(&btn, codes, buttons);

    btn ist bereits ein Pointer und kann ohne & übergeben werden. Hier wird ein Pointer auf einen Pointer übergeben!

    mfg
    Wenn ich das "&" entferne kommt ein neues Warning:

    Code:
    Warning	1	'btn' is used uninitialized in this function [-Wuninitialized]	C:\Users\Dennis\Documents\GccApplication2\GccApplication2\GccApplication2.c	35	8	GccApplication2

  7. #17
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Junge, Junge, ...
    Lern doch bitte erstmal überhaupt programmieren, bevor du dich an Sachen wie µC wagst, sonst wird das nie was.
    Ein einfacheres Warning als das gibts in C vermutlich nicht. Man muss es eh nur auf Deutsch übersetzen und dann hat man schon die Lösung.

    Dieses Forum dient als Anlaufstelle für Probleme. Aber das Problem, dass man nicht programmieren kann, wird hier keiner außer du selbst lösen können!

    mfg

  8. #18
    Neuer Benutzer Öfters hier
    Registriert seit
    11.06.2014
    Beiträge
    9
    Zitat Zitat von Wsk8 Beitrag anzeigen
    Junge, Junge, ...
    Lern doch bitte erstmal überhaupt programmieren, bevor du dich an Sachen wie µC wagst, sonst wird das nie was.
    Ein einfacheres Warning als das gibts in C vermutlich nicht. Man muss es eh nur auf Deutsch übersetzen und dann hat man schon die Lösung.

    Dieses Forum dient als Anlaufstelle für Probleme. Aber das Problem, dass man nicht programmieren kann, wird hier keiner außer du selbst lösen können!

    mfg
    Dieser freundliche Umgangston hier wieder...

    Tut mir echt Leid das ich noch kein "Programmier-Profi" bin wie hier andere vielleicht. Ich habe auch eine Seite zuvor geschrieben das ich dieses Programm mit meinen Kenntnissen noch nicht verstehe!

    Da mir hier dennoch von einem sehr freundlichen Mitglied Lösungsvorschläge und Programme geschrieben werden wird es mir doch hoffentlich erlaubt sein diesem Mitglied oder anderen zu "zeigen" was mein Compiler ausspuckt.

    Das Warning auf deutsch übersetzten kann ich wohl aber danke für den Tipp. Dennoch weiß ich nun mal nicht wie die Variable in diesem Fall initialisiert werden muss. Zumal das Programm auf dem Testboard halt auch noch nicht funktioniert.

    Tut mir leid das ich noch in den "Anfängen" von C stecke und mit Pointern und sowas noch nicht perfekt umgehen kann....

    Grüße
    Dennis

  9. #19
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Ich will hier sicher keinen Beleidigen, aber was denkst du warum hier so gut wie niemand schreibt?? Weil eben keiner Lust hat, jeden Anfänger immer wieder aufs neue die Basics von C zu sagen wo sich überall im Internet finden. Es gibt so viiiiieeele Tutorials wo einem alles erklärt wird und im Zweifelsfall hat bisher Google immer noch geholfen.

    C auf µC ist halt nun mal etwas schwerer als auf dem PC, vor allem weil oft die Möglichkeit zum debuggen fehlt. In vielen Programmiersprachen sind Pointer nicht mal vorhanden, da man sie als zu gefährlich ansieht und das sind sie auch! Am PC stürzt halt mal ein Programm ab, auf einem µC stürzt der ganze µC ab und macht gar nichts.

    Bevor man auf einem µc mit C arbeiten kann, muss man zuerst die Basics von C verstehen und dazu gehören unter anderem Compilermeldungen, Pointer, Variablen, Funktionen etc....

    Bevor du ein Rennfahrer werden kannst, musst du auch erst einmal lernen wie man überhaupt Auto fährt!

    Und solange du das nicht verinnerlicht hast, kann ich nur viel Spaß beim scheitern wünschen und früher oder später wirst du dadurch die Lust an der Materie verlieren.

    mfg

  10. #20
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Zitat Zitat von Wsk8 Beitrag anzeigen
    Nein, die Funktion würde schon passen. Das Problem ist der Aufruf
    Code:
    byte* btn;
    byte code_nr = checkButtons(&btn, codes, buttons);
    btn ist bereits ein Pointer und kann ohne & übergeben werden. Hier wird ein Pointer auf einen Pointer übergeben!

    mfg
    Klar, es muss stehen (ohne Stern):
    byte btn;

    Die Adresse von btn soll der Funktion übergeben werden, damit die Nummer der gedrückten Taste zusätzlich zur Codenummer zurückgegeben werden kann.

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Attiny13a RS232
    Von flecralf im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 09.10.2013, 19:27
  2. Variablen ändern sich durch Berechnung anderer Variablen
    Von Amri im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 03.05.2013, 18:30
  3. Kann Schalter nicht abfragen
    Von Icon2k im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 30.07.2010, 18:51
  4. Entprellung
    Von wolfshund im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 2
    Letzter Beitrag: 08.05.2007, 21:21
  5. Entprellung
    Von djdune im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 10.06.2004, 22:49

Stichworte

Berechtigungen

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

Labornetzteil AliExpress