Forum: Mikrocontroller und Digitale Elektronik taster-problem


von marvin (Gast)


Lesenswert?

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;

}

von Markus O. (pipimaxi)


Lesenswert?

mich wundert ja, dass dein programm überhaupt etwas tut ;-)

von Hubert G. (hubertg)


Lesenswert?

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.

von Olek (Gast)


Lesenswert?

int main ()

{


while(1)
{
  //ich bin eine Schleife
}


return 0;
}

von Hubert G. (hubertg)


Lesenswert?

Vielleicht doch noch das Tutorial durchsehen:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

von Michael (Gast)


Lesenswert?

Wie sich dein Aufbau benimmt, hängt nicht nur von dem Programm ab, 
sondern auch von der Schaltung.
Es gibt soooh viele Boards.

von marvin (Gast)


Lesenswert?

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;

}

von Michael (Gast)


Lesenswert?

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?

von Tim M. (tim_m)


Lesenswert?

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

von Tim M. (tim_m)


Lesenswert?

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;
}

von Christian H. (christian_h)


Lesenswert?

Schon mal etwas von der Hauptschleife ala whiel(1) {   } gehört? Oder 
ignorierst du irgendwie hier alles und schreibst einfach immer das 
gleiche?

von Olek (Gast)


Lesenswert?

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

von marvin (Gast)


Lesenswert?

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;

}

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.