PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mega32 LED anschalten über Taster



Ezalo
24.10.2010, 16:35
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:


#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:


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

BMS
24.10.2010, 17:02
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.



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?

Ezalo
24.10.2010, 17:08
Ok, scheint zu funktionier ^^

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

BMS
24.10.2010, 17:11
Na also, geht doch ;)
Ist bestimmt für dein MoBa.-Projekt, oder?

Ezalo
24.10.2010, 17:14
Jop, aber wieso glimmt die LED?
Sie ist doch eigentlich mit:



PORTA &= ~(1<<PA0);


ausgeschalten oder etwa nicht?

Und die LED wird ja durch einen Transistor ersetzt werden.

BMS
24.10.2010, 17:26
Hab noch was entdeckt


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:


PORTA |= (1<<PA1); //PA1 auf High setzen


Nun sollte es klappen - so wie du dir das vorstellst :-b

Grüße,
Bernhard

Ezalo
24.10.2010, 17:34
So funktionierts, danke :D