Bringe Taster nicht zum laufen

Gast #3674912
Lesenswert?

Ich bin ein absoluter Anfänger im Programmieren von Mikrocontrollern. 
Ich habe bisher kleine LED Schaltungen im Atmel Studio in C 
programmiert. Die haben prima geklappt, aber ich krieg des mit den 
Tastern net hin. Ich will dass eine LED beim erten Tastendruck angeht 
und beim nächsten wieder ausgeht. Kann mir bitte jemand helfen, ich hab 
schon edliche Befehle versucht. Schonmal im vorraus danke!
Gast #3674928
Lesenswert?

- Welcher Mikrocontrollertyp genau (AVR/STM32/MSP430), welches Derivat?
- Wie ist der Taster angeschlossen?
- Welchen Code hast du geschrieben der nicht läuft?

Zeig mal was du hast, dann können wir Tipps geben.
Gast #3674932
Lesenswert?

#define F_CPU 20000000UL  //Mikrokontroller Leistung
 #include <util/delay.h>  //einfügen der Zeit funktionen
 #include <avr/io.h>



 int main(void)
 {
   int n=0;
   DDRD=0b1100000;  //PD6 und PD5 LED

  while(1)
  {
    if ( (PIND & (1<<PIND3)) && n==0 )
    {
      PORTD=0b1000000;
      n=1;
    }

    if((PIND & (1<<PIND3)) && n==1)
    {
      PORTD=0b0000000;
      n=0;
    }

  }



Das ist mein bisheriger Code
Gast #3674965
Lesenswert?

Tobias benutzte am besten das mit dem

PORTD ^= (1<<PORTDX);  damit kannst du das in einer IF Abfrage 
abfertigen.

Aber du solltest/musst dir noch etwas zum entprellen Überlegen. Für eine 
sehr einfache, wenn auch nicht die eleganteste Lösung , hast du in 
deinem Programm schon eine lib eingebunden als Tipp.

Das mit den Bit Manipulationen ist im Tutorial nachzulesen genauso wie 
man Taster entprellt.

Generell noch als Tipp gewöhne dir die Schreibweise mit Shift 
Operationen an.
Gast #3674972
Lesenswert?

Tobias schrieb:
> if ( (PIND & (1<<PIND3)) && n==0 )
>     {
>       PORTD=0b1000000;
>       n=1;
>     }
>
>     if((PIND & (1<<PIND3)) && n==1)
>     {
>       PORTD=0b0000000;
>       n=0;
>     }

es tritt in beiden IF. solange bis Sie die Taste loslassen
Fehler = n 1 / n = 0

Loop
erste, n = 0 dann ausführen 1. If > dann n = 1
zwei n = 1 dann ausführen 2. If > dann n = 0
endloop
bis Sie die Taste loslassen

Mfg Ib
#3674989
Lesenswert?

Tobias schrieb:
> Ich benutze das eHajo aTeVal und versuche einen ATTiny2313A.

Daran kann ich nicht erkennen, wie die Taster verschaltet sind.
Wenn sie (was wahrscheinlich ist) nach GND schalten, brauchst Du einen 
Pull-Up-Widerstand. Der sorgt dafür, dass bei offenem Taster ein 
definierter Pegel am Port anliegt. Wenn dieser Widerstand nicht auf der 
Leiterplatte (also extern) ist, musst Du den internen Pull-Up des µC per 
Software einschalten:
1
PORTD |= (1 << PD3);
Allerdings muss Dein Programm dann anders werden, da Du mit ...
1
PORTD=0b1000000;
... das Bit gleich wieder löschst.

Dazu solltest Du Dir das Thema "Bitmanipulation" mal anschauen:
http://www.mikrocontroller.net/articles/Bitmanipulation

Aber das ist unabhängig von den sonstigen Problemen Deiner 
while-Schleife - wie oben schon angedeutet.

Gruß Dietrich
Gast #3674996
Lesenswert?

Ib schrieb:
> es tritt in beiden IF. solange bis Sie die Taste loslassen
> Fehler = n 1 / n = 0
>
> Loop
> erste, n = 0 dann ausführen 1. If > dann n = 1
> zwei n = 1 dann ausführen 2. If > dann n = 0
> endloop
> bis Sie die Taste loslassen
>
> Mfg Ib

Bitte vergessen. war zu schnell
Gast #3675035
Lesenswert?

Ich hab etz ein anderes Programm geschrieben:

 #define F_CPU 20000000UL  //Mikrokontroller Leistung
 #include <util/delay.h>  //einfügen der Zeit funktionen
 #include <avr/io.h>

 int main(void)
 {
   while(1)
   {
    DDRD=0b1100000;  //PD6 und PD5 LED
    if (PIND & (1<<PIND3))
    {
      PORTD=0b1000000;
      _delay_ms(200);
      PORTD=0b0000000;
      PORTD=0b0100000;
      _delay_ms(20);
      PORTD=0b0000000;
    }
  }
 }
______________________________________________________________________ 
___

Das komische an dem Programm ist, es wird irgendwie aktiviert obwohl ich 
den Taster garnicht berühre. Wenn ich meinen Finger si auf 2mm an den 
Taster annähere startet das Programm. woran liegt das???
Gast #3675056
Lesenswert?

Tobias schrieb:
> Das komische an dem Programm ist, es wird irgendwie aktiviert obwohl ich
> den Taster garnicht berühre. Wenn ich meinen Finger si auf 2mm an den
> Taster annähere startet das Programm. woran liegt das???

Es wird nicht ohne Gund nach dem Schaltplan bzw Verschaltung des Tasters 
gefragt. Vermutlich hängt der µC Eingang "in der Luft" da ja auch keine 
internen Pullups aktiviert sind

Mit den Zuweisungen an PORTD beeinflußt du gleich alle Bits obwohl da ja 
auch der Eingang für den Taster ist.
#3675091
Lesenswert?

Tobias schrieb:
> Ich hab etz ein anderes Programm geschrieben:

Schön für Dich.
Und was hast Du Dir dabei gedacht?

Etwas ohne Syntaxfehler hinschreiben kann jeder.
Das Schwere ist nur, daß es auch eine Funktion zuverlässig erfüllen 
soll.

Da aber niemand in Deinen Kopf hineinschauen kann, mußt Du das Programm 
kommentieren, was Du Dir bei jeder Zeile, Funktion, Variable, Zahlenwert 
gedacht hast, wie es funktionieren soll.

Kommentare sind kein überflüssiger Schnickschnack.
Auch Anfänger dürfen kommentieren, nicht nur Profis.
#3675177
Lesenswert?

Mike,

doch man muss sich nur den Schaltplan laden 
http://dokuwiki.ehajo.de/artikel:ateval und dann die entsprechende Seite 
6 aufsuchen.

http://dokuwiki.ehajo.de/_media/bausaetze:evalboard-005.pdf

man nehme den internen Pullup.

Je nach AVR µC gilt diese Belegung:
1
Bezeichnung Attiny13 Attiny2313 Atmega8 Atmega16
2
LED 1       X        PD6        PD6     PD6
3
LED 2       X        PD5        PD5     PD5
4
Taster 1    X        PD2        PD2     PD2
5
Taster 2    X        PD3        PD3     PD3
6
Taster 3    X        PD4        PD4     PD4
7
Poti 1      X        X          PC1     (ADC1)   PA1 (ADC1)
8
Poti 2      X        X          PC0     (ADC0)   PA0 (ADC0)
9
Summer      X        X          PD7     PD7
#3675824
Lesenswert?

Da inzwischen geklärt ist, dass die Taste keinen Pull-Up hat, muss Du 
(Tobias) das Programm ändern.
Hier mal eine Abwandliung Deines letzten Versuchs ohne Anspruch auf 
Schönheit (und hoffentlich richtig):
1
hier der Vorspann, dann:
2

3
int main(void)
4
{
5
  DDRD |= (1<<PD6) | (1<<PD5); // PD6 und PD5 = Ausgang (LEDs)
6
  PORTD |= (1 << PD3);         // PD3 (S2) Pull-Up einschalten
7

8
  while(1)
9
  {
10
    if ((PIND & (1<<PIND3)) == 0) // S2: gedrückte Taste = 0
11
    {
12
      PORTD |= (1<<PD6);   // nur PD6 = 1
13
      _delay_ms(200);
14
      PORTD &= ~(1<<PD6);  // nur PD6 = 0
15
      PORTD |= (1<<PD5);   // nur PD5 = 1
16
      _delay_ms(20);
17
      PORTD &= ~(1<<PD5);  // nur PD5 = 0
18
    }
19
  }
20
}

Gruß Dietrich
#3676561
Lesenswert?

Michael L. schrieb:
> Tim schrieb:
>> Er soll sich lieber gleich den shift angewöhnen.
>
> Ja stimmt, das ist viel lesbarer ... z.B. so hier:
>
>
1
(1<<7)|(1<<6)|(1<<5)|(1<<3)|(1<<2)|(1<<1)
>
> Würg ...

Da spricht ein wahrer Programmierer.

Ich ersetzte die direkte Bitmaske durch ein die Funktion beschreibende 
Defines und füge noch das Macropaket von PeDa Peter hinzu.

*sbit.h*
1
#ifndef sbit_h_
2
#define sbit_h_
3

4
#include <avr\io.h>
5

6
//       Access bits like variables:
7
struct bits {
8
  uint8_t b0:1;
9
  uint8_t b1:1;
10
  uint8_t b2:1;
11
  uint8_t b3:1;
12
  uint8_t b4:1;
13
  uint8_t b5:1;
14
  uint8_t b6:1;
15
  uint8_t b7:1;
16
} __attribute__((__packed__));
17

18
#define SBIT_(port,pin) ((*(volatile struct bits*)&port).b##pin)
19
#define  SBIT(x,y)  SBIT_(x,y)
20

21
#endif
1
#define LED SBIT(portb,0) // Portb Bit0

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren