Forum: Mikrocontroller und Digitale Elektronik Taster? Anfängerfrage Port Reagiert nicht?


von Randy T. (peroja)


Lesenswert?

Hallo,

Ich bin am herumexperimentieren mit einem Taster. Hier erst mal mein 
Code. Danach das komische Problem
1
#ifndef F_CPU
2
#define F_CPU 16000000UL // 8 MHz clock speed
3
#endif
4
5
#include <avr/io.h>
6
#include <util/delay.h>
7
8
int main(void)
9
{
10
  
11
DDRA = 0x00; // pin 1-7 an port A auf eingang
12
  
13
  while(1)
14
  {
15
    if(PINA & (1<<PA0) == 1) //button an pin pb0 ???? 
16
    {
17
      PORTD |= (1<<PD0); //LED an PD0 ein
18
      _delay_ms(100); //kurzes delay
19
      PORTD &= ~(1<<PD0); //LED off
20
    }
21
  }
22
}

Wenn ich das tue dann Funktioniert es:

if(PINA & (1<<PA0) == 1)

Wenn ich aber den Taster auf Pin2 setze :

if(PINA & (1<<PA1) == 1)

Dann gehts nicht? Oder hab ich da etwas falsch verstanden? (taster 
danach natürlich am pin 2 angehängt)

Auf dieses Problem bin ich gestossen nachdem ich 2 Taster an Port B 
angeschlossen hab und 2 versch. LED's an PortD ansteuern wollte. Ich 
dachte erst ich mach etwas falsch mit einem bit setzen.
1
#ifndef F_CPU
2
#define F_CPU 16000000UL // 8 MHz clock speed
3
#endif
4
5
#include <avr/io.h>
6
#include <util/delay.h>
7
8
9
10
int main(void)
11
{
12
  
13
   DDRB = 0x00; //Makes all pins of PORTD input
14
  
15
  while(1)
16
  {
17
    if(PINB & (1<<PB0) == 1) //button an pin pb0
18
    {
19
      
20
      PORTD |= (1<<PD0); //LED an PD0 ein
21
      _delay_ms(100); //kurzes delay
22
      PORTD &= ~(1<<PD0); //LED off
23
    }
24
25
    if(PINB & (1<<PB1) == 1) //button an pin pb1 
26
    {
27
      
28
      PORTD |= (1<<PD7); //LED an PD7 ein
29
      _delay_ms(100); //delay
30
      PORTD &= ~(1<<PD7); //LED off
31
    }
32
33
    
34
  }
35
}

versteh ich das richtig dass ich im 2.ten IF ein anderes bit setzen 
muss?
1
if(PINB & (2<<PB1) == 1) ->anderes/falsches bit?
2
    {
3
      
4
      PORTD |= <<PD7); //LED an PD7 ein (und hier?)
5
      _delay_ms(100); //delay
6
      PORTD &= ~(1<<PD7); //LED off (und hier?)
7
    }

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Randy T. schrieb:

> #define F_CPU 16000000UL // 8 MHz clock speed

Schon falsch. ;-)  Der Makro sagt, es seien 16 MHz, der Kommentar
meint, es sind 8.


> if(PINA & (1<<PA0) == 1)
>
> Wenn ich aber den Taster auf Pin2 setze :
>
> if(PINA & (1<<PA1) == 1)
>
> Dann gehts nicht?

Weil (1 << PA1) niemals gleich 1 sein kann.

(Wenn du alle Compilerwarnungen einschaltest, dann sagt dir der
Compiler das auch.)

Lass einfach das blöde "== 1" da weg, dann wird es klappen (also
generell weglassen, auch bei PA0, obwohl es dort zufällig klappt).

: Bearbeitet durch Moderator
von Randy T. (peroja)


Lesenswert?

Falls mir jemand freundlicher weise den unteren Code (2 buttons) 
korrigieren kann so wie es richtig wäre, dann wäre ich mega happy. Auf 
diese Weise kann ich vergleichen und sehe dann WO ich Fehler mache. (ist 
meine art zu lernen)

Lieben Dank
Randy

von Karl M. (Gast)


Lesenswert?

Hallo  Randy Tomlinson,

es ist immer besser den Kopf selbst an zu strengen,
die Frage lässt sich einfach beantworten, wenn Du die Werte

(1<<PA0) = ??
(1<<PA1) = ??
(1<<PA2) = ??
usw.

ausrechnen kannst.

Es wurde in <avr/io.h> definiert, bzw. diese Datei lädt dann die 
Definitionen für deinen ausgewählten AVR µC nach:
1
/* PORTA */
2
#define PA7     7
3
#define PA6     6
4
#define PA5     5
5
#define PA4     4
6
#define PA3     3
7
#define PA2     2
8
#define PA1     1
9
#define PA0     0

von DDRD (Gast)


Lesenswert?

Wo wird den Port D als Ausgang konfiguriert?
DDRD = 0xFF; //PortD als Ausgang

Sollte man auch hinschreiben um das klar zu haben.

von fop (Gast)


Lesenswert?

1
if(PINA & (1<<PA1) != 0)

bzw. da gab es doch auch schon ein Makro :
1
if(PINA & _BV(PA1)) != 0)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Das "!= 0" ist aber überflüssig.  Kann man hinschreiben, aber wenn man
C einmal verstanden hat, kann man's genauso gut weglassen.

von Falk B. (falk)


Lesenswert?

@ Randy Tomlinson (peroja)

>korrigieren kann so wie es richtig wäre, dann wäre ich mega happy. Auf

Siehe Bitmanipulation.

von Randy T. (peroja)


Lesenswert?

Falk B. schrieb:
> @ Randy Tomlinson (peroja)
>
>>korrigieren kann so wie es richtig wäre, dann wäre ich mega happy. Auf
>
> Siehe Bitmanipulation.

super. danke. werd ich mir morgen mal ansehen und testen

im endeffekt geht es mir nur darum zu lernen wie ich 2 odere mehr 
buttons zuweise und jedem ein eigenen ablauf zuteile.

dankeschön an alle helfer :-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Randy T. schrieb:
> Wenn ich das tue dann Funktioniert es:
> if(PINA & (1<<PA0) == 1)
> Wenn ich aber den Taster auf Pin2 setze :
> if(PINA & (1<<PA1) == 1)
Wenn schon schön umständlich, dann aber so richtig umständlich:
1
if(PINA & (1<<PA0) == (1<<PA0)) ...
Da ist bei korrekter Formatierung dank Obfuscation schon fast der 
Kapierschutz mit eingebaut:
1
if(PINA & (1<<PA1)==(1<<PA1) ) ...
;-)

: Bearbeitet durch Moderator
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Lothar M. schrieb:
> Kapierschutz

ROTFL :-)

Randy T. schrieb:
> im endeffekt geht es mir nur darum zu lernen wie ich 2 odere mehr
> buttons zuweise und jedem ein eigenen ablauf zuteile.

Buttons muss man sowieso entprellen und fragt sie daher im
Timer-Interrupt ab … Entprellung

Aber die Bitmanipulation ist so grundlegend, dass man sie trotzdem
vorher verstanden haben sollte.

von Reiner_Gast (Gast)


Lesenswert?

Ich würde ja die internen Pull-Ups an den Input Pins einschalten, sonst 
floaten die Inputs, wenn kein Taster gedrückt wird....

Die Taster müssen dann natürlich gegen GND schließen und die 
Abfragelogic ist negiert

von Rolf M. (rmagnus)


Lesenswert?

Reiner_Gast schrieb:
> Ich würde ja die internen Pull-Ups an den Input Pins einschalten, sonst
> floaten die Inputs, wenn kein Taster gedrückt wird....

Wir kennen die Schaltung nicht. Könnte ja sein, dass da schon 
Widerstände drauf sind, die irgendwo hin pullen.

fop schrieb:
> bzw. da gab es doch auch schon ein Makro :
> if(PINA & _BV(PA1)) != 0)

Da gibt's noch mehr Makros:
1
if (bit_is_set(PINA, PA1))

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.