- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Simple Tasterabfrage funktioniert nicht (PullUp-Widerstand)

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    25.07.2007
    Ort
    Bookholzberg
    Beiträge
    68

    Simple Tasterabfrage funktioniert nicht (PullUp-Widerstand)

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hey Leute!
    Wünsch euch erstmal `n schönes Wochenende an dieser Stelle.

    Das doofe ist nur bei mir fiel es bisher noch nciht wirklich gut aus
    Ich habe bis heute Nacht um 02:00Uhr daran gesessen und bekomme es einfach nicht zum laufen.

    Warscheinlich wird es irgendwo nur ein denkfehler sein aber ich komm einfach nicht drauf.

    Wir, also unsere Gruppe, haben an einem (selbstgebauten) Controllerboard folgende Taster:

    -> PC 4 bis PC 7

    Diese haben wir mit Masse angeschlossen, bedeutet wenn man einen Taster drückt, kommt Masse an dem einzelnen PIN an.

    Für eine simple Tasterabfrage muss man ja nun also die PULL-UP Widerstände einschalten und natürlich auf EINGANG schalten.

    Vielleicht ist es relevant, vielleicht nicht ich weiß es nicht
    Wir nutzen den ATMega644P und betreiben das ganze mit einem 16Mhz Quarz.






    Code:
    #include <avr/io.h>
    #include <inttypes.h>
    #define F_CPU = 16000000UL
    #include <util/delay.h> // Benutzen eine aktuelle AVR-LIB
     
    /* Einfache Funktion zum Entprellen eines Tasters */
    inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
    {
        if ( ! (*port & (1 << pin)) )
        {
            /* Pin wurde auf Masse gezogen, 100ms warten   */
            _delay_ms(50);  // max. 262.1 ms / F_CPU in MHz
            _delay_ms(50); 
            if ( *port & (1 << pin) )
            {
                /* Anwender Zeit zum Loslassen des Tasters geben */
                _delay_ms(50);
                _delay_ms(50); 
                return 1;
            }
        }
        return 0;
    }
    
    
     
    int main(void)
    {
    DDRB = (1 << DDB0); // Für die LED's die beim drücken eigentlich angehen sollten
        DDRC &= ~( 1 << PC4 );                 /* PIN PB0 auf Eingang (Taster)            */
        PORTC |= ( 1 << PC4 );                 /* Pullup-Widerstand aktivieren            */
        
        if (debounce(&PINC, PC4))fe
    	{   
    		
            PORTB |= (1 << 0); // Schaltet 2 LED's ein...
        }
    }
    Wir hatten eigentlich vor das ganze per Interrupt zu machen.
    Wenn also der Taster gedrückt wurde soll im Hauptprogramm eigentlich nur noch geprüft werden...
    if(taster==1){...}else if{...}
    Das Hauptprogramm soll ja zügig weiterlaufen...

    aber wenn wir daran schon scheitern?

    Vielleicht hat ja wer ein Beispiel parat, bin für jede Hilfe dankbar!

    Grüße aus Bookholzberg

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Wenn ich einen Taster abfragen will, mache ich es so:
    Code:
    void main()
    {
    DDRX |= (1 << PXx); //internen PullUp aktivieren
    while(1)
    {
    if(!(PINX & (1 << PXx))) //abfragen
    { //wenn gedrückt
    ...
    _delay_ms(200); //entprellen
    }
    }
    }
    Das funktioniert ohne Probleme.

    mfg

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    55
    Beiträge
    524
    Hallo,

    auf den ersten Blick ist offensichtlich, dass keine Schleife in der main() vorhanden ist. Das Programm wird einmal durchlaufen und dann? Dann passiert nix mehr.

    Dann bitte original Code per copy und past einfügen. Es ist ärgerlich, wenn einfache Schreibfehler vom eigentlichen Problem ablenken.

    Gruß

    Jens

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ich bin auch noch Tastenneuling, mein erster Versuch sieht so aus:
    Code:
    uint8_t lcd_getkeys(void)
    {
    	uint8_t keys=0;
    	el;                           // Auf keinen Fall Daten zum Display schicken
    	DDRC &= ~SL1;						// D4-D7 und RS auf Eingang mit PullUp schalten
    	PORTC|=SL1;
    	DDRC &= ~SL2;
    	PORTC|=SL3;
    	DDRC &= ~SL3;
    	PORTC|=SL2;
    	DDRB &= ~SL4;
    	PORTB|=SL4;
    	DDRB &= ~SL5;
    	PORTB|=SL5;
    
    	if(PINC & SL1) keys |= 8;     // einzelne Taster einlesen
    	if(PINC & SL2) keys |= 4;
    	if(PINC & SL3) keys |= 16;
    	if(PINB & SL4) keys |= 2;
    	if(PINB & SL5) keys |= 1;
    
    	DDRC |= 0x70;						// LED1-3 wieder auf Ausgang und low
    	PORTC &= ~0x70;
    	DDRB |= 0x83;						// LED4-6 wieder auf Ausgang und low
    	PORTB &= ~0x83;
    	rsh;                          // RS wieder auf Daten schreiben setzen
    	return(~keys & 0b11111);      // Bit gesetzt= Taster gedrückt (bit0-4)
    }
    Die 5 Taster werden als Bit0 bis Bit4 im Rückgabewert zurückgegeben.

    Der Test auf eine gedrückte Taste:
    if(lcd_getkeys()) ...

    Entprellen:
    taste=lcd_getkeys();
    if(taste && (taste == lcd_getkeys()))...

    Vielleicht hilft dir das weiter.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    25.07.2007
    Ort
    Bookholzberg
    Beiträge
    68
    mhmmm hab folgendes nun mal ausprobiert...

    Code:
    #include <avr/io.h>
    #include <inttypes.h>
    #include <util/delay.h>
    #define F_CPU = 16000000UL
    
    
    int main() 
    { 
    	DDRC |= (1 << PC4); //internen PullUp aktivieren 
    	while(1) 
    	{ 
    		if(!(PINC & (1 << PC4))) //abfragen 
    		{ //wenn gedrückt 
    			DDRB = (1 << DDB0); 
    			 PORTB |= (1 << 0); // Schaltet 2 LED's ein... 
    			_delay_ms(200); //entprellen 
    		} 
    	} 
    	return 0;
    }
    funktioniert aber immernoch net... werde mal gleich andere Kabel anlöten und schaun was passiert wenn ich andere Ports wähle...

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    DDRB = (1 << DDB0);
    PORTB |= (1 << 0); // Schaltet 2 LED's ein...
    Ich glaube der Fehler liegt in diesen 2 Zeilen. Sie müssten so lauten:
    Code:
    DDRB |= (1 << PB0);
    PORTB |= (1 << PB0);

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    25.07.2007
    Ort
    Bookholzberg
    Beiträge
    68
    Zitat Zitat von _R2D2
    DDRB = (1 << DDB0);
    PORTB |= (1 << 0); // Schaltet 2 LED's ein...
    Ich glaube der Fehler liegt in diesen 2 Zeilen. Sie müssten so lauten:
    Code:
    DDRB |= (1 << PB0);
    PORTB |= (1 << PB0);
    daran hat es leider nicht gelegen... hatte das auch einmal nur so in der Main stehen und die LED's leuchteten...

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Die defines aus iomxx4.h:
    Code:
    #define DDRB	_SFR_IO8(0x04)
    #define DDB7	7
    #define DDB6	6
    #define DDB5	5
    #define DDB4	4
    #define DDB3	3
    #define DDB2	2
    #define DDB1	1
    #define DDB0	0
    
    #define PORTB	_SFR_IO8(0x05)
    #define PB7	7
    #define PB6	6
    #define PB5	5
    #define PB4	4
    #define PB3	3
    #define PB2	2
    #define PB1	1
    #define PB0	0
    Sowohl DDB0 als auch PB0 werden durch 0 ersetzt, beides bedeutet dann:

    DDRB = (1<<0);
    PORTB |= (1<<0);

    oder kurz

    DDRB = 1;
    PORTB |= 1;

    Ähm, btw:

    DDRC |= (1 << PC4); //internen PullUp aktivieren

    Hier wird nicht der PullUp aktiviert sondern auf Ausgang geschaltet!
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Hast du auch alles richtig angeschlossen? Funktioniert der µC, die LEDs, die Taste?

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    25.07.2007
    Ort
    Bookholzberg
    Beiträge
    68
    so....
    Code:
    #include <avr/io.h> 
    #include <inttypes.h> 
    #include <util/delay.h> 
    #define F_CPU = 16000000UL 
    
    
    int main() 
    { 
       DDRC |= (1 << PC4); //internen PullUp aktivieren 
       while(1) 
       { 
          if(!(PINC & (1 << PC4))) //abfragen 
          { //wenn gedrückt 
              DDRB = (1 << DDB0); 
              PORTB |= (1 << 0); // Schaltet 2 LED's ein... 
             _delay_ms(200); //entprellen 
          } 
       } 
       return 0; 
    }
    bewirkt gerade bei mir das meine LED leuchtet ABER ohne eine Taste zu drücken... müsste doch heißen das ich bereits Masse auf dem Pin habe versteh das ich richtig? PULL-UP Widerstand ist ja an

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests