-         

Ergebnis 1 bis 10 von 10

Thema: Erste Schritte in C -> Taster abfragen

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.11.2005
    Beiträge
    272

    Erste Schritte in C -> Taster abfragen

    Anzeige

    Hallo,

    ich habe bis jetzt in Bascom programmiert und möchte jetzt auf C umsteigen.

    Das erste Programm war einfach eine LED zum leuchten zu bringen. Das ging einfach

    Jetzt möchte ich gern einen Taster benutzten. Und das versuche ich jetzt seit zwei Tagen. Ich verwende AVR Studio und das Atmega Board von Pollin.

    Code:
    /* LED Test für Pollin Board */
    
    #include <avr/io.h>
    #include <stdint.h>
    
    #ifndef F_CPU
    #define F_CPU 8000000
    #endif 
    
    int main (void)
    {
    
    //************ LED **********************************************	
    
    	/*DDRD = 0xff; 					/* Alle Pins des Portes werden zu Ausgängen */
    	DDRD  |= (1<<PD6) | (1<<PD5); 	/* Pin D6 und D5 als Ausgang */
    
    //************ Taster *******************************************
    
    	DDRD  &= ~ (1<<PD2); 			/* Pin D2 als Eingang */
    //	PORTD |= (1<<PD2); 				/* Pull Up von PIN D2 aktivieren */
    
    	PORTD |= (1<<PD6);				/* LED PD6 zum testen */
    
    
    	if ( PIND & ( 1<<PIND2 ) );		/* mache was wenn PinD2 High ist */
    	{
    
    		PORTD |= (1<<PD5); 		/* Setzt Pin D5 auf High */
    
    	}
    
    	PORTD &= ~ (1<<PD5); 			/* Setzt Pin D5 wieder auf low */
    	
    return 0;
    
    }
    Die Lampe an Port D6 geht Problemlos. Aber die LED an D5 reagiert nicht auf einen Tastendruck. Sie leuchtet aber komischerweise ganz schwach.

    Achja, die Taster geben in gedrückten Zustand ein High Signal ab.

    Ich vermute mal das ich irgendwo einen Fehler habe. Könnt ihr mir bitte helfen. Mit Hilfe eines Bascom Programmes konnte ich die Hardware testen, sie ist IO.

    Thx Arno
    Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
    Sir Isaac Newton

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    24.09.2006
    Beiträge
    84
    Hi, bei dir fehlt die Endlosschleife. Dein Programm wird quasi nur einmal ausgeführt und danach nicht mehr.
    So dürfte es funktionieren:

    Code:
    /* LED Test für Pollin Board */
    
    #include <avr/io.h>
    #include <stdint.h>
    
    #ifndef F_CPU
    #define F_CPU 8000000
    #endif
    
    int main (void)
    {
    
    //************ LED **********************************************   
    
       /*DDRD = 0xff;                /* Alle Pins des Portes werden zu Ausgängen */
       DDRD  |= (1<<PD6) | (1<<PD5);    /* Pin D6 und D5 als Ausgang */
    
    //************ Taster *******************************************
    
       DDRD  &= ~ (1<<PD2);          /* Pin D2 als Eingang */
    //   PORTD |= (1<<PD2);             /* Pull Up von PIN D2 aktivieren */
    
       PORTD |= (1<<PD6);            /* LED PD6 zum testen */
    
       while(1)
       {
         if ( PIND & ( 1<<PIND2 ) );      /* mache was wenn PinD2 High ist */
          {
             PORTD |= (1<<PD5);       /* Setzt Pin D5 auf High */
             //_delay_ms(20);
          }
    
          PORTD &= ~ (1<<PD5);          /* Setzt Pin D5 wieder auf low */
    }
    return 0;
    
    }
    Allerdings wird dieser Code wohl auch nur so halb funktionieren, für eine richtige Funktion des Tasters musst du diesen noch Entprellen. Wie das funktioniert wird in verschiedenen Tutorials beschrieben. Viele Grüße CsT

    PS: Wenn das Programm so nicht funktioniert, dann kommentiere die Zeile mit dem _delay_ms aus

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.11.2005
    Beiträge
    272
    danke für deine Atwort,

    aber es geht leider immer noch nicht.

    Das mit dem Entprellen weiß ich, aber es müsste ja erstmal die LED angehen oder aus. Aber die leuchtet halt ganz schwach ohne das ich einen Taster berühre. Und wenn ich ihn drücke, dann passiert nichts.

    thx Arno
    Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
    Sir Isaac Newton

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.183
    Nach der Klammer der if-Schleife gehört der ; weg sonst ist die Abfrage sinnlos.
    Das _delay_ms(20) ist zu wenig, da flimmert die Led nur schwach.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    24.09.2006
    Beiträge
    84
    Oh mein Gott .. das ; hab ich ja komplett übersehen. Das _delay_ms hab ich erstmal nur reingenommen, damit überhaupt was flimmert .. aber bitte keine (viel) größeren Werte nehmen, da _delay_ms nur bis zu einer bestimmten Zeit gewartet werden kann .. wenn dann eine for-Schleife drumherum. So z.B.

    Code:
    for(uint8_t i=0; i<20; i++)
    {
        _delay_ms(20);
    }
    Viele Grüße
    CsT

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    hier gehört durchaus auch noch ein else hinein, sonst schaltet der sofort wieder um, falls es mal high sein sollte !
    Code:
       while(1)
       {
         if ( PIND & ( 1<<PIND2 ) )      /* mache was wenn PinD2 High ist */
          {
             PORTD |= (1<<PD5);       /* Setzt Pin D5 auf High */
          }
         else {
          PORTD &= ~ (1<<PD5);          /* Setzt Pin D5 wieder auf low */
         }
         //_delay_ms(20); // wenn delay, dann hier, damit beide Anzeigen zu erkennen sind !
    }
    return 0;
    
    }

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.11.2005
    Beiträge
    272
    Hallo,

    danke für eure zahlreichen Antworten.

    Das mit dem Else werde ich dann zu hause gleich mal testen.

    Mit dem Delay habe ich noch Verständissprobleme. Habe mir gestern mal ein kleines Blinklicht pogrammiert. Und dort leuchtet die LED dauerhaft. Habe das Delay auf 250 gesetzt (habe´gelesen das ich den Wert nicht über 266 legen darf ?!).

    Werde dazu heute nocchmal in der Wiki schauen.

    thx Arno
    Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
    Sir Isaac Newton

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2007
    Ort
    Bayern
    Alter
    29
    Beiträge
    116
    Mal eine Frage:

    in der Datei delay.h steht
    Code:
    The maximal possible delay is 262.14 ms / F_CPU in MHz.
    Heißt das jetzt das ich pro 1 MHz eine Pause von ~260ms machen kann, also nutze ich einen 16 MHz Quarz, dann kann ich max. ~4160ms Pause machen, betreibe ich hingegen nur 1 MHz, gehen nur ~260ms?

    mfg
    Benny
    cooming soon...

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.183
    Nein, umgekehrt. Mit 1MHz Quarz gehen 262.14ms und mit 16MHz Quarz sind es 16.38ms. Das wird mit Schleifen gemacht, mit einem schnelleren Quarz sind sie schneller durchlaufen.
    Lies dir das über Timer/Counter: http://www.roboternetz.de/wissen/ind...nter_%28Avr%29
    http://www.mikrocontroller.net/artic...ounter_des_AVR

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.11.2005
    Beiträge
    272
    Hallo,

    danke für eure Hilfe. Das Programmm funktioniert jetzt super.

    Das lag echt an dem vergessenen Else und an dem ; hinter dem While und dem If.

    Und durch diese Tips habe ich auch mein LED Blinklicht Programm hinbekommmen.

    danke für eure Hilfe

    cu Arno
    Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
    Sir Isaac Newton

Berechtigungen

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