- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 7 von 7

Thema: Mega32 LED anschalten über Taster

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2010
    Alter
    34
    Beiträge
    228

    Mega32 LED anschalten über Taster

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich weiß absolut nicht mehr weiter.

    Seit gestern Versuche ich über einen Mega32 eine LED einzuschalten mithilfe eines Tasters.

    Belegung:
    Masse -> Taster -> PA1
    Masse -> Vorwiderstand -> LED -> PA0


    Dazu folgendes Programm:

    Code:
    #ifndef MCU             // Welcher AVR genutzt wird, wird i.A. im Makefile definiert
    #define MCU  atmega32
    #endif
    
    #ifndef F_CPU           // kann auch im Makefile definiert sein
    #define F_CPU 16000000UL // Takt als LONG definieren, da zu groß für Integer 
    #endif
    
    #include <avr/io.h>     // Namen der IO Register
    #include <util/delay.h> // Funktionen zum warten
    // Achtung, damit delay richtig funktioniert muß mit Optimierung compiliert werden
    
    int main(void){
    	DDRA |= 0b00000001;			//PA0 als Ausgang definieren
    	PORTA &= ~(1<<PA0);			//PA0 auf Low schalten (LED aus)
    	PORTA &= ~(1<<PA1);			//PA1 auf High setzen
    	while(1){
    		if(PINA&(1<<PIN1)){ 	//Wenn Taste gedrückt...
    			PORTA |= (1<<PA0);	//... schalte LED ein
    		}
    	}
    	while(1);
    	return 0;
    }
    Die LED leuchtet immer, egal ob ich dne Taster betätigt habe oder nicht. Eigentlich müsste sie doch erstmal aus sein oder?

    Hab schon google befragt aber nichts gefunden was mein Problem löst.

    MfG

    Ezalo

    Edit:

    Quellcode geändert:

    Code:
    int main(void){
    	DDRA |= 0b00000001;			//PA0 als Ausgang definieren
    	PORTA &= ~(1<<PA0);			//PA0 auf Low schalten (LED aus)
    	PORTA &= ~(1<<PA1);			//PA1 auf High setzen
    	while(1){
    		if(PINA&(1<<PIN1)){ 	//Wenn Taste gedrückt...
    			PORTA |= (1<<PA0);	//... schalte LED ein
    		}
    		else{
    			PORTA &= ~(1<<PA0);
    		}
    	}
    	while(1);
    	return 0;
    }
    Erklärung was jetzt passiert:

    - LED an
    - Wenn Taster mit GND verbundne LED aus > egal ob Taster gedrückt oder nicht... < versteh ich nicht wieso...
    - Wenn GND wieder entfernt von Taster und Taster betätigt geht die LED wieder an
    - GND von Taster wieder angeschlossen -> LED aus

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    32
    Beiträge
    1.192
    Hallo Ezalo,

    du hast geschrieben, der Taster zieht auf Masse. Deine If-Abfrage prüft jedoch, ob am Eingang "1" anliegt, d.h. wenn der Taster NICHT gedrückt ist.
    Mit einem Ausrufezeichen vor der if-Bedingung wird das umgedreht.
    Oder du lässt den Inhalt der if-Bedingung gleich und tauschst die LED-An und LED-Aus-Befehle.

    Code:
    int main(void){
       DDRA |= 0b00000001;         //PA0 als Ausgang definieren
       PORTA &= ~(1<<PA0);         //PA0 auf Low schalten (LED aus)
       PORTA &= ~(1<<PA1);         //PA1 auf High setzen
       while(1){
          if(!(PINA&(1<<PIN1))){    //Hier vorne das Ausrufezeichen beachten! Wenn Taste gedrückt...
             PORTA |= (1<<PA0);   //... schalte LED ein
          }
          else{
             PORTA &= ~(1<<PA0);
          }
       }
       while(1);   //das kannst du noch weglassen, hier kommt der Atmega nie hin!
       return 0;
    }
    Grüße,
    Bernhard

    EDIT:
    Wie sehen denn die Taster aus? Wie viele Anschlüsse haben die?

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2010
    Alter
    34
    Beiträge
    228
    Ok, scheint zu funktionier ^^

    Blöd das die LED so hell glimmmt, man sieht kaum einen Unterschied zwischen an und aus.

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    32
    Beiträge
    1.192
    Na also, geht doch
    Ist bestimmt für dein MoBa.-Projekt, oder?

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2010
    Alter
    34
    Beiträge
    228
    Jop, aber wieso glimmt die LED?
    Sie ist doch eigentlich mit:

    Code:
    PORTA &= ~(1<<PA0);
    ausgeschalten oder etwa nicht?

    Und die LED wird ja durch einen Transistor ersetzt werden.

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    32
    Beiträge
    1.192
    Hab noch was entdeckt
    Code:
       PORTA &= ~(1<<PA1);         //PA1 auf High setzen
    damit wolltest du wahrscheinlich den Pull-up von PA1 einschalten. Hier wird der Pull-up aber gerade deaktiviert.

    Grund dafür, dass die LED nur glimmt: Wenn der Pull-up deaktiviert ist und du den Taster nicht drückst, dann hängt der Eingang in der Luft, hat kein definiertes Potenzial. Fängt wahrscheinlich 50Hz Brumm ein.

    Richtig muss es heißen:
    Code:
       PORTA |= (1<<PA1);         //PA1 auf High setzen
    Nun sollte es klappen - so wie du dir das vorstellst

    Grüße,
    Bernhard

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2010
    Alter
    34
    Beiträge
    228
    So funktionierts, danke

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad