Forum: Mikrocontroller und Digitale Elektronik Bringe Taster nicht zum laufen


von Tobias (Gast)


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!

von Walter (Gast)


Lesenswert?

Hi

Zeig mal deinen Quellcode.

von Tim (Gast)


Lesenswert?

if (PINA & (1 << PINA0))
{
    PORTB ^= (1<<PORTB0);
}

Was das genau macht darfst du jetzt selber herausfinden. Steht alles im 
Tutorial hier auf der Seite.

von Julius .F (Gast)


Lesenswert?

Hi,

das löst du mir einer XOR-Verknüpfung

z.B.

PORTLED ^= ( 1 << LED )
LG Julius

von Thomas (kosmos)


Lesenswert?


von Hmm... (Gast)


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.

von Tobias (Gast)


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

von Walter (Gast)


Lesenswert?

der Taster prellt
-> siehe Entprellung

(Programm geht nicht ist übrigens keine Fehlerbeschreibung)

von Tobias (Gast)


Lesenswert?

aber trotz der Prellung müsste die LED doch zum Leuchten beginnen

von Dietrich L. (dietrichl)


Lesenswert?

Es fehlt immer noch eine Antwort:
Hmm... schrieb:
> - Wie ist der Taster angeschlossen?
d.h.: am besten Schaltplan!

von Walter (Gast)


Lesenswert?

Tobias schrieb:
> trotz der Prellung müsste die LED doch zum Leuchten beginnen

ab und zu ja, je nachdem wann man die Taste loslässt,
während man sie drückt wird die LED ziemlich schnell ein/ausgeschaltet,
also jedenfalls nicht das Verhalten das der TO will

von Tobias (Gast)



Lesenswert?

Ich benutze das eHajo aTeVal und versuche einen ATTiny2313A.
Undich hab noch ne Verzögerung in beiden if Funktionen eingebaut aber es 
passiert immer noch nichts

von Tim (Gast)


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.

von Ib (Gast)


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

von Dietrich L. (dietrichl)


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

von Ib (Gast)


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

von Tobias (Gast)


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???

von SchemaF (Gast)


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.

von Uwe (de0508)


Lesenswert?

Hallo,

das aTeVal Board ist hier komplett beschrieben:

http://dokuwiki.ehajo.de/artikel:ateval

von Peter D. (peda)


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.

von Mike (Gast)


Lesenswert?

Uwe S. schrieb:
> http://dokuwiki.ehajo.de/artikel:ateval

Da haben wir schon den Salat, kein Taster, kein Pull-irgendwo an PD3. 
Was nützt der Link also?

von Peter D. (peda)


Lesenswert?

Allgemein ist zuverlässiges Entprellen nichts, was man so einfach aus 
dem Ärmel schüttelt.
Es lohnt sich also, erstmal die Grundlagen zu lesen bzw. sich bewährte 
Entprellroutinen anzuschauen.

von SchemaF (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Allgemein ist zuverlässiges Entprellen nichts, was man so einfach aus
> dem Ärmel schüttelt.

Das stimmt. Da braucht es schon einen/den echten Entprellspzialisten. 
Ich lach mich weg ... Der arme Tobias.

von Uwe (de0508)


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

: Bearbeitet durch User
von Mike (Gast)


Lesenswert?

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

Sorry, auf solche Suchspiele habe ich echt keinen Bock.

von Uwe (de0508)


Lesenswert?

Naja, ich kann programmieren und hoffte den Suchenden helfen zu können.

von Peter D. (peda)


Lesenswert?

SchemaF schrieb:
> Ich lach mich weg ...

Also mir vergeht regelmäßig das Lachen, wenn ich mich über kommerzielle 
Geräte ärgern muß, die prellen oder Tastendrücke verlieren oder 
Ewigkeiten warten, ehe sie reagieren.

von gequälter (Gast)


Lesenswert?

Taste drücke - "einundzwanzig" - "zweiundzwanzig" - Taste loslassen

Funktioniert eigentlich immer 8-(

von Dietrich L. (dietrichl)


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

von Bernie (Gast)


Lesenswert?

0b0000000 und
0b1000000 sind
---------
--6543210 (Bit-Nr.)

keine richtig definierten Werte für ein 8-Bit-Register.

Probier es doch mal mit
0b00000000
0b10000000
----------
--76543210 (Bit-Nr.)

von Tim (Gast)


Lesenswert?

Er soll sich lieber gleich den shift angewöhnen.

von Michael L. (michaelx)


Lesenswert?

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 ...

von Dennis K. (scarfaceno1)


Lesenswert?

Bernie schrieb:
> 0b0000000 und
> 0b1000000 sind
> ---------
> --6543210 (Bit-Nr.)
>
> keine richtig definierten Werte für ein 8-Bit-Register.
>
> Probier es doch mal mit
> 0b00000000
> 0b10000000
> ----------
> --76543210 (Bit-Nr.)

Wollte es auch gerade erwähnen...

Ist bisher in keinem Post erläutert worden.
Binär Angaben immer in 8-bit Konstellationen.

von Uwe (de0508)


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

von Dietrich L. (dietrichl)


Lesenswert?

Bernie schrieb:

> Probier es doch mal mit
> 0b00000000
> 0b10000000
> ----------
> --76543210 (Bit-Nr.)

Das ist aber falsch, weil die LEDs an PD5 und PD6 angeschlossen sind.

Tobias Version war schon funktionell richtig, aber höchsten unschön. Der 
Compiler fügt die führenden Nullen schon selber ein.

Gruß Dietrich

: Bearbeitet durch User
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.