hallo ich habe 2 taster an meine board und möchte gerne eine LED einschalten. Die LED soll nur an sein wenn ich einen taster gedrückt halte. Bei meinem Programm funktioniert es aber genau umgekehrt, die LED ist permanent an und wenn ich den taster drücke geht sie aus, sogar wenn ich den 2.taster drücke geht sie aus. #include <avr/io.h> int main () { DDRB = (1 << PB5) if( (PIND & ( 1 << PD0 )) == 0 ){ PORTB |= (1 << PB5); } return 0; }
Was hast du für ein Potential an PD0 wenn kein Taster gedrückt ist? if ( !(PIND & (1<<PIND0)) ) Das wäre die bessere Abfrage.
Vielleicht doch noch das Tutorial durchsehen: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Wie sich dein Aufbau benimmt, hängt nicht nur von dem Programm ab, sondern auch von der Schaltung. Es gibt soooh viele Boards.
mittlerweile habe ich schon alles durch er machts immer noch genauso wie beschrieben. Wie überprüfe ich überhaupt ob der taster gegen masse geschalten ist ??? #include <avr/io.h> int main () { DDRD|= (1<<PD0) ; // inneren Pull-up Widerstand aktivieren DDRB|= (1<<PB7) | (1<<PB4); // PB7 auf Ausgang PORTB|= (1<<PB4); if(PIND & ~(1<<PD0)==0){ // PIND= 0b00000001 & 0b00000000 == 0??? PORTB|=(1<<PB7); // LED an } return 0; }
marvin schrieb: > Wie überprüfe ich überhaupt ob der taster gegen masse > geschalten ist ??? Auf dem Board nachgucken oder mit einem Multimeter die Spannung am PD0 nachmessen?
Hubert G. schrieb: > Vielleicht doch noch das Tutorial durchsehen: > http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial Mann, RTFM. Das ist nicht umsonst so toll beschrieben, sogar mit Codeschnipseln. Und im normalen Tut. findest auch noch mehr Beschaltungen. Das wird schon. Tm
So, aber den service gibbets nich immer: #define F_CPU 1000000UL // 1 MHz #include <avr/io.h> #define LED PORTB1 // Port musst du wissen #define TASTER1 PORTB2 // dito #define TASTER2 PORTB3 // dito int main(void) { DDRB &= ~(1<<TASTER1) | ~(1<<TASTER2); // Port B: Eingang für Taster DDRB |= (1<<LED); // Port B: Ausgang für LED PORTB |= (1<<TASTER1) | (1<<TASTER2); // Interne Pullups anknipsen char taster1_pressed=0; // Eine Flag wird gesetzt, ob taster gedrueckt char taster2_pressed=0; char led_is_on=0; PORTB &= ~(1<<(LED)) // LED ausschalten while(1) { // da darfste selber knabbern } return 0; }
Schon mal etwas von der Hauptschleife ala whiel(1) { } gehört? Oder ignorierst du irgendwie hier alles und schreibst einfach immer das gleiche?
Ich wette das ist so ein sozialpädagoge der testen will wie weit man die leute hier am wochenende auf die palme bringen kann :D
danke ich habs jetzt^^ #include <avr/io.h> int main() { DDRD &=~(1<<PD0); // internen pull-up DDRB |= (1<<PB7); //LED PORTD|= (1<<PD0); // internen pullup PORTB&= ~(1<<PB7); while(1) { if(!(PIND&(1<<PIND0))){ PORTB|= (1<<PB7); } } return 0; }
marvin schrieb: > danke > > ich habs jetzt^^ aber die äussere Form! Gewöhn dir von Anfang an an: nach einer { wird um 2 Zeichen eingerückt. Die zugehörige } wird wieder um 2 Zeichen ausgerückt. So sieht man auf einen Blick, wo Schleifen sind, wo if sind, und welche Anweisungen von ihnen kontrolliert werden. Dein Miniprogramm kannst du so noch überblicken, keine Frage. Aber das wird sich sehr schnell ändern und dann sind die Einrückungen (und ein paar strategische Leerzeichen die den Lesefluss verbessern) deine erste Front im Kampf gegen die Komplexität.
1 | #include <avr/io.h> |
2 | |
3 | int main() |
4 | {
|
5 | DDRD &=~(1<<PD0); // internen pull-up |
6 | DDRB |= (1<<PB7); //LED |
7 | |
8 | PORTD |= (1<<PD0); // internen pullup |
9 | PORTB &= ~(1<<PB7); |
10 | |
11 | |
12 | while( 1 ) { |
13 | |
14 | if( !(PIND & (1<<PIND0)) ) { |
15 | PORTB |= (1<<PB7); |
16 | }
|
17 | else { |
18 | PORTB &= ~(1<<PB7); |
19 | }
|
20 | }
|
21 | |
22 | return 0; |
23 | }
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.