- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Problem mit Taster ab frage

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    43
    Beiträge
    230

    Problem mit Taster ab frage

    Anzeige

    Praxistest und DIY Projekte
    Hallo

    Ich habe mal wider ein Programm zum Ausprobieren und weis nicht, warum es nicht richtig läuft, ich möchte zwischen den tasten hin und her schalten können und wen ich keine Taste drücke Dan möchte ich zum aus Wahl Menü geleitet werden.

    Code:
    // 
    //    ATMega644
    //    lcd-routines.c, lcd-routines.h
    // 
    #include <avr/io.h>
    #include <util/delay.h> 
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <stdlib.h>
    #include "lcd-routines.h"
    
    //#include "lcd-routines.c"
    
    
    int main(void)
    {
      
      // Initialisierung des LCD
      // Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken
      // verschwunden sein
      lcd_init();
      
      lcd_string("LCD Start !!!");
    
        _delay_ms(100);  //Gibt einem die moeglichckeit zu lesen was auf dem LCD stht
    
    DDRD = 0x00;
    PORTD = 0xff;    
    while(1)
        {
    lcd_clear();
    lcd_home();
    lcd_string("Taste 0-3 drucke");
    
        _delay_ms(100);
    
    lcd_clear();
    
    while (PIND & (1<<PD0))
    {
    
    lcd_home();
    lcd_string("Das ist Taste 0");
    }
        
    while (PIND & (1<<PD1))
    {    
    
    lcd_home();
    lcd_string("Das ist Taste 1");
    }    
    
    while (PIND & (1<<PD2))
    {    
    
    lcd_home();
    lcd_string("Das ist Taste 2");
    }
    
    while (PIND & (1<<PD3))
    {    
    
    lcd_home();
    lcd_string("Das ist Taste 3");
    }        
            
        }
    
    }
    by Ferdinand
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Hast du den Taster auch mit einem Pull-Up Widerstand an Vcc angeschlossen?
    Wieso aktivierst du an PortD die Pull-Up Widerstände?
    Mach das:

    PortD = 0xFF;

    mal weg. Ist doch bischen sinnlos den Pin auf 1 zu setzten und ihn dann nach 1 abzufragen
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  3. #3
    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

    Die Taster können auch gegen GND schalten:

    Code:
    //
    //    ATMega644
    //    lcd-routines.c, lcd-routines.h
    //
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <stdlib.h>
    #include "lcd-routines.h"
    
    uint8_t temp;
    
    int main(void)
    {
    	DDRD = 0x00; // Pins sind Eingang
    	PORTD = 0x0f; // mit aktiviertem PullUp, Taster schalten nach GND
    
    	// Initialisierung des LCD
    	// Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken
    	// verschwunden sein
    	lcd_init();
    
    	lcd_string("LCD Start !!!");
    	_delay_ms(100); //Gibt einem die moeglichckeit zu lesen was auf dem LCD steht
    
    	temp = PIND & 0b00001111; // Status der Tasten einlesen
    
    	while(1)
    	{
    		if((PIND & 0b00001111) != temp) // Hat sich was geändert?
    		{
    		   temp = PIND & 0b00001111; // Ja, deshalb neuen Status merken ...
    			lcd_clear(); // ... und ausgeben
    		   switch(temp)
    		   {
    				case 0b1110: lcd_string("Das ist Taste 0"); break;
    				case 0b1101: lcd_string("Das ist Taste 1"); break;
    				case 0b1011: lcd_string("Das ist Taste 2"); break;
    				case 0b0111: lcd_string("Das ist Taste 3"); break;
    				default:	lcd_string("Taste druecken");
    			}
    		}
    	}
    	return(0);
    }
    (ungetestet)

    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!

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Zitat Zitat von radbruch Beitrag anzeigen
    Hallo

    Die Taster können auch gegen GND schalten:

    Code:
    //
    //    ATMega644
    //    lcd-routines.c, lcd-routines.h
    //
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <stdlib.h>
    #include "lcd-routines.h"
    
    uint8_t temp;
    
    int main(void)
    {
        DDRD = 0x00; // Pins sind Eingang
        PORTD = 0x0f; // mit aktiviertem PullUp, Taster schalten nach GND
    
        // Initialisierung des LCD
        // Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken
        // verschwunden sein
        lcd_init();
    
        lcd_string("LCD Start !!!");
        _delay_ms(100); //Gibt einem die moeglichckeit zu lesen was auf dem LCD steht
    
        temp = PIND & 0b00001111; // Status der Tasten einlesen
    
        while(1)
        {
            if((PIND & 0b00001111) != temp) // Hat sich was geändert?
            {
               temp = PIND & 0b00001111; // Ja, deshalb neuen Status merken ...
                lcd_clear(); // ... und ausgeben
               switch(temp)
               {
                    case 0b1110: lcd_string("Das ist Taste 0"); break;
                    case 0b1101: lcd_string("Das ist Taste 1"); break;
                    case 0b1011: lcd_string("Das ist Taste 2"); break;
                    case 0b0111: lcd_string("Das ist Taste 3"); break;
                    default:    lcd_string("Taste druecken");
                }
            }
        }
        return(0);
    }
    (ungetestet)

    Gruß

    mic
    Ja das kannst du natürlich auch machen
    Nur er muss sich halt für eine Methode entscheiden . Was halt nicht funktioniert ist (egal wie er den Taster beschaltet hat) den Pin auf 1 setzt und dann nach 1 abfragt.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  5. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    43
    Beiträge
    230
    Also dein Beispiel hat leider nicht getan, ich habe deine Idee mal versucht umzusetzen.

    Code:
    //
    //    ATMega644
    //    lcd-routines.c, lcd-routines.h
    //
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <stdlib.h>
    #include "lcd-routines.h"
    
    uint8_t tasten;
     
     
    
    int main(void)
    {
        DDRD = 0x00; // Pins sind Eingang
        PORTD = 0xff; // mit aktiviertem PullUp, Taster schalten nach GND
    
        // Initialisierung des LCD
        // Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken
        // verschwunden sein
        lcd_init();
    
        lcd_string("LCD Start !!!");
        _delay_ms(100); //Gibt einem die moeglichckeit zu lesen was auf dem LCD steht
        lcd_home();    
        
        while(1)
        {
            
               
               switch((tasten))
               {
                    case 1: lcd_string("Das ist Taste 0"); lcd_home(); break;
                    
                    case 2: lcd_string("Das ist Taste 1"); lcd_home(); break;
                    
                    case 3: lcd_string("Das ist Taste 2");  lcd_home();break;
                    
                    case 4: lcd_string("Das ist Taste 3"); lcd_home(); break;
                    
                    default: lcd_home(); lcd_string("Taste druecken");
                }
            
        }
        return(0);
    }
    Nur möchte ich das Programm relative einfach halten damit man es gut lesen und relative kann.
    Ich möchte stat 0b00000001 das (1 << PD0) benutzen, weil man Dan sofort erkennt, was gemeind ist.

    Nun wie setz ich so was um?

    Danke
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Code:
    //
    //    ATMega644
    //    lcd-routines.c, lcd-routines.h
    //
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <stdlib.h>
    #include "lcd-routines.h"
    
    uint8_t temp;
    
    int main(void)
    {
    	DDRD = 0x00; // Pins sind Eingang
    	PORTD = 0x0f; // mit aktiviertem PullUp, Taster schalten nach GND
    
    	// Initialisierung des LCD
    	// Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken
    	// verschwunden sein
    	lcd_init();
    
    	lcd_string("LCD Start !!!");
    	_delay_ms(100); //Gibt einem die moeglichckeit zu lesen was auf dem LCD steht
    
    	temp = PIND & ((1<<PD3) | (1<<PD2) | (1<<PD1) | (1<<PD0)) ; // Status der Tasten einlesen
    
    	while(1)
    	{
    		if((PIND & ((1<<PD3) | (1<<PD2) | (1<<PD1) | (1<<PD0))) != temp) // Hat sich was geändert?
    		{
    			temp = PIND & ((1<<PD3) | (1<<PD2) | (1<<PD1) | (1<<PD0)); // Ja, deshalb neuen Status merken ...
    			lcd_clear(); // ... und ausgeben
    			lcd_home();
    			switch(~temp & 0x0f) // Achtung! temp wird mit ~ invertiert!
    			{
    				case (1<<PD0): lcd_string("Das ist Taste 0"); break;
    				case (1<<PD1): lcd_string("Das ist Taste 1"); break;
    				case (1<<PD2): lcd_string("Das ist Taste 2"); break;
    				case (1<<PD3): lcd_string("Das ist Taste 3"); break;
    				default:lcd_string("Taste druecken");
    			}
    		}
    	}
    	return(0);
    }
    Ob das besser zu lesen ist? Deine Taster schalten doch nach GND, oder?
    Geändert von radbruch (05.01.2012 um 22:18 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Wenn die Taster nach GND schalten musst du eine Low Abfrage machen.
    Die machst du (mein ich) so:

    if(!(1<<PD0))
    {
    }

    Das "!" steht dabei für eine Invertierung d.h. wenn PD0 = 1 NICHT erfüllt ist ist die If-Abfrage erfüllt.
    Und wenn du deinen Code besser lesen willst versuch die Kommentare alle an die Seite zu schreiben und auf gleicher Höhe
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  8. #8
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    43
    Beiträge
    230
    ok danke, es geht jetzt.

    Code:
    //
    //    ATMega644
    //    lcd-routines.c, lcd-routines.h
    //
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <stdlib.h>
    #include "lcd-routines.h"
    
    uint8_t temp;
    
    int main(void)
    {
        DDRD = 0x00; // Pins sind Eingang
        PORTD = 0x0f; // mit aktiviertem PullUp, Taster schalten nach GND
    
        // Initialisierung des LCD
        // Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken
        // verschwunden sein
        lcd_init();
    
        lcd_string("LCD Start !!!");
        _delay_ms(2000); //Gibt einem die moeglichckeit zu lesen was auf dem LCD steht
        
        lcd_clear();
        lcd_home();
        lcd_string("Taste druecken");
    
    
        temp = PIND & ((1<<PD3) | (1<<PD2) | (1<<PD1) | (1<<PD0)) ; // Status der Tasten einlesen
    
        while(1)
        {
            if((PIND & ((1<<PD3) | (1<<PD2) | (1<<PD1) | (1<<PD0))) != temp) // Hat sich was geändert?
            {
                temp = PIND & ((1<<PD3) | (1<<PD2) | (1<<PD1) | (1<<PD0)); // Ja, deshalb neuen Status merken ...
                lcd_clear(); // ... und ausgeben
                lcd_home();
                switch(~temp & 0x0f) // Achtung! temp wird mit ~ invertiert!
                {
                    case (1<<PD0): lcd_string("Das ist Taste 0"); break;
                    case (1<<PD1): lcd_string("Das ist Taste 1"); break;
                    case (1<<PD2): lcd_string("Das ist Taste 2"); break;
                    case (1<<PD3): lcd_string("Das ist Taste 3"); break;
                    default:lcd_string("Taste druecken");
                }
            }
        }
        return(0);
    }
    Nun möchte ich aus einem Taster einen Schalter Programmiren, ich habe keine Ahnung, wie ich das anstelle.
    Ja meine Taster schalten nach GND, ich benutze das STK500.
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

  9. #9
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Wenn es ein einfacher Ein/Aus Schalter ist kannst du ihn wie einen Taster im Programm behandeln. Ein Taster schaltet ja auch Ein und wenn du ihn los lässt Aus. Ein Schalter schaltet halt Ein und beim zweiten betätigen Aus. Aber das macht für die Software keinen wesentlichen Unterschied. Nur du darfst den Zustand des Schalters nicht mit "while" Abfragen, weil sich der Controller dann die ganze Zeit in der Schleife aufhält solange du den Schalter nicht nochtmal betätigst.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  10. #10
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    43
    Beiträge
    230
    ok und wie macht Mann das, wen sich der Controller nur in Schleifen bewegt.
    Ich müsste den Aktuellen wert zwischen Speichern, da die aktuelle Abfrage ständig überschrieben wird, nur weis ich nicht wie man so was wegen den Ganzen schleifen hin bekommt.

    Danke
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Problem mit der Taster
    Von oliver123 im Forum Asuro
    Antworten: 6
    Letzter Beitrag: 25.04.2011, 11:46
  2. Frage zu einem Taster
    Von Kesandal im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 15.08.2010, 14:45
  3. Taster erkennungs Problem
    Von patti16 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 01.01.2009, 19:21
  4. Eventuelles Taster Problem
    Von duronus im Forum Asuro
    Antworten: 1
    Letzter Beitrag: 25.01.2007, 10:04
  5. Problem bei Taster Abfrage mit ADC
    Von MartinNRW86 im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 20.09.2006, 14:37

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress