Taster? Anfängerfrage Port Reagiert nicht?

OP #5291112
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
    }
Moderator Persönliche Seite #5291116
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).
Gast #5291126
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
Moderator (Firma: Titel) Persönliche Seite #5291457
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) ) ...
;-)
Moderator Persönliche Seite #5291502
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.
Gast #5291966
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
#5292025
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))

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